C语言实验报告(函数应用)

来源:工作范文网 时间:2020-10-19 08:52:13

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