C语言课程设计实习报告_第1页
C语言课程设计实习报告_第2页
C语言课程设计实习报告_第3页
C语言课程设计实习报告_第4页
C语言课程设计实习报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、c语言课程设计实习报告班 级:地质11102学生姓名:商博文 学 号: 01 指导老师:何老师/陈老师/龙日 期: 2013.3.7目 录一、程序分析与设计1二、流程图2三、源程序清单9四、 调试过程17五、 程序有待改进的地方18六、本次实习的收获和建议18附录18c语言课程设计实习报告一、程序分析与设计1、一开始拿到这个程序我感觉到它的流程特别清晰,各个功能项之间联系并不十分密切,所以各异很容易的分成许多不同的部分分别以独立的函数体进行书写和编辑。2、确定每一项要求写成一个或者分成多个函数体进行书写。并按照要求的先后顺序确定函数体的排列次序,将最想被调用与被调用次数最多的函数体放在最前面,

2、一边用最简洁的方式书写程序,尽量少的进行函数声明。3、在确定了函数名称后,先将函数名称记录下来,并确定其功能总计有read(),output(),average(),allaverage(),rrank(),fenshuduan(),nopass(),chengjitiao(),menu(),youdengsheng()等十组函数。4、确定需要调用的库函数并进行声明,设定全局变量size为学生人数。5、清晰的书写学生结构体和课程结构体stusize,明确结构体重每一个变量的类型和长度。6、首先书写读入输出函数read(),将所需数据按照课程结构体的标准进行读入用文件格式fscanf。7、写出函

3、数向所需数据的列表进行写出。8、写出求学生平均成绩的函数average()并求出学生平均成绩三个相加除三取整。9、写出求各科平均成绩的函数allaverage()并求出各科平均成绩学生人数个相加除学生人数取整。10、排名函数rrank(),用抽排法写出排序并用文件类型输出。11、分数段函数fenshuduan()写出不同的分数段并运用数组寄存每个分数段的人数并用两种方式写出。12、判断出不及格的人nopass()并输出他/她们的学号,姓名,课程名称,成绩等信息。13、运用比较与循环写出查询学生信息的函数chengjitiao()。14、写出菜单的输出函数menu()。15、运用逻辑运算符写出优

4、等生的求取函数youdengsheng()。16、写退出函数。17、写出主函数并且用case语句进行判断执行主函数的各个功能。18、整个过程中,平均数,学生信息,平均分查询用文件类型的输出。二、流程图main函数函数图主体如果输入1则运行学生信息设置的函数如果输入2则运行求个人平均分的函数如果输入3则平均分数段函数如果输入4运行不及格函数如果输入0结束read()函数 此段为读入函数的流程图运用指针读入文件中的数据如果指针为空输出无法打开output函数此段为写出文件函数用指针指向文件夹写出如果指向空则输出无法打开average()函数此段为求每个学生平均成绩的函数现将每个学生的三科成绩相加再

5、将所得数据除以3得到平均分allaverage()函数此段为求各科平均成绩的函数现将每门课的所有学生得分相加再除以学生人数最后得到每科总平均分rrank()排名的函数先运用抽排法确定每一个学生的排名将排名组合到结构体再将包涵排名信息的所有学生信息进行输出fenshuduan()分数段函数将每个学生的每项成绩进行判断然后将学生的成绩分别计数分别统计出来没想科目每个分数段的学生人数用文件类型进行输入输出nopass()不及格人数统计的函数先求出不及格的成绩并记录该学生的各项信息对各项信息进行输出chengjitiao()输出学生的成绩条menu()打印主菜单youdengsheng()学生成绩查询

6、的函数按照课程要求进行逻辑用语的编写输出优等生的个人信息三、源程序清单#include#include/标准函数库调用#define size 40/班里学生40个int english5,c5,math5; /5保留小数点一位 float englishave;/此变量算英语成绩平均分float cave;/计算机float mathave;/数学struct student/学生结构体char name10;/存放姓名int num;/学号int score3;/学分float ave;/平均分int rank;/排名studsize;/结构体有40个struct course/课程设置结

7、构体char cname20;/存放课程名称20表示课程名称最长有20个字节cur3=大学英语,c语言设计,高等数学;/分别赋初值为课程的名称int cour35=0;/后面分段计数的时候分了5个分数段共有三门课赋初值为零/读文件函数void read()file *fp;/文件型指针变量如果存放地址为空则输出cant open file!并退出if (fp = fopen(e:stud1.txt,r)=null)printf(cant open file!n);exit(0);for(int i=0;isize;i+)/从0到40读入每个学生的信息fscanf(fp,%d%s%d%d%d%d

8、,&studi.num,,&studi.score0,&studi.score1,&studi.score2,&studi.score3); /从文件读取信息 fclose(fp);/写出文件函数void output() file *fp;/文件型指针变量if (fp = fopen(e:stud1.txt,r) = null)printf(cant open file!n);exit(0);printf(t 学生原始成绩n); printf(| 学号 | 姓名 |英语|c语言|高数|n);for(int i=0;isize;i+) fscanf(fp,%d%s%d%d%

9、d,&studi.num,,&studi.score0,&studi.score1,&studi.score2); /从文件读取信息 printf(%6d%12s%6d%6d%6dn,studi.num,,studi.score0,studi.score1 ,studi.score2,studi.score3);/从程序输出到文件里/求学生平均成绩函数void average()int i,j,sum;for(i=0;isize;i+)/从0到39循环 sum=0;for(j=0;j3;j+)/从第一门课到第三门课循环sum+=studi.scorej;

