C语言程序设计实验报告
专业 信息与计算科学  班级  一班        组别  无     
指导教师  许四平  姓名  石锦锋  同组人      无     
实验时间 2018      日  实验地点  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小时内删除。