kl800.com省心范文网

C语言程序设计综合实验报告(钟业聪)


C 语言程序设计综合实验

实验题目:学生成绩管理 实验班级: 学生学号: 学生姓名: 任课教师: 提交时间:

一、题目与运行说明 陈述程序设计的任务, 程序的功能是什么?强调的是程序要做什么?并按要 求明确说明: (1)程序中所使用的主要变量 (2)数据输入的形式和输入值的范围 (3)数据输出的形式 (4)程序所能达到的功能及出错处理 答:该程序的任务是: (1)将输入的 n 个同学的 m 门成绩进行运算,将学生按 总分由高到低排序,按格式要求输出排序后的结果(一行一个学生的信息)(2) ; 输出每一门成绩的平均分,保留一位小数。 功能是将 n 个同学的 m 门成绩以二维数组(b[i][j])的形式输入(采用双重 循环) ,接下来利用一个二重循环将各个同学的总分计算出来,并且寄存到一维 数组 sum[i],然后利用冒泡法的原理,在实现对数组 sum[i]由高到低的排序过程 中,也实现了对二维数组 b[i][j]的排序(即将学生的顺序排列出来) ,然后输出。 最后,采用一个双重循环将各个同学的同一科成绩累加(为 v) ,并且在输出的 时候进行了平均化的处理,得到了平均成绩 v/n,然后在第一个循环的情况下, 依次输出了各科平均分。 该程序的设计过程中定义了整形普通变量 n,m,i,j,t,s,p;单精度变量 v;数组变 量 b[1000][10],sum[1000]。 数据的输入形式都采取了整形(”%d”)的格式,由定义以及程序设定,输入 值 n,m 的范围为(0<n<=1000),(0<m<=10);数组 b[i][j]的范围为 int 的取值范围。 数据的输出形式有两种,一种是整形(”%d”)格式,另一种是输出一位小时 的单精度( “%.1f” )格式。 程序由于自身变量的定义,使得输入的数据只能是定义范围内的,否则输出 相应设定的结果或者错误的结果。 例如输入的 n,m 超出设定范围直接输出“超出有效范围” ,而输入的数组 b 超出整形数据的取值范围,则得不到正确的结果。

二、程序设计思路 说明实现程序的主要思路,要求写出主要的算法,建议画出流程图。 答:算法:1 输入 n,m 并判断是否在区间(0<n<=1000,0<m<=10)内,若是, 则进行下一步运算;否则输出“超出有效范围”的语句,并结束程 序。 2 按 输 入 的 n , m 值 , 建 立 一 个 双 重 循 环 ( for(i=0;i<n;i++) for(j=0;j<m;j++)) ,并数据,保存到二维数组 b[i][j]中; 3 建立步骤 2 的双重循环,将数组 b[i][j]的数据以 i 个同学的形式分 别自加,然后保存到数组 s[i]中; 4 建立新的双重循环(for(p=0;p<=n-1;p++) for(i=0;i<n-1-p;i++))采用 冒泡法(排序的一种方法,不做详细解释)的方式实现对数组 sum[i] 由大到小的排序的过程中实现数组 b[i][j]的排序,并以步骤 二的双重循环按序输出; 5 建立步骤 2 双重循环,将 i 个同学的同一科成绩累加(为 v) ,并 且在输出的时候进行了平均化的处理,得到了平均成绩 v/n,然 后在第一个循环的情况下,依次输出了各科平均分。 6 程序结束。

三、程序清单 列出程序,代码中变量定义与重要语句部分加上注释。 #include"stdio.h" main() {int n,m,i,j,t,s,p; float v; int b[1000][10],sum[1000]; ---------------二维数组的整形定义, 二维数组的整形定义, 二维数组的整形定义 一维数组的整形 定义,还有其他变量的定义 其他变量的定义; 定义,还有其他变量的定义; scanf("%d%d",&n,&m); if(n>0&&n<=1000&&m>0&&m<=10) ---------------判断数据的样本大小,超出 判断数据的样本大小, 判断数据的样本大小 范围不执行; 范围不执行; {for(i=0;i<n;i++) {for(j=0;j<m;j++) scanf("%d",&b[i][j]); ---------------输入二维数组(输入数据) 输入二维数组( 输入二维数组 输入数据) ; } printf("\n"); for(i=0;i<n;i++) {sum[i]=0; for(j=0;j<m;j++) sum[i]+=b[i][j]; ---------------实现每一个同学的各科分数自加, 实现每一个同学的各科分数自加, 实现每一个同学的各科分数自加 得出总分 sum; ; } for(p=0;p<=n-1;p++) { for(i=0;i<n-1-p;i++) {if(sum[i]<sum[i+1]) { t=sum[i]; sum[i]=sum[i+1]; -----------总分排序(采用冒泡法的方式,借用总分的中间变 总分排序( 总分排序 采用冒泡法的方式, 实现成绩由高到低的排序) 量,实现成绩由高到低的排序) ; sum[i+1]=t; for(j=0;j<m;j++) {s=b[i][j]; b[i][j]=b[i+1][j]; b[i+1][j]=s; ---------------排序过程; 排序过程; 排序过程 } } } } for(i=0;i<n;i++) {for(j=0;j<m;j++) printf("%d ",b[i][j]); ---------------输出排序后的结果; 输出排序后的结果; 输出排序后的结果

