一、实验要求
1.输入、修改和显示n个学生的m门考试科目的成绩,计算总分和平均分。
2.分别按总分和学号进行排序。
3.输入学生的学号,显示该学生的姓名、各门课程的成绩。
4.将输入的学生成绩数据保存到文件中。
5.从文件中读出学生成绩数据,查询学生成绩。
6.程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性
二、实验内容
通过七个子函数分别实现七个功能:
1. 输入一个班的学生记录
2. 显示所有记录
3. 求出全班平均成绩
4. 输出排名(分别按总分和学号排序)
5. 输入学号显示该学生的姓名、各门课程的成绩
6. 结果存入文件chengji.txt
7. 从文件chengji.txt中读出学生成绩数据
8. 生成可执行文件 (主函数中实现)【编译器用的DEV-C++】
缺陷
没有修改功能
三、实验步骤
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct Student
{
int num; //学号
char name[20]; //姓名
float pingshi; //平时成绩
float shiyan; //实验成绩
float kaoshi; //考试成绩
double zongfen;//总分
};
/* 对函数进行声明 */
void a(); /* 输入一个班的学生记录 */
void b(); /* 显示所有记录 */
void c(); /* 求出全班平均成绩 */
void d(); /* 输出成绩与排名 */
void e(); /* 输入学号显示该学生的记录 */
void f(); /* 结果存入文件chengji.txt */
void g(); /* 从文件中读出学生成绩数据 */
struct Student stu[50]; //此处假定班级人数为 50 人 ,输入量比较大,若改变人数以减少输入量(对于子函数中的数值也要随之改变)
int main()
{
int n = 0;
while(n != 8)
{
printf("\t计算机学生成绩管理系统\n\n");
printf("1:输入一个班学生成绩记录\n");
printf("2:显示所有成绩记录\n");
printf("3:计算并输出平均成绩\n");
printf("4:分别按总分和学号排序\n");
printf("5: 输入学号显示该学生的记录\n");
printf("6:结果存入文件chengji.txt\n");
printf("7: 从文件中读出学生成绩数据\n");
printf("8:退出系统\n\n");
printf("输入选项代码:");
scanf("%d",&n);
while(n<1 || n>8)
{
printf("请按照规则输入:\n"); //判断输入的正确性
scanf("%d", &n);
}
switch(n)
{
case 1: a();
case 2: b();
case 3: c();
case 4: d();
case 5: e();
case 6: f();
case 7: g(); break;
case 8: printf("\n*******************谢谢使用!*******************\n"); break;
}
system("pause"); //生成可执行文件
return 0;
}
getchar();
}
/* 子 函 数 */
void a() /* 输入一个班的学生记录*/
{
int i;
for(i=0; i<50; i++)
{
printf("请输入学号 姓名 平时成绩 实验成绩 考试成绩:");
scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].pingshi,&stu[i].shiyan,&stu[i].kaoshi);
}
for(i=0; i<50; i++)
{
stu[i].zongfen=0.1*stu[i].pingshi+0.3*stu[i].shiyan+0.6*stu[i].kaoshi; //总分
}
}
void b() /* 显示所有记录*/
{
int i;
printf("\n");
printf("学号 姓名 平时成绩 实验成绩 考试成绩 总评成绩\n");
for(i=0; i<50; i++)
{
printf("%d%14.2s%14.2f%14.2f%14.2f%14.2f\n",stu[i].num,stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);
}
}
void c() /* 求出全班平均成绩 */
{
int a[50];
int i, j, k;
double total=0;
double ave;
for(k = 0; k<50; k++) //对数组a[50]赋初值
{
a[k] = k;
}
for(i=0; i<4; i++)
{
total = total+stu[i].zongfen;
}
ave=total/4.0;
printf("总评平均成绩是%f\n", ave);
}
void d() /* 分别按总分和学号排序 */
{
int a[50];
int i, j, k, temp, t;
for(k = 0; k<50; k++) //对数组a[50]赋初值
{
a[k] = k;
}
for(j=0; j<3; j++)
{
for(i=0; i<3-j; i++)
if(stu[a[i]].zongfen > stu[a[i+1]].zongfen)
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
printf("\n按总分排序后:\n");
printf("学号 姓名 总评成绩\n");
for(i=0; i<50; i++)
{
printf("%d%10.2s%15.2f\n",stu[a[i]].num,stu[a[i]].name,stu[a[i]].zongfen);
}
for(i = 1; i<49; i++)
{
for(j = i+1; j<50; j++)
{
if(stu[a[i]].num >stu[a[j]].num )
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
printf("\n按学号排序后:\n");
printf("学号 姓名 总评成绩\n");
for(i=0; i<50; i++)
{
printf("%d%10.2s%15.2f\n",stu[a[i]].num,stu[a[i]].name,stu[a[i]].zongfen);
}
printf("\n");
}
void e() /* 输入学号显示该学生的记录 */
{
int num;
int i, k, a[50];
for(k = 0; k<50; k++) //对数组a[50]赋初值
{
a[k] = k;
}
printf("您如果想要查询某个学生的信息,请按照以下步骤进行:\n");
printf("\n请输入你想要查询学生的学号:\n");
scanf("%d", &num);
for(i = 0; i<50; i++)
{
if(num == stu[a[i]].num)
{
printf("查询信息如下:\n");
printf("%14.2s%14.2f%14.2f%14.2f%14.2f\n", stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);
}
}
}
void f() /* 结果存入文件chengji.txt , 保存在你的源程序所在的文件夹中*/
{
int i;
FILE * fp;
fp = fopen("chengji.txt","w"); //写入磁盘的名字为chengji.txt
fprintf(fp, "学号 姓名 平时成绩 实验成绩 考试成绩 总评成绩\n");
for(i=0; i<50; i++)
{
fprintf(fp, "%d%14.2s%14.2f%14.2f%14.2f%14.2f\n",stu[i].num,stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);
}
printf("\n\n*******************恭喜,保存完成!*******************\n\n");
}
void g() /* 从文件中读出学生成绩数据 */
{
int i;
FILE * in;
char infile[10];
printf("请输入读入文件的名字:\n"); //输入chengji.txt即可
scanf("%s", infile);
if((in = fopen(infile, "r")) == NULL) //以只读的方式打开 ,等于NULL就无法打开
{
printf("无法打开此文件\n");
exit(0);
}
printf("学生成绩数据");
for(i=0; i<50; i++)
{
printf("%d%14.2s%14.2f%14.2f%14.2f%14.2f\n",stu[i].num,stu[i].name,stu[i].pingshi,stu[i].shiyan,stu[i].kaoshi,stu[i].zongfen);
}
}
四、实验结果
注:
代码中我假定的是50个人,由于输入量的原因,此处是假定为10个人时候的结果。
第一张图
第二张图
第三张图
第四张图
五、实验总结
编程要的是正确的结果,体会的是艰辛的过程,收获的是好心情。 首先编程的时候你不能觉得这是一个繁琐的过程,在遇到出错的时候要有信心解决,不要害怕出错,不能忽略细节,尤其是对标点以及输入输出函数,要正确使用。 其次,编程要有一个扎实的知识储备,没把课本看好,没把例题看好,不会编出正确的程序,同时,如果不多看程序,不多敲程序,不断吸收别人的编程思想,就不会编出精彩的程序。