1.课程目的
本程序旨在训练学生的C语言基本编程能力,通过串联C语言输入输出、循环语句、子函数设计、数组、结构体等知识点,完成一个简单系统的设计开发。
2.系统功能
(1)通过菜单的形式实现人机交互界面
(2)实现录入学生基本信息和成绩功能
(3)实现删除指定学生的基本信息和成绩功能
(4)实现修改指定学生的基本信息和成绩功能
(5)实现查询指定学生的基本信息和成绩功能
(6)实现对所有学生的成绩进行统计功能,包括一下四个子菜单:(任务1必选,任务2-4任选一)
任务1.所有学生成绩求和(使用递归思想)
任务2.所有学生成绩等级转换:A(90-100),B(80-89),C(70-79),D(60-69),E(60以下)
任务3.对学生成绩实现从大到小排序
任务4.对所有学生成绩求平均
3.设计思想
(1)人机交互界面
使用printf()和scanf()输入输出函数设计出主界面交互菜单,通过switch case语句判断输入的选项值,执行相对应得子函数。
每一个选项执行完毕,需要考虑清屏(system(“cls”);),然后重新显示主界面,供用户下一次操作。
设计程序退出菜单选项,用户执行其选项后,需要使用C语言文件操作,保存当前录入得全部学生信息和成绩。
程序启动时需要打开上次保存得数据文件,读入到内存中,如果没有则新建一个文件用于程序退出时保存数据。
人机交互界面可以自己设计,可以加上开发者信息,体现每个学生的差异。
(2)添加学生信息
设计为单独的子函供主函数调用。
定义一个结构体类型,包括四个成员变量(学号,姓名,性别,成绩),并用该类型定义一个全局的结构体数组,供外部录入学生信息时存储。
定义一个全局变量来存储当前学生个数。
添加学生信息时,需要从外部读入学生的学号,姓名,性别以及成绩,在获取学号时需要判断是否输入重复,学生个数变量加一,并根据当前学生个数将其保存在结构体数组对应序号的元素中。
一个学生信息录入结束后可以提示用户输入Y/N来选择是否接着输入下一个学生。
(3)显示全部学生信息
通过对当前结构体数组进行遍历,并显示输出
(4)按成绩排序
利用选择排序或者冒泡排序法,将当前结构体数组根据元素中成绩变量,从小到大排序。然后对当排序完成的结构体数组进行遍历显示输出,从而达到按成绩排序的效果。
5)查找单个学生
根据输入需要查找学生的姓名,遍历当前结构体数组,判断是否含有一致姓名的元素,若有则显示输出对应的信息和成绩,否则显示无此人。
6)删除指定学生
根据输入需要查找学生的学号,遍历当前结构体数组,判断是否含有一致姓名的元素,若有则从该元素之后依次将下一个元素赋值到上一个元素,直至最后一个赋值完成,最后当前学生个数变量减一。
(7)修改学生信息
根据输入需要查找学生的学号,遍历当前结构体数组,判断是否含有一致学号的元素,
若有则依次从外部读入用户所修改的值,保存到对应成员变量中。
typedef struct
{
char num[12]; /*学号*/
char name[20]; /*姓名*/
char sex[2]; /*性别*/
int score; /*成绩*/
}Student;
Student studentAll[80]; /*结构体数组*/
int student_number = 0; /*总人数*/
/*菜单函数*/
int menu_select()
{
int check_number;
do{
system("cls"); /*运行前清屏clear screen,在stdlib.h中bai*/
printf("\t★☆☆☆☆☆☆学生成绩管理系统☆☆☆☆☆☆★\n"); /*菜单选择*/
printf("\t★| 1. 添加学生信息 |★\n");
printf("\t★| 2. 显示学生信息 |★\n");
printf("\t★| 3. 按成绩排序 |★\n");
printf("\t★| 4. 查找单个学生 |★\n");
printf("\t★| 5. 删除指定学生 |★\n");
printf("\t★| 6. 修改学生信息 |★\n");
printf("\t★| 0. 退出 |★\n");
printf("\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n");
printf("请输入选择(0-9):");
scanf("%d",&check_number); /*读入选择*/
}while(check_number<0||check_number>9);
return(check_number); /*返回选择*/
}
//以下的student都是形式参数,真正的数组是在全局变量里定义的studentAll数组
/*输入若干条记录*/
/*按姓名查找并显示一个记录*/
void Query_a_record(Student student[])
{
int i,j;
char findname[20]; //输入学生的姓名
printf("请输入要查找的学生名字"); //输入学生的姓名
scanf("%s",findname);
for(j=0;j<student_number;j++)
{
if(strcmp(student[j].name,findname)==0)
{
i=j;
} /*查找判断*/
}
printf("|学号 姓名 性别 C语言成绩|\n");
printf("———————————————————————————————————————\n");
printf("| %s %s %s %d\n",student[i].num,student[i].name,student[i].sex,student[i].score);
}
/*按名字查找,删除一条记录*/
void Delete_a_record(Student student[])
{
int i,j;
char findname[20];
printf("请输入将要删除的学生名字"); //输入学生的姓名
scanf("%s",findname);
for(j=0;j<student_number;j++)
{
if(strcmp(student[j].name,findname)==0)
{
i=j;
}
} /*查找判断*/
for(;i<student_number-1;i++)
{
student[i]=student[i+1];
}
student_number--;
}
/*修改学生信息*/
void modifyStudentinformation(Student student[])
{
char changenum[20];
int i=0;
printf("输入将要修改的学生学号");
scanf("%s",changenum);
while(strcmp(student[i].num,changenum)!=0&&i<student_number)
{
i++; /*查找判断*/
}
if(i<student_number)
{
printf("输入新的学生学号");
scanf("%s",student[i].num);
printf("输入新的学生姓名:");
scanf("%s",student[i].name);
printf("输入新的学生性别:");
scanf("%s",student[i].sex);
printf("输入新的c语言成绩:");
scanf("%d",&student[i].score);
}
}
/*从文件中读入数据*/
void AddfromText(Student student[])
{
int i=0;
int number = 0;
FILE *fp; /*定义文件指针*/
if((fp=fopen("D:\\student.txt","rb"))==NULL) /*打开二进制文件,如果不存在则创建*/
{
fp=fopen("C:\\student.txt","wb");
}
fscanf(fp,"共有%d条记录\n",&student_number); /*读入总记录量*/
while(i<student_number) /*循环读入数据*/
{
fscanf(fp,"%s %s %s %d\n",student[i].num,student[i].name,student[i].sex,&student[i].score);
i++;
}
fclose(fp);
}
/*将所有记录写入文件*/
WritetoText(Student student[])
{
int i=0;
FILE *fp;
fp=fopen("D:\\student.txt","wb");
printf("共有%d条记录\n",student_number);
fprintf(fp,"共有%d条记录\n",student_number);
while(i<student_number)
{
fprintf(fp," %s %s %s %d\n",student[i].num,student[i].name,student[i].sex,student[i].score);
i++;
}
fclose(fp);
}
/*主函数*/
int main()
{
AddfromText(studentAll);
for(;;)
{
switch(menu_select()) /*选择判断*/
{
case 1:
printf("插入学生信息\n"); /*输入若干条记录*/
Input(studentAll);
break;
case 2:
printf("显示记录\n"); /*显示所有记录*/
Display(studentAll);
system("pause");
break;
case 3:
printf("按成绩排序\n");
Sort_by_sum(studentAll); /*按总成绩排序*/
printf("按总成绩排序成功!\n");
Display(studentAll);
system("pause");
break;
case 4:
printf("查找单个学生\n");
Query_a_record(studentAll); /*按姓名查找学生*/
system("pause");
break;
case 5:
printf("删除指定学生\n");
Delete_a_record(studentAll); /*按姓名查找,删除一条记录*/
system("pause");
break;
case 6:
printf("修改学生信息\n");
modifyStudentinformation(studentAll); /*修改学生信息*/
system("pause");
break;
case 0:
WritetoText(studentAll);
printf("已保存,退出系统\n"); /*结束程序*/
system("pause");
exit(0);
}
}
}