C语言程序设计 实验报告
班级 日期 2012/4/16 学生姓名 学号
第 2 次上机
实验1 函数与程序结构 (一) 实验目的
(1)熟悉和掌握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类型的定义和返回值使用。
(2)熟悉和掌握不同存储类型变量的使用。 (3)熟悉多文件编译技术。
(二) 实验内容及要求
1.源程序改错
下面是计算s=1!+2!+3!+?+n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。
源程序:
#include
int k;
for(k=1;k<6;k++)
printf(\
}
long sum_fac(int n) {
long s=0; int i; long fac;
for(i=1;i<=n;i++) fac*=i; s+=fac; return s;
} 改后: #include
int k;
for(k=1;k<6;k++)
printf(\}
long sum_fac(int n)
{
long s=0; int i;
long fac=1;
for(i=1;i<=n;i++) { fac*=i; s+=fac;} return s; }
2.源程序修改替换
(1)修改上述源程序中的sum_fac函数,使其计算量最小。 (2)修改上述源程序中的sum_fac函数,计算
s?1?
111????2!3!n!
(1)
#include
int k;
for(k=1;k<6;k++)
printf(\}
long sum_fac(int n) {
static long s=0; static long fac=1; fac*=n; s+=fac; return s; }
(2)
#include
double sum_fac(int); void main(void) {
int k;
for(k=1;k<6;k++)
printf(\}
double sum_fac(int n) {
double s=0; int i;
long fac=1;
for(i=1;i<=n;i++) { fac*=i; s+=1.0/fac;} return s; }
3.跟踪调试
下面是计算fabonacci数列前n项和的源程序,现要求单步执行该程序,并观察p,i,sum,n值,即:
(1)刚执行完scanf(\语句时,p,i值是多少? (2)从fabonacci函数返回后,光条停留在哪个语句上? (3)进入fabonacci函数时,watch窗口显示的是什么?
(4)当i=3时,从调用fabonacci函数到返回,n值如何变化? 源程序:
void main(void) {
int i,k;
long sum=0,*p=∑ scanf(\ for(i=1;i<=k;i++){ sum+=fabonacci(i);
printf(\ } }
long fabonacci(int n) {
if(n==1 || n==2) return 1; else
return fabonacci(n-1)+fabonacci(n-2); }
其中,“ long sum=0,*p=∑ ”声明p为长整型指针并用&sum取出sum的地址对p初始化。*p表示引用p所指的变量(*p即sum)。
(1)p=0x0012ff74,i=-858993460(2)sum+=fabonacci(i)(3)显示n的值(4)n从3变成4
4.程序设计
编写并上机调试运行能实现以下功能的程序。
(1) 编写一个程序,让用户输入两个整数,计算两个数的最大公约数并且输出之。要求用递归函数实现求最大公约数,同时以单步方式执行该程序,观察其递归过程。
(2) 编写一个程序,验证歌德巴赫猜想:一个大于等于4的偶数都是两个素数之和。 (3) 编写一个程序,证明对于在符号常量BEGIN和END之间的偶数这一猜测成立。例如,如果BEGIN为10,END为20,则程序的输出应为:
GOLDBACH'S CONJECTURE:
Every even number n>=4 is the sum of two primes. 10=3+7 12=5+7 ?? 20=3+17 (1)
#include
int temp; temp=x%y; if(temp==0) {
return y; } else {
return a(y,temp); } }
void main() { int x,y;
printf(\ scanf(\
printf(\最大公约数是%d\\n\
}(2)
#include
#include
int i,n; n=sqrt(j);
for(i=2;i<=n;i++) if(j%i==0)return 0; return j; }
void main() {
int n,j,up;
printf(\ scanf(\ printf(\ for(n=6;n<=up;n+=2){ for(j=3;j<=n/2;j+=2){
if(a(j)&&a(n-j)){printf(\} } }
(3)
#include
int i,n; n=sqrt(j);
for(i=2;i<=n;i++) if(j%i==0)return 0; return j;