10、/每门课的成绩相加studi.ave=(int)(sum)/3;/八三门课的成绩除以3的平均分/求各科的平均成绩函数void allaverage() int i;englishave=0;cave=0;mathave=0;for(i=0;isize;i+) /循环人数mathave+=studi.score0;/所有人数学课成绩相加englishave=(englishave+studi.score1); /英语cave=(cave+studi.score2);/计算机englishave=englishave/size;/除以人数得到平均分mathave=mathave/size;cave

11、=cave/size;/排名函数void rrank() int i,j; for(i=0;isize;i+) studi.rank=1;/抽排法for(i=0;isize;i+) studi.rank=1;for(j=0;jsize;j+) if(studi.avestudj.ave) studi.rank+;/排名if(studi+1.rank=studi.rank)studi+2.rank+; /如果.相等再加一个 file *fp;if(fp = fopen(e:stu2.txt,w) = null)printf(cant open the file);return;fprintf(f

12、p,tttt学生成绩综合成绩n);fprintf(fp,序号tt姓名t高数t英语t计基t平均成绩t名次n);for(i=0;isize;i+)fprintf(fp,%dt%st%dt%dt%dt%15.2ft%5dn,studi.num,,studi.score0,studi.score1,studi.score2,studi.ave,studi.rank);fclose(fp);/求取个分数段人数void fenshuduan()void allaverage();allaverage();int i,j;printf(tt各科分数段及各科平均成绩n);for(i=0;i

13、size;i+)for(j=0;j=90)courj4+;/如果该门课该学生成绩大于90则该门课改分数段人数加一else if(studi.scorej=80)courj3+;else if(studi.scorej=70)courj2+;else if(studi.scorej=60)courj1+;else courj0+;printf(分数段t高数t英语t计基n);printf(60 t%dt%dt%dn,cour00,cour10,cour20);printf(6069 t%dt%dt%dn,cour01,cour11,cour21);printf(7079 t%dt%dt%dn,co

14、ur02,cour12,cour22);printf(8089 t%dt%dt%dn,cour03,cour13,cour23);printf(90100t%dt%dt%dn,cour04,cour14,cour24);printf(平均成绩t%4.1ft%4.1ft%4.1fn,mathave,englishave,cave);file *fp;if(null=(fp=fopen(e:stu3.txt,w)printf(cannot open the file);return;fprintf(fp,ttt分数段及平均分n);fprintf(fp,n);fprintf(fp,分数段t高数t大英

15、t计基n);/反斜杠t表示tab反斜杠n表示换行%d表示十进制整数输出%f表示十进制实数输出%s表示字符串类型输出f前面的4.1表示共四位数其中有一位小数fprintf(fp,60 t%dt%dt%dn,cour00,cour10,cour20);fprintf(fp,6069 t%dt%dt%dn,cour01,cour11,cour21);fprintf(fp,7079 t%dt%dt%dn,cour02,cour12,cour22);fprintf(fp,8089 t%dt%dt%dn,cour03,cour13,cour23);fprintf(fp,90100t%dt%dt%dn,co

16、ur04,cour14,cour24);fprintf(fp,平均成绩%4.1ft%4.1ft%4.1ftn,mathave,englishave,cave);fclose(fp);/不及格学生信息函数void nopass()int i,j;printf(t不及格学生名单n);printf(t学号tt姓名tt不及格课程tt不及格分数n);for(i=0;isize;i+) for(j=0;j3;j+)if(studi.scorej60)/如果该人该门课分数低于60则输出一下信息printf(t%5d %10stt%10stt %dn,studi.num,,a

17、me,studi.scorej);/查询学生信息函数void chengjitiao() int i,n;printf(请输入学号:);scanf(%d,&n);/一个整数读入for(i=0;isize;i+)if(n=studi.num)printf(ttt学生成绩条n);printf(学号t 姓名t 高数t英语t计基t平均分t名次n);printf(%dt%st %dt%dt%dt%4.1ft%dn,studi.num,,studi.score0,studi.score1,studi.score2,studi.ave,studi.rank);break;else con

18、tinue;/程序菜单函数void menu()printf(- welcome -n);printf(n);printf(*n);printf( 输入1 输出 学生信息设置 n);printf( 输入2 输出 求个人平均分并排名及查询 n);printf( 输入3 输出 求平均分并分段 n);printf( 输入4 输出 不及格学生成绩 n);printf( 输入5 输出 优等生名单 n);printf( 输入0 退出程序 n);printf(*n);/求取优等生人数及信息void youdengsheng() average();rrank();int i;printf(t优等生名单n);

19、printf( 学号 tt姓名t高数 英语 计基 平均成绩 名次n);for(i=0;i90|(studi.ave85&(studi.score0=100)|(studi.score1=100)|(studi.score2=100)|(studi.ave85&(studi.score0&studi.score195)|(studi.score0&studi.score295)|(studi.score195)&(studi.score295)&(studi.rank60)&(studi.score160)&(studi.score260)printf(%4dt%6s %d %d %d%10.2

20、f %dn,studi.num,,studi.score0,studi.score1,studi.score2,studi.ave,studi.rank);/主函数void main() int i;read();output(); while(1)menu();printf(请按照菜单进行操作n);scanf(%d,&i);switch(i)case 1:output();break;case 2:average();rrank();chengjitiao();break;case 3:allaverage();fenshuduan();break;case 4:nopa

21、ss();break; case 5:youdengsheng();break;case 0:goto kill;/exit(0);default:printf(error);kill:printf(您已成功退出程序); 4、 调试过程由于文件类型输入输出最后写入,所以我的程序全部写完才开始调试,用了逐条注释的方法,配合程序暂停的方式。起初注释掉部分函数后,发现的主要错误是“;”“”的缺失。后来利用程序暂停检查出一些排序算法上的错误。冒泡排序的部分赋初值有问题。在程序运行的过程中还出现了血多奇怪的数据,发现是数据定义和引用的过程中个别的数据类型和乘除的时候常数书写方式的问题。输出问题让我发现了

22、许多“printf”和“fprintf”的问题包括/f,%8,/n,/d等等问题导致的不对齐,数据类型混乱,与数据不对应导致的超额输出。运行输出数据错误让我发现了部分函数的排放规则问题。除此之外,还发现vb编译器的一些特殊情况我发准确识别的小bug,如输入文件的文件名中包涵特殊字符有可能会导致编译器读入错误。个人在调试程序的时候发现程序的编译构成中最易出错的是循环语句,排序部分,尝尝把循环的结构搞错,尤其是抽排序和冒泡排序容易搞混。其次最容易出现的是输出乱码,主要是输出的不匹配。再次就是goto语句在书写的时候要注意共同的语法。无条件跳出的运用。最后在进行梳理程序的时候发现了许多用不到的设置和

23、功能进行了清理。再梳理过程中调整了个别函数功能和输出的顺序。5、 程序有待改进的地方某些函数在特定情况下依然存在bug。比如2功能求平均分并分段在反复运行的情况下有极大可能出现数据加倍的情况。输出依然不够漂亮,部分函数体写得不够简洁优化清晰。以排序为例,在程序混乱的情况下最有排序方式应当是快速排序,但是为了方便书写我使用的是冒泡排序,在乱序情况下快速排序(选择排序)比冒泡排序的理论效率要高很多。把某些必要的引用内容写在了output函数里有待考虑同一名同学挂掉了多门课程应该在nopass函数里添加一个学位警示并记录学生挂掉的学分及课程,单独列出一个表。输出部分要是能做成“.xls”格式的输入输

24、出效果一定会好得多。六、本次实习的收获和建议本次实习收获很多,主要由以下几方面。1、 c语言的熟悉程度有了很大的提升。学习了结构体和对文件的输入和输出等方面内容。巩固了以前所学习的选择结构、循环结构、指针等知识。2、 了解了很多的调试程序的手段和方法。如程序暂停呵f10一步步运算看参考数组值。3、 对于程序的运行和构思更加缜密。尤其是在调试的过程中,愈发的感觉到了权后连贯在一起的全局考虑程序的重要性。4、 培养了细心和耐心的好习惯。5、了解了goto语句的书写和运用。附录1、 原始数据stu1.dat学号 姓名高数 英语 计基200602222陈果886086200602230丁伟周70596

25、5200602208范胜966590200602239侯聪917787200602244黄蕾926987200602205黄在豹905555200602219李金635360200604845郝妍879295200604846胡金元878897200602231李生鹏863653200602207李志勇845282200602240刘静828990200602243刘兰926393200602228刘书松604056200602203刘召807392200602229刘志明815675200602217罗中836982200602210马俊锋896983200602223毛春球81717220

26、0602242裴海勤927082200602233全妮878196200602224邵远846584200602236孙晓琼937890200602212田松845475200602215王伟967790200602225吴伟975648200602206夏冲655571200602226谢武涛735761200602221熊勇718284200602211徐扬927685200602209徐朕786375200605012余凤998082200602218杨成坤967488200602216叶太郎876769200602232翟英贺655756200602235张翅806167200602204张浩846762200602227张亮857356200602213赵华平997288200602241周燕9763872、生成文件stu2.dat 学生成绩综合成绩序号姓名高数英语计基平均成绩名次200602222陈果88608676.520200602230丁伟周70596568.735200602208范胜96659081.413200602239侯聪91778784.54200602244黄蕾92698780.2172

温馨提示

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

评论

0/150

提交评论