printf("\n"); } for(j=0;j<m;j++) {v=0; for(i=0;i<n;i++) v+=b[i][j]; ---------------各科成绩的总分; 各科成绩的总分; 各科成绩的总分 printf("%.1f ",v/n);---------------各科成绩的平均分; 各科成绩的平均分; 各科成绩的平均分 } } else printf("超出有效范围 超出有效范围\n"); 超出有效范围 }---------------结束程序。 结束程序。 结束程序

四、小结(收获与体会) 小结(收获与体会) 阐述在完成本次综合实验的过程中的收获和体会。 实验小结 本次综合实验耗费了较多时间,因为在实验进行过程中,既有对前面学习 过知识的回顾和加深,也有对新学知识的掌握和应用过程,由于实验的综合性 比较强,因而实验的过程显得比较烦恼。 实验的开端,通过思考,我确定了基本的算法:二维数组的输入和数据储 存——一维数组对计算的总分储存——采用冒泡法做排序——最后输出平均 值, 整个过程中贯彻二重循环的使用。 但是实际进行的情况下却没有这么连贯, 出现了一系列的问题。 由于设计 c 语言的过程又是一个很讲究细心的过程, 某个小细节的错误会 使得整个程序无法执行,特别是循环。同样的,在这个实验的开端,我就在定 义数组上犯下了初定义数组是不能使用未知变量的错误, 使得实验无法进行下 去,耗费了相当一段时间才检查出来。接下来,又在双重循环的使用过程中缺 漏了{ },使得实验再次处于停滞的过程,又进行了一次排除,也耗费了我一段 时间。还有,由于数组在初始定义中采用字符的 char 定义,使得运算结果一 直错误,排序的过程有部分数据没有实现排序……总之,此次实验出现了非常 多的问题,既有前面犯过得小错误,也有对新学知识的应用还不到位……所以 我得出一个教训那就是设计 c 时要特别细心! 通过该次实验, 我收获了很多, 既有学习方面的, 更有在人生态度方面的。 首先一点是耐心,从遇到的许许多多问题使得实验停滞了数次,检查排除了数 次,还要思考某些算法是否存在问题,充分让我体会了耐心的重要性,几次都 想着到网上随便找个答案填了得了,但是最后还是凭借自己的努力完成了。在 完成的一瞬间,我感到非常的喜悦,更确切的是一种成就感!耐心和毅力是一 个人在人生路上非常重要的品质,无数成功的例子告诉我们一个真理,做任何 事,都不能缺少耐心和毅力,要抱着坚持到底的念头,一直到实现你的目标为 止。这一点是我此次实验最重要的收获。另外一点是我对 c 语言知识有了更好 认识和应用,在学习上更进一步了!还有,此次实验过程完全是自我独立的一 个过程,没有询问老师和同学,锻炼了我独立工作的能力,相信有了这次“不 一样的经历“,我会更加走向自我解决问题的方向,那也是人生的良好收获! 最后一点,我总结出了检查 c 语言程序错误的方法,原理非常简单,第一步是 首先对自己的实验进行功能划分,针对性的由程序的开端到结尾,对第一个功 能段进行实验,确认正误,然后改正,再加上第二部分功能段再次实验,确定 第二部分的正误,依次类推,最后实现对整个程序的检验。从我的上机实验到 这个综合性实验, 我的结论是对复杂的实验千万别想着一步就能看出所有的错 误(好高骛远) ,这样反而更难发现错误……还是有方法,有步骤的发现错误来 的实际(脚踏实地) ! !

评分表
题目:学生成绩管理

学号

姓名

评分项目 1. 实现情况(40) :完成设计要求的情况 2. 程序规范(10) :程序的结构与格式规范程度等等 3. 报告情况(35) :报告内容是否详实,总结内容是否深刻等等 4. 报告规范(15) :撰写的规范性、合理性等等

分数

总成绩:

评语:

评阅老师:

评阅时间: