C语言课程设计报告
- 设计目的
根据课程设计题目要求,编写C代码,完成设计任务。
- 设计内容
- 仔细研读《课程设计题目和说明》文档,理解需要设计的功能;
- 使用自己熟悉的C IDE编程工具,实现具体功能;
- 设计“期末学生总评成绩统计”程序(详见课程设计题目与说明文档)
- 编码调试程序,运行结果截图。
- 撰写课程设计报告,提交源代码和课程设计报告到网络学习平台,现场答辩。
- 功能设计记录
3.1 系统功能描述
编写了控制台应用程序,采用功能菜单函数(menu)的方式,用户可以选择功能选项,执行相关功能。
3.2 程序整体设计说明
1读数功能(读取的成绩保存在数组中);2成绩计算功能(计算及格率、最高分、最低分、平均分、标准差、众数、中位数等。计算得到的数据可以保存在相关数组中,用于后面的显示与绘图);3显示总评成绩与分数分段占比信息;4绘制分数分段占比的直方图;5显示成绩的其他指标(最高分、最低分、平均分、标准差等);6显示排名前十的学生信息;0退出程序。
3.3 结构体设计
typedef struct student
{
long id;
int score[M];
} STUDENT;
3.4 main函数设计
int main ()
{
STUDENT stu[SIZE];
int num = readData(stu);
int sum=num;
int max, min;
double pass = 0;
double ave[SIZE],stdDev[SIZE];
int grade[11]= {0};
while(1)
{
switch(menu())
{
case 1:
{
display(stu, num);
break;
}
case 2:
{
countPassRadio(&max,&min, &pass, stu, sum);
countStdDev(ave,stdDev, stu,sum);
break;
}
case 3:
{
ShowData1(stdDev,stu,sum,grade);
break;
}
case 4:
{
draw(grade);
break;
}
case 5:
{
printf("及格率=%6.2f%% 最高分=%3d 最低分=%3d\n\n",pass,max,min);
printf("平时成绩平均分 = %5.2f 平时成绩标准差= %5.2f\n\n",ave[0],stdDev[0]);
printf("期末成绩平均分 = %5.2f 期末成绩标准差= %5.2f\n\n",ave[1],stdDev[1]);
printf("总评成绩平均分 = %5.2f 总评成绩标准差= %5.2f\n\n",ave[2],stdDev[2]);
break;
}
case 6:
{
top(stu,sum);
break;
}
case 0:
{
exit(0);
break;
}
default:
break;
}
}
return 0;
}
3.5 menu菜单函数设计
int menu(void)
{
int itemSelected;
printf("\n=========Student Score Analysis=========\n");
printf(" 1. Read data\n");
printf(" 2. Count\n");
printf(" 3. Show data 1\n");
printf(" 4. Draw Histogram\n");
printf(" 5. Show data 2\n");
printf(" 6. Top 10 Students\n");
printf(" 0. Exit\n");
printf("======================================\n");
printf("Your choice: ");
scanf("%d", &itemSelected);
return itemSelected;
}
3.6 功能函数一设计
void ShowData1(double stdDev[],STUDENT stu[], int sum,int grade[])
{
for(int i=0; i<sum; i++)
{
if(stu[i].score[2]==100)
{
grade[10]+=1;
}
else if(stu[i].score[2]>89)
{
grade[9]+=1;
}
else if(stu[i].score[2]>79)
{
grade[8]+=1;
}
else if(stu[i].score[2]>69)
{
grade[7]+=1;
}
else if (stu[i].score[2]>59)
{
grade[6]+=1;
}
else if(stu[i].score[2]>49)
{
grade[5]+=1;
}
else if(stu[i].score[2]>39)
{
grade[4]+=1;
}
else if(stu[i].score[2]>29)
{
grade[3]+=1;
}
else if(stu[i].score[2]>19)
{
grade[2]+=1;
}
else if(stu[i].score[2]>9)
{
grade[1]+=1;
}
}
for (int i=0; i<sum; i++)
{
printf("%3d%4d%4d%4d\n",i+1,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
float rate;
for (int i=10; i>0; i--)
{
if (grade[i]==0)
{
rate=0;
}
else
rate=(float)grade[i]/sum*100;
printf("Grade%3d: %d,%0.2f %%\n",i,grade[i],rate);
}
}
3.6 功能函数二设计
void top(STUDENT stu[],int sum)
{
STUDENT temp;
for(int i =0; i<sum-1; i++)
{
for(int j = 0; j<sum-1-i; j++)
{
if(stu[j].score[2]<stu[j+1].score[2])
{
temp=stu[j+1];
stu[j+1]=stu[j];
stu[j]=temp;
}
}
}
for (int i=0; i<10; i++)
{
printf("The top 10 students are %ld,scores are %3d %3d %3d\n",stu[i].id,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
3.7 运行截图分析
- 课程设计小结(设计心得、对改进系统功能的思考、对C的理解等)
本程序的实现完全按照题目所给的要求进行实现,可能是所有作品中完成度最高的。
Show data2部分没有采用函数的形式,是考虑到此步已经不需要进行任何数据的运算,只需要单纯输出count函数得出的结果
代码在运行前有很多bug,经过不懈努力终于修复完成。
可能是编译器不同的问题,我使用的codeblocks要求switch语句中每一句都带上大括号。
在grade数组中,我一开始得到了几个乱码的数据。究其原因,是一开始没有为数组赋初始值0。
在根据总评高低给结构体进行排序时一开始出现了语法错误,后来把用于交换的中间变量temp改成了结构体的类型才得以正常运行
最后我本人在自己电脑上运行时,所有的中文全部乱码,经查证是编译器的问题,因为代码在同学的电脑上可以正确运行。为了让考官能直观感受到程序本身的好坏,本人所提供的运行截图是在同学的电脑上进行的,望周知。