考试报名管理
1.项目简介
考试报名工作给各高校报名工作带来了新的挑战,给教务管理部门增加了很大的工作量,报名数据手工录入既费时又会不可避免地出现错误,同时也给不少学生以可乘之机。本项目是对考试报名管理的简单模拟,用菜单选择方式完成下列功能:输入考生信息;输出考生信息;查询考生信息;添加考生信息;修改考生信息;删除考生信息。
2.设计思路
本项目的实质是完成对考生信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
3.数据结构
本项目的数据是一组考生信息,每条考生信息由准考证号、姓名、性别、年龄、报考类别等信息组成,这组考生信息具有相同特性,属于同一数据对象,相邻数据元素之间存在序偶关系。由此可以看出,这些数据也具有线性表中数据元素的性质,所以该系统的数据可以采用线性表来存储。
从上一节的例子中可见,线性表的顺序存储结构的特点是逻辑关系相邻的两个元素在物理位置上也相邻,因此可以随机存储表中任一元素,它的存储位置可用一个简单、直观的公式来表示。然而,从另一个方面来看,这个特点也铸成了这种存储结构的弱点:在做插入或删除操作时,需要移动大量元素。为克服这一缺点,我们引入另一种存储形式――链式存储。链式存储是线性表的另一种表示方法,由于它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构的弱点,但同时也失去了顺序表可随机存取的特点。
链式存储的优点是插入或删除元素时很方便,使用灵活。缺点是存储密度小,存储空间利用率低。事实上,链表插入、删除运算的快捷是以空间代价来换取时间。
顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
本项目对考生数据主要进行插入、删除、修改等操作,所以采用链式存储结构比较适合。用结构体类型定义每个考生信息,故该单链表中的每个结点的数据元素结构可描述为:
typedef struct examinee { char examno[10]; //准考证号 char name[10]; //姓名 char sex; float age; char examtype[5]; //成绩 } ElemType;
程序主要功能:
输入学生信息;输出学生信息;查找学生信息;插入学生信息;修改学生信息;删除学生信息;
函数之间的调用关系:
1.调用函数void CreateListR( )输入相对应学生信息
2.调用函数void DispList( )输出相对应的考生信息
3.调用函数int LocateElem()查找相应学生信息
4.调用函数void InsertList()插入所需要的学生信息
5.调用函数int create() 修改学生信息
6. 调用函数void ListDelete( )删除学生成绩则必须对链表结点进行 删除意味着将某个要删除结点前后的连续打断去掉该结点,使前后指针变量重新连接,完成结点删除任务
详细设计
1.删除学生信息
输入要删除的学生的考号,调用删除函数int ListDelete()。
判断考号num是否存在的实现方法或关键代码:
while(e.num!=q->data.num && q->next!=NULL) { q=q->next; p=p->next; } if(e.num!=q->data.num) { printf("抱歉,没有找到!\n"); return 0; } 删除考号为num的学生信息的方法或关键代码: q=p->next; if(q==NULL) return 0; p->next=q->next; free(q); printf("输出删除以后的全部信息\n\n"); DispList(L); return 1;
2.添加学生信息
实现添加学生信息的方法或关键代码:
while(p->next!=NULL) p=p->next; for(i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); scanf("%d %s %s %s %d %d",&s->data.num,&s->data.name,&s->data.sex,&s->data.address,&s->data.age,&s->data.type); p->next=s; p=s; r=s; } r->next=NULL;
3.修改学生信息
while(e.num!=p->data.num && p->next!=NULL) { p=p->next; } if(p->data.num==e.num) { printf("请输入:姓名 性别 籍贯 年龄 考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他)\n"); scanf("%s %s %s %d %d",&p->data.name,&p->data.sex,&p->data.address,&p->data.age,&p->data.type); printf("输出修改后的全部信息:\n\n"); DispList(L); return 0; }
4.查询学生信息
while(p!=NULL && p->data.num!=e.num) { p=p->next; } if(p==NULL) return(0); else { printf("考号:"); printf("%d\n",p->data.num); printf("姓名:"); printf("%s\n",p->data.name); printf("性别:"); printf("%s\n",p->data.sex); printf("籍贯:"); printf("%s\n",p->data.address); printf("年龄:"); printf("%d\n",p->data.age); printf("考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他):"); printf("%d\n",p->data.type); return 1; }
执行结果测试
1、输入学生信息测试结果
2、删除学生信息测试结果
3、修改学生信息测试结果
4、查询学生信息测试结果
5、添加学生信息测试结果
带注释的源程序:
//头文件 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> #include <iostream> using namespace std; typedef struct student { int num; char sex[10]; char name[10]; int age; char address[10]; int type; }ElemType; //定义单链表节点类型 typedef struct LNode { ElemType data; struct LNode *next; }LinkList; ElemType e; //初始化一个线性表,建立一个空的单链表,创建一个头节点 void InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } //采用尾插法创建链表 void CreateListR(LinkList *&L) { int n; printf("请输入需要增加的人数n="); scanf("%d",&n); LinkList *s,*r; int i; L=(LinkList *)malloc(sizeof(LinkList)); r=L; printf("输入考号:姓名 性别 籍贯 年龄 考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他)\n"); for(i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); scanf("%d %s %s %s %d %d",&s->data.num,&s->data.name,&s->data.sex,&s->data.address,&s->data.age,&s->data.type); r->next=s; r=s; } r->next=NULL; } //输出信息 void DispList(LinkList *L) { LinkList *p=L->next; while(p!=NULL) { printf("\n输入考号:姓名 性别 籍贯 年龄 考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他)\n"); printf("%d %s %s %s %d %d",p->data.num,p->data.name,p->data.sex,p->data.address,p->data.age,p->data.type); p=p->next; } printf("\n"); } //查找信息 int LocateElem(LinkList *L) { printf("请输入要查找的考号i="); scanf("%d",&e.num); LinkList *p=L->next; while(p!=NULL && p->data.num!=e.num) { p=p->next; } if(p==NULL) return(0); else { printf("考号:"); printf("%d\n",p->data.num); printf("姓名:"); printf("%s\n",p->data.name); printf("性别:"); printf("%s\n",p->data.sex); printf("籍贯:"); printf("%s\n",p->data.address); printf("年龄:"); printf("%d\n",p->data.age); printf("考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他):"); printf("%d\n",p->data.type); return 1; } } //删除信息 int ListDelete(LinkList *&L) { printf("请输入要删除的考号i="); scanf("%d",&e.num); LinkList *p=L,*q; q=p->next; while(e.num!=q->data.num && q->next!=NULL) { q=q->next; p=p->next; } if(e.num!=q->data.num) { printf("抱歉,没有找到!\n"); return 0; } else { q=p->next; if(q==NULL) return 0; p->next=q->next; free(q); printf("输出删除以后的全部信息\n\n"); DispList(L); return 1; } } //修改信息 int create(LinkList *&L) { printf("请输入要修改人的考号i="); scanf("%d",&e.num); LinkList *p=L->next; while(e.num!=p->data.num && p->next!=NULL) { p=p->next; } if(p->data.num==e.num) { printf("请输入:姓名 性别 籍贯 年龄 考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他)\n"); scanf("%s %s %s %d %d",&p->data.name,&p->data.sex,&p->data.address,&p->data.age,&p->data.type); printf("输出修改后的全部信息:\n\n"); DispList(L); return 0; } printf("没有此考号,无法修改\n"); return 0; } //插入信息 void InsertList(LinkList *L) { int n; printf("请输入要插入的人数为n="); scanf("%d",&n); LinkList *s,*r,*p=L; int i; printf("输入考号:姓名 性别 籍贯 年龄 考试类别(1.英语 2.数据结构 3.数学 4.语文 5.其他)\n"); while(p->next!=NULL) p=p->next; for(i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); scanf("%d %s %s %s %d %d",&s->data.num,&s->data.name,&s->data.sex,&s->data.address,&s->data.age,&s->data.type); p->next=s; p=s; r=s; } r->next=NULL; } //输出 void display() { printf("-------------考试报名菜单选择-------------\n"); printf(" 1,输入信息 \n"); printf(" 2,输出信息 \n"); printf(" 3,查找信息 \n"); printf(" 4,删除信息 \n"); printf(" 5,修改信息 \n"); printf(" 6,添加信息 \n"); printf(" 7,结束程序 \n"); } //定义变量a为选择变量 void Display(LinkList *L) { while(true) { display(); int a; printf("请输入要操作的序号a="); scanf("%d",&a); switch(a) { case 1: {CreateListR(L);break;} case 2: {DispList(L);break;} case 3: {LocateElem(L);break;} case 4: {ListDelete(L);break;} case 5: {create(L);break;} case 6: {InsertList(L);break;} case 7: { cout<<"**************************"<<endl; cout<<"**************************"<<endl; cout<<"******欢迎再次使用******"<<endl; cout<<"**************************"<<endl; cout<<"**************************"<<endl; exit(0); } } } } int main() { LinkList *L; InitList(L); Display(L); return 0; }