C语言程序设计实验报告
专业 信息与计算科学 班级 一班 组别 无
指导教师 许四平 姓名 石锦锋 同组人 无
实验时间 2018 年 5 月 日 实验地点 K7-403
实验名称 函数(一)(二)
实验目的(1)熟悉定义函数的方法; (2)熟悉声明函数的方法; (3)熟悉调用函数时实参与形参的对应关系,以及“值传递”的方式; (4)学习对多文件的程序的编译和运行; (5)进一步熟悉怎样利用函数实现指定的任务; (6)熟悉函数的嵌套调用和递归调用的方法; (7)熟悉全局变量和局部变量的概念和用法; |
实验仪器: 1、支持Intel Pentium Ⅲ及其以上CPU,内存256MB以上、硬盘1GB以上容量的微机; 软件配有Windows98/2000/XP操作系统及VC++软件。 2、了解VC++6.0软件的特点及系统组成,在电脑上操作VC++6.0软件。 |
实验内容、步骤及程序: 编程序并上机调试运行之。 函数(一) (1)写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。 本程序应当准备以下测试数据:17,34,2,1,0.分别运行并检查结果是否正确。要求所编写的程序,主函数的位置在其他函数之前,在主函数中对其所调用的函数声明。进行以下工作; 输入自己编写的程序,编译和运行程序,分析结果。 #include<stdio.h> int main() {int prime(int); int n; printf("input an integer:"); scanf("%d",&n); if(prime(n)) printf("%d is a prime.\n",n); return 0;} int prime(int n) {int flag=1,i; for(i=2;i<n/2&&flag==1;i++) if(n%i==0) flag=0; printf("201741110126 石锦锋\n"); return(flag); } 将主函数的函数声明删掉,再进行编译,分析编译结果。 #include<stdio.h> int main() {int n; printf("input an integer:"); scanf("%d",&n); if(prime(n)) printf("%d is a prime.\n",n); else printf("%d is not a prime.\n",n); return 0;} int prime(int n) {int flag=1,i; for(i=2;i<n/2&&flag==1;i++) if(n%i==0) flag=0; printf("201741110126 石锦锋\n"); return(flag); } 结果:程序错误,因为未定义声明,不能执行。 把主函数的位置改为在其他函数之后,在主函数中不含函数声明。 #include<stdio.h> int main() {printf("input an integer:"); scanf("%d",&n); if(prime(n)) printf("%d is a prime.\n",n); else printf("%d is not a prime.\n",n); int n; return 0;} int prime(int n) {int flag=1,i; for(i=2;i<n/2&&flag==1;i++) if(n%i==0) flag=0; printf("201741110126 石锦锋\n"); return(flag);} 结果:程序不能执行,因为没有未定义,出现错误。 保留判别素数的函数,修改主函数, 要求实现输出100~200之间的素数。 #include<stdio.h> void main() {int prime(int); int i,j; for(i=100; i<=200; i++) if(prime(i)) printf(" "); else printf(" ",i);} printf("201741110126 石锦锋\n");} int prime(int n) {int a,b=0; for(a=2;a<i/2;a++) if(i%a==0) b++;continue;} return(b); } (2)写一个函数,将一个字符串中的元音字母复制到另一 字符串,然后输出。 ①输入程序,编译和运行程序,分析结果。 #include<stdio.h> int main() {void cpy(char[],char[]); char str[80],c[80]; printf("input string:"); gets(str); cpy(str,c); printf("The vowel letters are:%s\n",c); printf("201741110126 石锦锋\n"); return 0;} void cpy(char s[],char c[]) {int i,j; for(i=0,j=0;s[i]!='\0';i++) if(s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'||s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U') {c[j]=s[i]; j++;} c[j]='\0';} ②分析函数声明中参数的写法。先后用以下两种形式。 函数声明中参数的写法与定义函数时的形式完全相同,如: void cpy(char s[],char c[]); 函数声明中参数的写法与定义函数时的形式基本相同,但省略写数组名。如: void cpy(char[],char[]); 分别编译和运行,分析结果。 思考形参数组为什么可以不指定数组大小。 分析:形参数组的大小可以根据实参的大小得到。 ③如果随便指定数组大小行不行,如: void cpy(char s[40],char[40]) 请分别上机试一下。 (3)输入10个学生5门课的成绩,分别用函数实现下列功能: 计算每个学生平均分; 计算每门课的平均分; 出所有50个分数中最高的分数所对应的学生和课程。 #include<stdio.h> #define N 10 #define M 5 float score[N][M]; float a_stu[N],a_cour[M]; int r,c; int main() {int i,j; float h; float s_var(void); float highest(); void input_stu(void); void aver_stu(void); void aver_cour(void); input_stu(); aver_stu(); aver_cour(); printf("\n NO. cour1 cour2 cour3 cour4 cour5 aver\n"); for(i=0;i<N;i++) {printf("\nNO%2d",i+1); for(j=0;j<M;j++) printf("%8.2f",score[i][j]); printf("%8.2f\n",a_stu[i]);} printf("\naverage:"); for(j=0;j<M;j++) printf("%8.2f",a_cour[j]); printf("\n");h=highest(); printf("highest:%7.2f NO.%2d course%2d\n", h,r,c); printf("variance %8.2f\n",s_var()); return 0;} void input_stu(void) {int i,j; for(i=0;i<N;i++) {printf("\ninput score of student%2d:\n",i+1); for(j=0;j<M;j++) scanf("%f",&score[i][j]);}} void aver_stu(void) {int i,j; float s; for(i=0;i<N;i++) {for(j=0,s=0;j<M;j++) s+=score[i][j]; a_stu[i]=s/5.0;}} void aver_cour(void) {int i,j; float s; for(j=0;j<M;j++) {s=0; for(i=0;i<N;i++) s+=score[i][j]; a_cour[j]=s/(float)N;}} float highest() {float high; int i,j; high=score[0][0]; for(i=0;i<N;i++) for(j=0;j<M;j++) if(score[i][j]>high) {high=score[i][j]; r=i+1; c=j+1;} return(high);} float s_var(void) {int i; float sumx,sumxn; sumx=0.0; sumxn=0.0; for(i=0;i<N;i++) {sumx+=a_stu[i]*a_stu[i]; sumxn+=a_stu[i];} printf("201741110126 石锦锋\n"); return(sumx/N-(sumxn/N)*(sumxn/N));} (4)用一个函数来实现将一行字符串中最长的单词输出。此行字符串从函数主传递给该函数。 把两个函数放在同一个程序文件中,作为一个文件进行编译和运行。 #include<stdio.h> #include<string.h> int main() {int alphabetic(char); int longest(char[]); int i; char line[100]; printf("input one line:\n"); gets(line); printf("The longest word is:"); for(i=longest(line);alphabetic(line[i]);i++) printf("%c",line[i]); printf("201741110126 石锦锋\n"); return 0;} int alphabetic(char c) {if((c>='a'&&c<='z')||(c>='A'&&c<='z')) return(1); else return(0);} int longest(char string[]) {int len=0,i,length=0,flag=1,place=0,point; for(i=0;i<=strlen(string);i++) if(alphabetic(string[i])) if(flag) {point=i; flag=0;} else len++; else {flag=1; if(len>=length) {length=len; place=point; len=0;}} return(place);} 函数(二) 写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排序。 输入程序,进行编译和运行,分析结果。 #include<stdio.h> #include<string.h> #define N 10 char str[N]; int main() {void sort(char[]); int i,flag; for(flag=1;flag==1;) {printf("input string:\n"); scanf("%s",&str); if(strlen(str)>N) printf("string too long,input again!"); else flag=0;} sort(str); printf("string sorted:\n"); for(i=0;i<N;i++) printf("%c",str[i]); printf("\n"); printf("201741110126 石锦锋\n"); return 0;} void sort(char str[]) {int i,j; char t; for(j=1;j<N;j++) for(i=0;(i<N-j)&&(str[i]!='\0');i++) if(str[i]>str[i+1]) {t=str[i]; str[i]=str[i+1]; str[i+1]=t;}} 将要排序的字符串改为5个,按由小到大的顺序排列。 #include<stdio.h> #include<string.h> int main(void) {int i,j; char a[5][20],t[20]; printf("enter 5 strings:\n"); for(i=0;i<5;i++) {scanf("%s",a[i]);} for(i=1;i<5;i++) {for(j=0;j<5-i;j++) if(strcmp(a[j],a[j+1])>0) {strcpy(t,a[j]); strcpy(a[j],a[j+1]); strcpy(a[j+1],t);}} printf("After sorted:\n"); for(i=0;i<5;i++) puts(a[i]); printf("201741110126 石锦锋\n"); return 0;} (6)用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定,可以是任意的整数。 输入程序,进行编译和运行,分析结果。 #include<stdio.h> int main() {void convert(int n); int number; printf("input an integer:"); scanf("%d",&number); printf("output:"); if(number<0) {putchar('-');putchar(' '); number=-number;} convert(number); printf("\n"); printf("201741110126 石锦锋\n"); return 0;} void convert(int n) {int i; 字符串操作函数putsif((i=n/10)!=0) convert(i); putchar(n%10+'0'); putchar(32);} 分析递归调用的形式和特点. 分析:函数定义中直接或间接地调用函数,一定存在使递归调用终止的条件,否则会导致出现无限递归。 ③思考如果不用递归法,能否改用其他方法解决此问题,上机试一下。 (7)编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。 在程序中用全局变量。编译和运行程序,分析结果。讨论为什么要用全局变量。 #include<stdio.h> int letter,digit,space,others; int main() {void count(char[]); char text[80]; printf("input string:\n"); gets(text); printf("string:"); puts(text); letter=0; digit=0; space=0; others=0; count(text); printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\nothers:%d\n",letter,digit,space,others); printf("201741110126 石锦锋\n"); return 0;} void count(char str[]) {int i; for(i=0;str[i]!='\0';i++) if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) letter++; else if(str[i]>='0'&&str[i]<='9') digit++; else if(str[i]==32) space++; else others++;} 能否不用全局变量,修改程序并运行之。 #include<stdio.h> int main() {void count(char[]); int letter,digit,space,others; char text[80]; printf("input string:\n"); gets(text); printf("string:"); puts(text); letter=0; digit=0; space=0; others=0; count(text); printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\nothers:%d\n",letter,digit,space,others); printf("201741110126 石锦锋\n"); return 0;} void count(char str[]) {int i,letter,digit,space,others; for(i=0;str[i]!='\0';i++) if((str[i]>='a'&&str[i]<='z')||(str[i]<'A'&&str[i]<='z')) letter++; else if(str[i]>='0'&&str[i]<='9') digit++; else if(str[i]==32) space++; else others++;} (8)求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数。用另一函数根据求出的最大公约数求最小公倍数。 ①不用全局变量,分别用两个函数求最大公约数和最小公倍数。两个整数在主函数中输入,并传送给函数hcf,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数lcd,求出最小公倍数,返回到主函数输出最大公约数和最小公倍数。 #include<stdio.h> int main() {int hcf(int,int); int lcd(int,int,int); int u,v,h,l; scanf("%d,%d",&u,&v); h=hcf(u,v); printf("H.C.F=%d\n",h); l=lcd(u,v,h); printf("L.C.D=%d\n",l); printf("201741110126 石锦锋\n"); return 0;} int hcf(int u,int v) {int t,r; if(v>u) {t=u;u=v;v=t;} while((r=u%v)!=0) {u=v;v=r;} return(v);} int lcd(int u,int v,int h) {return(u*v/h);} ②用全局变量的方法。用两个全局变量分别代表最大公约数和最小公倍数。用两个函数分别求最大公约数和最小公倍数,但其值不由函数带回,而是赋给全局变量。在主函数中输入他们的值。 #include<stdio.h> int Hcf,Lcd; int main() {void hcf(int,int); void lcd(int,int); int u,v; scanf("%d,%d",&u,&v); hcf(u,v); lcd(u,v); printf("H.C.F=%d\n",Hcf); printf("L.C.D=%d\n",Lcd); printf("201741110126 石锦锋\n"); return 0;} void hcf(int u,int v) {int t,r; if(v>u) {t=u;u=v;v=t;} while((r=u%v)!=0) {u=v;v=r;} Hcf=v;} void lcd(int u,int v) {Lcd=u*v/Hcf;} 分别用以上两种方法编程并运行,分析对比。 |
实验小结:通过本次实验,我熟悉的如何定义和声明函数的方法,知道了如何调用函数时参和形参的方式,以及“值传递”的方法,知道如何利用函数来实现指定的任务,熟悉好处的嵌套调用和递归调用的方法,进一步对全局变量和局部变量熟悉。 |
教师评语: 1. 实验结果及解释:( 准确合理、 较准确、 不合理 );占30% 2. 实验步骤的完整度:( 完整、 中等、 不完整 );占30% 3. 实验程序的正确性:( 很好、 较好、 中等、 较差、 很差 );占30% 4. 卷面整洁度:( 很好、 较好、 中等、 较差、 很差 );占10% 评定等级:( ) 教师签名: 日期: |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论