C 语言程序设计 II 实验报告
题 目:实验五 函数应用
院系名称
:
计算机学院
专业名称
:
计算机科学与技术
班 级
学 号
:
:
学生姓名指导教师
:
:
实验日期
:
2017
年 4 月 1 日
报告提交截止日期: 2017 年 4 月 11 日
.
.
一、 实验目的
1、 掌握 C 语言函数的定义方法、 函数的声明及函数的调用方法及 调用过程;
2、 掌握主调函数和被调函数之间的参数传递方式;
二、 实验内容与要求:
1、 求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用
另一个函数根据求出的最大公约数求最小公倍数。 (提示: 设两个整数是
a,b,最大公约数是 p, 最小公倍数是 q, 那 么 ab=pq )
2、 用牛顿迭代法求方程 f(x)=ax
3
+bx
2
+cx+d=0 的根。系数 a、 b、c、d 由主
函数输入。求根过程写成函数。 (提示:牛顿迭代法是先给定方程 f(x)=0
的一个较好的初始近似根 x0,然后重复使用迭代公式 :
x x0
f ( x0 ) f ' ( x0 )
求 x 的近似解,直至相邻两次的近似解相差很小为止,如差值的绝对值小于 1e-07 。x 0 可以从键盘输入或直接设定。 )
3、 定义一个函数,功能是计算 n 个学生的成绩中高于平均成绩的人数,并作为函数返回值。用主函数来调用它。统计 30 个学生成绩中高于平均成
绩的有多少人。
4、 编写程序, 计算下列函数值:
f (m, n)
s(m)
,其中 ,m ,n 为正整数,
s(n)
s( n)
n
p(i )
i 1
p(1)
p( 2)
p(n) , p(i ) i!
5、 编写和调用函数,给定圆筒的内径、外径和高,计算该圆筒的体积;给定圆锥的高、底面半径,计算该圆锥的体积和表面积。
6、 编写和调用函数,求出 10000 以内的所有 素数 、 绝对素数 、水仙花数 、完全数 (或称 完数 )、互满数 。
提示:一个素数经过任意次调换位,仍然为素数,则称其为 绝对素数 , 例如 13 和 31 就是一个绝对素数。 水仙花数 是指一个三位整数,其各位数字立方之和等于该数。例如, 153 就是一个水仙花数: 153=1*1*1+ 5*5*5+3*3*3 。完全数 是指一个数正好是它的所有约数 (本身除外) 之和。例如, 6 就是一个完全数,因为 6 的因子有 1、2、 3,并且 6=1+2+3 。如果有两个数,每一个数的所有约数(除它本身以外)之和正好等于对
方,则称这两个数为 互满数 。
三、 实验结果
题目内容与要求:求两个整数的最大公约数和最小公倍数。用一个函数求最大
公约数, 用另一个函数根据求出的最大公约数求最小公倍数。
(提示: 设两个整数是 a,b,最大公约数是 p,最小公倍数是 q,那么 ab=pq )
算法简要描述(文本) :通过循环找出最大公约数,根据公式求最小公倍数。源代码标识符说明(文本) : a,b 存储数字 i,j 找最小公倍数和最大公因数。源代码(粘贴程序,注意缩进,不得使用截图) :
#include"stdio.h" int f(int a,int b)
{int i,j; if(a>b)
{a=a+b;b=a-b;a=a-b;
}
for(i=a;i>=1;i--) if(a%i==0&&b%i==0) return i;
}
int s(int a,int b,int i)
{return a*b/i;
}
main()
{
int a,b; while(1)
{
scanf("%d%d",&a,&b);
printf(" 最大公约数 :%d\n最小公倍数 :%d\n",f(a,b),s(a,b,f(a,b)));
}}
实 验 测 试 结 果 ( 使 用 截 图 , 图 形 格 式 JPEG 。
截 图 不 要 包 含 源 代 码 ):
讨论(文本) :
题目内容与要求: 用牛顿迭代法求方程
3
f(x)=ax +bx
2
+cx+d=0
的根。
系数 a、b、
c、d 由主函数输入。
求根过程写成函数。(提示: 牛顿迭代法是先给定方程 f(x)=0
的一个较好的初始近似根 x0,然后重复使用迭代公式 :
x x0
f ( x0 ) f ' ( x0)
求 x 的近似解,直至相邻两次的近似解相差很小为止,如差值的绝对值小于
1e-07 。x0 可以从键盘输入或直接设定。 )
算法简要描述(文本) :通过构造函数实现题中给的公式。源代码标识符说明(文本) : a,b,c,d, 存 系 数 x 存 根 。源代码(粘贴程序,注意缩进,不得使用截图) :
#include"stdio.h" #include"math.h"
float f1(float a,float b,float c,float d,float x)
{return (a*x*x*x+b*x*x+c*x+d);
}
float f2(float a,float b,float c,float x)
{return (3*a*x*x+2*b*x+c);
}
main()
{
while(1)
{float a,b,c,d,x,y,m,n; scanf("%f%f%f%f%f",&a,&b,&c,&d,&x); do
{x=y;
m=f1(a,b,c,d,x);n=f2(a,b,c,x); y=x-(m/n);
}while(fabs(x-y)>=1e-7);
printf("%.2f\n",y);
}}
实 验 测 试 结 果 ( 使 用 截 图 , 图 形 格 式 JPEG 。
截 图 不 要 包 含 源 代 码 ):
讨论(文本) :
题目内容与要求: 定义一个函数,功能是计算 n 个学生的成绩中高于平均成绩的人数, 并作为函数返回值。 用主函数来调用它。 统计 30 个学生成绩中高于平均成绩的有多少人。
算法简要描述(文本) :构造函数求出平均值,再和平均值一一比较。
源代码标识符说明 (文本):p 指针变量操作数组。 q 存大于平均值成绩的个数。源代码(粘贴程序,注意缩进,不得使用截图) : #include"stdio.h"
int f(float *p,int n)
{int i,q=0;float s=0; for(i=0;i<n;i++) s+=*(p+i); for(i=0;i<n;i++)
{if(*(p+i)>(s/n)) q++;
}
return q;
}
main()
{float a[30]; int i,n=30;
for(i=0;i<n;i++) scanf("%d",&a[i]);
printf("%d",f(a,n));
}
实 验 测 试 结 果 ( 使 用 截 图 , 图 形 格 式 JPEG 。
截 图 不 要 包 含 源 代 码 ):
讨论(文本) :
4
题目内容与要求: 编写程序,计算下列函数值:
f ( m, n)
s(m)
s(n)
,其中 ,m,n
为正整数,
s(n)
n
p(i )
i 1
p (1)
p(2)
p(n) , p(i ) i!
算法简要描述(文本) :构造一个阶乘函数。源代码标识符说明(文本) : x 存数据。
源代码(粘贴程序,注意缩进,不得使用截图) :
#include"stdio.h" long long s(int x)
{if(x==1) return 1; return x*s(x-1);
}
long long f(int a,int b)
{return s(a)/s(b);
}
main()
{
int a,b; while(1)
{scanf("%d%d",&a,&b);
printf("%d!=%lld %d!=%lld\n",a,s(a),b,s(b));
printf("s(a)/s(b)=%lld\n",f(a,b));
}}
实 验 测 试 结 果 ( 使 用 截 图 , 图 形 格 式 JPEG 。
截 图 不 要 包 含 源 代 码 ):
讨论(文本) :
题目内容与要求: 编写和调用函数,给定圆筒的内径、外径和高,计算该圆筒的体积;给定圆锥的高、底面半径,计算该圆锥的体积和表面积。
算法简要描述(文本) :构造圆锥和圆筒体积表面积函数
源代码标识符说明(文本) : a,b,c 存数据。
源代码(粘贴程序,注意缩进,不得使用截图) :
# include"stdio.h" #include"math.h"
#define PI 3.1415926
float v(float a,float b,float h)
{if(b!=0)
return PI*(b*b-a*a)*h; return PI*a*a*h/3;
}
float s(float a,float h)
{return PI*a*sqrt(a*a+h*h)+PI*a*a;
}
main()
{float a,b,h; while(1)
{
printf(" 请输入圆筒的内径,外径,高 \n"); scanf("%f%f%f",&a,&b,&h);
printf("v=%f\n",v(a,b,h)); b=0;
printf(" 请输入圆锥的半径,高 \n");
scanf("%f%f",&a,&h);
printf("v=%f s=%f\n",v(a,b,h),s(a,h));
}}
实 验 测 试 结 果 ( 使 用 截 图 , 图 形 格 式 JPEG 。
截 图 不 要 包 含 源 代 码 ):
讨论(文本) :
题目内容与要求: 编写和调用函数,求出 10000 以内的所有 素数、 绝对素数 、水仙花数 、完全数 (或称 完数 )、互满数 。
提示:一个素数经过任意次调换位,仍然为素数,则称其为 绝对数 ,例如 13
和 31 就是一个绝对素数。 水仙花数 是指一个三位整数,其各位数字立方之和
等于该数。例如, 153 就是一个水仙花数: 153=1*1*1+ 5*5*5+3*3*3 。完全数是指一个数正好是它的所有约数(本身除外)之和。例如, 6 就是一个完全数,
因为 6 的因子有 1、2 、3,并且 6=1+2+3 。如果有两个数,每一个数的所有约
数(除它本身以外)之和正好等于对方,则称这两个数为 互满数 。
算法简要描述(文本) :构造出各自函数,通过调用实现。绝对素数在已知的素
数里面通过移位再判断是否是素数。
源代码标识符说明(文本) : x,a,b,c 存数据。
源代码(粘贴程序,注意缩进,不得使用截图) :
#include"stdio.h" #include"math.h" int f(int i)
{int j,k=sqrt(i);
for(j=2;j<=k;j++) if(i%j==0) break; if(j>=k+1) return 1;
else return 0;
}
int g(int x)
{int i,a,b,c; for(i=100;i<=x;i++)
{a=i%10;b=i/100;c=(i-b*100)/10;
if(i<=999&&i==a*a*a+b*b*b+c*c*c) printf("% d",i);}
}
int h(int x)
{int i,j,k,a; for(i=2;i<=x;i++)
{a=0;
for(j=1;j<=i/2;j++) if(i%j==0)
a+=j; if(a==i)
printf("% d",i);
} }
int w(int x)
{int j,a=0; for(j=1;j<=x/2;j++) if(x%j==0)
a+=j;
return a;
}
int s(int x)
{int i,j,k; for(i=1;i<=x;i++) if(w(w(i))==i)
{if(w(i)<i) continue;
printf("%d,%d ",i,w(i));
}}
main()
{int i,j=0,x,a,b,c,m[1000]; scanf("%d",&x);
printf(" 素数为:\n");
for(i=2;i<=x;i++) if(f(i))
{printf("%5d",i); if(i>9&&i<100)
if(f(i%10*10+i/10)) m[j++]=i; if(i>100&&i<=999)
{c=i%10;a=i/100;b=(i-a*100)/10; if(a%2==0||b%2==0||c%2==0||a==5||b==5||c==5) continue;
if(f(a*100+c*10+b)&&f(b*100+c*10+a)&&f(b*100+a*10+c)&&f(c*10 0+b*10+a)&&f(c*100+a*10+b))
m[j++]=i;
}}
printf("\n 绝对素数为 :"); for(i=0;i<j;i++)
printf("% d",m[i]);
printf("\n 水仙花数为 :"); g(x);
printf("\n 完全数为 :"); h(x);
printf("\n 互满数为 :\n"); s(x);
}
实 验 测 试 结 果 ( 使 用 截 图 , 图 形 格 式 JPEG 。
截 图 不 要 包 含 源 代 码 ):
.
.
.
讨论(文本) :
四、实验心得
通过这次试验,对构造函数慢慢理解。
熟悉调用函数各方面规则。
3