c语言课程设计
学生成绩管理管理系统
一,需求分析
1、编写目的
为了明确软件需求、安排项目规划与进度、组织软件开发与测试,撰写本文档。本文档供项目经理、设计人员、开发人员参考。
2、项目背景
使用计算机对学生信息进行管理,拥有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、成本低等。这些优点能够极大地提高学生信息的效率,也是管理科学化、正规化的重要支撑。
学生成绩管理系统能够方便地查询和变更学生的基本数据(包括学生信息数据和成绩数据),节省大量工作时间,有效地提高学生信息管理的效率。而查询信息的直观显示将有助于系统的用户一目了然地掌握学生的情况。
3、开发计划
分阶段完成任务:
第一阶段实现快速界面原型,并进行相应的补充修改以满足客户的需求;
第二阶段完成界面的进一步设计求精,形成最终的设计样式;
第三阶段:整合管理系统并进行各项测试改正出现的各种问题。
4、源代码
#include <stdio.h>
#include <string.h>
#include <windows.h>
/*
*软件工程 吕重根
*/
//定义学生结构体
struct Student
{
char ID[12]; // 学号
char Name[30]; //姓名
float Grade1; //英语成绩
float Grade2; //c语言成绩
float Grade3; //高数成绩
float Grade4; //概率论成绩
float Average; //平均成绩
};
//声明学生数组及学生数量
struct Student students[1000];
int num=0;
//通过学号返回数组下标
int Student_ID(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].ID,id)==0)//判断两数组下标是否相等
{
return i;
}
}
return -1;
}
//通过姓名返回数组下标
int Student_Name(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].Name,name)==0)
{
return i;
}
}
return -1;
}
//求平均值
float Avg(struct Student stu)
{
float avg;
avg=(stu.Grade1+stu.Grade2+stu.Grade3+stu.Grade4)/4; //求平均值
return avg; //返回平均值
}
//英语不及格名单
void student_fail_1()
{
int i;
for(i=0;i<num;i++)
{
if(students[i].Grade1<60)
printf("%s %s %f\n",students[i].ID,students[i].Name,students[i].Grade1);
}
}
//c语言不及格名单
void student_fail_2()
{
int i;
for(i=0;i<num;i++)
{
if(students[i].Grade2<60)
printf("%s %s %f\n",students[i].ID,students[i].Name,students[i].Grade2);
}
}
//高数不及格名单
void student_fail_3()
{
int i;
for(i=0;i<num;i++)
{
if(students[i].Grade3<60)
printf("%s %s %f\n",students[i].ID,students[i].Name,students[i].Grade3);
}
}
//概率论不及格名单
void student_fail_4()
{
int i;
for(i=0;i<num;i++)
{
if(students[i].Grade4<60)
printf("%s %s %f\n",students[i].ID,students[i].Name,students[i].Grade4);
}
}
//不及格查询
void Student_Fail()
{
while(1)
{
int m;
printf("请选择查询科目:\n");
printf("1,英语不及格名单查询\n");
printf("2,c语言不及格名单查询\n");
printf("3,高数不及格名单查询\n");
printf("4,概率论不及格名单查询\n");
scanf("%d",&m);
getchar();
switch(m)
{
case 1:
student_fail_1();
break;
case 2:
student_fail_2();
break;
case 3:
student_fail_3();
break;
case 4:
student_fail_4();
break;
}
printf("是否继续?(y or n)");
if (getchar()=='n')
{
break;
}
}
}
//显示单个学生的记录
void Student_Single(int mas)
{
printf("%10s %10s %8s %8s %8s %10s %10s\n","学号","姓名","英语成绩","物理成绩","高数成绩","概率论成绩","平均成绩");
printf("***********************************************************************\n");
printf("%10s%11s%8.2f%9.2f%9.2f%10.2f%11.2f\n",students[mas].ID,students[mas].Name,
students[mas].Grade1,students[mas].Grade2,students[mas].Grade3,students[mas].Grade4,students[mas].Average);
}
//检查并添加成绩
float check(float g)
{
for(1;;){
scanf("%f",&g);
if(g<0||g>100)
printf("请输入正确的成绩");
else
break;
}
return g;
}
//插入学生信息
void Student_Insert()
{
while(1)
{
for(1;;){
int i = 0;
printf("请输入学号:");
scanf("%s",&students[num].ID);
for(i=0;students[num].ID[i]>='0'&&students[num].ID[i]<='9';i++);{
if(i!=10)
{ printf("学号必须是10位数字,请重新输入\n");
}else
break;
}
}
printf("请输入姓名:");
scanf("%s",&students[num].Name);
printf("请输入英语成绩:");
students[num].Grade1=check(students[num].Grade1);
printf("请输入c语言成绩:");
students[num].Grade2=check(students[num].Grade2);
printf("请输入高数成绩:");
students[num].Grade3=check(students[num].Grade3);
printf("请输入概率论成绩:");
students[num].Grade4=check(students[num].Grade4);
getchar();
students[num].Average=Avg(students[num]);
num++;
printf("是否继续?(y or n)");
if (getchar()=='n')
{
break;
}
}
}
//修改学生信息
void Student_Modify()
{
float Grade1,Grade2,Grade3,Grade4;
while(1)
{
char id[10];
int mas;
printf("请输入要修改的学生的学号:");
scanf("%s",&id);
getchar();
mas=Student_ID(id);
if (mas==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要修改的学生信息为:\n");
Student_Single(mas);
printf("-- 请输入新值--\n");
for(1;;){
int i = 0;
printf("请输入学号:");
scanf("%s",&students[mas].ID);
for(i=0;students[mas].ID[i]>='0'&&students[mas].ID[i]<='9';i++);{
if(i!=10)
{ printf("学号必须是10位数字,请重新输入\n");
}else
break;
}
}
printf("请输入姓名:");
scanf("%s",&students[mas].Name);
printf("请输入英语成绩:");
students[mas].Grade1=check(students[mas].Grade1);
printf("请输入c语言成绩:");
students[mas].Grade2=check(students[mas].Grade2);
printf("请输入高数成绩:");
students[mas].Grade3=check(students[mas].Grade3);
printf("请输入概率论成绩:");
students[mas].Grade4=check(students[mas].Grade4);
getchar();
students[mas].Average=Avg(students[mas]);
}
printf("是否继续?(y or n)");
if (getchar()=='n')
{
break;
}
}
}
//删除学生信息
void Student_Delete()
{
int i;
while(1)
{
char id[10];
int mas;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
mas=Student_ID(id);
if (mas==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_Single(mas);
printf("是否真的要删除?(y or n)");
if (getchar()=='y')
{
for (i=mas;i<num-1;i++)
{
students[i]=students[i+1];
}
num--;
}
getchar();
}
printf("是否继续?(y or n)");
if (getchar()=='n')
{
break;
}
}
}
//按姓名查询
void Name_Select()
{
while(1)
{
char name[30];
int mas;
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
getchar();
mas=Student_Name(name);
if (mas==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要查询的学生信息为:\n");
Student_Single(mas);
}
printf("是否继续?(y or n)");
if (getchar()=='n')
{
break;
}
}
}
//按学号查询
void ID_Select()
{
while(1)
{
char ID[10];
int mas;
printf("请输入您要查询的学生学号:");
scanf("%s",&ID);
getchar();
mas=Student_ID(ID);
if(mas==-1)
{
printf("学生不存在\n");
}
else
{
printf("您要查询的学生信息为:\n");
Student_Single(mas);
}
printf("是否继续?(y or n)");
if(getchar()=='n')
{
break;
}
}
}
//学生信息查询
void Student_Select()
{
int m;
printf("请选择查询方式:\n");
printf("1,按姓名查询");
printf("2,按学号查询");
scanf("%d",&m);
getchar();
switch(m)
{
case 1:
Name_Select();
break;
case 2:
ID_Select();
break;
}
}
//显示学生信息
void Student_Display()
{
while(1)
{
int i;
printf("%10s %10s %8s %8s %8s %10s %10s\n","学号","姓名","英语成绩","c语言成绩","高数成绩","概率论成绩","平均成绩");
printf("----------------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s %10s %8.2f %8.2f %8.2f %10.2f %10.2f\n",students[i].ID,students[i].Name,
students[i].Grade1,students[i].Grade2,students[i].Grade3,students[i].Grade4,students[i].Average);
}
printf("是否继续?(y or n)");
if(getchar()=='n')
{
break;
}
}
}
//将学生信息从文件读出
void IO_ReadInfo()
{
FILE *fp;
int i;
if ((fp=fopen("text.txt","rb"))==NULL)
{
printf("不能打开文件!/n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=1;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
//将学生信息写入文件
void IO_WriteInfo()
{
FILE *fp;
int i;
fp=fopen("data.txt","w");
for(i=0; i<num; i++){
fprintf(fp,"%s\t%s\t%f\t%f\t%f\t%f\t%f\n",students[i].ID,students[i].Name,students[i].Grade1,students[i].Grade2,students[i].Grade3,students[i].Grade4,students[i].Average);
}
//fwrite(&num,sizeof(int),1,fp);
//fwrite(&students[i],sizeof(struct Student),1,fp);
fclose(fp);
}
//主程序
main()
{
int choice;
int a=1;
IO_ReadInfo();
while(a)
{
system("cls");
//menu也许单独写个函数会更好
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();
IO_WriteInfo();
break;
case 2:
Student_Modify();
IO_WriteInfo();
break;
case 3:
Student_Delete();
IO_WriteInfo();
break;
case 4:
Student_Select();
IO_WriteInfo();
break;
case 5:
Student_Display();
IO_WriteInfo();
break;
case 6:
Student_Fail();
IO_WriteInfo();
break;
case 7:
printf("感谢您的使用,请按任意键退出\n");
a=0;
break;
}
}
}
5、运行结果截图