华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
else return fabonacci(n-1)+fabonacci(n-2); }
2.2.4 程序设计
编写并上机调试运行能实现以下功能的程序:
(1)编写一个程序,让用户输入两个整数,计算两个数的最大公约数并且输出之。要求用递归函数实现求最大公约数,同时以单步方式执行该程序,观察其递归过程。
(2)编写一个程序,验证哥德巴赫猜想:一个大于等于4 的偶数都是两个素数之和。
(3) 编写一个程序,证明对于在符号常量BEGIN和END之间的偶数这一猜测成立。如, 如果BEGIN为10,END为20,则程序的输出应为:
GOLDBACH’SCONJECTURE:
Every even number n>=4 is the sum of two primes. 10=3+7 12=5+7 …… 20=3+17
【分析】
(1)用辗转相除法求最大公约数,程序框图如下:
(2)首先判断一定范围内的素数(比如100以内),然后判断一个偶数能否表示为两个素数之和。程序框图如下:
26
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
(3)和第二题类似,只不过加上一个范围控制,设置循环处于最大值和最小值之间。程序框图如下:
【程序】
(1)
#include
int m,n,r;
printf(\ scanf(\
printf(\ return 0; }
int GCD(m,n){
if(m%n==0&&m>=n)return n; else if(m%n==0&&m 27 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 int r; r=m%n; m=n; n=r; return GCD(m,n); } } (2) #include int x,i; printf(\ scanf(\ if(x%2!=0||x<4)printf(\ prime(); for(i=2;i<=N&&i if(a[x-i]){printf(\ } return 0; } int prime(){ int i,j; for(a[0]=a[1]=0,i=2;i for(j=i*i;j (3) #include int x,i,j; printf(\CONJECTURE:\\nEvery even number n>=4 is the sum of two prime.\\n\ prime(); for(i=BEGIN;i<=END;i++){ for(j=2;j 28 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 if(a[j]) if(a[i-j]){printf(\ } } return 0; } int prime(){ int i,j; for(a[0]=a[1]=0,i=2;i for(j=i*i;j 【测试】 (1)输入24和16求最大公约数,最大公约数为8,结果正确: (2)验证哥德巴赫猜想, 输入98,返回素数和,结果正确: (3)验证一定范围内的哥德巴赫猜想,输入14,返回素数和,结果正确: 2.3 实验体会 源程序改错中,依赖于平时良好的输入习惯,在输入过程中已经可以检查出大多数语法错误,或者拼写错误。接下来再检查一下逻辑是否有误,无误则进行多组数据的编译检验,确认最终无误。 源程序修改与替换题锻炼我们优化算法的能力,在平时写程序时就应该思考对于一个问题有没有最优解决方案,使用不同的语句在空间和时间中寻求平衡点,尽可能的控制好占用的时间空间范围。 程序设计题则是自主的设计实践,在练习中获得进一步提升,增强对于所学知识的熟练度和理解程度,锻炼编写代码的能力以及并通过问题的进一步引申锻炼思维的灵活性。 29 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 4编译预处理实验 4.1实验目的 (1)掌握文件包含、宏定义、条件编译、assert宏的使用 (2)练习带参数的宏定义、条件编译的使用。 (3)练习assert宏的使用。 (4)使用集成开发环境中的调试功能:单步执行,设置断点,观察变量值。 4.2实验内容及要求 4.2.1. 源程序改错 下面是用宏来计算平方差和交换两数的源程序。在这个源程序中,存在若干语法和逻辑错误,要求在计算机上对这个源程序进行调试修改,使之能够正确完成计算平方差和交换两数的任务。 程序代码: #include #define SWAP(a,b) a=b,b=a int main(void) { int b, t; printf(\scanf(\ printf(\ b is:%d\ SWAP(a,b); printf(\return 0; } 【分析及改正】本程序共存在3处错误,分析如下: (1)#define SUM a+b #define DIF a–b 错误原因:在宏定义中,在引用时直接将表达式带入之后的表达式应用,由于不了解在之后的应用中采用的运算符,所以优先级无法确定,因此需要在宏定义中对变量即表达式中加上括号。 改正:#define SUM ((a)+(b)) #define DIF ((a)–(b)) (2)#define SWAP(a,b) a=b,b=a 错误原因:带参数的宏定义逻辑错误,无法有效实现两个数的交换。 改正:#define SWAP(a,b,t) t=b,b=a,a=t (3)int b, t; 30