《计算机实训C报告.docx》由会员分享,可在线阅读,更多相关《计算机实训C报告.docx(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、上盅协加学院综合实验报告课程名称:计算机基础综合实验(2)姓名:沈超班级:BQ1001学号:101008090120指导教师:杨立勤目录21目的与要求11. 1计算机基础综合实验(2)目的1L 2计算机基础综合实验(2)的基本内容和要求12问题描述32. 1变增求和(第40题)32. 2裁判打分(第4题)32. 3规则验证(第12题)32. 4可逆素数(第36题)42. 5哲集实盖(第16题)42. 6整数求积(第13题)53系统使用的主要函数64详细设计84.1程序总体结构图84. 2程序流程图105功能测试165. 2变增求和(第40题)165.3 裁判打分(第4题)175.4 规则验证(
2、第12题)175.5 可逆素数(第36题)185.6 哲集实盖(第16题)195.7 整数求积(第13题)196程序设计调试情况分析227计算机基础综合实验(2)小结24参考文献25附录系统源程序(源代码需有足够的注释)26LMkz 目录.c262 .变增求和.h283 .裁判打分.h294 .规贝ij验证.h315 .可逆素数.h346 .哲集实盖.h367 .整数求积.h371目的与要求1.1计算机基础综合实验(2)目的C语言程序设计是本科工科类各专业的重要基础课,主要学习程序设计的基本概念和方法,通过本门课程学习,使学生掌握C语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序
3、设计的思想和编程技巧。计算机基础综合实验(2)是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试作准备。L 2计算机基础综合实验(2)的基本内容和要求参加计算机基础综合实验(2)的学生,应当认真完成计算机基础综合实验(2)的全部内容。最终提交计算机基础综合实验(2)成果来证明其独立完成各种实际任务的能力。从而反映出理解和运用本课程知识的水平和能力。具体如下:1 .代码编写规范,形成良好的编程习惯;2 .程序须有一定的健壮性和必要的提示信息,考虑问题
4、的多种可能和边界数据。3 .提交计算机基础综合实验(2)报告电子稿、装订的打印稿。计算机基础综合实验(2)报告内容包括以下几个方面: 程序的总体设计和算法分析。 程序流程图、函数说明 源程序代码清单 测试数据和测试过程记录 遇到的问题及解决方法分析 计算机基础综合实验(2)小结4.程序运行方式构建一个简易菜单,形如::1;盲用户通过输入数值选择所需运行的子程序,当一个子程序运行结束后回到菜单界面,直至用户输入0后退出程序。2问题描述2.1 变增求和(第40题)编写程序计算并输出:1+12+123+1234+的前n(设0n10)项的和, n从键盘输入。例如输入:3,则输出:136又如输入:6,则
5、输出:137171分析:创建一个for循环语句,将1n (n为从键盘输入的数)按循环内的运算规则累及求和2.2 裁判打分(第4题)编写一个程序实现如下功能:有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号。裁判员号及其所打分数从键盘输入,假设裁判员号为整数,所打分数为实数。分析:定义三个整形数组,一个存放8位裁判的号码,第二个存放8位裁判打的分数,最后一个数组备份第二个数组,存放最初的分数排放情况;用冒泡排序法将第二个数组中的元素升序排列,去掉一个最低分和一个最高分后求出平均分,和第三个数组中的元素求差再一一比较差值,得到
6、要求的裁判员号2.3 规则验证(第12题)编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174o 要求如下(下面的函数名为建议函数名): 用函数int INE(int number)检杳输入的整数number各数码是否互不相等,全相等返回值为1否则为0; 用函数void ntos(int number, int c)把四位数整数number各位数码分别存入数组c 用函数void sort (int a)对4个元素的数组a排序(升序或降序都可以);由
7、输入整数分解排序后的数组得到最大值和最小值:int getmax(int a)返回值为最大值int getmin(int b)返回值为最小值分析:编写4个子函数,分别实现以下功能:INE-检查输入的整数各数字是否互不相等,全相等返回值为1否则为0; getmax-将4个数字降序排序后返回4个数字能组成的最大值;getmin-返回4个数字能组成的最小值;ntos-把最大值与最小值的差值的各位数码分别存入数组,利用主函数调用4个子函数实现程序功能24可逆素数(第36题)编写程序输出1001000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素
8、数,它们是可逆素数。要求调用两个子函数实现。分析:创建一个名为prime的子函数,判断主函数传送的数是否为素数,并存放在整形数组中;再创建一个change函数,将prime函数所判断出的素数倒序排列构成新的数字,与整形数组中的元素一一比较,以此确定是否满足可逆素数的条件2.5 哲集实盖(第16题)编写函数int Troitsky(long a),其功能是求出1000000以内的所有Troitsky 数,并将它们依次放入a指向的数组中,函数返回找到的Troitsky数的个数。Troitsky数的定义:将该数的首位数字移动到末位数字之后得到的数是原数的整数倍。例如:将142857的首位数字1移动到
9、末位之后得到的数是428571,而428571=3*142857,因此142857是 Troitsky 数。分析:使用子函数Troitsky检验系统给出的数是不是Troitsky数,子函数内置双循环,外循环给出11000000的数,内循环判断新组成的数是否是原数的整数倍2.6 整数求积(第13题)建立一-个函数,其功能是:计算正整数num的各位上的数字之积。例如,若输入:252,则输出应该是:20。若输入:202,则输出应该是:0。分析:将正整数num的3位数字以运算语句分别截取出来赋值给三个整型变量,将三个整型变量相乘实现函数要求的功能3系统使用的主要函数3.1系统使用的主要函数表序号文件名
10、函数名函数功能说明1变量求和4O.hqiuhe()求出1+12+123+1234+的前 n(设0n10)项的和,n从键盘输入2裁判打分4.hdafen()计算并输出8位裁判为1个运动员打分的情况下,去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号3.1规则验证12.hINE()将输入的整数4位数字拆分下来存入数组,检查输入的整数各数字是否互不相等,全相等返回值为1,否则为03.2规则验证12.hgetmax()将整数的4位数字升序排序,并返回4位数字能组成的最大值3.3规则验证12.hgetmin()返回4位数字能组成的最小值3.4规则验证12.hntos ()
11、截取最大值与最小值的差值的各位数字并存入数组3.5规则验证12.hyanzhen()验证以下说法:输入一个四位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数减去最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174。4.1可逆素数36.hprime()求出1001000以内的素数,并存入数组4.2可逆素数36.hchange()将prime函数判断出的素数倒序重新排列构成一个新的数,把依旧为素数的数存入数组4.3可逆素数36.hsushu()输出1001000内的可逆素数5.1哲集实盖16.hTroitsky()判断系统给出的数是
12、否为Troitsky数,并将符合要求的数存入数组5.2哲集实盖16.hzjsk()求出1000000以内的所有Troitsky数6整数求积13.hqiuji()计算并输出正整数num的各位上的数字之积7Mkz目录.cmain()作为程序的入口4详细设计4.1程序总体结构图根据设计出如下“C语言实验演示系统”的主控模块。在主控模块中,只要在主函数main()前加入包含各子系统文件组成的头文件,我们就能方便的调用各子系统的函数了。图4.1主控模块子模块1:图4.2子模块1子模块2:图4.3子模块2子模块3:图4.4子模块3子模块4:图4.5子模块4子模块5:图4.6子模块5子模块6:图4.7子模块
13、6开始图4.8主控模块流程图开始图4.9模块1流程图int count=0J=0;图4.11模块6流程图5功能测试5. 1系统主界面1 .操作运行说明:打开主菜单,输入16运行子模块2 .运行主界面题主二二一13 5 0和证盖 号 求验卖出单 瑞集.菜 (您呆二择 三一遍5. 2变增求和(第40题)1 .操作运行说明:输入1,输出:1+12+123+1234+的前n(设0n - 二 MW0- 和证盖 “承 -求验突出”单 褊集“菜 二祗民二择 二 TT 二选-sw -* s -n-:二二一我即裁列为1个运动员打金则算并辑出去掉一个最高分和一个最低分后这个运动员的平均榔媛触位(黄华均芬糠判货号输
14、入8位裁判的号码:1123123342101924请各位裁判打分:10092989395969799平均分为96.33最接近的裁判是号再次输入菜单号或退出。一?):5.4规则验证(第12题)1 .操作运行说明:输入3,验证以下说法:输入一个四位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数减去最小数,构成i个新的4位数。反复以上运算,使其最终结果为:6174o2 .运行界面检过以下冒沫:掩入一个4位数.致个、耳、千住上教互不理等,比个、十、县去楼关穆口一个最汴激余关数-说嗷南京一不新曲位毅反复M 宅巢为:6174青输入一个各个位数不相同的四位
15、数:5197畲人数据正确.开始计算折能组成的最大值为9751所能组成的最小值为1579斫能组成的最大值为8721所能组成的最小值为1278所能组成的最大值为7443所能组成的最小值为3447所能组成的最大值为9963所能组成的最小值为3699所能组成的最大值为6642所能组成的最小值为2466所能组成的最大值为促41所能组成的最小值为67最后计算结果为“74再次输入菜单号或退出7):5.5可逆素数(第36题)1 .操作运行说明:输入4,输出1001000内的可逆素数2 .运行界面C课题演示系统,单1支增求和3现则%证曾第实盖1出nt 请选择菜单号。一6):4编写程序输出1001000内的可逆素
16、数101701311131941151191991113313733743983107907727337937967787797709919929179389199“”再次输入菜单号或退出g7:满足条件的可逆素数有:9713737573591813831677695.6哲集实盖(第16题)1 .操作运行说明:输入5,输出1000000以内的所有Troitsky数2 .运行界面C课题酝系统1专殖求和3电则验证5皙集实盖01B 出请选择菜单号(g6:57号函数int Troitskylong a1】,其功能是求出180080以内的所有Tro it sky数,并将它们G次蛛曷旨向的数组中.函数返回找
17、醐Te【tsky数的个数背足条件的Troitsky数有:142857285714“再次输入菜单号或退出07:5.7整数求积(第13题)1 .操作运行说明:输入6,输出正整数num的各位上的数字之积2 .运行界面c课题?!请选择菜单号86:6MzrRS-打幸于.*到逆曲屏.一割可轴蓄)M算正整数nue的各位上的数字之积;输入 T 三位正整数:519519-45=:再次输入菜单号或退出。一?:216程序设计调试情况分析设计第4题时,如何在升序排序后,将各位裁判的打分与平均分比较以此得出打分最接近平均分的裁判员的号码成了这答题的难点,后来通过将裁判最初的打分备份在另一数组中的方法,记录最初的打分的顺
18、序,来方便最后的比较;用一个整形数组a来记录输入的8位裁判员的号码,用数组b来记录各位裁判的打分。用冒泡法升序排序输入的成绩,方便计算平均分时去掉一个最低分和去掉一个最高分,使用 if(b|jbj+l)temp=b|j;b|j=b|j+l;b|j+l=temp;fi 合语句时,起到的是升序排序的功能,而使用 if(bj=8(即是原文中的N,使用预处理1命令#define N 8定义N=8)作为终止条件。考虑到求平均值和各个分数的差值时可能会出现负数,而使用fabs()命令行(在源文件中使用以下命令行:#include),将平均分与各位裁判所打的分数”比较,找出打分最接近的裁判的号码。设计第12
19、题时,用个主函数调用了四个函数,其中判断输入的四位数的存入数组可以提高程序的运行效率设计第16题时,难点在于对,一个数是不是Troitsky的判断,用语句:“nl=(n%100000)*10+n/100000”将系统给出的数的首位移到末位。循环语句“for(i=l;i10;i+)”的作用是判断新构成的数是不是原来数的整数倍,减少了循环的次数,提高程序的运行效率设计第36题时,主函数调用了两个子函数,子函数prime中,用系统给出的数i与2/间的数相除以判断i是否为素数,之所以用来终止循环而不是用i是因为乘法满足交换律,若i不能被整除,必也不能被i整除,以此减少程序的操作。7计算机基础综合实验(
20、2)小结通过这次计算机基础综合实验(2)为期一周的实训,我感到受益良多。首先是通过自己动脑动手解决6道C语言的程序编程题目,让我发现了许多以前被自己忽视的问题,就拿第36题来说,第36题的题意是让我们编写一个程序,程序的功能是从1001(X)0内筛选出可逆素数,可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数,并要求调用两个子函数实现。如果题目没有规定使用两个子函数的话,可能会减少挑战性和难度,我编写了两个子函数,在主函数中调用。一个命名为prime。,实现的功能是判断系统给出的数是不是素数,如果是素数就存入数组中;另一个子函数命名为
21、change。,用来将数组内的素数倒序排列,组成一个新的数,并和原数组内的元素一一比较,来确定新组成的数是不是素数。在prime。函数中,运用循环语句来筛选素数,起始语句为j=2,判断语句是启用j作为判断语句而不是用通常的j flash powerpoint等方面的知识,其中words文档的处理技术是当今社会办公室技术中举足轻重的一项,随着运用的欠缺和记忆的生疏,大部分技术已经被遗忘在记忆的音晃里了,这次按照要求修改和完善实训报告,使用了大量的words修改技术,让我生疏的记忆重新苏醒。最后感谢在这次实训中给予我帮助的老师和同学。参考文献书籍:百问百例C语言程序设计作者:主编匡松、副主编:何福
22、良、吴卫华、缪池春.书名:百问百例C语言程序设计.出版地:北京出版社:中国铁道出版社,出版年:2008.11书籍:c程序设计教程与实验作者:主编吉顺如、副主编:曾祥绪、陶恂.书名.c程序设计教程与实验.出版地:北京出版社:清华大学出版社,出版年:2011.6附录系统源程序(源代码需有足够的注释)1 .Mkz 目录.c#include #include #include #include #include include 变增求和4O.hinclude ”裁判打分4.h#include 规则验证12.hinclude 可逆素数36.hinclude ”哲集实盖16.hinclude 整数求积13
23、.hvoid main()(int choice,n=0;char ch;system(color 34);/*更改背影色和文本颜色*/ch=y;while (ch=yllch=Y)if(nl)printf(nttC课题演示系统);printf(ntt主菜单);printf(nntt*”printf(ntt*1-变增求和2-一裁判打分printf(Hntt*3一一规则验证4-一可逆素数*:printf(Mntt*5一哲集实盖6一整数求积printf(Mntt*0一,一退出7-一清屏*)printf(,nttt * t+*+*+*”printf(ntt=请选择菜单号(0-6):elseprint
24、f(n=再次输入菜单号或退出(07):);scanf(%d,&choice);n+;getchar();printf(n);switch(choice)(case Lprintf(编写程序计算并输出:1+12+123+1234+的前 n(设0n10)项的和nn);qiuhe();break;case2:printf(有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号nn);dafen();break;case 3:printf(验证以下说法:输入一个4位数,该数个、百、千位上数互不相等,由个、十、百、千位上的数组成一个最大数
25、和一个最小数,最大数-最小数,构成一个新的4位数.反复以上运算,使其最终结果为:6174nn);yanzhen();break;case 4:printf(编写程序输出1001000内的可逆素数n);sushu();break;case 5:printf(编写函数 int Troitsky(long a),其功能是求出1000000以内的所有Troitsky数,并将它们依次放入a指向的数组中,函数返回找到的 Troitsky 数的个数nn);zjsk();break;case 6:printf(计算正整数num的各位上的数字之积nn);qiuji();break;case 7:system(c
26、ls);break;/*实现清屏的功能*/case 0:ch=n;break;defaultprintf(菜单选择错误!请重新输入!);)2 .变增求和.h#includeqiuhe()(int n,i,m=0,p=0;printf(put in a number:);scanf(%d,&n);printf(n前n项的和为巧;for(i=l;i=n;i+)m=m*10+i;/*后一个数=前一个数的10倍+数的序号*/p=p+m;/*累积相加*/printf(b=%d,p);printf(n);3 .裁判打分.h#include#include#define N 8dafen()(int aN,
27、bN,cN;int i,j,temp,sum=0,k=0;float ave,tl,t2;printf(输入8位裁判的号码:);for(i=0;iN;i+)scanf(%d,&ai);printf(n请各位裁判打分:n);for(i=0;iN;i+)scanf(%d,&bi);ci=bi;/*将最初的分数排列方式备份以方便找出最接近的裁判员号*/for(i=0;i=N-2;i+)for(j =0;j bj+l)(temp=bj;bj=bU+l;bj4-l=temp;)for(i=l;iN-l;i+)sum+=bi;ave=sum/6.0;printf(nn 平均分为4.2(11”再丫);tl=
28、fabs(cO-ave);/*假设第一个裁判的打分最接近平均分,求差值*/for(i=l;it2)(temp=t 1;tl=t2;t2=temp;k=i;printf(nn最接近的裁判是(1号n”,ak);)4 .规则验证.h#includeintk4;int INE(int number)/刊金i正输入的四位数各位数字互不和I司*/(k0=number%10;kl=(number/l 0)%10;k2=(number/100)%10;k3=number/1000;if(k0=klllk0=k2llk0=k3llkl=k2llkl=k3llk2=k3)return(l);elsereturn(
29、O);)int getmax(int a)(int i,j,temp;for(i=0;iv3;i+)/*用冒泡法升序排序*/for(j=0;j3-i;j+)if(ajaU+l)temp=aj;a|j=a|j+l;aj+l=temp;)retum(aO*1000+a1*100+a2*10+a3);/*返回所能确定的最大值*/int getmin(int b)(retum(b3*1000+b2*100+bl*10+b0);void ntos (int number)/*截取 m- n /值的各位数*/(k01=number%10;k1=(number/l 0)%10;k2=(number/100)
30、%10;k3=number/l 000;yanzhen()(int num,m,n,flag=l;printf(请输入一个各个位数不相同的四位数while(flag) scanf(n%d&num);flag=INE(num);if(flag)printf(un输入错误!请从新输入n);elseprintf(nn输入数据正确,开始计算nH);)do(m=getmax(k);printf(un所能组成的最大值为dn”,m);n=getmin(k);printf(un所能组成的最小值为dn”,n);ntos(m-n); while(m-n)!=6174);printf(nn最后计算结果为dn”,mn
31、);5 .可逆素数.h#include#includeint prime(int a,int k)(int i,j;for(i=100;i=1000;i+)for(j=2;jsqrt(i);j+)/*由于乘法满足交换律,为了提席程方:的效率而将 j的终止条件定为jsqrt(i),也可以定为jsqrt(i)ak+=i;return k;)int change(int a,int k)(int i,t,b,c,s,j,n=k+l;for(i=0;ik;i+)t=ai/100;b=ari%100/10;c=ai%10;s=100*c+10*b+t;/*将找出的素数倒序构成新的数*/for(j=0;j
32、k;j+)/*在prime函数找113的/字放素数的数组内查找*/if(s=aj)an+=s;n=n-k;/*n是从k+1开始的,返回n的数量时,n=n-k*/ return n;)void sushu()(int a2000,b1000=0;int k=0,i,n;k=prime(a,k);n=change(a,k);printf(nn满足条件的可逆素数有:n)for(i=k+l ;ivk+n;i+)printf(nnM);)6 .哲集实盖.h#includeint Troitsky(long a)(int count=0,i=0;long n,nl;for(n=l ;n=1000000;n
33、+)(n 1=(n%100000)*10+n/100000;/*去用系统给出的数的最高位,乘以10后加上作为个位数的最高位*/for(i=l;i10;i+)/*判断首位移至末位后的数是否是原数的整数倍*/if(i*n=n 1&n!=n 1)(acount+=n;break;)return count;)void zjsk()(long a10,i;int k;k=Troitsky(a);printf(满足条件的Troitsky数有for(i=0;ik;i+)printf(M%dtM,ai);printf(nH);)7 .整数求积.h#includeqiuji()(int n,u,m,num,s;printf(请输入一个三位正整数:);scanf(%d”,&num);n=num/100;u=num%100/10;m=num%10;s=n*u*m;printf(,n%d*%d*%d=%dnn,u,m,s);