基于C语言文件操作的学生成绩管理系统

原理

在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号、姓名、各科名称和成绩等
并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找、浏览、插入、排序、保存。
要求:
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”)进行清屏然后显示菜单。

 

测试结果

 

 

 

源码

  1 #include <stdio.h> 
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #define N 1000
  5 struct student
  6 {
  7     char No[10];    //学号 
  8     char name[20];  //姓名 
  9     int subject1;   //成绩 
 10     int subject2;
 11     int subject3;
 12     float average;  //平均成绩 
 13 };
 14 int p=1;//判断是否有数据
 15 int n=0;
 16 struct student *stu=NULL;
 17 void menu();                  //菜单 
 18 void input();                 //输入学生信息 
 19 void sort();
 20 void fileoutput();            //输出学生信息 
 21 void find();
 22 void show();
 23 void insert();
 24 void fileinput();
 25 int main()
 26 {
 27     fileinput();//从文件读取数据
 28     int flag;
 29     int first=0;
 30     if(p==0)
 31     {
 32         printf("首先请输入学生人数\n");
 33         scanf("%d",&n);
 34     }
 35     if(p==0)
 36         printf("\n初次选择,输入请选择 0:");
 37     else
 38         printf("已有数据,请选择其他操作,若要重新输入,请选择 0:");
 39     while(1)
 40     {
 41         menu();
 42         if(first==1)
 43             printf("\n请继续选择操作的序号:");
 44         else 
 45             first++;
 46         scanf("%d",&flag);
 47         if(flag ==-1)
 48             break;
 49         switch(flag)
 50         {
 51             case 0:input();break;//输入n个学生成绩
 52             case 1:find();break;//输入学生姓名查找
 53             case 2:sort();break;//将学生成绩从小到大排序
 54             case 3:show();break;//显示所有学生成绩 
 55             case 4:insert();break;//按平均成绩高低插入一条学生记录
 56             case 5:system("cls");break;//调出菜单 
 57             default:printf("本次选择不成功!\n");
 58         }
 59     }
 60     fileoutput();//将所有学生成绩保存到score文件中
 61 }
 62 void menu()//菜单
 63 {
 64     printf("\n");
 65     printf("                   学生管理系统                    \n");
 66     printf("***************************************************\n");
 67     printf("*   请选择操作的序号,如果输入-1,程序结束         *\n");
 68     printf("*                                                 *\n");
 69     printf("*   0 输入n个学生信息         1 输入学生姓名查找  *\n");
 70     printf("*                                                 *\n");
 71     printf("*   2 将学生成绩从小到大排序  3 显示所有学生成绩  *\n");
 72     printf("*                                                 *\n");
 73     printf("*   4 插入一条学生记录        5 显示菜单          *\n");
 74     printf("*                                                 *\n");
 75     printf("***************************************************\n");
 76 } 
 77 void input()//输入n个学生成绩
 78 {
 79     system("cls");    //清屏
 80     int i,num=1;
 81     char a[10];
 82     stu = (struct student*)malloc(sizeof(struct student)*n);
 83     for(i=0;i<n;i++)
 84     {
 85         printf("请输入第%d个学生的信息:\n",num);
 86         num++;
 87         gets(a);//防止回车键占用学号位置; 
 88         printf("学号:");
 89         gets(stu[i].No);
 90         printf("姓名:");
 91         gets(stu[i].name);
 92         printf("三科成绩:\n");
 93         scanf("%d%d%d",&stu[i].subject1,&stu[i].subject2,&stu[i].subject3);
 94         stu[i].average=stu[i].subject1+stu[i].subject2+stu[i].subject3;
 95         stu[i].average=stu[i].average/3;
 96     }
 97     printf("一共%d个学生信息输入完毕\n",n);
 98 }
 99 void find()//输入学生姓名查找并输出该学生信息
