原理
在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号、姓名、各科名称和成绩等
并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找、浏览、插入、排序、保存。
要求:
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 }
原文:https://www.cnblogs.com/cocktail/p/14829971.html