C 上机2.docx
《C 上机2.docx》由会员分享,可在线阅读,更多相关《C 上机2.docx(16页珍藏版)》请在冰豆网上搜索。
![C 上机2.docx](https://file1.bdocx.com/fileroot1/2023-1/31/e90bf22a-b72c-4584-9fbb-c8e2a34d7fd8/e90bf22a-b72c-4584-9fbb-c8e2a34d7fd81.gif)
C上机2
C语言程序设计实验报告
班级日期2012.4.19
学生姓名学号
第2次上机
实验1函数与程序结构
(一)实验目的
(1)熟悉和掌握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类型的定义和返回值使用。
(2)熟悉和掌握不同存储类型变量的使用。
(3)熟悉多文件编译技术。
(二)实验内容及要求
1.源程序改错
下面是计算s=1!
+2!
+3!
+…+n!
的源程序,在这个源程序中存在若干语法和逻辑错误。
要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。
源程序:
#include
voidmain(void)
{
intk;
for(k=1;k<6;k++)
printf("k=%d\tthesumis%ld\n",k,sum_fac(k));
}
longsum_fac(intn)
{
longs=0;
inti;
longfac;
for(i=1;i<=n;i++)
fac*=i;
s+=fac;
returns;
}
程序缺少调用函数的声明;变量的初始化;等。
修改后的正确程序为:
#include
longsum_fac(intn);
intmain()
{
intk;
printf("pleaseinputk:
");
scanf("%d",&k);
printf("k=%d\tthesumis%ld\n",k,sum_fac(k));
return0;
}
longsum_fac(intn)
{
longs=0;
inti;
staticlongfac=1;
for(i=1;i<=n;i++)
{
fac=fac*i;
s=s+fac;
}
returns;
}
运行结果:
2.源程序修改替换
(1)修改上述源程序中的sum_fac函数,使其计算量最小。
(2)修改上述源程序中的sum_fac函数,计算
(1)
#include
longsum_fac(intn,intt);
intmain()
{
intk=0,i;
longm;
do{
printf("pleaseinputk:
");
scanf("%d",&k);
}while(k<0);
for(i=1;i<=k;i++)
m=sum_fac(k,i);
printf("k=%d\tthesumis%ld\n",k,m);
return0;
}
longsum_fac(intn,intt)
{
staticlongfac=1,s=0;
if(t<=n)
{
fac=fac*t;
s=s+fac;
}
returns;
}
运行结果:
(2)
#include
doublesum_fac(intn);
intmain()
{
intk;
printf("pleaseinputk:
");
scanf("%d",&k);
printf("k=%d\tthesumis%lf\n",k,sum_fac(k));
return0;
}
doublesum_fac(intn)
{
doubles=0.0;
inti=1;
longfac=1;
do{
fac=fac*i;
s=s+1.0/fac;
i++;
}while(i<=n);
returns;
}
3.跟踪调试
下面是计算fabonacci数列前n项和的源程序,现要求单步执行该程序,并观察p,i,sum,n值,即:
(1)刚执行完scanf("%d",&k);语句时,p,i值是多少?
(2)从fabonacci函数返回后,光条停留在哪个语句上?
(3)进入fabonacci函数时,watch窗口显示的是什么?
(4)当i=3时,从调用fabonacci函数到返回,n值如何变化?
源程序:
voidmain(void)
{
inti,k;
longsum=0,*p=∑
scanf("%d",&k);
for(i=1;i<=k;i++){
sum+=fabonacci(i);
printf("i=%d\tthesumis%ld\n",i,*p);
}
}
longfabonacci(intn)
{
if(n==1||n==2)
return1;
else
returnfabonacci(n-1)+fabonacci(n-2);
}
其中,“longsum=0,*p=∑”声明p为长整型指针并用&sum取出sum的地址对p初始化。
*p表示引用p所指的变量(*p即sum)。
答:
(1)输入k=6;p和i的值如右图:
(2)从fabonacci函数返回后光条停留在“printf("i=%d\tthesumis%ld\n",i,*p);”语句上.
(3)在k=3输入:
最后一个截图为程序结束时的各变量数值。
最后一个截图为程序结束时的各变量数值。
(4)
4.程序设计
编写并上机调试运行能实现以下功能的程序。
(1)编写一个程序,让用户输入两个整数,计算两个数的最大公约数并且输出之。
要求用递归函数实现求最大公约数,同时以单步方式执行该程序,观察其递归过程。
intgcd(intu,intv)
{
inttemp;
while(v!
=0)
{
temp=u%v;
u=v;
v=temp;
}
returnu;
}
intmain()
{
intm,n;
printf("Pleaseinputtwonumbers:
");
scanf("%d%d",&m,&n);
printf("gcd=%d",gcd(m,n));
}
(2)编写一个程序,验证歌德巴赫猜想:
一个大于等于4的偶数都是两个素数之和。
#include
#include
#defineN40
intgedebahe(int);
intmain()
{
inti=6,n;
printf("4=2+2\n");
for(;i<=N;i+=2)
{
for(n=3;n<=i/2;n+=2)
if(gedebahe(n))
if(gedebahe(i-n))
{
printf("%4d=%2d+%2d\n",i,n,i-n);
break;
}
if(n>i/2)printf("error%d\n",i);
}
return0;
}
intgedebahe(inti)
{
intj;
if(i<=1)return0;
if(i==2)return1;
if(!
(i%2))return0;
for(j=3;j<=sqrt(i);j+=2)
if(!
(i%j))return0;
return1;
}
(3)编写一个程序,证明对于在符号常量BEGIN和END之间的偶数这一猜测成立。
例如,如果BEGIN为10,END为20,则程序的输出应为:
GOLDBACH'SCONJECTURE:
Everyevennumbern>=4isthesumoftwoprimes.
10=3+7
12=5+7
……
20=3+17
程序:
#include
#include
intgedebahe(int);
intmain()
{
inti,n;
printf("GOLDBACH'SCONJECTURE:
\n");
printf("Everyevennumbern>=4isthesumoftwoprimes.\n");
for(i=10;i<=20;i+=2)
{
for(n=3;n<=i/2;n+=2)
if(gedebahe(n))
if(gedebahe(i-n))
{
printf("%d=%d+%d\n",i,n,i-n);
break;
}
if(n>i/2)printf("error%d\n",i);
}
return0;
}
intgedebahe(inti)
{
intj;
if(i<=1)return0;
if(i==2)return1;
if(!
(i%2))return0;
for(j=3;j<=sqrt(i);j+=2)
if(!
(i%j))return0;
return1;
}
运行结果:
实验心得与体会
选做题
(1)假设一个C程序由file1.c和file2.c两个源文件及一个file.h头文件组成,file1.c、file2.c和file.h的内容分别如下所述。
试编辑该多文件C程序,并编译和链接。
然后运行生成的可执行文件。
源文件file1.c的内容为:
#include"file.h"
intx,y;/*外部变量的定义性说明*/
charch;/*外部变量的定义性说明*/
voidmain(void)
{
x=10;
y=20;
ch=getchar();
printf("infile1x=%d,y=%d,chis%c\n",x,y,ch);
func1();
}
源文件file2.c的内容为:
#include"file.h"
voidfunc1(void)
{
x++;
y++;
ch++;
printf("infile2x=%d,y=%d,chis%c\n",x,y,ch);
}
头文件file.h的内容为:
#include
externintx,y;/*外部变量的引用性说明*/
externcharch;/*外部变量的引用性说明*/
voidfunc1(void);/*func1函数原型*/
(3)如果由n个1组成的整数能被2011整除,则n至少为多少?
源程序:
#include
voidmain()
{inta,c,n;
c=1111;n=4;
while(c!
=0)
{a=c*10+1;
c=a%2011;n++;
}
printf("%d",n);
}
运行结果: