c语言成绩查询系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言大作业
目录
一.目的 (3)
二.题目描述和要求 (3)
三.报告内容 (5)
3.1需求分析 (5)
3.2 概要设计 (5)
3.3 详细设计 (7)
3.4 主要源程序代码 (8)
3.5 测试分析 (15)
3.6 设计结果 (16)
四.结论与心得 (21)
一.目的
1.1、通过本次大作业,锻炼我们应用C语言的语法规则和已经掌握的
算法,自己解决一个较简单的课题,初步积累编程经验。
1.2、通过学习掌握程序设计的方法与编程技术,学会良好的程序设计风格,
为计算机在不同领域的应用打下坚实的基础。
1.3、要求我们能利用计算机解决实际问题。
从分析问题入手,设计可行的
算法,进而编出相应的C程序。
强调上机实践过程,从实际应用出发,注重程序的实际应用。
二.题目描述和要求
题目:学生成绩管理系统
应用链表及外部文件,独立设计上述应用系统,并编程实现以下功能:
2.1 信息录入
录入学生信息(包括姓名、学号、各科成绩)。
2.2信息查询
输入学号,查询与学号相对应的信息(包括成绩),并按可选的自定义规则进行排序。
按班级查询学生成绩。
按班级统计学科总分、平均分等。
2.3 信息删除与修改
输入学号,删除该学号对应的成绩信息。
输入学号,查询并显示出该学号信息,并在此基础上进行修改。
2.4 计算学生成绩
计算每位学生的总分。
计算每位学生的平均分。
成绩排序。
2.5信息保存
将学生信息保存在文件中。
2.6根据以上功能需求,定义通讯录信息结构,并采用链表结构对数据进行存储。
2.7提供友好的用户界面,方便用户操作。
三.报告内容
3.1需求分析
随着当今社会发展,信息化水平逐步提高,对教务管理有了新的要求,因此,编写一个信息管理系统是十分有必要的。
该软件主要是实现对学生信息进行系统化的管理,首先可以对学生基本信息进行输入和读取,其次查找并显示特定学生的相关信息,然后可以插入学生的相关信息,还有就是可按学生相关信息排序,以求达到简易操作的目的。
3.2 概要设计
1.系统结构图(功能模块图)和数据变量说明
2.系统总体流程图
3.3 详细设计
3.4 主要源程序代码
#include<stdio.h>
#include<string.h>
#include <cstdlib>
struct Student
{
char ID[20];
char Name[20];
float scor_eng;
float scor_math;
float scor_phy;
float Average;
};
struct Student students[1000];
int num=0;
float Avg(struct Student stu)
{
return (stu.scor_eng+stu.scor_math+stu.scor_phy)/3; }
int Student_SearchByIndex(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].ID,id)==0)
{
return i;
}
}
return -1;
}
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].Name,name)==0)
{
return i;
}
}
return -1;
}
void Student_DisplaySingle(int index)
{
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","英语成绩","数学成绩","物理成绩","平均成绩");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name, students[index].scor_eng,students[index].scor_math,students[index].scor_phy,students[index].Average); }
void Student_Insert()
{
while(1)
{
printf("请输入学号:");
scanf("%s",&students[num].ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[num].Name);
getchar();
printf("请输入英语成绩:");
scanf("%f",&students[num].scor_eng);
getchar();
printf("请输入数学成绩:");
scanf("%f",&students[num].scor_math);
getchar();
printf("请输入物理成绩:");
scanf("%f",&students[num].scor_phy);
getchar();
students[num].Average=Avg(students[num]);
num++;
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
void Student_Modify()
{
while(1)
{
char id[20];
int index;
printf("请输入要修改的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要修改的学生信息为:\n");
Student_DisplaySingle(index);
printf("-- 请输入新值--\n");
printf("请输入学号:");
scanf("%s",&students[index].ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[index].Name);
getchar();
printf("请输入英语成绩:");
scanf("%f",&students[index].scor_eng);
getchar();
printf("请输入数学成绩:");
scanf("%f",&students[index].scor_math);
getchar();
printf("请输入物理成绩:");
scanf("%f",&students[index].scor_phy);
getchar();
students[index].Average=Avg(students[index]);
}
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
void Student_Delete()
{
int i;
while(1)
{
char id[20];
int index;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_DisplaySingle(index);
printf("是否真的要删除?(y/n)");
if (getchar()=='y')
{
for (i=index;i<num-1;i++)
{
students[i]=students[i+1];
}
num--;
}
getchar();
}
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
void Student_Select()
{
while(1)
{
char name[20];
int index;
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
void Student_SortByAverage()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (students[j-1].Average<students[j].Average)
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
void Student_Display()
{
int i;
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","英语成绩","数学成绩","物理成绩","平均成绩");
printf("-------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,
students[i].scor_eng,students[i].scor_math,students[i].scor_phy,students[i].Average);
}
}
void IO_ReadInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
void IO_WriteInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n");
}
}
fclose(fp);
}
int main()
{
int choice;
IO_ReadInfo();
while(1)
{
printf("\n------ 学生成绩管理系统------\n");
printf("1. 增加学生记录\n");
printf("2. 修改学生记录\n");
printf("3. 删除学生记录\n");
printf("4. 按姓名查询学生记录\n");
printf("5. 按平均成绩排序\n");
printf("6. 保存文件\n");
printf("7. 退出\n");
printf("请选择(1-7):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Insert();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Select();
break;
case 5:
Student_SortByAverage();
Student_Display();
break;
case 6:
IO_WriteInfo();
break;
case 7:
exit(0);
break;
}
}
}
3.5 测试分析
C语言是上学期的学习内容,现在生疏了很多,以致程序运行过程中有许多bug,测试也有很多想不到的错误。
下面列举几个例子:
1)IO_ReadInfo读出文件
If((fp=fopen(“database.txt”,”rb”))=NULL)以二进制的格式读取文件的模式打开database.txt文件,并把文件指针赋值为文件读取指针
IO_WriteInfo写入文件
If((fp=fopen(“database.txt”,”rb”))=NULL)以二进制写入方式打开文件,和读取类似。
在写这个函数的时候总是不能读出,而且写入也有问题,if (fwrite(&num,sizeof(int),1,fp)!=1)因为sizeof(int)是指一次读入的二进制数据单位个数,后面的“1”表示要读取的次数,fread返回值有1、0,分别是成功,失败的意思。
2)在程序中float与int要根据数据得取值情况,还有字符串类型的使用,在求学生成绩平均值的时候,因为字符串类型不一致,导致数据结果失真,这样的错误不应再犯。
3.6 设计结果
录入一条或多条学生数据
删除一条或多条学生数据
按姓名查找一条或多条学生数据
增加一条或多条学生数据
修改一条或多条学生数据
按学生平均成绩排序
保存文件到根目录
退出程序
四.结论与心得
通过一周的上机实习,我对C语言又有了自己的一点认识。
C语言的学习是一个系统的过程,不像其它学科知识,C语言必须自己亲自一个个代码打出来,自己对那个代码要有自己的了解,怎么用,如何用更好,还可以怎么用,都要通过自己联系才有体会,在实践中成长,在实践中求知。
这次设计的课题是学生信息管理系统。
课题要求对学生信息实现一系列基本操作。
我选择通过结构体数组和指针来实现这个设计。
但是,设计完成后关于用学号输出成绩还是用姓名都是可以的。
但用学号输入时有很多麻烦都是之前没有料到的,换成姓名输入后,就简单多了。
总之,通过这次实习,我也认识到了我自己在程序设计这门课程上的不足,
在以后的学习实践中,要更加的严谨踏实,对知识的把握要更加的细致入微,要活学活用,争取在这个学科上取得更大的进步。