C语言实验四 函数与预处理.docx
- 文档编号:4358012
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:28
- 大小:138.07KB
C语言实验四 函数与预处理.docx
《C语言实验四 函数与预处理.docx》由会员分享,可在线阅读,更多相关《C语言实验四 函数与预处理.docx(28页珍藏版)》请在冰豆网上搜索。
C语言实验四函数与预处理
实验(实训)报告
项目名称实验四函数与预处理
所属课程名称C语言程序设计
项目类型验证性
实验(实训)日期2011.10.26/11.2/11.9
班级10统计2
学号100112100236
姓名裴晓晓
指导教师刘亚楠
浙江财经学院教务处制
一、实验(实训)概述:
【实验目的】
1.熟悉定义函数的方法;验证函数实参与形参的对应关系、值传递;函数重载;函数的调用(嵌套、递归)。
2.理解全局变量和局部变量、动态存储和静态存储变量。
3.学会使用预编译命令。
【实验要求】
1.正确使用函数进行程序设计。
2.正确运用实参与形参进行参数传递。
【基本原理】
见第四章课件和课本内容
【实施环境】(使用的材料、设备、软件)
VisualC++6.0
二、实验(实训)内容:
实验任务一用DEBUG跟踪程序流程,回答问题
第1题
【考查知识点】
函数调用、参数传递、调试
【项目内容】
用辗转相除法求最大公约数,并利用最大公约数求最小公倍数。
已经有如下正确的程序了,请为该程序建立控制台工程,然后按照要求进行测试和调试。
#include
usingnamespacestd;
intmain()
{
intgcd(int,int);
intlcm(int,int,int);
intm,n,g,l;
cin>>m>>n;
g=gcd(m,n);
cout<<"G.C.D="< l=lcm(m,n,g); cout<<"L.C.M="< return0; } intgcd(intu,intv) { intt,r; if(v>u) { t=u; u=v; v=t; } while((r=u%v)! =0) { u=v; v=r; } return(v); } intlcm(intu,intv,inth) { return(u*v/h); } 【方案设计】 请根据课件中关于辗转相除法的相关内容,理解辗转相除法的执行过程。 并画出gcd函数的流程图。 【实验(实训)过程】(步骤、记录、数据、程序等) (1)测试: 请拟5组数据,比如m=100,n=105等等,运行上面的程序,初步测试该程序是否正确。 对每组数据,写出程序的输出结果,判断输出结果是否正确。 回答: 289 G.C.D=1 L.C.M=252 36 G.C.D=3 L.C.M=6 1525 G.C.D=5 L.C.M=75 114 G.C.D=1 L.C.M=44 228 G.C.D=2 L.C.M=88 (2)调试: 对下面每组数据,通过调试,给出每个步骤后,m、n(或u、v)变量的值。 提示1: 调试方法,在cin语句处插入一个断点,进行调试,如下图所示。 然后单步运行(stepover),输入两个数据m和n。 提示2: 当运行到g=gcd(m,n);这条语句处时,点击调试工具条上的StepInto按钮,进入到gcd函数中进行调试。 1)输入数据为m=18,n=33,请回答: main函数中: m的值是: 18 n的值是: 33 gcd函数中: uv 进入到gcd时: 执行完if语句后: 3318 第一次while循环执行之后: 1815 第二次while循环执行之后: 153 … main函数中: gcd函数的返回值是: 3 赋值后变量g的值是: 3 赋值后变量l的值是: 198 2)输入数据为m=10,n=16,请回答: main函数中: m的值是: 10 n的值是: 16 gcd函数中: uv 进入到gcd时: 执行完if语句后: 1610 第一次while循环执行之后: 106 第二次while循环执行之后: 64 main函数中: gcd函数的返回值是: 2 赋值后变量g的值是: 2 赋值后变量l的值是: 80 【结论】(结果、分析) 无 实验任务二给出程序,记录编译、连接错误,并进行调试与运行。 (或者为程序填空题,简答题等) 第1题 【考查知识点】 函数的定义及调用、素数的判定、while循环的使用 【项目内容】 2005年秋浙江省高等学校计算机等级考试试卷(二级C),试题三程序填空题第2题有改动。 读入一批正整数(以零或负数表示结束),输出其中的素数。 函数prime(m)用于判断m是否为素数。 素数就是只能被1和自身整除的正整数,1不是素数,2是素数。 提示: 读入一批正整数(以零或负数表示结束)的含义是,在一次运行过程中,可以连续进行判断,每输入一个正整数,回车,判断该正整数是否为素数,再输入下一个数,判断。 直到输入的数为0或者为负数时,结束判断。 #include #include usingnamespacestd; intmain() { intx; intprime(intm); cin>>x; while( (1)) { if(prime(x))cout<<"prime"< elsecout<<"notprime"< cin>>x; } return0; } intprime(intm) { intk,n,res;//res为0表示不是素数,为1表示是素数 if(m==1)return0; res=1; n=(int)sqrt(m); for(k=2;k<=n;k++) { if(m%k==0) { (2); break; } } return(3); } (1)A、x<0B、x>=0C、x<=0D、x>0 (2)A、res=1B、res=0C、res=-1D、res=2 (3)A、1B、resC、0D、-1 【方案设计】 (1)请填写你选择的答案。 DBB (2)选择好答案后,为完整的程序建立控制台工程 【实验(实训)过程】(步骤、记录、数据、程序等) (1)如果你选择正确的话,那么输入以下数据,正确的运行过程是: 45↙ notprime 51↙ notprime 89↙ prime 7↙ prime 请测试你的程序是否正确 【结论】(结果、分析) 提示: 请记录该程序的运行过程: 输入输出。 比如: 123456↙(↙表示输入,如果没有输入,则没有这一行) a+b=579(输出) 并尽可能对程序的执行结果进行分析。 □ 11 prime 67 prime 45 notprime 4 notprime -5 第2题问答题 【考查知识点】 带默认参数的函数 (1)在带有默认参数的函数中,指定默认值的参数必须放在形参表列中的最右端,否则出错。 为什么? ? ? 回答: 实参与形参的结合是从左至右顺序进行的,第1个实参必然与第1个形参结合,第2个实参必然与第2个形参结合······ (2)在使用带默认参数的函数时,应当在什么时候给出参数的默认值,在定义时还是在声明时? 回答: 如果函数的定义在调用之前,在定义时给出参数的默认值。 如果函数的定义在调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明时给出参数的默认值。 (3)一个函数不能既作为重载函数,又作为有默认参数的函数。 为什么? 回答: 因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行。 实验任务三给出程序,要求给出程序运行结果、回答问题,或者设计测试数据等。 第1题 【考查知识点】 自动变量、静态局部变量、函数定义及调用、参数传递 【项目内容】 05~06学年《程序设计基础》课程期末考试四程序分析第1题 #include usingnamespacestd; intf(inta) { autointb=0; staticintc=3; b=b+1; c=c+1; returna+b+c; } intmain() { inta=2,i; for(i=0;i<3;i++) cout< cout< return0; } 【方案设计】 为该程序建立控制台工程。 【实验(实训)过程】(步骤、记录、数据、程序等) (1)请给出程序的输出结果 回答: (2)请分析每次函数调用后b和c的值分别是多少 f函数中: bc 第一次执行完函数f中的语句后: 14 第二次执行完函数f中的语句后: 15 第三次执行完函数f中的语句后: 16 (3)请根据这道题,总结静态局部变量的含义。 回答: 函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。 【结论】(结果、分析) 无 第2题 【考查知识点】 求余、取整数各位上数字的方法、函数定义及调用 【项目内容】 2005年秋浙江省高等学校计算机等级考试试卷(二级C),试题五程序阅读题第4题,有改动 下面的程序是实现: 输入一个正整数,统计该正整数的各位数字中,0出现了几次,1出现了几次,…。 如没有出现,则不输出该位数字的信息。 #include usingnamespacestd; intf(intnumber,intdigit) { intcount=0; while(number! =0) { if(number%10==digit) count++; number=number/10; } returncount; } intmain() { unsignedintnum; cin>>num; for(inti=0;i<=9;i++) if(f(num,i)! =0) cout< "< return0; } 【方案设计】 为该程序建立控制台工程。 【实验(实训)过程】(步骤、记录、数据、程序等) (1)请拟5个正整数,尽量大一点,但不要超出unsignedint所表示的范围。 然后运行程序,输入每个正整数,记录各自的输出。 回答: 355455 3: 1 4: 1 5: 4 587011100 0: 3 1: 3 5: 1 7: 1 8: 1 65541055 0: 1 1: 1 4: 1 5: 4 6: 1 6677545 4: 1 5: 2 6: 2 7: 2 67787676 6: 3 7: 4 8: 1 (2)请分析f函数中while循环的功能,并画出流程图。 while(number! =0) { if(number%10==digit) count++; number=number/10; } 回答: 【结论】(结果、分析) 无 实验任务四根据题目说明,编程实现并进行程序调试 第1题 【考查知识点】 函数的的定义及调用,if语句 【项目内容】 完成课后第2题。 其中对应于b2-4ac大于0、等于0和小于0的3个函数名分别为greater_than_zero、equal_to_zero和smaller_than_zero,函数的参数和返回类型自己编写。 提示: 3个系数a、b、c是在main函数中通过键盘输入的,然后需要判断b2-4ac的大小来调用相应的求根函数。 【方案设计】 提示: 请在此粘贴你的完整程序。 □ #include #include usingnamespacestd; floatd,p,q,x1,x2; intmain() { voidgreater_than_zero(float,float); voidequal_to_zero(float,float); voidsmaller_than_zero(float,float); floata,b,c; cin>>a>>b>>c; d=b*b-4*a*c; if(d>0) {greater_than_zero(a,b); cout<<"x1="< elseif(d=0) {equal_to_zero(a,b); cout<<"x1="< else{smaller_than_zero(a,b); cout<<"x1="< cout<<"x2="< } return0; } voidgreater_than_zero(floata,floatb) {x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); } voidequal_to_zero(floata,floatb) { x1=x2=(-b)/(2*a); } voidsmaller_than_zero(floata,floatb) { p=-b/(2*a); q=sqrt(-d)/(2*a); } 【实验(实训)过程】(步骤、记录、数据、程序等) 提示: 请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手)。 □ 回答: 【结论】(结果、分析) 提示: 请记录该程序的运行过程: 输入输出。 比如: 123456↙(↙表示输入,如果没有输入,则没有这一行) a+b=579(输出) 并尽可能对程序的执行结果进行分析。 □ 567341 x1=-0.0299824+0i x2=-0.0299824-0i 第2题 【考查知识点】 函数的的定义及调用,for语句 【项目内容】 完成课后第4题。 【方案设计】 提示: 请在此粘贴你的完整程序。 □ #include usingnamespacestd; intmain() { intfac(intn); inta,b,c,f; cin>>a>>b>>c; f=fac(a)+fac(b)+fac(c); cout< return0; } intfac(intn) {ints=1; for(inti=1;i<=n;i++)s=s*i; return(s); } 【实验(实训)过程】(步骤、记录、数据、程序等) 提示: 请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手)。 □ 回答: 【结论】(结果、分析) 提示: 请记录该程序的运行过程: 输入输出。 比如: 123456↙(↙表示输入,如果没有输入,则没有这一行) a+b=579(输出) 并尽可能对程序的执行结果进行分析。 □ 479 367944 第3题 【考查知识点】 函数的的定义及调用,库函数的调用 【项目内容】 完成课后第5题。 提示: 写一个函数e(x)用来求ex,其中需要调用 【方案设计】 提示: 请在此粘贴你的完整程序。 □ #include #include usingnamespacestd; intmain() { doublee(doublex); doublex,sinh; cin>>x; sinh=(e(x)-e(-x))/2; cout<<"sinh="< return0; } doublee(doublex) {returnexp(x);} 【实验(实训)过程】(步骤、记录、数据、程序等) 提示: 请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手)。 □ 回答: 【结论】(结果、分析) 提示: 请记录该程序的运行过程: 输入输出。 比如: 123456↙(↙表示输入,如果没有输入,则没有这一行) a+b=579(输出) 并尽可能对程序的执行结果进行分析。 □ 3.2 sinh=12.2459 第4题 【考查知识点】 函数的的定义及调用,do-while语句 【项目内容】 完成课后第6题。 提示: 牛顿迭代法的公式是 ,设迭代到 时结束。 其中 f(x)的导数 。 用牛顿迭代法求根的函数solut的算法如下: do {x0=x; 计算函数f(x0)的值; 计算函数f(x0)的导数f’(x0)的值; 计算近似根x=x0-f(x0)/f’(x0); }until( ) 输出近似根x; 【方案设计】 提示: 请在此粘贴你的完整程序。 □ #include #include usingnamespacestd; intmain() {doublesolut(double,double,double,double); doublea,b,c,d; cin>>a>>b>>c>>d; cout<<"x="< return0; } doublesolut(doublea,doubleb,doublec,doubled) {doublex=1,x0,f,f1; do {x0=x; f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c; x=x0-f/f1; } while(fabs(x-x0)>=1e-5); return(x); } 【实验(实训)过程】(步骤、记录、数据、程序等) 提示: 请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手)。 □ 回答: 【结论】(结果、分析) 提示: 请记录该程序的运行过程: 输入输出。 比如: 123456↙(↙表示输入,如果没有输入,则没有这一行) a+b=579(输出) 并尽可能对程序的执行结果进行分析。 1234 x=-1.65063 第5题 【考查知识点】 递归函数的定义及调用 【项目内容】 完成课后第8题。 提示: 课本有印刷错误。 正确的n阶勒让德多项式如下: 【方案设计】 提示: 请在此粘贴你的完整程序。 □ #include #include usingnamespacestd; intmain() {intx,n; floatp(int,int); cin>>n>>x; cout<<"n="< cout< return0; } floatp(intn,intx) {if(n==0) return (1); elseif(n==1) return(x); elseif(n>=1) return(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n);} 【实验(实训)过程】(步骤、记录、数据、程序等) 提示: 请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手)。 □ 回答: 【结论】(结果、分析) 提示: 请记录该程序的运行过程: 输入输出。 比如: 123456↙(↙表示输入,如果没有输入,则没有这一行) a+b=579(输出) 并尽可能对程序的执行结果进行分析。 □ 46 n=4,x=6 5535.38 第6题 【考查知识点】 递归函数的定义及调用 【项目内容】 完成课后第11题。 提示: 可以将求值的式子表示如下,即递归公式: 【方案设计】 提示: 请在此粘贴你的完整程序。 □ #include usingnamespacestd; intmain() {intf(int); inta,n; cin>>n; a=f(n);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言实验四 函数与预处理 语言 实验 函数 预处理