原理
在一个班级学生成绩管理系统中, 希望处理每个学生的学习情况信息, 其中包括学生的学号, 姓名, 各科名称和成绩等
并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找, 浏览, 插入, 排序, 保存.
要求:
1, 提供用户界面
2, 每一条记录包括一个学生的学号, 姓名, 三门课成绩, 平均成绩
3, 输入功能: 可以一次完成若干条记录的输入
4, 显示功能: 完成全部学生记录的显示
5, 查找功能: 完成按姓名查找学生记录, 并显示
6, 排序功能: 按学生平均成绩进行排序
7, 插入功能: 按平均成绩高低插入一条学生记录
8, 将学生记录存在文件 score 中
主要数据结构
- struct student
- {
- char No[10]; // 学号
- char name[20]; // 姓名
- int subject1; // 成绩
- int subject2;
- int subject3;
- float average; // 平均成绩
- };
算法分析
代码开始时定义学生管理系统所需要用到的函数, 如输入, 查找, 排序, 输出, 插入等, 然后逐个定义所需函数, 输入函数利用循环逐个输入学生信息, 查找函数利用 if 语句和循环进行查找, 排序函数利用选择法排序将学生按平均成绩进行从小到大排序, 输出函数利用文件把学生信息保存到文件中去, 显示菜单函数利用 system("cls") 进行清屏然后显示菜单.
测试结果
源码
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define N 1000
- struct student
- {
- char No[10]; // 学号
- char name[20]; // 姓名
- int subject1; // 成绩
- int subject2;
- int subject3;
- float average; // 平均成绩
- };
- int p=1;// 判断是否有数据
- int n=0;
- struct student *stu=NULL;
- void menu(); // 菜单
- void input(); // 输入学生信息
- void sort();
- void fileoutput(); // 输出学生信息
- void find();
- void show();
- void insert();
- void fileinput();
- int main()
- {
- fileinput();// 从文件读取数据
- int flag;
- int first=0;
- if(p==0)
- {
- printf("首先请输入学生人数 \ n");
- scanf("%d",&n);
- }
- if(p==0)
- printf("\n 初次选择, 输入请选择 0:");
- else
- printf("已有数据, 请选择其他操作, 若要重新输入, 请选择 0:");
- while(1)
- {
- menu();
- if(first==1)
- printf("\n 请继续选择操作的序号:");
- else
- first++;
- scanf("%d",&flag);
- if(flag ==-1)
- break;
- switch(flag)
- {
- case 0:input();break;// 输入 n 个学生成绩
- case 1:find();break;// 输入学生姓名查找
- case 2:sort();break;// 将学生成绩从小到大排序
- case 3:show();break;// 显示所有学生成绩
- case 4:insert();break;// 按平均成绩高低插入一条学生记录
- case 5:system("cls");break;// 调出菜单
- default:printf("本次选择不成功!\n");
- }
- }
- fileoutput();// 将所有学生成绩保存到 score 文件中
- }
- void menu()// 菜单
- {
- printf("\n");
- printf("学生管理系统 \n");
- printf("***************************************************\n");
- printf("* 请选择操作的序号, 如果输入 - 1, 程序结束 *\n");
- printf("* *\n");
- printf("* 0 输入 n 个学生信息 1 输入学生姓名查找 *\n");
- printf("* *\n");
- printf("* 2 将学生成绩从小到大排序 3 显示所有学生成绩 *\n");
- printf("* *\n");
- printf("* 4 插入一条学生记录 5 显示菜单 *\n");
- printf("* *\n");
- printf("***************************************************\n");
- }
- void input()// 输入 n 个学生成绩
- {
- system("cls"); // 清屏
- int i,num=1;
- char a[10];
- stu = (struct student*)malloc(sizeof(struct student)*n);
- for(i=0;i<n;i++)
- {
- printf("请输入第 %d 个学生的信息:\n",num);
- num++;
- gets(a);// 防止回车键占用学号位置;
- printf("学号:");
- gets(stu[i].No);
- printf("姓名:");
- gets(stu[i].name);
- printf("三科成绩:\n");
- scanf("%d%d%d",&stu[i].subject1,&stu[i].subject2,&stu[i].subject3);
- stu[i].average=stu[i].subject1+stu[i].subject2+stu[i].subject3;
- stu[i].average=stu[i].average/3;
- }
- printf("一共 %d 个学生信息输入完毕 \ n",n);
- }
- void find()// 输入学生姓名查找并输出该学生信息
- {
- system("cls"); // 清屏
- printf("请输入要查找的学生姓名:");
- char a[10];
- gets(a);// 防止回车键占用学号位置;
- char name[20];
- gets(name);
- int i,j=1001;
- for(i=0;i<n;i++)
- {
- if((strcmp(name,stu[i].name))==0)
- j=i;
- }
- if(j==1001)
- printf("没有此学生!\n");
- else
- {
- printf("成功已找到此姓名的学生 \ n");
- printf("学号:");
- puts(stu[j].No);
- printf("姓名:");
- puts(stu[j].name);
- printf("三科成绩:%d %d %d\n 平均成绩:%.2f\n",stu[j].subject1,stu[j].subject2,stu[j].subject3,stu[j].average);
- }
- }
- void sort()// 将学生成绩从小到大排序
- {
- system("cls"); // 清屏
- struct student t;
- int min;
- int i,j,num;
- for(j=0;j<n;j++)
- {
- min=stu[j].average;
- num=j;
- for(i=j;i<n;i++)
- {
- if(stu[i].average<min)
- {
- num=i;
- min=stu[i].average;
- }
- }
- t=stu[j];
- stu[j]=stu[num];
- stu[num]=t;
- }
- show();
- printf("已按照平均成绩从低到高排序完毕!\n");
- }
- void fileoutput()// 将所有学生成绩输出到 score 文件中
- {
- system("cls"); // 清屏
- char filename[]={"score.txt"};
- FILE *in;
- if((in=fopen(filename,"w"))==NULL)
- printf("无法打开此文件 \ n");
- else
- {
- int i;
- fprintf(in,"%d\n",n);
- for(i=0;i<n;i++)
- fwrite(&stu[i],sizeof(struct student),1,in);
- fclose(in);
- printf("已成功将学生记录保存于 score 文件中 \ n");
- }
- free(stu);
- stu = NULL;
- }
- void show()// 显示所有学生成绩
- {
- system("cls"); // 清屏
- printf("以下是所有学生信息:\n");
- int i;
- for(i=0;i<n;i++)
- {
- printf("学号:");
- puts(stu[i].No);
- printf("姓名:");
- puts(stu[i].name);
- printf("三科成绩:%d %d %d\n 平均成绩:%.2f\n",stu[i].subject1,stu[i].subject2,stu[i].subject3,stu[i].average);
- printf("\n");
- }
- }
- void insert()// 按平均成绩高低插入一条学生记录
- {
- system("cls"); // 清屏
- struct student *newbase = (struct student *)realloc(stu,sizeof(struct student)*(n+1));
- stu = newbase;
- int *m=&n;
- printf("请输入要插入的学生的信息:\n");
- struct student stu1;
- char a[10];
- gets(a);// 防止回车键占用学号位置;
- printf("学号:");
- gets(stu1.No);
- printf("姓名:");
- gets(stu1.name);
- printf("三科成绩:\n");
- scanf("%d%d%d",&stu1.subject1,&stu1.subject2,&stu1.subject3);
- stu1.average=stu1.subject1+stu1.subject2+stu1.subject3;
- stu1.average=stu1.average/3;
- int num;
- int i;
- for(i=1;1;i++)
- {
- if(stu1.average<stu[0].average)
- {
- num=0;
- break;
- }
- else if(stu1.average>stu[*m-1].average)
- {
- num=*m;
- break;
- }
- else if(stu[i-1].average<stu1.average&&stu1.average<stu[i].average)
- {
- num=i;
- break;
- }
- }
- struct student t;
- for(i=*m-1;i>=num;i=i-1)// 将 num 后的向后平移一个
- {
- stu[i+1]=stu[i];
- }
- stu[i+1]=stu1;
- *m=*m+1;
- show();
- printf("已成功插入该学生的信息 \ n");
- }
- void fileinput()// 从文件中读取数据
- {
- system("cls"); // 清屏
- char filename[]={"score.txt"};
- FILE *in;
- if((in=fopen(filename,"r"))==NULL)
- {
- printf("无法读取数据 \ n");
- p=0;
- }
- else
- {
- fscanf(in,"%d\n",&n);
- stu = (struct student*)malloc(sizeof(struct student)*n);
- int i;
- for(i=0;i<n;i++)
- fread(&stu[i],sizeof(struct student),1,in);
- fclose(in);
- printf("已成功从 score 文件中将学生记录读取 \ n");
- }
- }
来源: http://www.bubuko.com/infodetail-3776001.html