100 {
101     system("cls");  //清屏
102     printf("请输入要查找的学生姓名:");
103     char a[10];
104     gets(a);//防止回车键占用学号位置;
105     char name[20];
106     gets(name);
107     int i,j=1001;
108     for(i=0;i<n;i++)
109     {
110         if((strcmp(name,stu[i].name))==0)
111             j=i;
112     }            
113     if(j==1001)
114         printf("没有此学生!\n");
115     else
116     {
117         printf("成功已找到此姓名的学生\n");
118         printf("学号:");
119         puts(stu[j].No);
120         printf("姓名:");
121         puts(stu[j].name);
122         printf("三科成绩:%d %d %d\n平均成绩:%.2f\n",stu[j].subject1,stu[j].subject2,stu[j].subject3,stu[j].average);
123     }
124 }
125 void sort()//将学生成绩从小到大排序
126 {
127     system("cls");  //清屏
128     struct student t;
129     int min;
130     int i,j,num;
131     for(j=0;j<n;j++)
132     {
133         min=stu[j].average;
134         num=j;
135         for(i=j;i<n;i++)
136         {
137             if(stu[i].average<min)
138             {
139                 num=i;
140                 min=stu[i].average;
141             }
142         }
143         t=stu[j];
144         stu[j]=stu[num];
145         stu[num]=t;
146     }
147     show();
148     printf("已按照平均成绩从低到高排序完毕!\n");
149 }
150 void fileoutput()//将所有学生成绩输出到score文件中
151 {
152     system("cls");  //清屏
153     char filename[]={"score.txt"};
154     FILE *in;
155     if((in=fopen(filename,"w"))==NULL)
156         printf("无法打开此文件\n");
157     else
158     {
159         int i;
160         fprintf(in,"%d\n",n);
161         for(i=0;i<n;i++)
162             fwrite(&stu[i],sizeof(struct student),1,in);
163         fclose(in);
164         printf("已成功将学生记录保存于score文件中\n");
165     }
166     free(stu);
167     stu = NULL;
168 }
169 void show()//显示所有学生成绩
170 {
171     system("cls");  //清屏
172     printf("以下是所有学生信息:\n");
173     int i;
174     for(i=0;i<n;i++)
175     {
176         printf("学号:");
177         puts(stu[i].No);
178         printf("姓名:");
179         puts(stu[i].name);
180         printf("三科成绩:%d %d %d\n平均成绩:%.2f\n",stu[i].subject1,stu[i].subject2,stu[i].subject3,stu[i].average);
181         printf("\n");
182     }
183 }
184 void insert()//按平均成绩高低插入一条学生记录
185 {
186     system("cls");   //清屏
187     struct student *newbase = (struct student *)realloc(stu,sizeof(struct student)*(n+1));
188     stu = newbase;
189     
190     int *m=&n;
191     printf("请输入要插入的学生的信息:\n");
192     struct student stu1; 
193     char a[10];
194     gets(a);//防止回车键占用学号位置; 
195     printf("学号:");
196     gets(stu1.No);
197     printf("姓名:");
198     gets(stu1.name);
199     printf("三科成绩:\n");
200     scanf("%d%d%d",&stu1.subject1,&stu1.subject2,&stu1.subject3);
201     stu1.average=stu1.subject1+stu1.subject2+stu1.subject3;
202     stu1.average=stu1.average/3;
203     int num;
204     int i;
205     for(i=1;1;i++)
206     {
207         if(stu1.average<stu[0].average)
208         {
209             num=0;
210             break;
211         }
212         else if(stu1.average>stu[*m-1].average)
213         {
214             num=*m;
215             break;
216         }
217         else if(stu[i-1].average<stu1.average&&stu1.average<stu[i].average)
218         {
219             num=i;
220             break;
221         }
222     }
223     struct student t;
224     for(i=*m-1;i>=num;i=i-1)//将num后的向后平移一个 
225     {
226         stu[i+1]=stu[i];
227     }
228     stu[i+1]=stu1;
229     *m=*m+1;
230     
231     show();
232     printf("已成功插入该学生的信息\n");
233 }
234 void fileinput()//从文件中读取数据
235 {
236     system("cls");   //清屏
237     char filename[]={"score.txt"};
238     FILE *in;
239     if((in=fopen(filename,"r"))==NULL)
240     {
241         printf("无法读取数据\n");
242         p=0;
243     }
244     else
245     {
246         fscanf(in,"%d\n",&n);
247         stu = (struct student*)malloc(sizeof(struct student)*n);
248         int i;
249         for(i=0;i<n;i++)
250             fread(&stu[i],sizeof(struct student),1,in);
251         fclose(in);
252         printf("已成功从score文件中将学生记录读取\n");    
253     }
254 }

 

posted @ 2021-05-31 09:08  熊猫耳朵  阅读(70)  评论(0编辑  收藏  举报