320 likes | 448 Views
第十二章 上机实训. 学习目标 : 通过一个完整实例让学生掌握 C 语言编程的知识 , 提高综合分析和解决问题的能力 。. 第三十二讲 学生成绩管理系统. 一、问题描述 设计一个学生管理系统。该系统可以建立学生信息表,向表中插入新记录,删除某记录,或在表中查找某特定的学生信息。可输入一组学生成绩,包括每名学生的学号,姓名,语文、数学和英语成绩,建立学生成绩信息表。可加入新学生信息到学生成绩表中,或删除表中的某个位置的学生,或在表中查找某位置的学生并将该学生的信息显示出来。在主函数中设计一个菜单,将要进行的操作用 0 ~ 4 来表示,允许用户输入相应的数字来进行反复操作。.
E N D
第十二章 上机实训 学习目标: 通过一个完整实例让学生掌握C语言编程的知识,提高综合分析和解决问题的能力。
第三十二讲 学生成绩管理系统 一、问题描述 设计一个学生管理系统。该系统可以建立学生信息表,向表中插入新记录,删除某记录,或在表中查找某特定的学生信息。可输入一组学生成绩,包括每名学生的学号,姓名,语文、数学和英语成绩,建立学生成绩信息表。可加入新学生信息到学生成绩表中,或删除表中的某个位置的学生,或在表中查找某位置的学生并将该学生的信息显示出来。在主函数中设计一个菜单,将要进行的操作用0~4来表示,允许用户输入相应的数字来进行反复操作。
二、数据结构 其主要的数据类型为带头结点的单链表: typedef struct node { int number; /*学生的学号*/ char name[20]; /*姓名*/ int chinese,math,english; /*语文、数学和英语成绩*/ struct node *next; }LinkList;
三、程序流程 1.函数之间的调用关系图 程序流程图如图12-1所示。
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)。
(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()。
四、完整程序 • #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; /*定义学生结点类型*/
/*********************初始化链表**********************/ LinkList *InitList() { LinkList *H; /*申请一块LinkList类型的存储单元的操作,并将其地址赋值给头指针变量H*/ H=(LinkList *)malloc(sizeof(LinkList)) ; H->next=NULL; return(H); /*头结点H指针域为空,表示空链表*/ }
/******************求链表长度*************************/ 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的值为表长度*/ }
/*****************建立链表函数************************//*****************建立链表函数************************/ 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; /*将新结点的指针域为空*/
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; }
/******************查找表中元素位置函数*******************//******************查找表中元素位置函数*******************/ 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; }
/******************在链表中插入新元素函数******************//******************在链表中插入新元素函数******************/ 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; }
/****************在给定位置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; }
/*******************删除链表中的某元素函数***********//*******************删除链表中的某元素函数***********/ 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; }
/*****************删除链表中给定位置的元素函数***************//*****************删除链表中给定位置的元素函数***************/ 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; }
/**********************主函数中的菜单显示********************//**********************主函数中的菜单显示********************/ out() { printf("\n******************************************"); printf("\n请输入序号(0-4)选择要进行的操作:"); printf("\n0------退出"); printf("\n1------建立一个学生信息表"); printf("\n2------插入一个学生信息"); printf("\n3------删除一个学生信息"); printf("\n4------查找一个学生是否在该学生信息表中"); printf("\n******************************************\n"); }
/**********************输出表中信息函数********************//**********************输出表中信息函数********************/ 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; } }
/******************主函数****************************/ 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; /*退出*/
case 1: /*建立一个学生信息表*/ printf("\n请输入要生成的学生信息表的元素个数:"); scanf("%d",&n); CreateList(H,n); printf("\n建立的学生信息表为:\n"); DisLinkList(H); break;
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;
case 3: /*在学生信息表中删除一个元素*/ printf("\n请输入要删除的学生的位置:"); scanf("%d",&i); flag=Del_List(H,i,&x); if(flag) { printf("\n删除第%d个学生后,表中信息为:",i); DisLinkList(H); } break;
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); }
else printf("\n在学生信息表中不存在着学号为%d的学生!",num); break; default: printf("\n输入选项错误,请重新输入(0-4)!"); } out(); scanf("%d",&menux); }while(1); }
五、程序运行步骤及结果 说明:程序运行自动显示的信息无下画线,用户输入的信息用下画线显示,“↙”表示回车。本程序有主菜单,设有0~4五个选项,每次可以输入0~4来执行相关操作,并且每次执行完后都会重新显示菜单,当输入0时结束该程序。 程序一次运行结果如下:
******************************************** • 请输入序号(0-4)选择要进行的操作: • 0------退出 • 1------建立一个学生信息表 • 2------插入一个学生信息 • 3------删除一个学生信息 • 4------查找一个是否在该学生信息表中 • ******************************************** • 1↙
请输入要生成的学生信息表的元素个数:2↙ 请输入第1个学生的学号:1↙ 请输入第1个学生的姓名:liu↙ 请输入第1个学生的语文、数学和英语成绩:78 88 89↙ 请输入第2个学生的学号:2↙ 请输入第2个学生的姓名:wang↙ 请输入第2个学生的语文、数学和英语成绩:65 89 93↙
建立的学生信息表为: 学号姓名语文数学英语 1 liu 78 88 89 2 wang 65 89 93 ******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 2↙
请输入要插入的学生位置3↙ 请输入要插入的学生信息: 请输入学生的学号:3↙ 请输入学生的姓名:zhao↙ 请输入学生的语文、数学和英语成绩:92 75 81↙ 插入后的学生信息表为: 学号姓名语文数学英语 1 liu 78 88 89 2 wang 65 89 93 3 zhao 92 75 81
******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 3↙ 请输入要删除的学生的位置:2↙ 删除第2个学生后,表中信息为: 学号姓名语文数学英语 1 liu 78 88 89 3 zhao 92 75 81
******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 4 请输入查找的学生学号:3↙ 学号姓名语文数学英语 3 zhao 92 75 81
******************************************** 请输入序号(0-4)选择要进行的操作: 0------退出 1------建立一个学生信息表 2------插入一个学生信息 3------删除一个学生信息 4------查找一个是否在该学生信息表中 ******************************************** 0↙