C语言程序设计-实验第四次上机实验报告.doc

上传人:jian****018 文档编号:8687211 上传时间:2020-03-31 格式:DOC 页数:22 大小:403.50KB
返回 下载 相关 举报
C语言程序设计-实验第四次上机实验报告.doc_第1页
第1页 / 共22页
C语言程序设计-实验第四次上机实验报告.doc_第2页
第2页 / 共22页
C语言程序设计-实验第四次上机实验报告.doc_第3页
第3页 / 共22页
点击查看更多>>
资源描述
5.第四次实验C语言程序设计 实验报告专业 计算机科学与技术 班级 信安1302班 日期 2014.4.26 成绩 实验组别 第 4 次实验 函数与程序结构实验&编译预处理实验 指导教师 学生姓名 学号 同组人姓名 实验名称 函数与程序结构实验 &编译预处理实验 4.1实验目的1.熟悉和掌握函数的定义,声明,调用函数与参数传递的方法,以及函数返回值类型的定义和返回值使用.2.熟悉和掌握不同存储类型变量的使用.3.熟悉多文件编译技术.4.掌握文件包含、宏定义、条件编译、assert宏的使用。5.练习带参数的宏定义、条件编译的使用。6.练习assert宏的使用。7.使用集成开发环境中的调试功能:单步执行,设置断点,观察变量值。4.2实验内容(一)斐波那契数列F0=0,F1=1,Fn=Fn-1+Fn-2(n=2,nN*),求Fn。源程序如下:shangji4chengxu21#include int F(int n);int main() int x; do printf(input a number:); scanf(%d,&x); while(x0); printf(F%d=%d,x,F(x); return 0;int F(int n) if(!n) return (0); else if(n=1) return (1); else return(F(n-1)+F(n-2);实验步骤: 步骤一:定义一个子函数求出斐波拉切数列第n项的值,子函数的形式参数为n控制项数,子函数中采用递归的思想求得结果。 步骤二:在主函数中通过键盘输入n的值,调用子函数将n的值传给形式参数,将计算得出的该项值返回到主函数,并在屏幕上输出。调试及编译过程:测试数据:1(第一项)测试数据:2(第二项)测试数据:7(任意选取一项)不足及修改: 刚开始时未注意到项数有要求为大于或等于0,导致若输入的n值不在此区间内,则无法输出预期的结果。后改为控制一个循环,若输入的n值不符合要求,则重复提示输入和接受数据的过程。 结果:出现预期的实验结果。(二)计算多项式的值anxn+ an-1xn-1+ an-2xn-2+a3x3+ a2x2+ a1x1+ a0源程序如下:shangji4chengxu22#include int main() int n,i,x,x1; int a800; for(i=0;i800;i+) ai=0; printf(input a number:); scanf(%d,&n); printf(input %d numbers:,n); for(i=0;in;i+) scanf(%d,&ai); printf(input x:); scanf(%d,&x); if(n=1) printf(the final result is %d,a0); else x1=x; x=a0*x+a1; for(i=2;i=n-1;i+) x=x*x1+ai; printf(the final result is %d,x); return 0;实验步骤: 步骤一:在键盘端输入需要的项数,并定义一个数组用来存放各项系数,从左至右,按照计算的顺序,分别为最高项系数,依次往下,最后一项为常数项系数。步骤二:将多项式采用拆分成多步乘积与相加的形式,通过控制循环改变与x相乘的因子,计算出最后结果并输出。调试及编译过程:测试数据:系数个数为1,即只有常熟项,此时分别输入两个不同的x的值如2和3,应得到的都是同一个值且为a的值。测试数据:n=2,a0=2,a1=1,x=3(任意数据)测试数据:n=3,a0=1,a1=2,a2=3,x=4(任意数据)出现的不足及修改:最开始时当n为一时不能输出预期的结果,经分析得出是因为常数项系数的排列规律与其他项系数不一样,若按此排列方法,当n=1时,应作为另外一种情况讨论,直接输出a0即常数项的值即可。 实验结果:修改后可以输出预期的结果。(三)设计一个计算两个x和y的最大值函数max(x,y),并利用该函数实现求n个数的最大值。源程序如下:shangji4chengxu23#include int max(int x,int y);int main() int a800; int i,n,m; printf(input n:); scanf(%d,&n); printf(input %d numbers:,n); for(i=0;in;i+) scanf(%d,&ai); m=a0; for(i=1;iy)?x:y);实验步骤: 步骤一:声明求两数较大值的子函数,在主函数中定义一个整型数组存放需要比较的n个数,在键盘端输入需要比较的数的个数,通过控制循环从键盘端输入n个数并赋值到数组中。 步骤二:通过预先定义的循环变量控制循环,首先将a0设为最大值,再往后通过两两比较,不断最大的数赋给变量max,在循环结束后输出max。 步骤三:定义子函数,通过条件语句比较出两数中的较大值并返回到主函数中。调试及编译过程:测试数据:n=1(只有一个数据时)测试数据:n=5(任意选取n的个数)出现的不足及修改:无 实验结果:输出预期的结果。(四)设计一个判断x是否是素数的函数prime(x),并利用该函数实现输出2100范围内的所有素数。源程序如下:shangji4chengxu24#include int P(int n);int main() int i,k=0; for(i=2;i=100;i+) if(P(i) printf(%-4d,i); k+; if(!(k%5) printf(n); return 0;int P(int n) int i,r=1; for(i=2;(i*i=n)&r;i+) r=n%i; if(r) return (1);else return (0);实验步骤: 步骤一:声明判断素数的子函数,该函数为整型,形式参数为要判断的数,当此数是素数时输出1,否则输出0. 步骤二:定义两个整型变量分别用来控制循环和控制一行五个的输出。控制循环过程中调用子函数对正在循环的数进行判断,若是素数则输出,且另一个计数变量加一。 步骤三:控制另一个循环,若计数变量的值是5的倍数则输出换行符实现换行。 步骤四:定义子函数,控制循环范围为2到该数的平方根,若相除的过程中出现可以整除的情况,则该数不是素数并退出循环,若退出循环时余数不为0,则该数是素数。调试及编译过程: 出现的不足及修改:在控制五个一行输出的过程中,最开始把控制条件写在了条件语句的外面,结果并不是按照五个一行输出,经分析发现是由于这样的话,在k到达了5之后,每次循环进行到这里都会输出一个换行符,于是将它改为把控制条件写在了判断素数的条件语句的花括号之内,这样只有是素数时才会执行括号内的内容。 实验结果:修改后输出预期的结果。(五)课程设计教材55面4(1)实现递归函数求两个数的最大公约数。源程序如下:shangji4jiaocai55.4(1)#include int main() int x,y,r; do printf(input two numbers:); scanf(%d%d,&x,&y); while(x0)|(y0); while(r=(x%y)!=0) x=y; y=r; printf(%d,y); return 0;实验步骤: 步骤一:定义两个整型变量,当从键盘端获取的两个数据均大于零时,将这两个数分别赋给这两个整型变量。 步骤二:用辗转相除法,实现对这两个数最大公约数的求法,并输出。调试及编译过程:测试数据:4,5(互质的俩数)(若输入的数中有为负的,则需重新输入)测试数据:24 30(一般情况)测试数据:12 24(一个可以被另一个整除的俩数)出现的不足及修改:无 实验结果:输出预期的结果(六)课程设计教材55面4(2)验证哥德巴赫猜想,一个大于或等于4的偶数都是两个素数的和。 源程序如下:shangji4jiaocai55.4(2)#include int p(int x);int main() int n,i,j; printf(enter n:); scanf(%d,&n); for(i=2;in;i+) for(j=2;j=i;j+) if(p(i)&p(j)&(i+j=n) printf(%d+%d=%dn,i,j,n); break; return 0;int p(int x) int i,r=1; for(i=2;(i*i=x)&r;i+) r=x%i; if(r) return (1); else return (0);实验步骤: 步骤一:声明一个子函数用来判断素数,定义一个整型变量用来存放将被拆成两个素数之和的偶数。从键盘端获取这个偶数。 步骤二:通过两层循环,分别定义来年各个整型变量从2到这个偶数间依次变化,当它们都是素数且和为这个偶数的时候输出。调试及编译过程:测试数据:4(起点的偶数)测试数据:28(任意选取一个偶数)出现的不足及修改:无 实验结果:输出预期的结果(七)课程设计教材55面4(3) 通过宏定义,输出在这两个定义的常量之间所有偶数关于验证哥德巴赫猜想的式子。源程序如下:shangji4jiaocai55.4(3)#include #define BEGIN 10#define END 100int p(int x);int main() int i,j,k; for(k=BEGIN;k=END;k+=2) for(i=2;ik;i+) for(j=2;ji;j+) if(p(i)&p(j)&(i+j=k) printf(%d+%d=%dn,i,j,k); break; return 0;int p(int x) int i,r=1; for(i=2;(i*i=x)&r;i+) r=x%i; if(r) return (1); else return (0);实验步骤:步骤一:声明一个判断素数的子函数,定义三个控制循环的变量,分别控制要求验证哥德巴赫猜想的范围和加法中的两个相加的素数。 步骤二:在循环过程中调用子函数实现对相加两数为素数的控制,若满足两素数的和为该数,则将加法式输出。 步骤三:定义子函数,通过控制循环判断一个数是否为素数。调试及编译过程: 出现的不足及修改:无 实验结果:输出预期结果。(八)课程设计教材61面4(1)通过带参数宏的定义实现计算三角形的面积。源程序如下:shangji4jiaocai61.4(1)#include #include #define s(a,b,c) (a)+(b)+(c)/2)#define area(s,a,b,c) (sqrt(s)*(s)-(a)*(s)-(b)*(s)-(c)int main() float s,a,b,c; printf(enter a,b,c:); scanf(%f%f%f,&a,&b,&c); s=s(a,b,c); printf(the area is %.2f,area(s,a,b,c); return 0;实验步骤: 步骤一:定义两个带参数宏,分别计算三角形周长的一半和三角形的面积。 步骤二:在主函数中,通过键盘端输入三角形三边的边长,通过宏定义计算出面积并输出。调试及编译过程:测试数据:3,4,5(方便计算)出现的不足及修改:无 实验结果:输出预期的结果。(九)课程设计教材61面4(2)通过宏定义的条件运算,分别按照客户的需求,以两种不同的形式输出从键盘端得到的字符串。源程序如下:shangji4jiaocai61.4(2)#include #define CHANGE 1#define CHANGE 2int main() char c; while(c=getchar()!=EOF) #if CHANGE=1 if(c=a&c=A&c=Z) printf(%c,c-A+a); else printf(%c,c); #elif CHANGE=2 printtf(%c,c); #endif return 0;实验步骤: 步骤一:定义两个不带参宏(具体使用时只需保留一个)分别用作两种形式的标志。 步骤二:通过循环语句实现对输入文本的“复制”,若是需要改变输出的形式,则通过条件语句实现。调试及编译过程:测试数据:输出大写形式测试数据:不翻转,即change=2(十)教材53面源程序1改错该程序出现的错误有:1.没有在主函数前声明子函数。2.应在输入端输入n的值。3.return 0应放在花括号里面。4.在子函数中没有对fac进行初始化。5子函数中的for循环应加上花括号构成复合语句。修改后程序如下:shangji4jiaocai53.1#include long sum_fac(int n);int main() int n; printf(enter n:); scanf(%d,&n); printf(1!+2!+.+%d!=%ld,n,sum_fac(n); return 0;long sum_fac(int n) int i; long s=0; long fac=1; for(i=1;i=n;i+) fac*=i; s+=fac; return (s);调试及编译过程:测试数据:1(第一个数据)测试数据:3(任意取一个数)出现的不足及修改:无 运行的结果:出现预期的结果。(十一)教材54面2(1)修改源程序中的sum_fac函数,使其计算量最小源程序如下:shangji4jiaocai54.2(1)#include int main() int n,i,fac=1,s=0; printf(enter n:); scanf(%d,&n); for(i=1;i=n;i+) fac*=i; s+=fac; printf(1!+.+%d!=%d,n,s); return 0;调试及编译过程:测试数据:1(起始数据)测试数据:5(任意选取数据)(十二)教材54面2(2)修改源程序中的sum_fac函数,计算s=1+1/1!+1/2!+1/n!源程序如下:shangji4jiaocai54.2(2)#include double sum_fac(int n);int main() int n; printf(enter n:); scanf(%d,&n); printf(1!+2!+.+%d!=%.2lf,n,sum_fac(n); return 0;double sum_fac(int n) int i; double s=0; long fac=1; for(i=1;i=n;i+) fac*=i; s+=1.0/fac; return (s);调试及编译过程:测试数据:1(起始数据)测试数据:2(最后一个能除尽的)测试数据:5(任意选取一个数)(十三)教材59面源程序1改错源程序中有这些错误:1.定义SUM和DIF的方式错误。2.定义交换的方式错误,且不能达到交换的目的3.主函数中定义了t却没有使用,使用了a却没有定义。4.scanf函数中,不需要加逗号。修改后程序如下:shangji4jiaocai59.1#include #define SUM (a)+(b)#define DIF (a)-(b)#define SWAP(a,b) a=a+b;b=a-b;a=a-b;int main() int a,b; printf(enter a&b:); scanf(%d%d,&a,&b); printf(nSUM=%dnthe difference between square of a and square of b is %d,SUM,SUM*DIF); SWAP(a,b); printf(nNow a =%d,b=%d,a,b); return 0;调试及编译过程:测试数据:1,2(任意选取一组数据)测试数据:2,1(将上一组数据翻转)出现的不足及修改:无 运行结果:出现预期的结果。(十四)教材59面2(1)修改源程序使它能完成求三数中最大者,计算两数之和的功能。源程序的错误有:1.未在主函数前声明子函数,且主函数类型应为int 。2.在主函数的scanf函数调用中,双引号内不需要加逗号。源程序修改如下:shangji4jiaocai59.2(1)#include int max(int x,int y,int z);float sum(float x,float y);int main() int a,b,c; float d,e; printf(enter a&b&c:); scanf(%d%d%d,&a,&b,&c); printf(the max of them is%dn,max(a,b,c); printf(enter d&e:); scanf(%f%f,&d,&e); printf(nthe sum of them is %.2fn,sum(d,e); return 0;int max(int x,int y,int z) int t; if(xy) t=x; else t=y; if(tz) t=z; return (t);float sum(float x,float y) return (x+y);调试及编译过程:测试数据:1,2,3 4,5(任意选取)测试数据:3,2,1, 5,4(调换顺序)测试数据:2,3,1 4,5(再次打乱顺序)出现的不足及修改:无 运行的结果:出现预期的结果。(十五)教材59面2(2)用带宏的参数替换max,实现求最大数的功能。源程序如下:shangji4jiaocai59.2(2)#include #define MAX(a,b,c) (ab)?(ac)?a:c):(bc)?b:c)int main() int a,b,c; printf(enter a&b&c:); scanf(%d%d%d,&a,&b,&c); printf(the max of them is %d,MAX(a,b,c); return 0;调试及编译过程:测试数据:1,2,3(第一种顺序)测试数据:1,3,2(第二种顺序)测试数据:2,1,3(第三种顺序)测试数据:2,3,1(第四种顺序)测试数据:3,1,2(第五种顺序)测试数据:3,2,1(第六种顺序)出现的不足及修改:无 运行结果:出现预期的结果。5.3实验总结1.通过本次实验,加强了对宏定义的条件语句的理解和使用能力。2.通过本次实验,三层循环的使用加强了对循环的控制能力,同时巩固了对子函数的使用能力。3.通过本次实验,锻炼了调用子函数和控制多层循环的能力。4. 通过本次实验,加深了实验过程中细致的分析过程,使分析问题更有逻辑性,同时发现了一种常见错误。5. 通过本次实验,加强了对循环过程的理解,尤其是当循环过程中有较多变量时容易出现混淆等问题。6. 通过本次实验,加强了对子函数作用的了解,使函数结构日趋清晰。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!