C语言课设实习报告.docx
《C语言课设实习报告.docx》由会员分享,可在线阅读,更多相关《C语言课设实习报告.docx(20页珍藏版)》请在冰豆网上搜索。
C语言课设实习报告
C语言课程设计实习报告
目录
一、程序分析与设计1
二、流程图2
三、源程序清单6
四、调试过程9
五、程序有待改进的地方10
六、本次实习的收获和建议10
附录11
一、程序分析与设计
1、先用记事本编辑文件stu1.dat存储一个班学习成绩。
然后在C环境下,建立一个学生信息的结构体,用r方式打开上述文件,再用fscanf读入、用printf在屏幕上显示文件内容。
2、利用循环使每个学生的三门功课的成绩相加,然后再把和除以三就得到了平均成绩。
接着用冒泡法利用平均分的高低排出名次。
最后用fprintf将每个学生的信息写入到stu2.dat文件。
3.计算各科成绩的分数段时,用到for循环if条件,事先定义各分数段人数变量,并赋值为0.如果符合各分数段符合if条件变量++自增。
再用fprintf将分数段的信息写入到stu2.dat文件。
4.在屏幕上打印学生的成绩,用printf函数for循环即可打出每个学生的成绩。
格式对齐用\n换行\t制表符。
5.打印不及格学生的信息,不及格应满足stu[i].score<60。
Printf打出stu[i].num,stu[i].name即学号,姓名。
第二次调用printf分别打出stu[i].score[0],stu[i].score[1],stu[i].score[2]相应的不及格成绩。
6.在屏幕上打印优等学生。
首先分析优等生需要的条件,有四种并列关系的条件都可。
A均成绩>=90B均成绩>=85且至少一科为100C均分>=85且至少有两科>=95D均分排名前三名。
满足着四个条件中的任一个且每门功课及格以上,即为优秀。
即可表示为:
(满足A||满足B||满足C||满足D)&&(各科成绩>=60)
A即为stu[i].aver>=90
B即为stu[i].aver>=85&&(stu[i].score[0]==100||stu[i].score[1]==100||stu[i].score[2]==100)
C即为stu[i].aver>=85&&(a||b||c)
a为英语C语言都>=95即为(stu[i].score[0]>=95&&stu[i].score[1]>=95)
b为英语高数都>=95即为(stu[i].score[0]>=95&&stu[i].score[2]>=95)
c为C语言高数都>=95即为(stu[i].score[1]>=95&&stu[i].score[2]>=95)
D即为stu[i].rank<=3
各科成绩>=60即可表示为(stu[i].score[0]>=60&&stu[i].score[1]>=60&&stu[i].score[2]>=60)
用逻辑运算符&&及||ifelseif语句即可实现程序。
二、流程图
voidmain()//主函数
voidduwenjian()//读入文件函数
voidxiewenjian()//向文件写出函数
voidgekepingjun()//求各科平均分
voidpingjunScore()//每学生三门功课平均分
voidRankStudent()//学生排名
voidfengshuduan()//各科分数段
voidPrint()//向屏幕打印学生成绩条
voidprintbujige()//向屏幕打印不及格学生信息
voidprintyoudenStudent()//向屏幕打印优等生信息
各个函数流程图如下:
设计思路
voidmain()voidduwenjian()
主函数读入文件
voidxiewenjian()写文件voidgekepingjun()求各科平均分函数
voidpingjunScore()三门功课平均分
voidRankStudent()学生排名voidfengshuduan()各分数段人数
voidprintbujige()打印不及格信息
voidPrint()打印各科成绩
voidprintyoudenStudent()优等生
三、源程序清单
#include
#include
#defineN15
structstudent
{intnum;
charname[20];
intscore[3];
floataver;
intrank;
}stu[N];
intE1=0,E2=0,E3=0,E4=0,E5=0,C1=0,C2=0,C3=0,C4=0,C5=0,M1=0,M2=0,M3=0,M4=0,M5=0;
floataverEnglish=0,averClanguage=0,averMath=0;
voidduwenjian();
voidxiewenjian();
voidgekepingjun();
voidpingjunScore();
voidRankStudent();
voidfengshuduan();
voidPrint();
voidprintbujige();
voidprintyoudenStudent();
voidmain()
{inti;intk;
duwenjian();//读入文件
pingjunScore();//各学生平均分
gekepingjun();//各科平均分
RankStudent();//排名
fengshuduan();//算分数段
xiewenjian();//写文件
printf("输入123\n1打印学生成绩2打印不及格信息3打印优等生\n");
for(k=0;;k++)
{
scanf("%d",&i);
if(i==1)
Print();//屏幕上打印学生成绩
elseif(i==2)
printbujige();//打印不及格信息
elseif(i==3)
printyoudenStudent();//打印优等生
else(i!
=1&&i!
=2&&i!
=3);
printf("请输入123\n");
}
}
voidduwenjian()
{FILE*fp;
inti;
if((fp=fopen("E:
\\xiaoqiang.txt","r"))==NULL)
{printf("cannotopenthefile!
\n");
exit(0);
}
for(i=0;i{
fscanf(fp,"%d%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
fclose(fp);
}
voidxiewenjian()
{FILE*fp;
inti;
if((fp=fopen("stu1.txt","w"))==NULL)
{
printf("cannotopenthefile!
\n");
exit(0);
}
fprintf(fp,"学号姓名英语C语言高数平均分名次\n");
for(i=0;i{
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%5.2f\t%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver,stu[i].rank);
}
fprintf(fp,"\n");
fprintf(fp,"分数段\t英语\tC语言\t高数\n");
fprintf(fp,"<60\t%d\t%d\t%d\n",E1,C1,M1);
fprintf(fp,"60~69\t%d\t%d\t%d\n",E2,C2,M2);
fprintf(fp,"70~79\t%d\t%d\t%d\n",E3,C3,M3);
fprintf(fp,"80~89\t%d\t%d\t%d\n",E4,C4,M4);
fprintf(fp,">=90\t%d\t%d\t%d\n",E5,C5,M5);
fprintf(fp,"平均分%5.3f\t%5.3f\t%5.3f\t",averEnglish,averClanguage,averMath);
fclose(fp);
}
voidpingjunScore()
{inti;
for(i=0;istu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
voidgekepingjun()
{inti;
for(i=0;i{
averEnglish=stu[i].score[0]+averEnglish;
averClanguage=stu[i].score[1]+averClanguage;
averMath=stu[i].score[2]+averMath;
}
averEnglish=averEnglish/N;
averClanguage=averClanguage/N;
averMath=averMath/N;
}
voidfengshuduan()
{inti;
for(i=0;i{if(stu[i].score[0]<60)E1++;
if(stu[i].score[0]<70&&stu[i].score[0]>=60)E2++;
if(stu[i].score[0]<80&&stu[i].score[0]>=70)E3++;
if(stu[i].score[0]<90&&stu[i].score[0]>=80)E4++;
if(stu[i].score[0]>=90)E5++;
if(stu[i].score[1]<60)C1++;
if(stu[i].score[1]<70&&stu[i].score[1]>=60)C2++;
if(stu[i].score[1]<80&&stu[i].score[1]>=70)C3++;
if(stu[i].score[1]<90&&stu[i].score[1]>=80)C4++;
if(stu[i].score[1]>=90)C5++;
if(stu[i].score[2]<60)M1++;
if(stu[i].score[2]<70&&stu[i].score[2]>=60)M2++;
if(stu[i].score[2]<80&&stu[i].score[2]>=70)M3++;
if(stu[i].score[2]<90&&stu[i].score[2]>=80)M4++;
if(stu[i].score[2]>=90)M5++;
}
}
voidRankStudent()
{inti,j;
for(i=0;i{
stu[i].rank=1;
for(j=0;j{
if(stu[i].averstu[i].rank++;
}
}
}
voidPrint()
{inti;
printf("每名学生的成绩:
\n\n");
for(i=0;iprintf("学号%d\t姓名%s\t英语%d\tC语言%d\t高数%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
voidprintbujige()
{
inti;
printf("\n不及格学生:
\n");
for(i=0;i{
if(stu[i].score[0]<60||stu[i].score[1]<60||stu[i].score[2]<60)
{
printf("学号%d\t姓名%s\t不及格课程及成绩:
",stu[i].num,stu[i].name);
if(stu[i].score[0]<60)printf("英语%d\t",stu[i].score[0]);
if(stu[i].score[1]<60)printf("C语言%d\t",stu[i].score[1]);
if(stu[i].score[2]<60)printf("高数%d\t",stu[i].score[2]);
printf("\n");
}
}
}
voidprintyoudenStudent()
{
inti;
printf("\n优秀学生的名单\n");
for(i=0;i{
if(((stu[i].aver>=90)||((stu[i].aver>=85)&&(stu[i].score[0]==100||stu[i].score[1]==100||stu[i].score[2]==100)))&&(stu[i].score[0]>=60&&stu[i].score[1]>=60&&stu[i].score[2]>=60))
printf("学号%d\t姓名%s\t英语%d\tC语言%d高数%d\t平均分%5.2f\t名次%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver,stu[i].rank);
elseif((stu[i].rank<=3)&&(stu[i].score[0]>=60&&stu[i].score[1]>=60&&stu[i].score[2]>=60))
printf("学号%d\t姓名%s\t英语%d\tC语言%d高数%d\t平均分%5.2f\t名次%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver,stu[i].rank);
elseif(((stu[i].aver>=85)&&((stu[i].score[0]>=95&&stu[i].score[1]>=95)||(stu[i].score[1]>=95&&stu[i].score[2]>=95)||(stu[i].score[0]>=95&&stu[i].score[2]>=95)))&&(stu[i].score[0]>=60&&stu[i].score[1]>=60&&stu[i].score[2]>=60))
printf("学号%d\t姓名%s\t英语%d\tC语言%d高数%d\t平均分%5.2f\t名次%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver,stu[i].rank);
}
}
四、调试过程
1.在程序运行的过程中,出现了很多的错误。
有很复杂的问题,也不乏许多低级的错误。
在写入文件的时候,首先我用的是fwrite,而在读入文件的时候用的是fread,后来才发现这两个语句都只是对二进制的文件进行操作,实际上我们要用到的fscanf、fprintf这两个语句。
2.在程序运行后开始写出文件结果中出现乱码,原来是原文本文件中添加了汉字的标
注,在读入文件程序中fscanf不能识别,故写出乱码。
删除汉字符标注后写出的文件即为正确的信息。
3.在分数段函数的编写中开始只在该函数中定义了各分数段人数的局部变量,而在后面的fprintfprintf函数输出结果时却不能利用该定义的变量。
正确的做法是在main函数中定义全局变量,这样才能使其他函数也能利用该定义的变量。
4.在编写优等生的函数中,由于优等生要求满足的条件较多。
编写的各段代码很乱。
后来仔细分析了各个需要满足的条件之间的逻辑关系,利用逻辑关系实现了程序,但仍较为繁琐。
在该程序中又出先多重括号不匹配的错误。
由于没有弄情if语句的嵌套,在连续用了三个if和printf语句,结果使有些学生的信息连续打出了几次。
在改为elseif语句后即得出正确结果。
5.在程序调试过程中没有利用设置断点的方法,使错误查找较困难。
五、程序有待改进的地方
1.在程序编写时用了较多if语句的嵌套使程序的可读性降低。
2.在编写分数段函数时在main函数中定义了较多的变量,占用了较多的内存空间,应当适当优化。
3.程序运行后要求分别打印出三项内容学生成绩,不及格学生,优等生信息可以用switch语句编写一个菜单选项,这样比通过用if语句更显简单。
通过在界面上输入相应的字符,让需要打印出信息。
六、本次实习的收获和建议
1.通过这次实习第一次编写了较多程序,通过函数调用将各个函数模块联系起来,来组成较大的程序,实现其功能。
这使我感到结构化编写程序的重要性。
只有通过结构化的程序设计将各部分小功能组合起来,才能编写出功能较强的大程序。
2.在这次上机调试调试过程中,我学会了用设置断点的方法查找程序中出现的错误,这样使得程序的错误查找更为容易。
进一步对VC++的编程环境有所了解,对上机调试有了更深入的认识。
3.在编写程序的各段函数中,感到自己对书上的一些内容理解和掌握的不够。
对一些长用的语句特点记忆不清,结果使程序的编写较为困难。
应加深对课本的理解。
4.通过本次实习我感到一个编程者应有认真仔细的态度,只有认真仔细才能查找出程序中的错误,有所提高。
附录
1、原始数据xiaoqiang.tst
2.
生成文件stu1.tst
3、运行结果
输入1按enter键
输入2按enter键
输入3按enter键
输入4按enter键