《计算机实训C报告.pdf》由会员分享,可在线阅读,更多相关《计算机实训C报告.pdf(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、上盅纪仙学院综合实验报告课程名称:计算机基础综合实验(2)姓 名:沈超_ _ _ _ _ _ _ _ _ _ _ _ _ _班 级:_ _ _ _ _ _ _ BQ1001_学 号:101008090120指导教师:杨立勤_ _ _ _ _ _ _ _ _ _ _ _ _完成日期:2012/09/07目录目录.21 目的与要求.11.1计算机基础综合实验(2)目的.11.2计算机基础综合实验(2)的基本内容和要求.12 问题描述.32.1变增求和(第 40题).32.2 裁判打分(第 4 题).32.3 规则验证(第 12题).32.4 可 逆 素 数(第 36题).42.5 哲 集 实 盖(
2、第 16题).42.6 整数求积(第 13题).53 系统使用的主要函数.64 详细设计.84.1 程序总体结构图.84.2 程序流程图.105 功能测试.165.1 系统主界面.165.2变增求和(第40题).165.3 裁判打分(第4题).175.4 规则验证(第12题).175.5 可逆素数(第36题).185.6 哲集实盖(第16题).195.7 整数求积(第13题).196程序设计调试情况分析.227计算机基础综合实验(2)小 结.24参考文献.25附 录 系 统 源 程 序(源代码需有足够的注释).26l.Mkz 目录.c.262.变增求和.h.283.裁判打分.h.294.规则验
3、证.h.315.可逆素数.h.346.哲集实盖.h.367.整数求积.h.371目的与要求1.1计算机基础综合实验(2)目的C 语言程序设计是本科工科类各专业的重要基础课,主要学习程序设计的基本概念和方法,通过本门课程学习,使学生掌握C 语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。计算机基础综合实验(2)是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C 语言有更全面的理解,进一步提高运用C 语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试作准备。L 2 计算机基础综合实验(2)的基本内容和
4、要求参加计算机基础综合实验(2)的学生,应当认真完成计算机基础综合实验的全部内容。最终提交计算机基础综合实验(2)成果来证明其独立完成各种实际任务的能力。从而反映出理解和运用本课程知识的水平和能力。具体如下:1 .代码编写规范,形成良好的编程习惯;2.程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。3.提交计算机基础综合实验(2)报告电子稿、装订的打印稿。计算机基础综合实验(2)报告内容包括以下儿个方面:程序的总体设计和算法分析。程序流程图、函数说明 源程序代码清单 测试数据和测试过程记录 遇到的问题及解决方法分析计 算机基础综合实验Q)小结4.程序运行方式构建个简易菜单,
5、形如:1用户通过输入数值选择所需运行的子程序,当一个子程序运行结束后回到菜单界面,直至用户输入0 后退出程序。22问题描述2.1 变增求和(第 40题)编写程序计算并输出:1+12+123+1234+的前n(设0n10)项的和,n从键盘输入。例如输入:3,则输出:136又如输入:6,则输出:137171分析:创建一个for循环语句,将1n(n为从键盘输入的数)按循环内的运算规则累及求和2.2 裁判打分(第 4 题)编写一个程序实现如下功能:有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号。裁判员号及其所打分数从键盘输入,假
6、设裁判员号为整数,所打分数为实数。分析:定义三个整形数组,一个存放8位裁判的号码,第二个存放8位裁判打的分数,最后一个数组备份第二个数组,存放最初的分数排放情况;用冒泡排序法将第二个数组中的元素升序排列,去掉一个最低分和一个最高分后求出平均分,和第三个数组中的元素求差再一一比较差值,得到要求的裁判员号2.3 规则验证(第 12题)编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174o要 求 如 下(下面的函数名为建议函数名):3 用 函 数int
7、INE(int number)检查输入的整数number各数码是否互不相等,全相等返回值为1否则为0;用函数void ntos(int number,int c口)把四位数整数number各位数码分别存入数组c 用函数void sort(int a口)对4个元素的数组a排序(升序或降序都可以);由输入整数分解排序后的数组得到最大值和最小值:int getmax(int a)返回值为最大值int getmin(int b)返回值为最小值分析:编写4个子函数,分别实现以下功能:INE-检查输入的整数各数字是否互不相等,全相等返回值为1否则为0;getmax将4个数字降序排序后返回4个数字能组成的最
8、大值;getmin-返 回4个数字能组成的最小值;ntos-把最大值与最小值的差值的各位数码分别存入数组,利用主函数调用4个子函数实现程序功能2.4 可 逆 素 数(第 36题)编写程序输出1001000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。分析:创建一个名为prime的子函数,判断主函数传送的数是否为素数,并存放在整形数组中;再创建一个change函数,将prime函数所判断出的素数倒序排列构成新的数字,与整形数组中的元素一一比较,以此确定是否满足可逆素数的条件2.5 哲 集 实 盖
9、(第 16题)编写函数int Troitsky(long a),其功能是求出1000 000以内的所有Troitsky数,并将它们依次放入a指向的数组中,函数返回找到的Troitsky数的个数。4Troitsky数的定义:将该数的首位数字移动到末位数字之后得到的数是原数的整数倍。例如:将 142857的首位数字1移动到末位之后得到的数是428571,而428571=3*142857,因此 142857 是 Troitsky 数。分析:使用子函数Troitsky检验系统给出的数是不是Troitsky数,子函数内置双循环,外循环给出11000000的数,内循环判断新组成的数是否是原数的整数倍2.6
10、整 数 求 积(第 13题)建立一个函数,其功能是:计算正整数num的各位上的数字之积。例如,若输入:2 5 2,则输出应该是:20。若输入:2 0 2,则输出应该是:0。分析:将正整数num的3 位数字以运算语句分别截取出来赋值给三个整型变量,将三个整型变量相乘实现函数要求的功能53 系统使用的主要函数3.1系统使用的主要函数表序号文件名函数名函数功能说明1变量求和4O.hqiuhe()求 出1 +12+123+1234+的 前n(设0n10)项的和,n从键盘输入2裁判打分4.hdafen()计算并输出8位裁判为1个运动员打分的情况下,去掉一个最高分和一个最低分后这个运动员的平均得分以及所评
11、分最接近平均分的裁判员号3.1规则验证12.hINE()将输入的整数4位数字拆分下来存入数组,检查输入的整数各数字是否互不相等,全相等返回值为1.否则为03.2规则验证12.hgetmax()将整数的4位数字升序排序,并返回4位数字能组成的最大值3.3规则验证12.hgetmin()返回4位数字能组成的最小值3.4规则验证12.hntos()截取最大值与最小值的差值的各位数字并存入数组3.5规则验证12.hyanzhen()验证以下说法:输入一个四位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数减去最小数,构成一个新的4位数。反复以上运算,使
12、其最终结果为:6174。4.1可逆素数36.hprime()求出1001000以内的素数,并存入数组4.2可逆素数36.hchange()将prime函数判断出的素数倒序重新排列构成一个新的数,把依旧为素数的数存入数组4.3可逆素数36.hsushu()输出1001000内的可逆素数5.1哲集实盖16.hTroitsky()判断系统给出的数是否为Troitsky数,并将符合要求的数存入数组65.2哲集实盖16.hzjsk()求出1000 000以内的所有T roitsky数6整数求积13.hqiujiO计算并输出正整数num的各位上的数字之积7M kz目录.cmain()作为程序的入口74详细
13、设计4.1程序总体结构图根据设计出如下“C 语言实验演示系统”的主控模块。在主控模块中,只要在主函数main()前加入包含各子系统文件组成的头文件,我们就能方便的调用各子系统的函数了。图4.1 主控模块子模块1:图4.2子模块18子模块2:图4.3 子模块2子模块3:图4.4 子模块3子模块4:图4.5 子模块4子模块5:图4.6 子模块5子模块6:图4.7 子模块610开始图4.8 主控模块流程图开始11图4.9 模块1流程图开始1213N14图4.10 模块5流程图 4.11 模块6 流程图155功能测试5.1 系统主界面1.操作运行说明:打开主菜单,输入16运行子模块2.运行主界面5.2
14、 变增求和(第 40题)L操作运行说明:输入1,输出:1 +12+123+1234+的前n(设 0n1350F331裁切蒂”二二“二一二22467:W分翳*21*直8位裁判为1个运动同打金,请亡算并喷出去掉一个最高分和一个最低分后这个运动员的平均前以以帚吩段就平均分的萩货喷号输入8位裁判的号码:11 23 12 33 42 10 19 24清各位裁判打分:100 92 98 93 95 96 97 99平均分为9 6.33最接近的裁判是号=再次输入菜单号或退出 0?:5.4规则验证(第12题)1.操作运行说明:输入3,验证以下说法:输入一个四位数,该数个、十、百、千位上的数互不相等,由个、十、
15、百、千位上的数组成一个最大数和一个最小17数,最大数减去最小数,构成一个新的4 位数。反复以上运算,使其最终结果为:6174o2.运行界面题王伴和证盖求验实出三一13502-4-G-7-打泰屏3C*MM=请选择菜单号 0 6:3翳好莪酷笈糕舞畲满或瞬啸癖家遍遑京瞌牌结臬为:6174清输入一个各个位数不相同的四位数4 1 9 7输人数据正确.开始计算“所能组成的最大值为9751所省绳成的最小值为1579所能组成的最小值为1278所能组成的最大值为7443所能组成的最小值为3447所能组成的最大值为9963所能组成的最小值为3699所能组成的最大值为6642所能组成的最小值为2466所能组成的最大
16、值为*4 1所能组成的最小值为1467最后计算结果为6174-再次输入菜单号或退出。一?:5.5可逆素数(第3 6题)1 .操作运行说明:输入4,输出1001000内的可逆素数2.运行界面182467*-6*0-和证盖*察求验实出“单,i“菜加於痼*择编写程序痫出 照y 0 0 0内的可逆素数满足条件的可逆素数有:1 0 17 0 13 1 11 3 19 4 11 5 17 5 17 6 11 9 19 9 11 1 33 1 37 3 37 4 33 5 39 5 39 8 31 0 79 0 77 2 73 3 79 3 73 4 71 5 79 6 71?97 8 73 8 97 9
17、71 9 97 0 99 1 99 2 97 3 91 4 99 7 13 7 3?5 73 5 91 8 13 8 31 6 77 6 9=“再次输入菜单号或退出8 7:5.6 哲集实盖(第 16题)1 .操作运行说明:输入5,输出1000 000以内的所有Troitsky数2.运行界面C课 题 酝 系 统主 菜 单曾判施数屏*“打丰编写函数i n t T r o i t s k y 其功能是求出1 0 0 0 0 0 0以内的所有T r o i t s k y数.并将它们依次放入a指向的数组中,函数返回战至猫T r o i t s k y数的个数辆足条件的T r o i t s k y的有
18、:1 4 2 8 5 7 2 8 5 7 1 4=再次输入菜单号或退出 :5.7 整数求积(第 13题)1.操作运行说明:输入6,输出正整数num的各位上的数字之积2.运行界面19=请选择菜单号一6:6十算正整数num的各位上的数字之积青输入f三位正整数由195*1-9-45=再次输入菜单号或退出0 7:20216 程序设计调试情况分析设计第4题时,如何在升序排序后,将各位裁判的打分与平均分比较以此得出打分最接近平均分的裁判员的号码成了这答题的难点,后来通过将裁判最初的打分备份在另一数组中的方法,记录最初的打分的顺序,来方便最后的比较;用一个整形数组a来记录输入的8位裁判员的号码,用数组b来记
19、录各位裁判的打分。用冒泡法升序排序输入的成绩,方便计算平均分时去掉一个最低分和去掉一个最高分,使用 if(bjbj+1 )temp=bj;bj=b|j+l;b|j+l=temp;M合语句时,起到的是升序排序的功能,而使用if(bj=8(即是原文中的N,使用预处理1命令#define N 8定义N=8)作为终止条件。考虑到求平均值和各个分数的差值时可能会出现负数,而使用fabs()命令行(在源文件中使用以下命令行:#include),将平均分与各位裁判所打的分数-比较,找出打分最接近的裁判的号码。设 计 第12题时,用一个主函数调用了四个函数,其中判断输入的四位数的存入数组可以提高程序的运行效率
20、设 计 第16题 时 难 点 在 于 对 一个数是不是Troitsky的判断,用语句:“nl=(n%100000)*10+n/100000”将系统给出的数的首位移到末位。循环语句“for(i=l;i10;i+)”的作用是判断新构成的数是不是原来数的整数倍,减少了循环的次数,提高程序的运行效率设计第36题时,主函数调用了两个子函数,子函数prime中,用系统给出的数i与2W间的数相除以判断i是否为素数,之所以用VI来终止循环而不是22用i是因为乘法满足交换律,若i不能被工整除,必也不能被i整除,以此减少程序的操作。237 计算机基础综合实验(2)小结通 过 这 次 计 算 机 基 础 综 合 实
21、 验(2)为 期 一 周 的 实 训,我 感 到 受 益 良 多。首 先 是 通 过 自 己 动 脑 动 手 解 决6道C语 言 的 程 序 编 程 题 目,让我发现了许多以前被自己忽 视 的 问 题,就 拿 第36题 来 说,第36题的题意是让我们编写一个程 序,程 序 的 功 能 是 从1001000内筛选出可逆素数,可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数,并要求调用两个子函数实现。如果题目没有规定使用两个子函数的话,可能会减少挑战性和难度,我编写了两个子函数,在主函数中调用。一个命名为prime。,实现的功能是判断系统
22、给出的数是不是素数,如果是素数就存入数组中;另一个子函数命名为change。,用来将数组内的素数倒序排列,组成一个新的数,并和原数组内的元 素 一 比较,来确定新组成的数是不是素数。在prime。函数中,运用循环语句来筛选素数,起始语句为j=2,判 断 语 句 是 启 用jV i作为判断语句而不是用通常的j=i-l是 因 为 乘 法 满 足 交 换 律,不 能 被 小 整 除 的 数 也 一 定 不 能 被i整 除,这样 既 减 少 程 序 的 操 作,同 时 也 提 升 了 程 序 的 效 率,这 是 以 前 为 我 所 忽 视 的 地 方,经 过 这 次 的 学 习 和 与 同 学 们 的
23、 探 讨,我 做 出 了 这 类 的 尝 试,发 现C语言果然是很 精 彩 的 一 门 学 科,我 们 以 前 课 本 上 所 学 习 的 知 识 点 不 过 是 一 些 最 浅 薄 的 皮 毛,真 正 的 知 识 点 是 在 不 断 的 累 及 和 尝 试 与 突 破 中 慢 慢 积 攒 起 来 的。其 次,是 通 过 修 改 和 完 善 实 训 报 告 让 我 有 了 一 个 复 习 以 前 所 学 的words文档处理 技 术 的 机 会。我 们 在 计 算 机 基 础 综 合 实 验(1)中实训了我们在大一时所学的关 于photoshop、Excel、flash、powerpoint等
24、 方 面 的 知 识,其 中words文档的处理 技 术 是 当 今 社 会 办 公 室 技 术 中 举 足 轻 重 的 一 项,随着运用的欠缺和记忆的生疏,大 部 分 技 术 已 经 被 遗 忘 在 记 忆 的 音 晃 里 了,这次按照要求修改和完善实训报告,使 用 了 大 量 的words修 改 技 术,让 我 生 疏 的 记 忆 重 新 苏 醒。最 后 感 谢 在 这 次 实 训 中 给 予 我 帮 助 的 老 师 和 同 学。24参考文献书籍:百问百例C语言程序设计 作者:主编匡松、副主编:何福良、吴卫华、缪池春.书名:百问百例C语言程序设计.出版地:北 京 出 版 社:中国铁道出版社
25、,出版年:2008.11书籍:c程序设计教程与实验作者:主编吉顺如、副主编:曾祥绪、陶恂.书名.c程序设计教程与实验.出版地:北京 出版社:清华大学出版社,出版年:2011.625附录 系统源程序(源代码需有足够的注释)l.Mkz 目录.c#include#include#include#include#include include”变增求和 4O.hninclude”裁判打分4.h”#include”规则验证 12.h,include”可逆素数 36,hninclude”哲集实盖 16.hninclude”整数求积 13.h”void main()int choice,n=0;char c
26、h;system(color 34);/*更改背影色和文本颜色*/ch=y;while(ch=,y,llch=,Y,)if(nl)printf(n);26printf(Hntt C课题演示系统”);printf(ntt主 菜 单printf(nntt*printf(ntt*1 一变增求和 2-一裁判打分printf(ntt*3一规则验证 4-一可逆素数printf(nntt*5一哲集实盖 6-一整数求积printf(ntt*0一 退 出 7-一清屏printf(ntt=请选择菜单号(0-6):);elseprintf(nn=再次输入菜单号或退出(0-7):);scanf(0%d,&choice
27、);n+;getchar();printf(,nn);switch(choice)case Lprintf(编写程序计算并输出:1+12+123+1234+.的前 n(设 0n10)项的和nn);qiuhe();break;case 2:printf(”有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员#nn);dafen();break;case 3:printf(验证以下说法:输入一个4位数,该数个、百、千位上数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数.反复以上运算,
28、使其最终结果为:6174nn n);yanzhen();break;27case 4:printf(编写程序输出1001000内的可逆素数nn);sushu();break;case 5:printf(编写函数 int Troitsky(long a),其功能是求出 1000 000以内的所有Troitsky数,并将它们依次放入a 指向的数组中,函数返回找到的Troitsky 数的个数nn);zjsk();break;case 6:printf(计算正整数num的各位上的数字之积nn);qiuji();break;case 7:system(Hcls);break;/*实现清屏的功能*/cas
29、e 0:ch=n;break;default:printf(菜单选择错误!请重新输入!”);2,变增求和.h#includeqiuhe()(int n,i,m=0,p=0;printf(put in a number:n);scanf(”d”,&n);printf(”n前 n 项的和为:);for(i=l;i=n;i+)(m=m*10+i;/*后一个数亍前一个数的10倍+数的序号*/printf(”d+”,m);28p=p+m;/*累积相加*/printf(b=%d,p);printf(n);)3.裁判打分.h#include#include#define N 8dafen()(int aNL
30、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(nn请各位裁判打分:n)for(i=0;iN;i+)(scanf(%d,&bi);ci=bi;/*将最初的分数排列方式备份以方便找出最接近的裁判员号*/29for(i=0;i=N-2;i+)for(j=0;jbj+l)(temp=bj;bj=bj+l;bj+l=temp;)for(i=l;iN-l;i+)sum+=bi;ave=sum/6.0;printf(n 平均分为4.2fn,ave);tl
31、=fabs(cO-ave);/*假设第一个裁判的打分最接近平均分,求差值*/for(i=l;i(temp=t 1;tl=t2;t2=temp;k=i;30printf(n最接近的裁判是(1号nak);4.规则验证.h#includeint k41;int INE(int number)/*验证输入的四位数各位数字互不相卜尹/(kf0=number%10;k 1 =(number/10)%10;k2=(number/100)%10;k3=number/1000;if(kf0=klllk0=k2llk0=k3llkl=k2llkl=k3llk2=k3)return(l);elsereturn(O)
32、;)int getmax(int af)int i,j,temp;for(i=0;i3;i+)/*用冒泡法升序排序*/31for(j=0;j3-i;j+)if(aUaj+l)temp=aj;aU=aU+l;aj+l=temp;retum(aO*1 OOO+al*l 00+a2*10+a3);/*返回所能确定的最大值*/)int getmin(int b)(return(b3*1000+b2*100+bl*10+b0);)void ntos(int number)/*截取 mn 差值的各位数*/(k0=number%10;kl=(number/10)%10;k2=(number/100)%10;
33、32k3=number/l 000;yanzhen()(int num,m,n,flag=l;printf(”请输入个各个位数不相同的四位数。;while(flag)scanf(d&num);flag=INE(num);if(flag)printf(nn输入错误!请从新输入n);elseprintf(nn输入数据正确,开始计算n);)do(m=getmax(k);printf(nn所能组成的最大值为dn”,m);n=getmin(k);printf(nn所能组成的最小值为dn”,n);ntos(m-n);while(m-n)!=6174);printf(n最后计算结果为 dn”,m.n);33
34、5.可逆素数.h#include#includeint prime(int af,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=ai%100/10;34c=ai%10;s=100*c+10*b+t;/*将找出的素数倒序构成新的数*/for(j=0;jk
35、;j+)/*在 prime函数找出的存放素数的数组内查找*/if(s=aj)an+4-=s;)n=n-k;/*口是从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(n满足条件的可逆素数有:n“);for(i=k+l;ik+n;i+)printf(n%dtu,ai);printf(”n);356.哲集实盖.h#includeint Troitsky(long a)(int count=0,i=0;long n,nl;for
36、(n=1 ;n=l000000;n+)(n 1 =(n%100000)*10+n/100000;/*去掉系统给出的数的最高位,乘以10后加上作为个位数的最高位*/for(i=l;i10;i+)/*判断首位移至末位后的数是否是原数的整数倍*/if(i*n=nl&n!=nl)(acount+=n;break;)return count;)void zjsk()(long a10,i;int k;k=Troitsky(a);36printf(满足条件的Troitsky数有:);for(i=0;ik;i+)printf(n%dt;ai);printfCAn*1);)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=%dn,n,u,m,s);37