lzc978

直接贴代码了 

另有:python调用c程序的实现

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<iostream>
  3 using namespace std;
  4 
  5 
  6 struct Student
  7 {
  8     char Number[9];
  9     char Name[9];
 10     char Sex[20];
 11     char Post[4];
 12     char MainPhone[12];
 13     char OtherPhone[12];
 14     char Mail[30];
 15     struct Student* Next;
 16 };
 17 
 18 int NodeNumber = 0;//统计个数
 19 char MESSAGE[20] = { \'\0\' };//保存文件名字,用来判断是否重复输入
 20 struct Student *top = NULL, *rear = NULL;
 21 
 22 void Choice();
 23 void WriteMessage();
 24 void AddStudent();
 25 void Amend();
 26 void Delete();
 27 void Save();
 28 void PrintOne();
 29 void PrintClass();
 30 void PrintPosition();
 31 void PrintALL();
 32 void PrintSame();
 33 
 34 
 35 int main(){
 36     Choice();
 37     int num;
 38     printf("请输入功能选项:");
 39     while (scanf("%d", &num))
 40     {
 41         switch (num)
 42         {
 43         case 1:system("CLS");
 44             WriteMessage();
 45             break;
 46         case 2:system("CLS");
 47             AddStudent();
 48             break;
 49         case 3:system("CLS");
 50             Amend();
 51             break;
 52         case 4:system("CLS");
 53             Delete();
 54             break;
 55         case 5:system("CLS");
 56             Save();
 57             break;
 58         case 6:system("CLS");
 59             PrintOne();
 60             break;
 61         case 7:system("CLS");
 62             PrintClass();
 63             break;
 64         case 8:system("CLS");
 65             PrintPosition();
 66             break;
 67         case 9:system("CLS");
 68             PrintALL();
 69             break;
 70         case 10:system("CLS");
 71             PrintSame();
 72             break;
 73         default:system("CLS");
 74             printf("输入错误!\n");
 75             system("PAUSE");
 76             system("CLS");
 77             Choice();
 78             break;
 79         }
 80         printf("请输入功能选项:");
 81     }
 82     return 0;
 83 }
 84 
 85 //界面选项
 86 void Choice()
 87 {
 88     printf("\t※※※※※※※※※※※欢迎进入通讯录管理系统※※※※※※※※※※※\n");
 89     printf("\t※                                                              ※\n");
 90     printf("\t※       系统功能说明:                                         ※\n");
 91     printf("\t※                                                              ※\n");
 92     printf("\t※       1.从文件中录入多位同学的相关信息;                     ※\n");
 93     printf("\t※       2.增加1位新同学的相关信息;                            ※\n");
 94     printf("\t※       3.修改1位同学的相关信息;                              ※\n");
 95     printf("\t※       4.删除1位同学的所有信息;                              ※\n");
 96     printf("\t※       5.将当前系统中的所有信息保存到文件中;                 ※\n");
 97     printf("\t※       6.打印某位同学(按照姓名或手机号查找)的所有相关信息   ※\n");
 98     printf("\t※       7.打印某班同学的所有相关信息(可选);                 ※\n");
 99     printf("\t※       8.输出所有班级干部的相关信息;                         ※\n");
100     printf("\t※       9.按照学号顺序打印系统中所有同学的信息;               ※\n");
101     printf("\t※      10.打印所有包含相同手机号的同学信息;                   ※\n");
102     printf("\t※                                                              ※\n");
103     printf("\t※            ---------退出系统请输入exit---------              ※\n");
104     printf("\t※                                                              ※\n");
105     printf("\t※※※※※※※※※※※※※谢谢使用※※※※※※※※※※※※※※※※\n");
106     printf("\n");
107 }
108 
109 //输出一个学生信息
110 void Out(struct Student *t)
111 {
112     printf("\t学  号:%-13s姓  名:%-13s\n", t->Number, t->Name);
113     printf("\t性  别:%-13s职  务:%-13s\n", t->Sex, t->Post);
114     printf("\t手机号:%-13s其它号:%-13s\n", t->MainPhone, t->OtherPhone);
115     printf("\t邮  箱:%s\n", t->Mail);
116     printf("\t------------------------------------------\n");
117     printf("\n");
118 
119 }
120 
121 //插入链表
122 void inrear(struct Student *p) //构建链表(队列)
123 {
124     if (top == NULL)
125     {
126         top = p;
127         rear = p;
128     }
129 
130     else
131     {
132         rear->Next = p;
133         rear = p;
134     }
135     NodeNumber++;//节点数加一
136 }
137 
138 //对学号排序
139 void Sort(){
140     struct Student *p, *q, *r, *s; //q指向p的前元素,r指向p的后元素
141     bool flag = true;
142     s = (struct Student *)malloc(sizeof(struct Student)); //哨兵变量
143     s->Next = top;
144     top = s;
145     p = top->Next;
146     q = s;
147     while (flag&&p != NULL)
148     {
149         flag = false;
150         while (p->Next != NULL) //用p从头扫到尾
151         {
152             r = p->Next; //r指向p后
153             if (strcmp(p->Number, r->Number) == 1)
154             {
155                 q->Next = r;
156                 p->Next = r->Next;
157                 r->Next = p;
158                 q = r;
159                 flag = true;
160             }
161             else
162             { // q,p向后移位
163                 q = p;
164                 p = p->Next;
165             }
166         }
167         q = s;//q,p重新到第一个元素
168         p = top->Next;
169     }
170     top = top->Next;//释放哨兵变量
171     free(s);
172 }
173 
174 //检查学生是否重复
175 bool Check(struct Student *t)
176 {
177     struct Student *p = top;
178     while (p != NULL)
179     {
180         if (strcmp(p->Number, t->Number) == 0 || strcmp(p->Name, t->Name) == 0)
181             return false;
182         p = p->Next;
183     }
184     return true;
185 }
186 
187 //从文件中读入信息
188 void WriteMessage()
189 {
190     FILE *f;
191     char str[20] = { \'\0\' };
192     printf("请输入文件名称:");
193     scanf("%s", str);
194     //比较文件名字是否重复
195     if (strcmp(MESSAGE, str) == 0)
196     {
197         printf("错误,多次输入同一文件!\n");
198         printf("是否重新输入(Y or N)\n");
199         char ch = getchar();
200         ch = getchar();
201         if (ch == \'Y\' || ch == \'y\')
202         {
203             system("CLS");
204             WriteMessage();
205         }
206         else
207         {
208             system("PAUSE");
209             system("CLS");
210             Choice();
211         }
212     }
213     else
214     {
215         strcpy(MESSAGE, str);
216         f = fopen(str, "r");
217         if (!f)
218         {
219             printf("文件打开失败!即将创立新的%s文件", str);
220             f = fopen(str, "w");
221         }
222         else
223         {
224             while (!feof(f))
225             {
226                 struct Student *p = (struct Student *)malloc(sizeof(struct Student));
227                 p->Next = NULL;
228                 fscanf(f, "%s", &p->Number);
229                 fscanf(f, "%s", &p->Name);
230                 fscanf(f, "%s", &p->Sex);
231                 fscanf(f, "%s", &p->Post);
232                 fscanf(f, "%s", &p->MainPhone);
233                 fscanf(f, "%s", &p->OtherPhone);
234                 fscanf(f, "%s", &p->Mail);
235                 if (Check(p))
236                     inrear(p);
237             }
238             printf("文件已成功写入!\n");
239             printf("学生数为: %d\n", NodeNumber);
240             system("PAUSE");
241             system("CLS");
242             Choice();
243         }
244         fclose(f);
245     }
246 }
247 
248 
249 //增加学生
250 void AddStudent(){
251     struct Student *p = (struct Student *)malloc(sizeof(struct Student));
252     p->Next = NULL;
253     printf("\n请输入学号:");
254     scanf("%s", &p->Number);
255     while (p->Number[0] != \'5\' || p->Number[1] != \'3\')
256     {
257         printf("你输入的学号是不是不对呢,请重新输入");
258         scanf("%s", &p->Number);
259         if (strlen(p->Number) != 8)
260         {
261             printf("你输入的学号是不是不对呢,请重新输入");
262             scanf("%s", &p->Number);
263         }
264     }
265     while (strlen(p->Number) != 8)
266     {
267         printf("你输入的学号是不是不对呢,请重新输入");
268         scanf("%s", &p->Number);
269         if (p->Number[0] != \'5\' || p->Number[1] != \'3\')
270         {
271             printf("你输入的学号是不是不对呢,请重新输入");
272             scanf("%s", &p->Number);
273         }
274     }
275     printf("\n请输入姓名:");
276     scanf("%s", &p->Name);
277     for (int T = 67; T<122; T++)
278     for (int i = 0; i<strlen(p->Name); i++)
279     while (p->Name[i] == char(T))
280     {
281         printf("你输入的名字格式有误,请重新输入");
282         scanf("%s", &p->Name);
283     }
284     printf("\n请输入性别:");
285     scanf("%s", &p->Sex);
286     while (strcmp(p->Sex, "") != 0 && strcmp(p->Sex, "") != 0 && strcmp(p->Sex, "不详") != 0){
287         printf("你输入的性别格式有错误请重新输入");
288         printf("\n");
289         scanf("%s", &p->Sex);
290     }
291     printf("\n请输入职务:");
292     scanf("%s", &p->Post);
293     while (strcmp(p->Post, "班长") != 0 && strcmp(p->Post, "学委") != 0 && strcmp(p->Post, "体育委员") != 0 && strcmp(p->Post, "文艺委员") != 0){
294         printf("你输入的职务有错误请重新输入");
295         printf("\n");
296         scanf("%s", &p->Post);
297     }
298     printf("\n请输入主要手机号:");
299     scanf("%s", &p->MainPhone);
300     while (strlen(p->MainPhone) != 11)
301     {
302         printf("你输入的主手机号格式有误哦,请重新输入");
303         scanf("%s", &p->MainPhone);
304     }
305     for (int i = 0; i<strlen(p->MainPhone); i++)
306     while (p->MainPhone[i] != char(48) && p->MainPhone[i] != char(49) && p->MainPhone[i] != char(50) && p->MainPhone[i] != char(51) && p->MainPhone[i] != char(52) && p->MainPhone[i] != char(53) && p->MainPhone[i] != char(54) && p->MainPhone[i] != char(55) && p->MainPhone[i] != char(56) && p->MainPhone[i] != char(57))
307     {
308         printf("你输入的主手机号格式有误哦,请重新输入");
309         scanf("%s", &p->MainPhone);
310     }
311     printf("\n请输入其他手机号:");
312     scanf("%s", &p->OtherPhone);
313     while (strlen(p->OtherPhone) != 11)
314     {
315         printf("你输入的副手机号格式有问题哦,请重新输入");
316         scanf("%s", &p->OtherPhone);
317     }
318     while (strcmp(p->MainPhone, p->OtherPhone) == 0)
319         printf("你输入的主手机号和副手机号相同");
320     printf("\n请输入邮箱:");
321     scanf("%s", &p->Mail);
322     int j = 1;
323     for (int L = 0; L<strlen(p->Mail); L++){
324         if (p->Mail[L] == \'@\')
325             j++;
326     }
327 
328     if (j != 2)
329     {
330         printf("你输入的邮箱名是不是错了呢,请重新输入邮箱名");
331         scanf("%s", &p->Mail);
332     }
333 
334 
335     if (Check(p))
336         inrear(p);
337     printf("已成功存储!");
338     system("PAUSE");
339     system("CLS");
340     Choice();
341 };
342 
343 //修改信息
344 void Amend(){
345     printf("\n请输入要修改的同学的学号或姓名:");
346     char str[8];
347     scanf("%s", str);
348     struct Student *p = top;
349     while (p != NULL)
350     {
351         if ((strcmp(str, p->Number) == 0) || (strcmp(str, p->Name) == 0))
352             break;
353         else
354             p = p->Next;
355     }
356     if (p != NULL)
357     {
358         printf("\n请选择要修改的信息:\n\n");
359         printf("1.学号  2.姓名  3.性别  4.主要电话号码 5.其它电话号码  6.邮箱\n\n");
360         int n;
361         scanf("%d", &n);
362         while (n>0)
363         {
364             switch (n)
365             {
366             case 1:printf("请输入新的学号:");
367                 char NewNumber[9];
368                 scanf("%s", NewNumber);
369                 strcpy(p->Number, NewNumber);
370                 printf("已成功修改!\n");
371                 break;
372             case 2:printf("请输入新的姓名:");
373                 char NewName[9];
374                 scanf("%s", NewName);
375                 strcpy(p->Name, NewName);
376                 printf("已成功修改!\n");
377                 break;
378             case 3:printf("请输入新的性别:");
379                 char NewSex[3];
380                 scanf("%s", NewSex);
381                 strcpy(p->Sex, NewSex);
382                 printf("已成功修改!\n");
383                 break;
384             case 4:printf("请输入新的主要手机号码:");
385                 char NewMainPhone[12];
386                 scanf("%s", NewMainPhone);
387                 strcpy(p->MainPhone, NewMainPhone);
388                 printf("已成功修改!\n");
389                 break;
390             case 5:printf("请输入新的其它手机号码:");
391                 char NewOtherPhone[12];
392                 scanf("%s", NewOtherPhone);
393                 strcpy(p->OtherPhone, NewOtherPhone);
394                 printf("已成功修改!\n");
395                 break;
396             case 6:printf("请输入新的邮箱:");
397                 char NewMail[30];
398                 scanf("%s", NewMail);
399                 strcpy(p->Mail, NewMail);
400                 printf("已成功修改!\n");
401                 break;
402             default:printf("输入错误!\n");
403                 break;
404             }
405             printf("\n请输入修改选项或输入0退出修改!\n");
406             scanf("%d", &n);
407         }
408         system("PAUSE");
409         system("CLS");
410         Choice();
411     }
412     else
413     {
414         printf("该系统中无此学生,是否添加(Y or N)\n");
415         char ch = getchar();//滤去回车
416         ch = getchar();
417         if (ch == \'Y\' || ch == \'y\')
418             AddStudent();
419         if (ch == \'N\' || ch == \'n\')
420         {
421             system("PAUSE");
422             system("CLS");
423             Choice();
424         }
425     }
426 };
427 
428 //删除学生
429 void Delete(){
430     printf("\n请输入要删除的学生的学号或姓名:");
431     char str[9];
432     scanf("%s", str);
433     struct Student *s = (struct Student *)malloc(sizeof(struct Student)), *p, *q;
434     s->Next = top;
435     top = s;
436     q = s;
437     p = q->Next;
438     while (p != NULL)
439     {
440         if ((strcmp(str, p->Number) == 0) || (strcmp(str, p->Name) == 0))
441         {
442             q->Next = p->Next;
443             p = p->Next;
444         }
445         else
446         {
447             q = q->Next;
448             p = p->Next;
449         }
450     }
451     top = top->Next;
452     free(s);
453     NodeNumber--;//节点数减一
454 
455     printf("\n是否继续删除(Y or N)\n\n");
456     char ch = getchar();//滤去回车
457     ch = getchar();
458     if (ch == \'Y\' || ch == \'y\')
459         Delete();
460     if (ch == \'N\' || ch == \'n\')
461     {
462         system("PAUSE");
463         system("CLS");
464         Choice();
465     }
466 };
467 
468 //保存信息到文件
469 void Save(){
470     FILE *out;
471     out = fopen("PresentMessage.txt", "w");
472     struct Student *p = top;
473     while (p != NULL)
474     {
475         fprintf(out, "%s %s %s %s %s %s\n", p->Number, p->Name, p->Sex, p->MainPhone, p->OtherPhone, p->Mail);
476         p = p->Next;
477     }
478     fclose(out);
479     printf("数据已成功导入文件PresentMessage.txt!\n");
480     system("PAUSE");
481     system("CLS");
482     Choice();
483 };
484 
485 //打印指定学生
486 void PrintOne(){
487     printf("请输入要打印的同学的姓名或手机号:");
488     bool flag = false;
489     char str[12];
490     scanf("%s", str);
491     struct Student *p = top;
492     while (p != NULL)
493     {
494         if ((strcmp(str, p->MainPhone) == 0) || (strcmp(str, p->OtherPhone) == 0) || (strcmp(str, p->Name) == 0))
495         {
496             flag = true;
497             Out(p);
498             p = p->Next;
499         }
500         else
501             p = p->Next;
502     }
503     if (!flag)
504         printf("该系统中无此学生或输入错误!\n");
505     system("PAUSE");
506     system("CLS");
507     Choice();
508 
509 };
510 
511 //打印指定班级
512 void PrintClass(){
513     bool flag = false;
514     Sort();
515     printf("请输入班级(阿拉伯数字):");
516     int num;
517     scanf("%d", &num);
518     char ch[2];
519     ch[0] = char(num % 10 + 48);
520     ch[1] = char(num / 10 + 48);
521     struct Student *p = top;
522     while (p != NULL)
523     {
524         if (p->Number[4] == ch[1] && p->Number[5] == ch[0]){
525             Out(p);
526             flag = true;
527         }
528         p = p->Next;
529     }
530     if (!flag)
531         printf("该系统中无此班级的学生!\n");
532     system("PAUSE");
533     system("CLS");
534     Choice();
535 };
536 
537 //打印指定职务
538 void PrintPosition(){
539     bool flag;
540     printf("请输入要打印的职务:");
541     char str[12];
542     scanf("%s", str);
543     struct Student *p = top;
544     while (p != NULL)
545     {
546         if ((strcmp(str, p->Post) == 0))
547         {
548             flag = true;
549             Out(p);
550             p = p->Next;
551         }
552         else
553             p = p->Next;
554     }
555     if (!flag)
556         printf("该系统中无此职务学生或输入错误!\n");
557     system("PAUSE");
558     system("CLS");
559     Choice();
560 
561 };
562 
563 //打印所有学生
564 void PrintALL(){
565     Sort();
566     struct Student* p = top;
567     printf("\t系统中共有%d个学生\n\n", NodeNumber);
568     if (p == NULL)
569         printf("文件中没有学生信息!\n");
570     else
571     {
572         while (p != NULL)
573         {
574             Out(p);
575             p = p->Next;
576         }
577     }
578     system("PAUSE");
579     system("CLS");
580     Choice();
581 };
582 
583 //打印含有相同手机号的学生
584 void PrintSame(){
585     int n = 1, m = 0;//n用来统计p,m用来统计q
586     bool flag = true;//flag判断当前节点
587     bool *Handle = (bool *)malloc(NodeNumber + 1);//用bool型的数组关联链表,true代表相同的
588     for (int i = 0; i<NodeNumber; i++)
589         Handle[i] = true;
590     struct Student *q = top, *p;
591     if (q == NULL)
592     {
593         printf("系统中无学生信息!\n");
594         system("PAUSE");
595         system("CLS");
596         Choice();
597     }
598     else
599     {
600         p = q->Next;
601         while (q->Next != NULL)
602         {
603             while (p != NULL)
604             {
605                 if ((strcmp(q->MainPhone, p->MainPhone) == 0) || (strcmp(q->OtherPhone, p->OtherPhone) == 0) || (strcmp(q->MainPhone, p->OtherPhone) == 0) || (strcmp(q->OtherPhone, p->MainPhone) == 0))
606                 {
607                     //用flag控制当前节点的输出
608                     if (flag)
609                     {
610                         Out(q);
611                         Out(p);
612                         flag = false;
613                         Handle[n++] = false;
614                     }
615                     else
616                     {
617                         Out(p);
618                         Handle[n++] = false;
619                     }
620                 }
621                 else
622                     n++;
623                 p = p->Next;
624             }
625             m++;
626             q = q->Next;
627             flag = true;
628             //判断当前节点是否可访问
629             while (Handle[m] == false)
630             {
631                 q = q->Next;
632                 if (q->Next == NULL)
633                     break;
634                 m++;
635             }
636             n = m + 1;
637             p = q->Next;
638         }
639     }
640     system("PAUSE");
641     system("CLS");
642     Choice();
643 };

 

分类:

技术点:

相关文章: