计算机C语言课程设计实习报告.docx
- 文档编号:6383310
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:25
- 大小:278.70KB
计算机C语言课程设计实习报告.docx
《计算机C语言课程设计实习报告.docx》由会员分享,可在线阅读,更多相关《计算机C语言课程设计实习报告.docx(25页珍藏版)》请在冰豆网上搜索。
计算机C语言课程设计实习报告
C语言课程设计实习报告
班级:
地质11102
学生姓名:
商博文
学号:
01
指导老师:
何老师/陈老师/龙
日期:
2018.3.7
目录
一、程序分析与设计1
二、流程图2
三、源程序清单9
四、调试过程17
五、程序有待改进的地方18
六、本次实习的收获和建议18
附录18
一、程序分析与设计
1、一开始拿到这个程序我感觉到它的流程特别清晰,各个功能项之间联系并不十分密切,所以各异很容易的分成许多不同的部分分别以独立的函数体进行书写和编辑。
2、确定每一项要求写成一个或者分成多个函数体进行书写。
并按照要求的先后顺序确定函数体的排列次序,将最想被调用与被调用次数最多的函数体放在最前面,一边用最简洁的方式书写程序,尽量少的进行函数声明。
3、在确定了函数名称后,先将函数名称记录下来,并确定其功能总计有read(),output(),average(),allaverage(),rrank(),fenshuduan(),nopass(),chengjitiao(),menu(),youdengsheng()等十组函数。
4、确定需要调用的库函数并进行声明,设定全局变量SIZE为学生人数。
5、清晰的书写学生结构体和课程结构体stu[SIZE],明确结构体重每一个变量的类型和长度。
6、首先书写读入输出函数read(),将所需数据按照课程结构体的标准进行读入用文件格式fscanf。
7、写出函数向所需数据的列表进行写出。
8、写出求学生平均成绩的函数average()并求出学生平均成绩三个相加除三取整。
9、写出求各科平均成绩的函数allaverage()并求出各科平均成绩学生人数个相加除学生人数取整。
10、排名函数rrank(),用抽排法写出排序并用文件类型输出。
11、分数段函数fenshuduan()写出不同的分数段并运用数组寄存每个分数段的人数并用两种方式写出。
12、判断出不及格的人nopass()并输出他/她们的学号,姓名,课程名称,成绩等信息。
13、运用比较与循环写出查询学生信息的函数chengjitiao()。
14、写出菜单的输出函数menu()。
15、运用逻辑运算符写出优等生的求取函数youdengsheng()。
16、写退出函数。
17、写出主函数并且用case语句进行判断执行主函数的各个功能。
18、整个过程中,平均数,学生信息,平均分查询用文件类型的输出。
二、流程图
Main函数
函数图主体
如果输入1则运行学生信息设置的函数
如果输入2则运行求个人平均分的函数
如果输入3则平均分数段函数
如果输入4运行不及格函数
如果输入0结束
Read()函数
此段为读入函数的流程图
运用指针读入文件中的数据
如果指针为空输出无法打开
Output函数
此段为写出文件函数
用指针指向文件夹写出
如果指向空则输出无法打开
average()函数
此段为求每个学生平均成绩的函数
现将每个学生的三科成绩相加
再将所得数据除以3得到平均分
allaverage()函数
此段为求各科平均成绩的函数
现将每门课的所有学生得分相加
再除以学生人数
最后得到每科总平均分
rrank()
排名的函数
先运用抽排法确定每一个学生的排名
将排名组合到结构体
再将包涵排名信息的所有学生信息进行输出
fenshuduan()
分数段函数
将每个学生的每项成绩进行判断
然后将学生的成绩分别计数
分别统计出来没想科目每个分数段的学生人数
用文件类型进行输入输出
nopass()
不及格人数统计的函数
先求出不及格的成绩并记录该学生的各项信息
对各项信息进行输出
chengjitiao()
输出学生的成绩条
menu()
打印主菜单
youdengsheng()
学生成绩查询的函数
按照课程要求进行逻辑用语的编写
输出优等生的个人信息
三、源程序清单
#include
#include
#defineSIZE40//班里学生40个
intenglish[5],C[5],math[5];//‘5’保留小数点一位
floatenglishave;//此变量算英语成绩平均分
floatCave;//计算机
floatmathave;//数学
structstudent//学生结构体
{
charname[10];//存放姓名
intnum;//学号
intscore[3];//学分
floatave;//平均分
intrank;//排名
}stud[SIZE];//结构体有40个
structcourse//课程设置结构体
{
charcname[20];//存放课程名称20表示课程名称最长有20个字节
}cur[3]={{"大学英语"},{"C语言设计"},{"高等数学"}};//分别赋初值为课程的名称
intcour[3][5]={0};//后面分段计数的时候分了5个分数段共有三门课赋初值为零
//读文件函数
voidread()
{
FILE*fp;//文件型指针变量如果存放地址为空则输出can'topenfile!
并退出
if((fp=fopen("e:
\\stud1.txt","r"))==NULL)
{
printf("can'topenfile!
\n");
exit(0);
}
for(inti=0;i fscanf(fp,"%d%s%d%d%d%d",&stud[i].num,stud[i].name,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2],&stud[i].score[3]);//从文件读取信息 fclose(fp); } //写出文件函数 voidoutput() { FILE*fp;//文件型指针变量 if((fp=fopen("e: \\stud1.txt","r"))==NULL) { printf("can'topenfile! \n"); exit(0); } printf("\t学生原始成绩\n"); printf("|学号|姓名|英语|C语言|高数|\n"); for(inti=0;i { fscanf(fp,"%d%s%d%d%d",&stud[i].num,stud[i].name,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);//从文件读取信息 printf("%6d%12s%6d%6d%6d\n",stud[i].num,stud[i].name,stud[i].score[0],stud[i].score[1],stud[i].score[2], stud[i].score[3]);//从程序输出到文件里 } } //求学生平均成绩函数 voidaverage() { inti,j,sum; for(i=0;i { sum=0; for(j=0;j<3;j++)//从第一门课到第三门课循环 sum+=stud[i].score[j];//每门课的成绩相加 stud[i].ave=(int)(sum)/3;//八三门课的成绩除以3的平均分 } } //求各科的平均成绩函数 voidallaverage() { inti; englishave=0; Cave=0; mathave=0; for(i=0;i { mathave+=stud[i].score[0];//所有人数学课成绩相加 englishave=(englishave+stud[i].score[1]);//英语 Cave=(Cave+stud[i].score[2]);//计算机 } englishave=englishave/SIZE;//除以人数得到平均分 mathave=mathave/SIZE; Cave=Cave/SIZE; } //排名函数 voidrrank() { inti,j; for(i=0;i //抽排法 for(i=0;i { stud[i].rank=1; for(j=0;j { if(stud[i].ave if(stud[i+1].rank=stud[i].rank) stud[i+2].rank++;//如果....相等再加一个 } } FILE*fp; if((fp=fopen("e: \\stu2.txt","w"))==NULL) { printf("can'topenthefile"); return; } fprintf(fp,"\t\t\t\t学生成绩综合成绩\n"); fprintf(fp,"序号\t\t姓名\t高数\t英语\t计基\t平均成绩\t名次\n"); for(i=0;i fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%15.2f\t%5d\n",stud[i].num,stud[i].name,stud[i].score[0],stud[i].score[1], stud[i].score[2],stud[i].ave,stud[i].rank); fclose(fp); } //求取个分数段人数 voidfenshuduan() { voidallaverage(); allaverage(); inti,j; printf("\t\t各科分数段及各科平均成绩\n"); for(i=0;i for(j=0;j<3;j++) { if(stud[i].score[j]>=90)cour[j][4]++;//如果该门课该学生成绩大于90则该门课改分数段人数加一 elseif(stud[i].score[j]>=80)cour[j][3]++; elseif(stud[i].score[j]>=70)cour[j][2]++; elseif(stud[i].score[j]>=60)cour[j][1]++; elsecour[j][0]++; } printf("分数段\t高数\t英语\t计基\n"); printf("<60\t%d\t%d\t%d\n",cour[0][0],cour[1][0],cour[2][0]); printf("60~69\t%d\t%d\t%d\n",cour[0][1],cour[1][1],cour[2][1]); printf("70~79\t%d\t%d\t%d\n",cour[0][2],cour[1][2],cour[2][2]); printf("80~89\t%d\t%d\t%d\n",cour[0][3],cour[1][3],cour[2][3]); printf("90~100\t%d\t%d\t%d\n",cour[0][4],cour[1][4],cour[2][4]); printf("平均成绩\t%4.1f\t%4.1f\t%4.1f\n",mathave,englishave,Cave); FILE*fp; if(NULL==(fp=fopen("e: \\stu3.txt","w"))) { printf("cannotopenthefile"); return; } fprintf(fp,"\t\t\t分数段及平均分\n"); fprintf(fp,"\n"); fprintf(fp,"分数段\t高数\t大英\t计基\n");//反斜杠t表示tab反斜杠n表示换行%d表示十进制整数输出%f表示十进制实数输出%s表示字符串类型输出f前面的4.1表示共四位数其中有一位小数 fprintf(fp,"<60\t%d\t%d\t%d\n",cour[0][0],cour[1][0],cour[2][0]); fprintf(fp,"60~69\t%d\t%d\t%d\n",cour[0][1],cour[1][1],cour[2][1]); fprintf(fp,"70~79\t%d\t%d\t%d\n",cour[0][2],cour[1][2],cour[2][2]); fprintf(fp,"80~89\t%d\t%d\t%d\n",cour[0][3],cour[1][3],cour[2][3]); fprintf(fp,"90~100\t%d\t%d\t%d\n",cour[0][4],cour[1][4],cour[2][4]); fprintf(fp,"平均成绩%4.1f\t%4.1f\t%4.1f\t\n",mathave,englishave,Cave); fclose(fp); } //不及格学生信息函数 voidnopass() { inti,j; printf("\t不及格学生名单\n"); printf("\t学号\t\t姓名\t\t不及格课程\t\t不及格分数\n"); for(i=0;i { for(j=0;j<3;j++) { if(stud[i].score[j]<60)//如果该人该门课分数低于60则输出一下信息 printf("\t%5d%10s\t\t%10s\t\t%d\n",stud[i].num,stud[i].name,cur[j].cname,stud[i].score[j]); } } } //查询学生信息函数 voidchengjitiao() { inti,n; printf("请输入学号: "); scanf("%d",&n);//一个整数读入 for(i=0;i if(n==stud[i].num) { printf("\t\t\t学生成绩条\n"); printf("学号\t姓名\t高数\t英语\t计基\t平均分\t名次\n"); printf("%d\t%s\t%d\t%d\t%d\t%4.1f\t%d\n",stud[i].num,stud[i].name,stud[i].score[0],stud[i].score[1], stud[i].score[2],stud[i].ave,stud[i].rank); break; } else continue; } //程序菜单函数 voidmenu() { 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"); } //求取优等生人数及信息 voidyoudengsheng() { average(); rrank(); inti; printf("\t优等生名单\n"); printf("学号\t\t姓名\t高数英语计基平均成绩名次\n"); for(i=0;i { if((stud[i].ave>90||(stud[i].ave>85&&((stud[i].score[0]==100)||(stud[i].score[1]==100)||(stud[i].score[2]==100))) ||(stud[i].ave>85&&((stud[i].score[0]&&stud[i].score[1]>95)||(stud[i].score[0]&&stud[i].score[2]>95)|| ((stud[i].score[1]>95)&&(stud[i].score[2]>95)))))&&(stud[i].rank<=3&&((stud[i].score[0]>60)&&(stud[i].score[1]>60)&&(stud[i].score[2]>60)))) printf("%4d\t%6s%d%d%d%10.2f%d\n",stud[i].num,stud[i].name,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].ave,stud[i].rank); } } //主函数 voidmain() { inti; read(); output(); while (1) {menu(); printf("请按照菜单进行操作\n"); scanf("%d",&i); switch(i) { case1: output();break; case2: average();rrank();chengjitiao();break; case3: allaverage();fenshuduan();break; case4: nopass();break; case5: youdengsheng();break; case0: gotokill;//exit(0); default: printf("error"); } } kill: printf("您已成功退出程序"); } 4、调试过程 由于文件类型输入输出最后写入,所以我的程序全部写完才开始调试,用了逐条注释的方法,配合程序暂停的方式。 起初注释掉部分函数后,发现的主要错误是“;”“{}”的缺失。 后来利用程序暂停检查出一些排序算法上的错误。 冒泡排序的部分赋初值有问题。 在程序运行的过程中还出现了血多奇怪的数据,发现是数据定义和引用的过程中个别的数据类型和乘除的时候常数书写方式的问题。 输出问题让我发现了许多“printf”和“fprintf”的问题包括/f,%8,/n,/d等等问题导致的不对齐,数据类型混乱,与数据不对应导致的超额输出。 运行输出数据错误让我发现了部分函数的排放规则问题。 除此之外,还发现VB编译器的一些特殊情况我发准确识别的小bug,如输入文件的文件名中包涵特殊字符有可能会导致编译器读入错误。 个人在调试程序的时候发现程序的编译构成中最易出错的是循环语句,排序部分,尝尝把循环的结构搞错,尤其是抽排序和冒泡排序容易搞混。 其次最容易出现的是输出乱码,主要是输出的不匹配。 再次就是goto语句在书写的时候要注意共同的语法。 无条件跳出的运用。 最后在进行梳理程序的时候发现了许多用不到的设置和功能进行了清理。 再梳理过程中调整了个别函数功能和输出的顺序。 5、程序有待改进的地方 某些函数在特定情况下依然存在bug。 比如2功能求平均分并分段在反复运行的情况下有极大可能出现数据加倍的情况。 输出依然不够漂亮,部分函数体写得不够简洁优化清晰。 以排序为例,在程序混乱的情况下最有排序方式应当是快速排序,但是为了方便书写我使用的是冒泡排序,在乱序情况下快速排序(选择排序)比冒泡排序的理论效率要高很多。 把某些必要的引用内容写在了output函数里有待考虑 同一名同学挂掉了多门课程应该在nopass函数里添加一个学位警示并记录学生挂掉的学分及课程,单独列出一个表。 输出部分要是能做成“.xls”格式的输入输出效果一定会好得多。 六、本次实习的收获和建议 本次实习收获很多,主要由以下几方面。 1、c语言的熟悉程度有了很大的提升。 学习了结构体和对文件的输入和输出等方面内容。 巩固了以前所学习的选择结构、循环结构、指针等知识。 2、了解了很多的调试程序的手段和方法。 如程序暂停呵F10一步步运算看参考数组值。 3、对于程序的运行和构思更加缜密。 尤其是在调试的过程中,愈发的感觉到了权后连贯在一起的全局考虑程序的重要性。 4、培养了细心和耐心的好习惯。 5、了解了goto语句的书写和运用。 附录 1、原始数据stu1.dat 学号姓名高数英语计基 200602222陈果886086 200602230丁伟周705965 200602208范胜966590 200602239侯聪917787 200602244黄蕾926987 200602205黄在豹905555 200602219李金635360 200604845郝妍879295 200604846胡金元878897 200602231李生鹏863653 200602207李志勇845282 200602240刘静828990 200602243刘兰926393 200602228刘书松604056 200602203刘召807392 200602229刘志明815675 200602217罗中836982 200602210马俊锋896983 200602223毛春球817172 200602242裴海勤927082 200602233全妮878196 200602224邵远846584 200602236孙晓琼9
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 语言 课程设计 实习 报告