《最新C++程序设计课程实践报告.docx》由会员分享,可在线阅读,更多相关《最新C++程序设计课程实践报告.docx(118页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC+程序设计课程实践报告C+程序设计课程实践报告中南大学化学化工学院C+语言程序设计实验报告专业班级:姓名: 学号: 同组人员:指导教师:完成日期:目录第一题(必做)31. 题目32. 系统功能模块结构图43. 数据结构设计及说明(程序)54. 程序结构(流程图)105. 各模块的功能156. 运行结果16第二题(必做)211. 题目212. 数据结构设计及说明(程序
2、)213. 程序结构(流程图)244. 运行结果25第三题(选做)26第四题(选做)261. 题目262. 系统功能模块结构图273. 数据结构设计及说明(程序)274. 程序结构(流程图)305. 各模块的功能316. 运行结果31总结及参考文献35第一题一、题目:使用菜单选择趣味程序 菜单是应用程序的界面,控制语句用来改变程序执行的顺序,是实现结构化设计的基础。 本题的任务是设计一个比较实用的菜单,通过菜单选择不同的功能。 本题的设计分两步:(1)先设计一个含有多个菜单项的菜单演示程序;A、菜单内容:程序运行后,给出六个菜单项的内容和输出提示1、FindNum2、FindRoot3、Det
3、ective4、Bear5、Curve6、YearDay7、Goodbye!B、设计要求:使用数字1-7来选择菜单项,其他输入则不起作用。(2)再为上述菜单项配上相应的功能,即以上述菜单的设计为基础,增加菜单项的处理功能。菜单设计要求(这是6道编程题,要求在运行菜单时,能给出每个程序的运行结果):1、FindNum有0、1、2、3、4、5、6、7、8、9十个数,按要求填入下列算式中,要求每个数只使用一次,首位数不能为零,输出时显示所有可能的组合并统计个数。 + = 2、FindRoot求方程在区间-8,8内的全部实根。3、Detective这是一个侦探题,有一辆汽车撞人后跑了,4个目击证人提供
4、如下线索:牌照三、四位相同;牌号为31xxxx;牌照五、六位相同,三到六位是一个整数的平方。4、Bear有一只狗熊到玉米地里吃玉米,一边掰一边吃。第一天吃了一半,又拿走一个回去喂小熊。第二天又去吃了剩下的一半,走是仍带走一个回去喂小熊。以后每天都吃前天剩下的一半,拿走一个。到第十天,地里只剩下一个玉米。求地里一共有多少玉米。5、Curve(可选作)绘制一条滴定曲线(已知是0.1000mol/L的氢氧化钠滴定20.00mL同浓度的盐酸)。曲线如图所示。此题可以根据所给曲线大致形状,运用常规的编制图形的方法来绘制。也可根据下面所列的方程式来绘出滴定曲线。其中H为氢离子浓度,cHCl为盐酸浓度,Kt
5、=1014.00,a为滴定分数(令a在02范围内取值,步长为0.001),Vb为氢氧化钠加入到盐酸中的瞬时浓度。6、YearDay已知2000年1月1日为星期六,请输入任一年的年份后,打印该年的年历。7、Goodbye!这里除了输出一个信息外,还必须结束程序运行。二、系统功能模块结构图:主调main函数启动DetectiveFindnumCurveGoobye!BearFindrootYearday三、数据结构设计及说明(程序):#include#include using namespace std;#define YES 1 /* 定义符号常数“是” */#define NO 0 /* 定
6、义符号常数“否” */void FindNum() /函数1intA,B,C,N,M,O,a,b,c,d,e,f,g,h,i,j,mm=0;cout符合条件的组合是:; for(A=1000;A=9999;A+) for(B=100;B=999;B+) for(C=100;C=999;C+) /多层循环对可能的数字进行组合 N=A;a=N/1000;N=N%1000; b=N/100;N=N%100; c=N/10;N=N%10; d=N; M=B;O=C; e=M/100;M=M%100; f=M/10;M=M%10; g=M; h=O/100;O=O%100;i=O/10;O=O%10;
7、j=O; /提取出各位数字 if(a!=b)&(a!=c)&(a!=d)&(a!=e)&(a!=f)&(a!=g)&(a!=h)&(a!=i)&(a!=j)&(b!=c)&(b!=d)&(b!=e)&(b!=f)&(b!=g)&(b!=h)&(b!=i)&(b!=j)&(c!=d)&(c!=e)&(c!=f)&(c!=g)&(c!=h)&(c!=i)&(c!=j)& (d!=e)&(d!=f)&(d!=g)&(d!=h)&(d!=i)&(d!=j)&(e!=f)&(e!=g)&(e!=h)&(e!=i)&(e!=j)&(f!=g)&(f!=h)&(f!=i)&(f!=j)&(g!=h)&(g!
8、=i)&(g!=j)&(h!=i)&(h!=j)&(i!=j)&(A=B+C)/判断各位数字不相等,并且符合题意等式要求 cout B+C=Aendl;mm+; cout共有组合个数:mm;/输出组合的个数voidFindRoot()float i,j,k,s1,s2,s;for(i=-8;i=7;i+) j=i+1;s1=i*i*i-3*i-1;s2=j*j*j-3*j-1;if(s1*s20)dok=(i+j)/2; s=k*k*k-3*k-1;if(s1*s=1e-6);/利用数学函数对输出的解进行精度控制cout方程的实根为:kendl;void Detective() inta,A,
9、i,j;for(i=0;i=9;i+) for(j=0;j=9;j+)/车牌后四位的排列组合 for(a=0;a100;a+)/对所有可能的数字进行平方,为之后的比较做准备 A=1000*i+100*i+10*j+j;/算出车牌后四位数的数学值if(a*a=A)cout车牌号为31iijjendl; void Bear()int day=10, x1, x2=1;cout有一只狗熊到玉米地里吃玉米,一边掰一边吃.endl;cout第一天吃了一半,又拿走一个回去喂小熊。endl;cout第二天又去吃了剩下的一半,走是仍带走一个回去喂小熊。endl;cout以后每天都吃前天剩下的一半,拿走一个。到
10、第十天,地里只剩下一个玉米。求地里一共有多少玉米。0)/循环直到时间的始端0 x1=(x2+1)*2;/前一天的数量是后一天加一的两倍x2=x1; day-;/天数递减,倒退 cout玉米田里共有玉米x1个endl;intisleap(int year)/* 函数isleap(): 判断某年是否闰年 */int leap = NO;if(year%4=0 & year%100!=0 )| year%400=0)leap = YES;return leap;/* 函数week_of_newyears_day(): 求元旦是星期几 */intweek_of_newyears_day(int yea
11、r)int n = year-1900; n = n+(n-1)/4+1; n = n%7;return n;intYearDay()int year, month, day, weekday, len_of_month, i; coutyear; /*因为你的要求是已知2000年1月1日是星期六,所以这里不用week_of_newyears_day去求星期六了*/ weekday = week_of_newyears_day(year); /* 求元旦是星期几 */coutyear年endl; /* 打印年份 */ for(month=1; month=12;month=month+1) /
12、* 打印12个月的月历 */ coutmonth月endl;cout-endl;cout星期日星期一星期二星期三星期四星期五星期六endl;cout-endl; for(i=0;iweekday;i=i+1) /* 找当月1日的打印位置 */cout ;if(month=4 | month= 6 | month=9 | month=11)len_of_month = 30;else if(month=2) if(isleap(year)len_of_month = 29;elselen_of_month = 28; elselen_of_month = 31; for(day=1;day=le
13、n_of_month;day=day+1)/* 打印当月日期 */ coutday;if(day10) cout ;elsecout ;weekday = weekday+1; if(weekday=7) /* 打满一星期应换行 */ weekday = 0;coutendl; coutendl; /* 打完一月应换行 */ return 0;int main() int N;cout-趣味选择菜单程序-endl;cout1.FindNumendl;cout2.FindRootendl;cout3.Detectiveendl;cout4.Bearendl;cout5.Curve(不可使用)en
14、dl;cout6.YearDayendl;cout7.Goodbyeendl;/输出菜单内容coutN;if(N0&N8)switch(N) case 1:FindNum();coutendl; return main();/重新返回主函数,即可重新开始菜单选择case 2:FindRoot();coutendl;return main();case 3:Detective();coutendl;return main();case 4:Bear();coutendl;return main(); case 5:coutsorry,该程序未编写endl;return main();case 6
15、:YearDay();coutendl;return main();case 7:coutGoodbye!endl;cout-谢谢使用-endl; else cout输入错误,请输入17的整数endl;return main(); 四、程序结构(流程图):*主菜单程序结构图:输出菜单及提示信息12346其它7Findnum()Findroot()Detective()Goodbye!结束输入错误Yearday()Bear()数字判断开始5Curve()*分程序结构图:1、findnum开始A=1000B=999B=100B+C+判断各位数字是否相同,等式是否成立C=100A+结束FalseFa
16、lseFalsetureC=999A=9999tureture开始2、findroot:i=7j=i+1;s1=i*i*i-3*i-1s2=j*j*j-3*j-1;s1*s20k=(i+j)/2; s=k*k*k-3*k-1s1*s=1e-6Flase输出符合的根i+a*a=A输出车牌开始i=0j=9j=0j+a+A=1000*i+100*i+10*j+ja=0i+结束FalseFalseFalseturea100i=93、detectiveturetureture4、Bear:开始bear()n=10bear(10)=1returnn=92*bear(10)+1returnn=82*bear
17、(9)+1returnn=22*bear(3)+1returnn=32*bear(4)+1returnn=12*bear(2)+1return结束并返回值5、Curve输出sorry(此题未编写结束开始6、yearday:开始输入年份按闰年方式打印年历判断是否闰年计算各月天数,打印年历结束,返回主菜单7、goodbye输出goodbye菜单程序结束开始五、各模块的功能:一、main输出菜单格式,并指向个分程序二、1、FindNum有0、1、2、3、4、5、6、7、8、9十个数,按要求填入下列算式中,要求每个数只使用一次,首位数不能为零,输出时显示所有可能的组合并统计个数。 + = 2、Find
18、Root输出方程在区间-8,8内的全部实根。3、Detective解出侦探题:有一辆汽车撞人后跑了,4个目击证人提供如下线索:牌照三、四位相同;牌号为31xxxx;牌照五、六位相同,三到六位是一个整数的平方。4、Bear有一只狗熊到玉米地里吃玉米,一边掰一边吃。第一天吃了一半,又拿走一个回去喂小熊。第二天又去吃了剩下的一半,走是仍带走一个回去喂小熊。以后每天都吃前天剩下的一半,拿走一个。到第十天,地里只剩下一个玉米。求出地里一共有多少玉米。5、Curve 输出sorry(此题未编写)6、YearDay已知2000年1月1日为星期六,输入任一年的年份后,可打印该年的年历。7、Goodbye!这里
19、输出“Goodbye!-谢谢使用-”,且结束程序运行。六、运行结果:程序运行后,显示菜单内容和输出提示 (1)Findnum(2)Findroot(3)Detective (4)Bear (5)Curve(6)YearDay(7)Goodbye(8)输入错误数字时第二题一、题目: 输出一份元素周期表; 要求有原子序数和元素符号; 在输入原子序数或元素符号时,能相应的输出元素符号或原子序数 二、数据结构设计及说明(程序):1.对于此程序,需要在运行时输出整个元素周期表,且对应有相应的原子序数和元素符号,且具有查找功能,即输入原子序数或元素符号时,能相应的输出元素符号或原子序数。2.程序:#inc
20、lude #include using namespace std;void main()char *a=H,He,Li,Be,B,C,N,O,F,Ne,Na,Mg,Al,Si,P,S,Cl,Ar,K,Ca,Sc,Ti,V,Cr,Mn,Fe,Co,Ni,Cu,Zn,Ga,Ge,As,Se,Br,Kr,Rb,Sr,Y,Zr,Nb,Mo,Tc,Ru,Rh,Pd,Ag,Cd,In,Sn,Sb,Te,I,Xe,Cs,Ba,La,Ce,Pr,Nd,Pm,Sm,Eu,Gd,Tb,Dy,Ho,Er,Tm,Yb,Lu,Hf,Ta,W,Re,Os,Ir,Pt,Au,Hg,Ti,Pb,Bi,Po,At,Rn,Fr
21、,Ra,Ac,Th,Pa,U,Np,Pu,Am,Cm,Bk,Cf,Es,Fm,Md,No,Lr,Rf,Db,Sg,Bh,Hs,Mt,Uun,Uuu,Uub;int b=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,
22、76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112;inti,j,k=1,l=1;for(i=0;i7;i+) for(j=0;j18&k0&j0&i1&j12)cout ;else if(i=5&j=2) cout57-71 ;k=72;else if(i=6&j=2) cout89-103 ;k=104;/镧系锕系分行else coutbk-1 ;k+;coutendl;for(j=0;j18&l
23、0&j0&i1&j12)cout ;else if(i=5&j=2) coutLa-Lu ;l=72;else if(i=6&j=2) coutAc-Lr ;l=104;else coutal-1 ;l+; coutendl; coutendl; for(i=57;i72;i+)coutbi-1 ;coutendl;for(i=56;i71;i+)coutai ;coutendl;coutendl;for(i=89;i104;i+)coutbi-1 ;coutendl;for(i=88;i103;i+)coutai ;coutendl;coutendl;cout请选择:1.退出;2.输入原子序
24、数找对应元素;3.输入元素找对应原子序数j;if(j=1)cout退出!endl;else if(j=2)intk;coutendl;coutk;if(k0)&(k=112)for(i=0;i112;i+)/通过循环找到对应序数的对应元素if(k=bi)cout该原子序数对应的元素:aiendl;else if(j=3) char m4,*n;coutendl;coutm; for(i=0;i112;i+)/通过循环找到对应元素的对应序数 n=ai;if(strcmp(n,m)=0)/ strcmp函数比较字符是否相同,相同返回非0 值cout该元素对应的原子序数:biendl;运用数组和fo
25、r语句循环输出整个元素周期表,且使元素与其元素符号和元素序数相对应,便于下面元素查找。3. 通过if语句输入的是原子序数还是元素符号,再通过for语句与之对应的元素符号或序数并输出。三、程序结构(流程图):开始输入元素周期表输出菜单输入数字231输入元素找对应原子序数输入原子序数找对应元素退出结束输入原子序数找对应元素四、运行结果:1、输出周期表2、按原子序数查找元素符号3、元素符号查找原子序号第三题(选做)对学生的成绩信息进行管理。学生信息包括:学号、姓名、学期、每门课程的成绩、平均成绩、名次。实现:学生信息的录入;修改;删除和查询,按学期、学号、成绩不及格等查询。第四题(选做)一、题目:小
26、学生数学测试软件的编写要求:(1)可选择题型(+,-,*,/);(2)可选择每次答题的个数;(3)随机生成两个数进行运算;(4)每次在输入答案后应判断对错,若答案错误,应给出正确答案;(5)最后给出做对题目的总个数。注意:产生随机数的方法使用随机数函数二、系统功能模块结构图:主调main函数加法计算减法计算乘法计算除法计算三、数据结构设计及说明(程序):#include using namespace std;int main()inti,j,k,R=0,n;cout小学数学测试endl;cout请选择想测试的题型:1.+ 2.- 3.* 4./i;if(i=1) coutj; for(int
27、 n=0;nj;n+)/循环j次,产生j个题目 int x1=rand()%100;int x2=rand()%100; /产生任意两正整数随机函数coutx1+x2k;if(k=x1+x2) cout回答正确!endl; R+;/正确个数递加 elsecout回答错误!正确答案为:x1+x2endl; else if(i=2) coutj;for(int n=0;nx2 coutx2-x1k;if(k=x2-x1) cout回答正确!endl; R+; elsecout回答错误!正确答案为:x2-x1endl; else if(i=3) coutj;for(int n=0;nj;n+) in
28、t x1=rand()%100;int x2=rand()%100; /产生任意非0整数随机函数coutx1*x2k;if(k=x1*x2) cout回答正确!endl; R+; elsecout回答错误!正确答案为:x1*x2endl; else if(i=4) coutj;for(int n=0;nj;n+) int x1=rand()%100+1;/产生正整数int x2=x1*(rand()%10); /产生可被X1整除的非负整数coutx2/x1k;if(k=x2/x1) cout回答正确!endl; R+; elsecout回答错误!正确答案为:x2/x1endl; cout这次测
29、试你回答正确的题目的个数为R个endl; coutn; if(n=1) cout下面开始重新测试endl; return main();/返回main函数,重新开始测试return 0; 四、程序结构(流程图):01结束3214-/*+开始输出菜单及提示信息数字判断正确个数数字判断结束进行四则运算n+,R+Rnj?开始题目数j生成两个随机数五、各模块的功能:1、由main函数指向四个运算2、进行加减乘除四则运算六、运行结果:1、输出题头2、加法运算3、减法运算4、乘法运算5、除法运算6、退出:输出答对正确题目的个数总结及参考文献:这次实践使我认识到了C+程序设计是一门实践性很强的学科,我们学校
30、C+不仅仅是为了学习而学习,还能锻炼我们的创新能力,合作精神等等,我们不仅要按照要求完成作业,还要在设计时加上自己的想法及理解,开始是以为做着会很简单,但真正做的时候才发现真的很不容易,要完成这项工作真的要耐心,细心的去分析,设计。我们小组根据题目经过研讨会后明确的进行了分工。不得不说这一题很繁琐,因为需要很多信息的输入与查询,但是在做的过程中则发现其实规律性很大,慢慢的就会感到轻松,不在会觉得枯燥,但是在编程之后的调试又遇到了问题,那么长的程序不可避免的会遇到错误,在改得过程中则不再有规律性可言,要慢慢的分析,有的地方实在理解不了要去查书,问同学,一处处的去修改,经过无数次的调试及修改,我终
31、于完成了这次编程。我深刻的体会到编程的艰辛与困难,确实,实践是检验真理的唯一标准。之前学习C+时,大部分时间都用在听课和看书上,即使上机也是一些简单的程序设计,所以缺少了亲自去动手编写程序的经历,对C+程序设计并不熟练,对一些基础知识也只是机械式的记忆,并没有什么深刻的印象。但是在这次编写程序过程中,出现的许多错误,令我对书本有了更加深刻的印象,那么多的错误有的是因为自己的不小心,少了标点,设置错误的变量类型,但是通过自己的反复检查,这些简单的错误在后来的编程中较少出现,可见C+的实践可以加深对书本的理解及记忆,对于错误的修改也让我体会到细节的重要性。 这么大型的程序我是第一次编写,但是完成之后我明白了,其实大型的程序并没有想象中的那么复杂,它们也是由一个个的小程序组合而成的看到自己的劳动成果真的很高兴,之前的烦躁也变得是那么值得,这次的编程对我的耐心真的是一次很大的锻炼,平时我们学C+程序设计语言几乎都是为了考试或者做一些比较常规的题目,而这次程序设计实践却给我们的将所学知识运用于解决实际问题的机会,让人更有激
限制150内