级标准C语言程序设计综合设计实验十上机报告模板06013.doc_第1页
级标准C语言程序设计综合设计实验十上机报告模板06013.doc_第2页
级标准C语言程序设计综合设计实验十上机报告模板06013.doc_第3页
级标准C语言程序设计综合设计实验十上机报告模板06013.doc_第4页
级标准C语言程序设计综合设计实验十上机报告模板06013.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

标准c语言程序设计上机报告实验十 综合设计实验 专业: 电子信息工程 班级: 通信1302 完成日期:2014-7-1一、 实验目的1、 进一步熟悉开发环境,掌握编译、连接和调试的技巧;2、 综合运用数组、指针、函数、结构体和文件,通过综合设计掌握数组、结构体、指针和函数之间的相互关系,掌握函数实参与形参的对应关系,理解传值、传指针的区别(允许使用传引用)3、 熟悉具有复杂需求的程序设计过程和注意事项;4、 使用多文件的工程设计二、 实验内容及要求下面程序运行中所有学生信息均存入文件studengdata.txt,程序每次运行时从文件中提取数据存入内存结构体数组中(指定文件不存在则新建)。题目:某班有最多不超过30人(具体人数由键盘输入)参加期末考试,考试科目最多不超过6门(具体门数由键盘输入)。编程实现如下菜单驱动的学生成绩管理系统:(1) 录入学生学号、姓名和各科考试成绩;(2) 计算每门课程的总分和平均分;(3) 计算每个学生的总分和平均分;(4) 按每个学生的总分由高到低排出名次表;(5) 按学号由小到大排出成绩表;(6) 按姓名的字典顺序排出成绩表;(7) 按学号查询学生排名及其考试成绩;(8) 按姓名查询学生排名及其考试成绩;(9) 按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计各类别人数和所占比例;(10) 输出每个学生学号、姓名、各科考试成绩和总分排名。(11) 学生记录信息写入文件studengdata.txt(12) 从文件中读出学生记录信息并显示;(13) 退出系统程序要求:1. 程序运行后先显示菜单列出上面13项操作选项,并提示用户输入1-13值;2. 考虑对用户输入的数据进行有效性校验,提高程序的健壮性;总体要求:1、 按模块化设计方法,对问题进行分解,提出模块划分并绘制模块划分框图。给出各子函数模块的输入输出接口设计(即函数原型)以及用到的主要数据类型或数据结构的选择;(注:输入数据、折半查找、统计个人平均分、统计班级总平均分、排序、打印等均采用子函数设计,文件操作允许在main函数内完成)(不得采用直接选择法进行排序子函数设计)2、 给出程序清单,添加注释;3、 不允许使用全局变量,避免破坏程序结构;4、 允许采用传引用方式定义子函数;5、 注意编程规范,包括书写格式遵循缩进规则和空行规则;6、 提交要求:提交:报告纸质打印档、报告电子档、源码(含cpp和h文件)、student data.txt文件。所有电子档压缩归档,压缩档命名格式为“2013级综合设计代码报告汇总班号学号姓名提交年月日.rar”,纸质档提交截至时间2014/7/1,提交唯一邮箱:zhang_三、 程序设计注意事项1、 大型程序通常采用模块化,每个模块通常至少有一个函数组成;大型程序是以工程project来组织的,一个project又是由几个源程序文件(.cpp)组成的。因此,学会编写多源文件和多函数的c+程序,不要一味地用唯一的main函数来组织程序设计。本设计要求2个以上的源文件,规定所有子函数原型说明语句、结构体类型定义以及#define宏、typedef类型别名说明语句等放在myproject.h文件中,main函数和各子函数定义放在源文件中,源文件开头用#include “myproject.h”包含。2、 尽量少用全局变量(外部存储类型变量)。过多使用外部类型的全局变量,将使函数模块之间的耦合性加强,从而降低函数的独立性以及通用型。尽管采用全局变量编程相对容易,但对c+程序员,更应注意采用符合模块化的设计理念来完成设计,正确的设计方法论是我们在学习过程首先要掌握并以此为主要学习任务,不能为了解决问题而“凑”程序。3、 采用软件工程学的准则来完成整个设计过程,一般的软件开发过程包括了:确定需求分析过程、逐步细化的系统设计过程(包含总体设计、概要设计、详细设计等)、程序生产过程(编写代码)、调试和测试以及运行和维护过程这几个阶段。对于初学者,我们不必严格按照这些步骤,但简单的问题理解、通过系统设计给出各模块的函数原型说明以及用到的主要数据类型或数据结构、编程、调试运行等需要掌握。四、 设计思路分析1、 简单需求分析:先设计出13个函数再写主程序引用函数(先打印操作内容 再用分支语句写主程序)2、 总体设计确定功能模块划分:要求:根据需求分析,确定所有函数模块,对各模块功能作简单描述,根据函数模块之间的调用与被调用关系,分析出彼此数据传递关系,然后为每个函数模块确定输入/输出接口参数定义,写出完整的函数原型说明。最终根据上面得到的函数模块调用关系及接口参数定义画出具体的功能模块划分框图图(方框内为模块名,方框之间的连线注明数据传递)函数原型说明:函数input:调用函数录入学生信息函数n2:调用函数计算每门课程总分和平均值并输出函数n3:调用函数计算每个学生的总分和平均成绩函数n4:调用函数按总分由高到低排出名次表函数n5:调用函数按学号由小到大排出成绩表函数n6:调用函数按姓名的字典顺序排出成绩表函数searchnumber:调用函数按学号查找学生成绩函数searchname:调用函数按姓名查找学生成绩函数classify:调用函数按5个等级对每门课程分别统计各类别人数和所占比例函数output:调用函数输出学生信息函数save:调用函数将信息存入文件函数read:调用函数读取存入文件中的信息函数menu:打印菜单模块分框图:main函数n2 n3searchnumber searchname classify output save readn4 n5 n6menuexchange3、 模块内部流程图或伪代码要求:除输入输出子函数外都要给出函数内部流程图或伪代码(关于伪代码参考wikipedia,内部搜索词:pseudocode或直接谷歌)project():for j0 to m do for sum0,i0 to n do sumsum+score aversum/nprintf课程总成绩和平均成绩n2:打印:姓名 总成绩 平均成绩循环打印:该学生的姓名 总成绩 平均成绩n3:for i从0开始循环n次 单科按成绩高低逐个交换 按总分排名逐个交换按学号大小逐个交换按姓名字典顺序逐个交换n4:for i从0开始 循环n-1次 for ji+1 to n if 总分1小于总分2 then 交换总分1、2printf 姓名 学号 排名 总分 单科成绩for i0 to n打印:姓名 学号 排名 总分 单科成绩 循环打印:各科成绩n5:for i0 to n-1 do for ji+1 to n do if 学号i大于学号j then 交换其相应的排名和成绩的位置printf学号 姓名 排名 总分 单科成绩for i0 to nn6for(i从开始循环n-1次) for(j=i+1;jpi+1.name) exchange函数(&pi,&pj); 交换顺序 打印:姓名 学号 排名 总分 单科成绩 循环打印:结构体的内容循环打印:各科成绩searchnumber(数组指针,学生个数n,课程数)打印:请输入你想查询的学生的学号:录入:一个数1for(i从零开始 循环n次 )if(数1=学号)打印:该学号的学生排名用循环打印:该学生四门课的成绩else打印:查无此人searchname(数组指针,学生个数,课程数)打印:请输入你想查询的学生姓名录入:学生姓名for(i从0开始 循环n次)if(!(录入姓名与结构体的数组比较=0)打印:该学生的排名用循环打印:该学生的四门成绩else打印:查无此人classifyfor(j从0开始;循环m次) for(i=0;i5;i+) numi=0; for(i=0;i=90) 访问下一个 else if(pi.scorej=80同时有pi.scorej=70同时有pi.scorej=60同时有pi.scorej70) 访问下一个 else 循环打印:科目1优秀有人,占比例;良好有人,占比例;中等有人,占比例;及格有人,占比例;不及格有,占比例 readif(fp=fopen(.studengdata.txt,rt)=null)打印:不能打开文件for(i从0开始 循环n次) 利用结构体数组 录入学生信息 循环打印:姓名 学号 排名 总分 循环打印:单科成绩save():if(!fp) then printf打开文件失败循环打印:姓名 学号 排名 总分 循环打印:各科成绩五、 源代码(每个子函数需附注释描述功能及关键方法) #include #include #include #include #define n 30 /定义学生个数int n,m; struct student /结构定义char name20;int number;float score6; float sum; /该学生总成绩int ranking; /该学生排名;/定义函数原型声明void input(struct student *p,int n,int m); void n2(struct student *p,int n,int m); void n3(struct student *p,int n,int m);void n4(struct student *p,int n,int m); void n5(struct student *p,int n);void n6(struct student *p,int n);void searchnumber(struct student *p,int n,int m);void searchname(struct student *p,int n,int m);void classify(struct student *p,int n,int m);void output(struct student *p,int n,int m);void save(struct student *p,int n,int m);void read(struct student *p,int n,int m);void menu();/打印菜单void exchange(struct student *a,struct student *b); int main()int k=0; struct student *stu; /定义结构数组,存储学生信息stu=(struct student*)malloc(sizeof(struct student); printf(输入学生人数:); scanf(%d,&n); printf(输入考试科目数:); scanf(%d,&m); do system(cls); menu(); printf( 请输入选项0-12:); scanf(%d,&k); switch(k) case 0: break; case 1: input(&stu,n,m); break; case 2: n2(stu,n,m); break; case 3: n3(stu,n,m); break; case 4: n4(stu,n,m); break; case 5: n5(stu,n); break; case 6: n6(stu,n); break; case 7: searchnumber(stu,n,m); break; case 8: searchname(stu,n,m); break; case 9: classify(stu,n,m); break; case 10: output(stu,n,m); break; case 11: save(stu,n,m); break; case 12: read(stu,n,m); break; default: printf(输入有误,请输入从012的数!n); fflush(stdin); getchar(); while(k);return 0;void input(struct student *stu,int n,int m)int i,j;int temp;struct student *p=(struct student*)malloc(n*sizeof(struct student); for(i=0,pi.sum=0;in;i+) printf(输入学生%d的姓名:,i+1);scanf(%s,);printf(输入学生%d的学号:,i+1);scanf(%d,&pi.number);for(j=0;jm;j+) printf(输入学生%d科目%d的成绩:,i+1,j+1); scanf(%f,&pi.scorej);for(j=0;jm;j+) pi.sum+=pi.scorej;for(i=0;in;i+) pi.ranking=i+1;for(i=0;in-1;i+)for(j=i+1;jn;j+) if(pi.sumpj.sum) temp=pi.ranking; pi.ranking=pj.ranking; pj.ranking=temp; *stu=p;/return;void n2(struct student *p,int n,int m) int i,j;float sum,aver; for(j=0;jm;j+)for(i=0,sum=0;in;i+)sum+=pi.scorej; aver=sum/n;printf(课程%d的总成绩和平均成绩为:%g,%g.n,j+1,sum,aver); void n3(struct student *p,int n,int m)int i;printf(t姓名t总成绩t平均成绩n);for(i=0;in;i+)printf(t%st%gt%gn,,pi.sum,pi.sum/m);void exchange(struct student *a,struct student *b) int i; float tempsum; /*交换总分*/ float temps6; /*交换成绩*/ int tempnu; /*交换学号*/ int tempr; /*交换排名*/ char tempna20; /*交换姓名*/ for(i=0;iscorei; a-scorei=b-scorei; b-scorei=tempsi; tempsum=a-sum; a-sum=b-sum; b-sum=tempsum; tempr=a-ranking; a-ranking=b-ranking; b-ranking=tempr; tempnu=a-number; a-number=b-number; b-number=tempnu; strcpy(tempna,a-name); strcpy(a-name,b-name); strcpy(b-name,tempna);void n4(struct student *p,int n,int m)int i,j;for(i=0;in-1;i+)for(j=i+1;jn;j+) if(pi.sumpj.sum) exchange(&pi,&pj); printf(t姓名t学号t排名t总分t单科成绩n);for(i=0;in;i+)printf(t%st%dt%dt%gt,,pi.number,i+1,pi.sum);for(j=0;jm;j+) printf(%g ,pi.scorej); printf(n);void n5(struct student *p,int n)int i,j;int tempr;float temps;for(i=0;in-1;i+)for(j=i+1;jpj.number) exchange(&pi,&pj); tempr=pi.ranking; pi.ranking=pj.ranking; pj.ranking=tempr; temps=pi.sum; pi.sum=pj.sum; pj.sum=temps; printf(t学号t姓名t排名t总分tt单科成绩n);for(i=0;in;i+)printf(t%dt%st%dt%gt,pi.number,,i+1,pi.sum);for(j=0;jm;j+) printf(%g ,pi.scorej); printf(n); void n6(struct student *p,int n) int i,j;int tempr;float temps; for(i=0;in-1;i+) for(j=i+1;j0) exchange(&pi,&pj); tempr=pi.ranking; pi.ranking=pj.ranking; pj.ranking=tempr; temps=pi.sum; pi.sum=pj.sum; pj.sum=temps; printf(t姓名t学号t排名t总分tt期末成绩n);for(i=0;in;i+)printf(t%st%dt%dt%gt,,pi.number,i+1,pi.sum);for(j=0;jm;j+) printf(%g ,pi.scorej); printf(n); void searchnumber(struct student *p,int n,int m) int i,j,x; printf(输入需要查询的学生的学号:n); scanf(%d,&x); for(i=0;in;i+) if(pi.number=x) printf(学号为%d的学生排名为%d,成绩为,x,pi.ranking); for(j=0;jm;j+) printf(%g ,pi.scorej); printf(n); return; printf(查无此人!n); void searchname(struct student *p,int n,int m) int i,j; char string20; printf(请输入你想查询的学生姓名:n); scanf(%s,string); for(i=0;iname,string) printf(学生%s的排名为%d,成绩为,string,pi.ranking); for(j=0;jm;j+) printf(%g ,pi.scorej); printf(.n); return; printf(查无此人!n); void classify(struct student *p,int n,int m) int i,j,num5; float per5; for(j=0;jm;j+) for(i=0;i5;i+) numi=0; for(i=0;i=90) num0+; else if(pi.scorej=80&pi.scorej=70&pi.scorej=60&pi.scorej70) num3+; else num4+; for(i=0;i5;i+) peri=(float)numi/n; printf(科目%d优秀有%d人,占比例%g;良好有%d人,占比例%g;中等有%d人,占比例%g;及格有%d人,占比例%g;不及格有%d,占比例%g.n,j+1,num0,per0,num1,per1,num2,per2,num3,per3,num4,per4); void output(struct student *p,int n,int m)int i,j;printf(t姓名t学号t排名t总分t单科成绩n);for(i=0;in;i+)printf(t%st%dt%dt%gt,,pi.number,i+1,pi.sum);for(j=0;jm;j+) printf(%g ,pi.scorej); printf(n); void save(struct student *p,int n,int m)file*fp;int i,j;fp=fopen(.studengdata.txt,wt); /*将文件放在程序目录下*/if(!fp) printf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论