1 #include<stdio.h>
2 #include<string.h>
3 #include <stdlib.h>
4 #define N 3
5 struct Student{
6 int num;
7 char name[25];
8 char major[10];
9 int classNo;
10 int score[4];
11 };
12 typedef struct Student STU;
13 void Input(STU *p);
14 void Output(STU *p);
15 void Save(STU *p);
16 int Fetch(STU *st,int n,char *filename);
17 void Max(STU stu[],int m);
18 double average_person(STU *p);
19 void sort_select(STU *p);
20 void Sort_Buble(STU *p);
21 void Sort_insert(STU *p);
22 void Search(STU *p);
23 void Ask();
24
25
26 void main()
27 {
28 int choose;
29 int i,j,m,n;
30 char filename[10];
31 STU stu[N];
32 STU *p;
33 p=stu;
34
35 while(1)
36 {
37 printf("\n——————————————————————————————————————————\n");
38 printf("|/ # 已经进入 大连海事大学--学生信息管理系统 # //\n");
39 printf("———————————————————————————————————————————\n\n\n");
40 printf("|///#No.1 ---- 输入学生个人信息 ---- \n");
41 printf("|///#No.2 ---- 输出学生个人信息 ---- \n");
42 printf("|///#No.3 ---- 保存学生信息 ---- \n");
43 printf("|///#No.4 ---- 读取学生信息 ---- \n");
44 printf("|///#No.5 ---- 输出某门课程的最高分和分数最高的学生的姓名 ----\n");
45 printf("|///#No.6 ---- 对某专业的学生按总平均成绩进行简单选择排序 ---- \n");/*MOU 专业*/
46 printf("|///#No.7 ---- 按平均成绩对某班学生进行冒泡排序 ---- \n");
47 printf("|///#No.8 ---- 对某班学生按某门课程成绩进行直接插入排序 ---- \n");/*班级*/
48 printf("|///#No.9 ---- 按照班级和成绩的查找某位学生信息 ---- \n");
49 printf("\n **注意:若是输入其他数字直接退出系统//**\n\n\n");
50 printf("———————————————————————————————————————————\n\n\n");
51 printf("请输入选择的功能编号:");
52
53 scanf("%d",&choose);
54 switch(choose)
55 {
56 case 1:
57 {
58
59 for(i=0;i<N;i++)
60 {
61 Input(stu+i);
62 }
63 Ask();
64 break;
65
66 }
67 case 2:{
68 printf("请输入想要输出第几个学生的信息:\n");
69 scanf("%d",&n);
70
71 if (n>=0 && n<N)
72 Output(stu+n-1);
73 else
74 printf("没有这名学生!请重新输入!");
75
76 Ask();
77 break;
78
79 }
80 case 3:{
81 getchar();
82 Save(stu);
83 printf("文件保存成功!\n");
84 Ask();
85 break;
86 }
87 case 4:
88 {
89 printf("请输入读入的文件名:");
90 scanf("%s",filename);
91 printf("请输入要提取信息的位置号:");
92 scanf(" %d",&j);
93 if (j>=0 && j<=N)
94 {
95 if ( Fetch(stu,j,filename)==0)
96 printf("提取失败!\n");
97 }
98
99 Ask();
100 break;
101
102 }
103 case 5:
104 {
105 printf("请输入想求最高分的科目代号(1,2,3),总成绩代号:4:\n");
106 scanf("%d",&m);
107 Max(p,m);
108 Ask();
109 break;
110 }
111
112 case 6:/*6*/
113 {
114 getchar();
115 printf("对某专业的学生,按总平均成绩由低到高排序结果为:\n");
116 sort_select(stu);
117 Ask();
118 break;
119
120 }
121
122 case 7:
123 {
124 Sort_Buble(stu);
125 Ask();
126 break;
127
128 }
129 case 8:
130 {
131 Sort_insert(stu);
132 Ask();
133 break;
134
135 }
136 case 9:
137 {
138 getchar();
139 Search(stu);
140 Ask();
141 break;
142 }
143 default:
144 {
145 break;
146
147 }
148 }
149 if((choose<1)||(choose>10))
150 break;
151 }
152 }
153
154 void Input(STU *p)
155 {
156 int j;
157 printf("请输入学生的学号:\n");
158 scanf("%d",&p->num);
159 getchar();
160 printf("请输入学生的姓名 \n");
161 gets(p->name);
162 printf("请输入学生的专业 软件工程:soft/网络工程:net/计算机科学与技术:computer \n");
163 gets(p->major);
164 printf("请输入学生的班级 1班/2班,:\n");
165 scanf("%d",&p->classNo);
166 getchar();
167 printf("请分别按顺序输入学生的三门成绩:高数/英语/物理 \n");
168 for(j=0;j<3;j++)
169 {
170 printf("请输入第%d门成绩 :\n",j+1);
171 scanf("%d",&p->score[j]);
172 getchar();
173 }
174 p->score[3]=p->score[0]+p->score[1]+p->score[2];
175 }
176
177 void Output(STU *p)
178 {
179
180 printf("学号:%d\t| 姓名%s\t| 专业:%s\t| 班级:%d\t| 高数成绩:%d\t| 英语成绩:%d\t| 物理成绩:%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
181
182
183
184 }
185 double average_person(STU *p){//此函数将会被求平均成绩的函数调用
186
187 return(((p->score[0])+(p->score[1])+(p->score[2]))/3.0);
188
189 }
190
191 void Save(STU *p)
192 {
193 FILE *fp;
194 char filename[20];
195 int i;
196 printf("请输入要保存的文件名称:\n");
197 gets(filename);
198 if((fp=fopen(filename,"wb"))==NULL)
199 {
200 printf("新建文件失败 请重试请重新输入\n");
201 return;
202 }
203 for(i=0;i<N;i++)
204 {
205 if(fwrite(p++,sizeof(STU),1,fp)!=1)
206 printf("文件写入失败 请重新输入\n");
207 }
208 fclose(fp);
209 }
210
211
212 int Fetch(STU *p,int n,char *filename)
213 {
214 FILE *fp;
215 if((fp=fopen(filename,"rb"))==NULL)
216 {
217 fclose(fp);
218 return 0;
219 }
220 fseek(fp,(long)sizeof(STU)*n,0);//将位置指针从文件的开始往后移n个STU结构体的长度,n是提取的位置。
221 if ( (fread(p,sizeof(STU),1,fp)) != 1)
222 {
223 printf("文件录入失败 请重新输入:");
224 fclose(fp);
225 return 0;
226 }
227 Output(p);
228 fclose(fp);
229 return 1;
230 }
231
232
233
234 void Max(STU stu[],int m)
235 {
236
237 int i,index;
238 int y[N];
239 STU *p;
240 p=stu;
241 for(i=1;i<=N;i++)//定义一个长度为N的数组,作为下标。
242 y[i-1]=i-1;
243
244 switch(m)
245 {
246
247 case 1:
248 {
249 for(i=1;i<N;i++)
250 if((p+y[0])->score[0]<(p+y[i])->score[0])//让最高分的同学放到第一名的位置上来。
251 {
252 index=y[0];
253 y[0]=y[i];
254 y[i]=index;
255 }
256 p=p+y[0];
257 printf("\t第1门最高分为:");
258 printf("%d\n",p->score[0]);
259 printf("\t得最高分的同学名字是:");
260 puts(p->name);
261 break;
262 }
263 case 2:
264 {
265 for(i=1;i<N;i++)
266 if((p+y[0])->score[1]<(p+y[i])->score[1])
267 {
268 index=y[0];
269 y[0]=y[i];
270 y[i]=index;
271 }
272 p=p+y[0];
273 printf("\t第2门最高分为:");
274 printf("%d\n",p->score[1]);
275 printf("\t得最高分的同学名字是:");
276 puts(p->name);
277 break;
278 }
279 case 3:
280 {
281 for(i=1;i<N;i++)
282 if((p+y[0])->score[2]<(p+y[i])->score[2])
283 {
284 index=y[0];
285 y[0]=y[i];
286 y[i]=index;
287 }
288 p=p+y[0];
289 printf("\t第3门最高分为:");
290 printf("%d\n",p->score[2]);
291 printf("\t得最高分的同学名字是:");
292 puts(p->name);
293 break;
294 }
295 case 4:
296 {
297 for(i=1;i<N;i++)
298 if((p+y[0])->score[3]<(p+y[i])->score[3])
299 {
300 index=y[0];
301 y[0]=y[i];
302 y[i]=index;
303 }
304 p=p+y[0];
305 printf("\t总成绩最高分为:");
306 printf("%d\n",p->score[3]);
307 printf("\t得最高分的同学名字是:");
308 puts(p->name);
309 break;
310 }
311 default:
312 break;
313 }
314
315 }
316
317 //对某专业学生,按总平均成绩由低到高进行简单选择排序。
318 void sort_select(STU *p)/*6*/ //STU是学生结构体,stu是学生结构体数组
319 {
320 int i,j,k;
321 char b[15];
322 double t,aver[N];
323 STU a;
324 printf("请选择一个专业(请输入已经录入的专业名称):\n");
325 gets(b);
326 for(i=0;i<N;i++)
327 {
328 aver[i]=average_person(p+i);
329 //((*(p+i)).score[0]+(p+i)->score[1]+(p+i)->score[2])/3.0;
330 }
331 for(i=0;i<N-1;i++)
332 {
333 k=i; //确定要比较的数,先选择第一个数进行比较。
334 for(j=i+1;j<N;j++)
335 if(aver[k]>aver[j])
336 k=j; //记下位置,继续让大的数和下一位进行比较。
337 t=aver[i];
338 aver[i]=aver[k];
339 aver[k]=t;//交换,把大的数向后移一位;如果if为假,k=i,相当于不进行交换。
340
341 a=*(p+i);*(p+i)=*(p+k);*(p+k)=a;//利用结构体指针变量交换结构体
342 }
343 for(i=0;i<N;i++){
344 if(strcmp((p+i)->major,b)==0){
345 printf("专业:%s\t班级:%d\t姓名:%s\t平均成绩:%5.3f\n",(p+i)->major,(p+i)->classNo,(p+i)->name,aver[i]);
346 }
347 }
348 }
349
350
351 //对某个班级的学生,按总平均成绩由高到低进行起泡排序。
352 void Sort_Buble(STU *p)/*7*/
353 {
354 int i,j,b;
355 double t,aver[N];
356 STU a;
357 printf("选择一个班级(请输入已经创建的班级):\n");
358 scanf("%d",&b);
359 for(i=0;i<N;i++)
360 {
361 aver[i]=average_person(p+i);
362 }
363
364 for(i=0;i<N;i++)
365 for(j=0;j<N-1-i;j++)
366 if(aver[j]<aver[j+1])//前面的数比后面的数小的话就交换,直到把最小的数放到最后。
367 {
368 t=aver[j];
369 aver[j]=aver[j+1];
370 aver[j+1]=t;
371 a=*(p+j);
372 *(p+j)=*(p+j+1);
373 *(p+j+1)=a;
374 }
375 for(i=0;i<N;i++)
376 if((p+i)->classNo==b){
377 printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]);
378 }
379 }
380
381 //对某个班级的学生,按某门课程成绩由低到高进行直接插入排序
382 void Sort_insert(STU *p)/*8*/
383 {
384 int i,j,id,q,tem;
385 int score[N];
386 char b[10];
387 int k=0; //用于计算学生数
388 STU pai[N];
389 STU *m;
390 STU stude[N];
391 getchar(); //吃掉回车键,避免给b赋值
392 printf ("请输入需要查看成绩的班级(请输入已经录入的专业):");
393 gets(b);
394 printf ("请输入需要查看成绩的班级(请输入已经录入的班级):");
395 scanf ("%d",&q);
396 printf ("请输入需要查看分数的课程(1,2,3)\n");
397 scanf ("%d",&id);
398 getchar();
399 for(i=0;i<N;i++,p++){
400 if(strcmp(p->major,b)==0&&p->classNo==q){//找到某个班级的所有同学,并把它们提取出来
401 stude[k]=*p;
402 k++;
403 }
404 }
405 pai[0]=stude[0];
406 for(i=1;i<k;i++){
407 for(j=i;j>=0&&stude[i].score[id-1]>pai[j].score[id-1];j--)
408 pai[j+1]=pai[j];
409 pai[j+1]=stude[i];
410
411 }
412 for(i=0;i<k;i++,m++){
413 Output(m);
414 printf("\n");
415 }
416
417 /* for (i=0; i<N; i++,p++)
418 {
419 if(strcmp(p->major,b)==0&&p->classNo==q)
420 {
421 score[k]=p->score[id-1];
422 k++; //计算所选出的学生数
423
424 }
425 }
426
427 for (i=1; i<k; i++)
428 if (score[i-1]>score[i])
429 {
430 struct Student tmp;
431 tem=score[i];//等于小的那个数字
432 j=i-1;//记录大的数的位置
433 do
434 {
435 score[j+1]=score[j];//把大的数赋值给小的数,相当于把大的数字向后推了一位,但是原位置的数字不动
436 j--;
437 }
438 while (j>=0&&tem<score[j]); //把tem和较大的数的前一位比较,如果比它小,就让大的数在往后推一个
439 score[j+1]=tem; //把tem插入到j和j+1之间的位置。
440 }
441
442 printf ("对该班级的学生,按第%d科成绩由低到高进行直接插入排序为:\n",id);
443 for (i=0; i<k; i++)
444 {
445 p=m;
446 for (j=0; j<N; j++,p++)
447 {
448
449 if (strcmp(p->major,b)==0 && (p->score[id]==score[i]) && (p->classNo==q))//并且该学生成绩的这门成绩等于成绩数组的第i个数字
450 {
451 Output(p);
452 printf("\n");
453 }
454 }
455 }
456 }
457 */
458 }
459
460 //班级和成绩的综合查找
461 void Search(STU *head)
462 {
463 STU *p;
464 int b,k,sum_scores;
465 int limit_score;
466 k=0 ; // 如果输入班级或总成绩有误,k的值不变。与后面的if相关联。
467 printf ("请输入该学生的班级号 \n");
468 scanf ("%d",&b);
469 getchar();
470 printf ("请输入总成绩>=**的学生(**为分数)\n");
471 scanf ("%d",&limit_score);
472 printf (" \t\t\t\t%d班总成绩>=%d的学生信息为:\t\t\t\t \n",b,limit_score);
473 for (p=head;p<head+N;p++)
474 {
475 sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
476 if((p->classNo)==b)
477 {
478 if (sum_scores >= limit_score) //满足班级号和成绩界限的才可以输出,不然k=0;
479 {
480 printf ("该学生信息为:\n");
481 Output(p);
482 printf("\n");
483 k++;
484 }
485 }
486 }
487 if (k==0) //此条件是该班级没有符合条件的同学
488 printf ("查找的学生信息不存在:\n");
489 }
490
491
492 void Ask()
493 {
494 int c;
495 printf("\n已实现所选功能 输出编号进行下一步操作:\n\n 1: 继续选择其他功能 2: 不再选择直接退出系统\n");
496 scanf("%d",&c);
497 if (c==2)
498 exit(0);
499 }