1 / 32

第十二章 上机实训

第十二章 上机实训. 学习目标 : 通过一个完整实例让学生掌握 C 语言编程的知识 , 提高综合分析和解决问题的能力 。. 第三十二讲 学生成绩管理系统. 一、问题描述 设计一个学生管理系统。该系统可以建立学生信息表,向表中插入新记录,删除某记录,或在表中查找某特定的学生信息。可输入一组学生成绩,包括每名学生的学号,姓名,语文、数学和英语成绩,建立学生成绩信息表。可加入新学生信息到学生成绩表中,或删除表中的某个位置的学生,或在表中查找某位置的学生并将该学生的信息显示出来。在主函数中设计一个菜单,将要进行的操作用 0 ~ 4 来表示,允许用户输入相应的数字来进行反复操作。.

ewan
Télécharger la présentation

第十二章 上机实训

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十二章 上机实训 学习目标: 通过一个完整实例让学生掌握C语言编程的知识,提高综合分析和解决问题的能力。

  2. 第三十二讲 学生成绩管理系统 一、问题描述 设计一个学生管理系统。该系统可以建立学生信息表,向表中插入新记录,删除某记录,或在表中查找某特定的学生信息。可输入一组学生成绩,包括每名学生的学号,姓名,语文、数学和英语成绩,建立学生成绩信息表。可加入新学生信息到学生成绩表中,或删除表中的某个位置的学生,或在表中查找某位置的学生并将该学生的信息显示出来。在主函数中设计一个菜单,将要进行的操作用0~4来表示,允许用户输入相应的数字来进行反复操作。

  3. 二、数据结构 其主要的数据类型为带头结点的单链表: typedef struct node { int number; /*学生的学号*/ char name[20]; /*姓名*/ int chinese,math,english; /*语文、数学和英语成绩*/ struct node *next; }LinkList;

  4. 三、程序流程 1.函数之间的调用关系图 程序流程图如图12-1所示。

  5. 2.主要函数 (1)初始化链表:LinkList *InitList()。 (2)求链表长度:int Length_List(LinkList *H)。 (3)建立链表函数:void CreateList(LinkList *H,int n)。 (4)表中元素定位函数:LinkList *Locate(LinkList *H,int num)。 (5)查找表中元素位置函数:LinkList *GetList(LinkList *H,int i)。 (6)在链表中插入新元素函数:int InsList(LinkList *p,LinkList x)。 (7)在给定位置i插入元素函数:int Ins_List(LinkList *H, int i, LinkList x)。

  6. (8)删除链表中的某元素函数:int DelList(LinkList *p,LinkList *x)。 (9)删除链表中给定位置的元素函数:int Del_List(LinkList *H,int i,LinkList *x)。 (10)主函数中的菜单显示函数:out()。 (11)输出表中信息函数:void DisLinkList(LinkList *H)。 (12)主函数:main()。

  7. 四、完整程序 • #include "stdio.h" • #include "string.h" • typedef char ElemType; • #define OK 1 /*操作成功返回1*/ • #define ERROR 0 /*错误为0*/ • #define OVER -1 /*结束为-1*/ • typedef struct node • { int number; /*学生学号*/ • char name[20]; /*学生姓名*/ • int chinese,math,english; /*学生语文、数学和英语成绩*/ • struct node *next; /*指向下一结点的指针*/ • } LinkList; /*定义学生结点类型*/

  8. /*********************初始化链表**********************/ LinkList *InitList() { LinkList *H; /*申请一块LinkList类型的存储单元的操作,并将其地址赋值给头指针变量H*/ H=(LinkList *)malloc(sizeof(LinkList)) ; H->next=NULL; return(H); /*头结点H指针域为空,表示空链表*/ }

  9. /******************求链表长度*************************/ int Length_List(LinkList *H) { LinkList *p; int j=0; p=H; /*p指向链表的头结点*/ while(p->next!=NULL) /*判断p所指结点后面是否为空*/ { p=p->next; /*p向所指结点的后面移动*/ j++; /*计数器值增1*/ } return j; /*计数器j的值为表长度*/ }

  10. /*****************建立链表函数************************//*****************建立链表函数************************/ void CreateList(LinkList *H,int n) { int i; LinkList *s,*last; char ch; last=H; /*last始终指向尾结点,开始时指向头结点*/ for(i=1;i<=n;i++) /*循环输入各学生成绩*/ { s=(LinkList *) malloc(sizeof(LinkList)); /*生成新结点*/ printf("\n请输入第%d个学生的学号:",i); scanf("%d",&s->number); printf("\n请输入第%d个学生的姓名:",i); scanf("%s",s->name); printf("\n请输入第%d个学生的语文、数学和英语成绩:",i); scanf("%d%d%d",&s->chinese,&s->math,&s->english); s->next=NULL; /*将新结点的指针域为空*/

  11. last->next=s; /*将新结点插入表尾*/ last=s; /*将last指针指向表尾*/ } } /*********************表中元素定位函数*******************/ LinkList *Locate(LinkList *H,int num) { LinkList *p; p=H->next; /*p指向链表的第一个结点*/ while(p!=NULL && p->number!=num) p=p->next; return p; }

  12. /******************查找表中元素位置函数*******************//******************查找表中元素位置函数*******************/ LinkList *GetList(LinkList *H,int i) { LinkList *p; int j=0; p=H; /*p指向链表的头结点*/ while(p->next!=NULL && j<i) { p=p->next; j++; } if(j==i) /*判断与给定的序号是否相等*/ return p; else return NULL; }

  13. /******************在链表中插入新元素函数******************//******************在链表中插入新元素函数******************/ int InsList(LinkList *p,LinkList x) { LinkList *s; s=(LinkList *)malloc(sizeof(LinkList)); s->number=x.number; strcpy(s->name,x.name); s->chinese=x.chinese; s->math=x.math; s->english=x.english; /*将数据放入新结点的数据域*/ s->next=p->next; /*将新结点的指针域与p结点后面元素相连*/ p->next=s; /*将新结点插入链表*/ return OK; }

  14. /****************在给定位置i插入元素函数*****************//****************在给定位置i插入元素函数*****************/ int Ins_List(LinkList *H, int i, LinkList x) { LinkList *p; p=GetList(H, i-1); /*调用按序号查找第i个元素地址p函数*/ if(p!=NULL) /*判断查找的元素地址p是否存在*/ { InsList(p,x); /*调用在已知结点p后插入结点算法函数*/ return OK; } else return ERROR; }

  15. /*******************删除链表中的某元素函数***********//*******************删除链表中的某元素函数***********/ int DelList(LinkList *p,LinkList *x) { LinkList *s; s=p->next; /*s为要删除结点*/ x->number=s->number; strcpy(x->name,s->name); x->chinese=s->chinese; x->math=s->math; x->english=s->english; /*将要删除的数据赋予指针变量X */ p->next=s->next;/*将p结点的指针域与s结点后面元素相连*/ free(s); /*释放结点s*/ return OK; }

  16. /*****************删除链表中给定位置的元素函数***************//*****************删除链表中给定位置的元素函数***************/ int Del_List(LinkList *H,int i,LinkList *x) { LinkList *p; p=GetList(H, i-1); /*调用按序号查找第i-1个元素地址p函数*/ if (p!=NULL && p->next!=NULL) /*判断查找的元素地址p是否存在*/ { DelList(p,x); /*调用删除已知结点p之后结点函数*/ return OK; } else return ERROR; }

  17. /**********************主函数中的菜单显示********************//**********************主函数中的菜单显示********************/ out() { printf("\n******************************************"); printf("\n请输入序号(0-4)选择要进行的操作:"); printf("\n0------退出"); printf("\n1------建立一个学生信息表"); printf("\n2------插入一个学生信息"); printf("\n3------删除一个学生信息"); printf("\n4------查找一个学生是否在该学生信息表中"); printf("\n******************************************\n"); }

  18. /**********************输出表中信息函数********************//**********************输出表中信息函数********************/ void DisLinkList(LinkList *H) { LinkList *p; printf("\n所有学生的信息如下:"); printf("\n 学号姓名语文数学英语\n"); p=H->next; while(p!=NULL) { printf("%2d%10s%9d%9d%9d\n",p->number,p->name,p->chinese, p->math,p->english); p=p->next; } }

  19. /******************主函数****************************/ main() { LinkList *H,*p,*q,x; int i,n,menux,flag,num; clrscr(); /*清屏*/ out(); H=InitList(); scanf("%d",&menux); do { switch(menux) /*用来判断用户要进行何种操作*/ { case 0:exit(0); break; /*退出*/

  20. case 1: /*建立一个学生信息表*/ printf("\n请输入要生成的学生信息表的元素个数:"); scanf("%d",&n); CreateList(H,n); printf("\n建立的学生信息表为:\n"); DisLinkList(H); break;

  21. case 2: /*在学生信息表中插入一个元素*/ printf("\n请输入要插入的学生位置 "); scanf("%d",&i); printf("\n请输入要插入的学生信息:"); printf("\n请输入学生的学号:"); scanf("%d",&x.number); printf("\n请输入学生的姓名:"); scanf("%s",x.name); printf("\n请输入学生的语文、数学和英语成绩:"); scanf("%d%d%d",&x.chinese,&x.math,&x.english); flag=Ins_List(H,i,x); if(flag) { printf("\n插入后的学生信息表为: "); DisLinkList(H); } break;

  22. case 3: /*在学生信息表中删除一个元素*/ printf("\n请输入要删除的学生的位置:"); scanf("%d",&i); flag=Del_List(H,i,&x); if(flag) { printf("\n删除第%d个学生后,表中信息为:",i); DisLinkList(H); } break;

  23. case 4: /*在学生信息表中查找某学号学生信息*/ printf("\n请输入查找的学生学号:\n"); scanf("%d",&num); if((q=Locate(H,num))!=NULL) { printf("\n在学生信息表中存在着学号为%d的学生!",num); printf("\n学号姓名语文数学英语\n"); printf("%2d%10s%9d%9d%9d",q->number,q->name,q->chinese, q->math,q->english); }

  24. else printf("\n在学生信息表中不存在着学号为%d的学生!",num); break; default: printf("\n输入选项错误,请重新输入(0-4)!"); } out(); scanf("%d",&menux); }while(1); }

  25. 五、程序运行步骤及结果 说明:程序运行自动显示的信息无下画线,用户输入的信息用下画线显示,“↙”表示回车。本程序有主菜单,设有0~4五个选项,每次可以输入0~4来执行相关操作,并且每次执行完后都会重新显示菜单,当输入0时结束该程序。 程序一次运行结果如下:

  26. ******************************************** • 请输入序号(0-4)选择要进行的操作: • 0------退出 • 1------建立一个学生信息表 • 2------插入一个学生信息 • 3------删除一个学生信息 • 4------查找一个是否在该学生信息表中 • ******************************************** • 1↙

  27. 请输入要生成的学生信息表的元素个数:2↙ 请输入第1个学生的学号:1↙ 请输入第1个学生的姓名:liu↙ 请输入第1个学生的语文、数学和英语成绩:78 88 89↙ 请输入第2个学生的学号:2↙ 请输入第2个学生的姓名:wang↙ 请输入第2个学生的语文、数学和英语成绩:65 89 93↙

  28. 建立的学生信息表为: 学号姓名语文数学英语 1 liu 78 88 89 2 wang 65 89 93 ******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 2↙

  29. 请输入要插入的学生位置3↙ 请输入要插入的学生信息: 请输入学生的学号:3↙ 请输入学生的姓名:zhao↙ 请输入学生的语文、数学和英语成绩:92 75 81↙ 插入后的学生信息表为: 学号姓名语文数学英语 1 liu 78 88 89 2 wang 65 89 93 3 zhao 92 75 81

  30. ******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 3↙ 请输入要删除的学生的位置:2↙ 删除第2个学生后,表中信息为: 学号姓名语文数学英语 1 liu 78 88 89 3 zhao 92 75 81

  31. ******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 4 请输入查找的学生学号:3↙ 学号姓名语文数学英语 3 zhao 92 75 81

  32. ******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 0↙

More Related