还是把一个课程设计作为第一篇文章吧——学生学籍管理系统(C语言)

  1 #include <stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 
  5 typedef struct student {
  6     int number;
  7     char name[20];
  8     char faculty[50];
  9     char classes[20];
 10     struct student * link;
 11 }STU;
 12 
 13 STU * CreateLink();
 14 void WriteLink(STU *);
 15 
 16 void input();
 17 void del();
 18 void del_number(STU *);
 19 void del_name(STU *);
 20 void del_faculty(STU *);
 21 void del_classes(STU *);
 22 void search();
 23 void search_number(STU *);
 24 void search_name(STU *);
 25 void search_faculty(STU *);
 26 void search_classes(STU *);
 27 void sort();
 28 void show();
 29 void edit();
 30 
 31 
 32 void main()
 33 {
 34     char c;
 35     FILE * fp;
 36 
 37     if((fp=fopen("student.dat","r"))==NULL)
 38     {
 39         fp=fopen("student.dat","w");
 40         fclose(fp);
 41     }
 42 
 43     do
 44     {
 45         system("cls");
 46         printf("


");
 47         printf("		╔═════════════════════╗
");
 48         printf("		║                                          ║
");
 49         printf("		║        1: 添加一个学生                   ║
");
 50         printf("		║        2: 删除一个学生                   ║
");
 51         printf("		║        3: 查找一个学生                   ║
");
 52         printf("		║        4: 学生信息排序                   ║
");
 53         printf("		║        5: 修改学生信息                   ║
");
 54         printf("		║        6: 查看学生信息                   ║
");
 55         printf("		║        9: 退出                           ║
");
 56         printf("		║                                          ║
");
 57         printf("		╚═════════════════════╝
");
 58         printf("		                                         
");
 59         printf("		请选择输入选项[1\2\3\4\5\6\9]:> ");
 60         do
 61         {
 62             c=getchar();
 63         }while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='9');
 64         getchar();
 65 
 66         switch(c)
 67         {
 68             case '1':     input(); break;
 69             case '2':     del();  break;
 70             case '3':     search(); break;
 71             case '4':     sort(); break;
 72             case '5':     edit(); break;
 73             case '6':     show(); break;
 74             case '9':     exit(0);
 75         }
 76         system("cls");
 77         }while(1);
 78 }
 79 
 80 STU * CreateLink()
 81 {
 82     FILE *fp;
 83     STU * head,*p1, *p2;
 84     
 85     if((fp=fopen("student.dat","r"))==NULL)
 86     {
 87         printf("打开文件错误,退出。");
 88         exit(1);
 89     }
 90     head=p1=p2=(STU *)malloc(sizeof(STU));
 91     while(!feof(fp))
 92     {
 93         if(fscanf(fp,"%d %s %s %s
",&p2->number,p2->name,p2->faculty,p2->classes)==EOF)
 94         {
 95             free(head);
 96             return NULL;
 97         }
 98         p1->link=p2;
 99         p1=p2;
100         p2=(STU *)malloc(sizeof(STU));
101     }
102     p1->link=NULL;
103     free(p2);
104     fclose(fp);
105 
106     return head;
107 }
108 
109 void WriteLink(STU * p2)
110 {
111     FILE *fp;
112 
113     if((fp=fopen("student.dat","w"))==NULL)
114     {
115         printf("打开文件错误,退出。");
116         exit(1);
117     }
118     while(p2!=NULL)
119     {
120         fprintf(fp,"%d %s %s %s
",p2->number,p2->name,p2->faculty,p2->classes);
121         p2=p2->link;
122     }
123     fclose(fp);
124 }
125 
126 void input()
127 {
128     STU * head, *p1, *p2;
129     system("cls");
130 
131     head=CreateLink();
132     p1=head;
133 
134     if(p1!=NULL)
135         while(p1->link!=NULL)
136             p1=p1->link;
137 
138     p2=p1;
139     printf("


		输入待添加学生(-1 结束):
");
140     while(1)
141     {
142         p2=(STU *)malloc(sizeof(STU));
143         if(p1==NULL) head=p1=p2;
144         printf("输入学号:");
145         scanf("%d",&p2->number);
146         if(p2->number==-1)    break;
147         printf("输入 姓名、系别、班级:");
148         scanf("%s%s%s",p2->name,p2->faculty,p2->classes);
149         p1->link=p2;
150         p1=p2;
151     }
152     p1->link=NULL;
153     free(p2);
154 
155     WriteLink(head);
156     
157     free(head);
158 }
159 
160 void del()
161 {
162     STU * head=CreateLink();
163     char c;
164     do
165     {
166         system("cls");
167         printf("


");
168         printf("		╔═════════════════════╗
");
169         printf("		║                                          ║
");
170         printf("		║        请输入删除内容:                  ║
");
171         printf("		║                                          ║
");
172         printf("		║        1: 按照学号删除                   ║
");
173         printf("		║        2: 按照姓名删除                   ║
");
174         printf("		║        3: 按照系别删除                   ║
");
175         printf("		║        4: 按照班级删除                   ║
");
176         printf("		║        9: 返回主菜单                     ║
");
177         printf("		║                                          ║
");
178         printf("		╚═════════════════════╝
");
179         printf("		                                         
");
180         printf("		请选择输入选项[0\1\2\3\4\9]:> ");
181         do
182         {
183             c=getchar();
184         }while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='9');
185         getchar();
186 
187         switch(c)
188         {
189             case '1':     del_number(head); break;
190             case '2':     del_name( head);  break;
191             case '3':     del_faculty(head); break;
192             case '4':     del_classes(head); break;
193             case '9':     return;
194         }
195         printf("		按任意键返回主菜单:
");
196         getchar();
197         system("cls");
198     }while(1);
199 
200     free(head);
201 }
202 void del_number(STU * head)
203 {
204     STU * p1, *p2, temp;
205     system("cls");
206     do
207     {
208         printf("


		输入要删除学生学号(-1 结束):");
209         scanf("%d",&temp.number);
210         getchar();
211         p1=p2=head;
212         while(p2!=NULL)
213         {
214             if(head->number==temp.number)
215             {
216                 head=head->link;
217                 p1->link=NULL;
218                 free(p1);
219                 p1=p2=head;
220             }
221             else
222             {
223                 if(p2->number==temp.number)
224                 {
225                     p1->link=p2->link;
226                     p2->link=NULL;
227                     free(p2);
228                     p2=p1;
229                 }
230                 p1=p2;
231                 p2=p2->link;
232             }
233         }
234     }while(temp.number!=-1);
235     WriteLink(head);
236 }
237 void del_name(STU * head)
238 {
239     STU * p1, *p2, temp;
240     system("cls");
241     do
242     {
243         printf("


		输入要删除学生姓名(EOF 结束):");
244         if(scanf("%s",temp.name)==EOF) break;
245         getchar();
246         p1=p2=head;
247         while(p2!=NULL)
248         {
249             if(strcmp(head->name,temp.name)==0)
250             {
251                 head=head->link;
252                 p1->link=NULL;
253                 free(p1);
254                 p1=p2=head;
255             }
256             else
257             {
258                 if(strcmp(head->name,temp.name)==0)
259                 {
260                     p1->link=p2->link;
261                     p2->link=NULL;
262                     free(p2);
263                     p2=p1;
264                 }
265                 p1=p2;
266                 p2=p2->link;
267             }
268         }
269     }while(1);
270     WriteLink(head);
271 }
272 void del_faculty(STU * head)
273 {
274     STU * p1, *p2, temp;
275     system("cls");
276     do
277     {
278         printf("


		输入要删除学生系别(EOF 结束):");
279         if(scanf("%s",temp.faculty)==EOF) break;
280         getchar();
281         p1=p2=head;
282         while(p2!=NULL)
283         {
284             if(strcmp(head->faculty,temp.faculty)==0)
285             {
286                 head=head->link;
287                 p1->link=NULL;
288                 free(p1);
289                 p1=p2=head;
290             }
291             else
292             {
293                 if(strcmp(head->faculty,temp.faculty)==0)
294                 {
295                     p1->link=p2->link;
296                     p2->link=NULL;
297                     free(p2);
298                     p2=p1;
299                 }
300                 p1=p2;
301                 p2=p2->link;
302             }
303         }
304     }while(1);
305     WriteLink(head);
306 }
307 void del_classes(STU * head)
308 {
309     STU * p1, *p2, temp;
310     system("cls");
311     do
312     {
313         printf("


		输入要删除学生班级(EOF 结束):");
314         if(scanf("%s",temp.classes)==EOF) break;
315         getchar();
316         p1=p2=head;
317         while(p2!=NULL)
318         {
319             if(strcmp(head->classes,temp.classes)==0)
320             {
321                 head=head->link;
322                 p1->link=NULL;
323                 free(p1);
324                 p1=p2=head;
325             }
326             else
327             {
328                 if(strcmp(head->classes,temp.classes)==0)
329                 {
330                     p1->link=p2->link;
331                     p2->link=NULL;
332                     free(p2);
333                     p2=p1;
334                 }
335                 p1=p2;
336                 p2=p2->link;
337             }
338         }
339     }while(1);
340     WriteLink(head);
341 }
342 
343 void search()
344 {
345     STU * head=CreateLink();
346 
347     char c;
348     do
349     {
350         system("cls");
351         printf("


");
352         printf("		╔═════════════════════╗
");
353         printf("		║                                          ║
");
354         printf("		║        请输入查找内容:                  ║
");
355         printf("		║                                          ║
");
356         printf("		║        1: 按照学号查找                   ║
");
357         printf("		║        2: 按照姓名查找                   ║
");
358         printf("		║        3: 按照系别查找                   ║
");
359         printf("		║        4: 按照班级查找                   ║
");
360         printf("		║        9: 返回主菜单                     ║
");
361         printf("		║                                          ║
");
362         printf("		╚═════════════════════╝
");
363         printf("		                                         
");
364         printf("		请选择输入选项[0\1\2\3\4\9]:> ");
365         do
366         {
367             c=getchar();
368         }while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='9');
369         getchar();
370 
371         switch(c)
372         {
373             case '1':     search_number(head); break;
374             case '2':     search_name( head);  break;
375             case '3':     search_faculty(head); break;
376             case '4':     search_classes(head); break;
377             case '9':     return;
378         }
379         printf("		按任意键返回主菜单:
");
380         getchar();
381         system("cls");
382     }while(1);
383 }
384 void search_number(STU * head)
385 {
386     STU temp,*p2=head;
387     system("cls");
388 
389     do
390     {
391         printf("


		输入要查找学生学号(-1 结束):
		");
392         scanf("%d",&temp.number);
393         printf("		查询结果:
");
394         while(p2!=NULL)
395         {
396             if(p2->number==temp.number)
397                 printf("		%d %s %s %s",p2->number,p2->name,p2->faculty,p2->classes);
398             p2=p2->link;
399         }
400         p2=head;
401     }while(temp.number!=-1);
402 
403 }
404 void search_name(STU * head)
405 {
406     STU temp, *p2=head;
407     system("cls");
408 
409     printf("


		输入要查找学生姓名(EOF 结束):
		");
410     do
411     {
412         if(scanf("%s",temp.name)==EOF) return;
413         printf("		查询结果:
");
414         while(p2!=NULL)
415         {
416             if(strcmp(p2->name,temp.name)==0)
417                 printf("		%d %s %s %s
		",p2->number,p2->name,p2->faculty,p2->classes);
418             p2=p2->link;
419         }
420         p2=head;
421         getchar();
422         printf("


		输入要查找学生姓名(EOF 结束):
		");
423     }while(1);
424 }
425 void search_faculty(STU * head)
426 {
427     STU temp, *p2=head;
428     system("cls");
429 
430     printf("


		输入要查找学生系别(EOF 结束):
		");
431     do
432     {
433         if(scanf("%s",temp.faculty)==EOF) return;
434         printf("		查询结果:
");
435         while(p2!=NULL)
436         {
437             if(strcmp(p2->faculty,temp.faculty)==0)
438                 printf("		%d %s %s %s
		",p2->number,p2->name,p2->faculty,p2->classes);
439             p2=p2->link;
440         }
441         p2=head;
442         getchar();
443         printf("


		输入要查找学生系别(EOF 结束):
		");
444     }while(1);
445 }
446 void search_classes(STU * head)
447 {
448     STU temp, *p2=head;
449     system("cls");
450 
451     printf("


		输入要查找学生班级(EOF 结束):
		");
452     do
453     {
454         if(scanf("%s",temp.classes)==EOF) return;
455         printf("		查询结果:
");
456         while(p2!=NULL)
457         {
458             if(strcmp(p2->classes,temp.classes)==0)
459                 printf("		%d %s %s %s
		",p2->number,p2->name,p2->faculty,p2->classes);
460             p2=p2->link;
461         }
462         p2=head;
463         getchar();
464         printf("


		输入要查找学生班级(EOF 结束):
		");
465     }while(1);
466 }
467 
468 void sort()
469 {
470     STU * head, *p1, *p2;
471     STU temp;
472 
473     head=CreateLink();
474 
475     system("cls");
476     printf("


		按照学号排序(正序):
");            //常排序
477     for(p1=head;p1!=NULL;p1=p1->link)
478         for(p2=p1->link;p2!=NULL;p2=p2->link)
479             if(p1->number>p2->number)
480             {
481                 temp.number=p1->number;
482                 strcpy(temp.name,p1->name);
483                 strcpy(temp.faculty,p1->faculty);
484                 strcpy(temp.classes,p1->classes);
485                 p1->number=p2->number;
486                 strcpy(p1->name,p2->name);
487                 strcpy(p1->faculty,p2->faculty);
488                 strcpy(p1->classes,p2->classes);
489                 p2->number=temp.number;
490                 strcpy(p2->name,temp.name);
491                 strcpy(p2->faculty,temp.faculty);
492                 strcpy(p2->classes,temp.classes);
493             }
494 
495     WriteLink(head);
496 
497     printf("		排序完毕,输出排序结果:");
498     show();
499     free(head);
500 }
501 
502 void show()
503 {
504     STU * head, *p2;
505 
506     head=CreateLink();
507 
508     printf("


		学号 姓名 系别 班级:
");
509     p2=head;
510     while(p2!=NULL)
511     {
512         printf("		%d %s %s %s
",p2->number,p2->name,p2->faculty,p2->classes);
513         p2=p2->link;
514     }
515     getchar();
516 }
517 
518 void edit()
519 {
520     STU * head, *p2;
521     STU temp;
522     head=CreateLink();
523     p2=head;
524 
525     system("cls");
526     do
527     {
528         printf("


		输入要查找学生学号(-1 结束):
");
529         scanf("%d",&temp.number);
530         getchar();
531         while(p2!=NULL)
532         {
533             if(p2->number==temp.number)
534             {    
535                 printf("请输入修改后的内容:姓名、系别、班级:
");
536                 scanf("%s %s %s",p2->name,p2->faculty,p2->classes);
537             }
538             p2=p2->link;
539         }
540     }while(temp.number!=-1);
541 
542     WriteLink(head);
543     free(head);
544 }