毕业补考题目 实在不会 今天就要交了!求大神啊!
设计学生信息管理系统,使之完成如下功能,写出源程序并做出适当说明。学生信息包括:学好,姓名,性别,出生年月,专业,班级,家庭地址,电话等。试设计一学生信息管理系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)学生信息录入功能
(3)学生信息浏览功能
(4)查询、排序功能:可按学号、按姓名、按专业、按班级查询;
(5)学生信息的删除与修改
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> typedef struct person //通讯录结构中节点的定义 { char name[30]; //姓名 char addr[30]; //地址 char offphnum[15]; //办公电话 char hmphnum[15]; //家庭电话 char mbnub[15]; //移动电话 struct person *next; }listnode,*listlink; struct add_person //通讯录记录结构 { char name[30]; char addr[30]; char offphnum[15]; char hmphnum[15]; char mbnub[15]; }; listlink head=NULL,end=NULL; listlink create(); //建立通讯录并将信息存入文件 listlink readfp(); //将文件的信息独处并转存如链表 void Show(listlink head); //显示信息 listlink Delete(listlink head);//删除一条记录的信息 void Find(listlink head); //查找记录 listlink Input(listlink head); //向通讯录加入一条记录 void Alter(listlink head); //修改一条记录的信息 void Save(listlink head); //保存信息到文件 int main() { int n; head=readfp(); if(head==NULL) head=create(head); while(1) { printf("------------------------------------\n"); printf("请选择操作:1 显示所有 2 删除记录 \n"); printf(" 3 查询记录 4 插入新记录\n"); printf(" 5 修改记录 0 保存退出 \n"); printf("请选择操作:"); scanf("%d",&n); switch(n) { case 1:Show(head);break; case 2:head=Delete(head);break; case 3:Find(head);break; case 4:head=Input(head);break; case 5:Alter(head);break; case 0:Save(head);return 0; } } return 0; } //----------------------------建立通讯录 listlink create() { listlink s; printf("\n通讯录为空!\n"); printf("请输入信息以创建通讯录(结束请在姓名处输入‘#’)\n\n"); while(1) { s=(listlink)malloc(sizeof(listnode)); printf("姓名:"); scanf("%s",&s->name); if(strcmp(s->name,"#")==0) break; printf("地址:"); scanf("%s",&s->addr); printf("办公电话:"); scanf("%s",&s->offphnum); printf("家庭电话:"); scanf("%s",&s->hmphnum); printf("移动电话:"); scanf("%s",&s->mbnub); s->next=NULL; if(head==NULL) head=end=s; else { end->next=s; end=s; } printf("\n"); } return (head); } //-----------------------------显示全部记录 void Show(listlink head) { listlink p1; p1=head; printf("\n"); if(p1==NULL) { printf("没有记录!\n"); return ; } while(p1!=NULL) { printf("姓名:%s\n",p1->name); printf("地址:%s\n",p1->addr); printf("办公电话:%s\n",p1->offphnum); printf("家庭电话:%s\n",p1->hmphnum); printf("移动电话:%s\n",p1->mbnub); p1=p1->next; printf("\n"); } } //----------------------------将文件的信息读出并转存如链表中 listlink readfp() { FILE *fp; struct add_person persons; listlink s; fp=fopen("people.txt","r"); if(fp==NULL) { printf("cannot open file!\n"); return NULL; } printf("\n\n通讯录打开成功! \n"); fread(&persons,sizeof(struct add_person),1,fp); while(!feof(fp)) { s=(listlink)malloc(sizeof(listnode)); //存入链表中 strcpy(s->name,persons.name); strcpy(s->addr,persons.addr); strcpy(s->offphnum,persons.offphnum); strcpy(s->hmphnum,persons.hmphnum); strcpy(s->mbnub,persons.mbnub); s->next=NULL; if(head==NULL) //尾插法将其插入链表中 head=end=s; else { end->next=s; end=s; } fread(&persons,sizeof(struct add_person),1,fp); } return head; } //-------------------------------------将信息保存到文件中 void Save(listlink head) { FILE *fp; static struct add_person persons; listlink p; fp=fopen("people.txt","wb"); p=head; while(p!=NULL) { strcpy(persons.name,p->name); strcpy(persons.addr,p->addr); strcpy(persons.offphnum,p->offphnum); strcpy(persons.hmphnum,p->hmphnum); strcpy(persons.mbnub,p->mbnub); fwrite(&persons,sizeof(struct add_person),1,fp); p=p->next; } fclose(fp); } //----------------------------------删除一条记录 listlink Delete(listlink head) { listlink p1,p2; char Name[10],ch; int k=1; p1=p2=head; if(p1==NULL) { printf("没有记录!\n"); return NULL; } while(k) { printf("请输入要删除人的姓名:"); scanf("%s",&Name); while(p1!=NULL) { p2=p1; if(strcmp(p1->name,Name)==0) { if(p1==head) { if(p1->next!=NULL) head=p1->next; else head=NULL; } else p2->next=p1->next; free(p1); printf("删除成功!\n"); return head; } p1=p1->next; } printf("要删除的记录不存在!\n"); printf("是否继续?(Y/N):"); getchar(); ch=getchar(); if(ch=='Y'||ch=='y') k=1; else k=0; } return head; } //--------------------------------------查找指定记录 void Find(listlink head) { listlink p1=head; char Name[10],ch; int k=1; if(p1==NULL) { printf("没有记录!\n"); return ; } while(k) { p1=head; printf("请输入要查找人的姓名:"); scanf("%s",&Name); while(strcmp(Name,p1->name)!=0&&p1->next!=NULL) { p1=p1->next; } if(strcmp(Name,p1->name)!=0) printf("要查找的记录不存在!\n"); else { printf("姓名:%s\n",p1->name); printf("地址:%s\n",p1->addr); printf("办公电话:%s\n",p1->offphnum); printf("家庭电话:%s\n",p1->hmphnum); printf("移动电话:%s\n",p1->mbnub); } printf("是否继续?(Y/N):"); getchar(); ch=getchar(); if(ch=='Y'||ch=='y') k=1; else k=0; } } //------------------------------------------向通讯录中插入新的记录 listlink Input(listlink head) { int k=1; char ch; listlink s,p; p=head; while(k) { s=(listlink)malloc(sizeof(listnode)); printf("姓名:"); scanf("%s",&s->name); printf("地址:"); scanf("%s",&s->addr); printf("办公电话:"); scanf("%s",&s->offphnum); printf("家庭电话:"); scanf("%s",&s->hmphnum); printf("移动电话:"); scanf("%s",&s->mbnub); s->next=NULL; if(p==NULL) head=s; else { end->next=s; end=s; } printf("是否继续?(Y/N):"); getchar(); ch=getchar(); if(ch=='Y'||ch=='y') k=1; else k=0; } return head; } //-----------------------------------------修改一条记录的信息 void Alter(listlink head) { listlink p=head; char pname[10],ch; int k=1; if(p==NULL) { printf("没有记录!\n"); return ; } while(k) { printf("请输入要修改人的姓名:"); scanf("%s",&pname); while(p!=NULL) { if(strcmp(pname,p->name)==0) { printf("请输入要修改的信息!\n"); printf("姓名:"); scanf("%s",&p->name); printf("地址:"); scanf("%s",&p->addr); printf("办公电话:"); scanf("%s",&p->offphnum); printf("家庭电话:"); scanf("%s",&p->hmphnum); printf("移动电话:"); scanf("%s",&p->mbnub); break; } p=p->next; } if(p==NULL) printf("没有要修改人的记录!\n"); printf("是否继续?(Y/N):"); getchar(); ch=getchar(); if(ch=='Y'||ch=='y') k=1; else k=0; } }