/* *文件名称;xueshengxinxi3.c *文件标识:无 *内容摘要:该代码用于获取满足后缀要求的第一个文件 *其他说明:无 *作者:桑立 *完成日期:20151225 *课程设计题目: 学生信息管理系统设计 *问题描述:学生信息包括:学号,姓名,年龄,性别,地址,电话,E-mail ,某一科的成绩等。试设计一学生信息管理系统,使之能提供以下功能: (1)系统以菜单方式工作 (2)学生信息录入功能(学生信息用文件保存) (3)学生信息浏览功能——输出 (4)查询,排序功能 按学号查询 按姓名查询 (5)学生信息的删除与修改 */
代码:
#include "stdio.h" #include "stdlib.h" #include "string.h" struct Student //定义学生信息的结构体 { char Number[13]; char Name[9]; char Sex[20]; char Data[5]; char MainPhone[12]; char Mail[30]; struct Student* Next;//指针域 }; //用于存储队列的单链表简称为链队 int NodeNumber=0;//统计个数 char MESSAGE[20]={'\0'};//保存文件名字,用来判断是否重复输入 struct Student *top=NULL,*rear=NULL;// 初始化队列 void menu();// 界面系统 void WriteMessage();//录入多位同学的相关信息 void AddStudent(); //增加1位新同学的相关信息 void Amend(); //修改一位同学的相关信息 void Delete();//删除一位同学的信息 void Save(); //将信息保存到文件中 void PrintOne();//打印某一位同学的相关信息 void PrintALL(); //将学号进行排序,按照学号打印所有同学的信息 void PrintSame();//将文件中成绩相同的学生信息打印出来 //界面选项 void menu() { printf("\t卍卍卍卍卍卍卍卍卍卍卍欢迎进入学生信息管理系统卍卍卍卍卍卍卍卍卍卍\n"); printf("\t卍 卍\n"); printf("\t卍 系统功能说明: 卍\n"); printf("\t卍 卍\n"); printf("\t卍 1.录入多位同学的相关信息; 卍\n"); printf("\t卍 2.增加1位新同学的相关信息; 卍\n"); printf("\t卍 3.修改1位同学的相关信息; 卍\n"); printf("\t卍 4.删除1位同学的所有信息; 卍\n"); printf("\t卍 5.将当前系统中的所有信息保存到文件中; 卍\n"); printf("\t卍 6.打印某位同学(按照姓名或手机号查找)的所有相关信息 卍\n"); printf("\t卍 7.按照学号顺序打印系统中所有同学的信息; 卍\n");\ printf("\t卍 8.打印系统中所有成绩相同的同学的信息; 卍\n"); printf("\t卍 卍\n"); printf("\t卍 ---------退出系统请输入exit--------- 卍\n"); printf("\t卍 卍\n"); printf("\t卍卍卍卍卍卍卍卍卍卍卍卍卍谢谢使用卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍\n"); printf("\n"); } void Out(struct Student *t) { printf("\t学 号:%s 姓 名:%s\n",t->Number,t->Name); printf("\t性 别:%s 手机号:%s\n",t->Sex,t->MainPhone); printf("\t成 绩: %s\n",t->Data); printf("\t邮 箱:%s\n",t->Mail); printf("\t------------------------------------------\n"); printf("\n"); } //插入链表 void inrear(struct Student *p) //构建链队 { if(top==NULL)//若链队为空,则新节点既是队首节点又是队尾结点 { top=p; rear=p; } else //将*p节点链到队尾,并将rear指向它 { rear->Next=p; rear=p; } NodeNumber++;//节点数加一 } //对学号排序 void Sort() { struct Student *p,*q,*r,*s; //创建结点,q指向p的前元素,r指向p的后元素 bool flag=true; s=(struct Student *)malloc(sizeof(struct Student)); //创建头结点,分配空间 s->Next=top; top=s; p=top->Next; q=s; while(flag&&p!=NULL) { flag=false; while(p->Next!=NULL) //扫描单链表用p从头扫到尾 { r=p->Next; //r指向p后 r为p指向的后一结点 if(strcmp(p->Number,r->Number)==1) { q->Next=r;//将*r节点插入到*q之后 p->Next=r->Next;//将*p插入到*r之后 r->Next=p;// q=r; flag=true;//返回为真 } else { // q,p向后移位 q=p; p=p->Next;//继续比较其他节点 } } q=s;//q,p重新到第一个元素 p=top->Next; } top=top->Next; free(s);//释放*s节点 } //检查学生是否重复 bool Check(struct Student *t) { struct Student *p=top;// while(p!=NULL) { if(strcmp(p->Number,t->Number)==0||strcmp(p->Name,t->Name)==0) return false; p=p->Next; } return true; } void WriteMessage() { FILE *f;//本地文件传输协议,FILE主要用于访问本地计算机中的文件 char str[20]={'\0'}; printf("请输入文件名称:"); scanf("%s",str); //比较文件名字是否重复 if(strcmp(MESSAGE,str)==0) { printf("错误,多次输入同一文件!\n"); printf("是否重新输入(Y or N)\n"); char ch=getchar();//输入字符 ch=getchar(); if(ch=='Y'||ch=='y') { system("CLS"); WriteMessage();//调用函数 } else { system("PAUSE");//暂停进程,直到新信号的出现 system("CLS"); menu(); } } else { strcpy(MESSAGE,str);//将str与MESSAGE保存内容进行比较 f=fopen(str,"r");//读文件 if(!f)//如果不存在 { printf("文件打开失败!即将创立新的%s文件",str); f=fopen(str,"w"); } else//向文件中输入内容 { while(!feof(f)) { struct Student *p=(struct Student *)malloc(sizeof(struct Student)); p->Next=NULL; fscanf(f,"%s",&p->Number); fscanf(f,"%s",&p->Name); fscanf(f,"%s",&p->Sex); fscanf(f,"%s",&p->Data); fscanf(f,"%s",&p->MainPhone); fscanf(f,"%s",&p->Mail); if(Check(p)) inrear(p); } printf("文件已成功写入!\n"); printf("学生数为: %d\n",NodeNumber); system("PAUSE"); system("CLS"); menu(); } fclose(f); } } //增加学生 void AddStudent(){ struct Student *p=(struct Student *)malloc(sizeof(struct Student));//创建节点 p->Next=NULL; printf("\n请输入学号:"); scanf("%s",&p->Number); printf("\n请输入姓名:"); scanf("%s",&p->Name); printf("\n请输入性别:"); scanf("%s",&p->Sex); printf("\n请输入成绩:"); scanf("%s",&p->Data); printf("\n请输入手机号:"); scanf("%s",&p->MainPhone); printf("\n请输入邮箱:"); scanf("%s",&p->Mail); int j=1; for(int L=0;L<strlen(p->Mail);L++) { if(p->Mail[L]=='@') j++; } if(j!=2) { printf("你输入的邮箱名是不是错了呢,请重新输入邮箱名"); scanf("%s",&p->Mail); } if(Check(p)) inrear(p); Save(); printf("已成功存储!"); system("PAUSE");//让进程暂停直到信号出现 system("CLS");//调用DOS命令,清零信号 menu(); }; //修改信息 void Amend() { printf("\n请输入要修改的同学的学号或姓名:"); char str[8]; scanf("%s",str); struct Student *p=top;//初始化 while(p!=NULL) { if((strcmp(str,p->Number)==0)||(strcmp(str,p->Name)==0))//strcmp 比较两个字符串 break; else p=p->Next;//指向下一结点 } if(p!=NULL) { printf("\n请选择要修改的信息:\n\n"); printf("1.学号 2.姓名 3.性别 4.成绩 5.电话号码 6.邮箱\n\n"); int n; scanf("%d",&n); while(n>0) { switch(n)//进行选择 { case 1:printf("请输入新的学号:"); char NewNumber[9]; scanf("%s",NewNumber); strcpy(p->Number,NewNumber);//将修改内容复制到Number中 printf("已成功修改!\n"); break; case 2:printf("请输入新的姓名:"); char NewName[9]; scanf("%s",NewName); strcpy(p->Name,NewName); printf("已成功修改!\n"); break; case 3:printf("请输入新的性别:"); char NewSex[3]; scanf("%s",NewSex); strcpy(p->Sex,NewSex); printf("已成功修改!\n"); break; case 4:printf("请输入新的成绩:"); char NewMainPhone[12]; scanf("%s",NewMainPhone); strcpy(p->MainPhone,NewMainPhone); printf("已成功修改!\n"); break; case 5:printf("请输入新的成绩:"); char NewData[5]; scanf("%s",NewData); strcpy(p->Data,NewData); printf("已成功修改!\n"); break; case 6:printf("请输入新的邮箱:"); char NewMail[30]; scanf("%s",NewMail); strcpy(p->Mail,NewMail); printf("已成功修改!\n"); break; default:printf("输入错误!\n"); break; } printf("\n请输入修改选项或输入0退出修改!\n"); scanf("%d",&n); } system("PAUSE"); system("CLS"); menu(); } else { printf("该系统中无此学生,是否添加(Y or N)\n"); char ch=getchar();//滤去回车 ch=getchar(); if(ch=='Y'||ch=='y') AddStudent(); if(ch=='N'||ch=='n') { system("PAUSE"); system("CLS"); menu(); } } }; //删除学生 void Delete() { printf("\n请输入要删除的学生的学号或姓名:"); char str[9]; scanf("%s",str); struct Student *s=(struct Student *)malloc(sizeof(struct Student)),*p,*q;//创建节点 定义指针 s->Next=top; top=s; q=s; p=q->Next; while(p!=NULL) { if((strcmp(str,p->Number)==0)||(strcmp(str,p->Name)==0))//将输入与已存数据进行比较 { q->Next=p->Next; p=p->Next; } else { q=q->Next; p=p->Next; } } top=top->Next; free(s);//释放节点*s NodeNumber--;//节点数减一 printf("\n是否继续删除(Y or N)\n\n"); char ch=getchar();//滤去回车 ch=getchar(); if(ch=='Y'||ch=='y') Delete(); if(ch=='N'||ch=='n') { system("PAUSE"); system("CLS"); menu(); } }; //保存信息到文件 void Save() { FILE *out; out=fopen("PresentMessage.txt","w"); struct Student *p=top; while(p!=NULL) { fprintf(out,"%s %s %s %s %s %s\n",p->Number,p->Name,p->Sex,p->Data,p->MainPhone,p->Mail); p=p->Next; } fclose(out); printf("数据已成功导入文件PresentMessage.txt!\n"); system("PAUSE"); system("CLS"); menu(); }; //打印指定学生 void PrintOne(){ printf("请输入要打印的同学的姓名或手机号:"); bool flag=false; char str[12]; scanf("%s",str); struct Student *p=top; while(p!=NULL)//判断节点是否为空 { if((strcmp(str,p->MainPhone)==0)||(strcmp(str,p->Name)==0)) { flag=true;//判断正确 Out(p);//输出 p=p->Next;//指向下一节点 } else p=p->Next; } if(!flag) printf("该系统中无此学生或输入错误!\n"); system("PAUSE"); system("CLS"); menu(); }; //打印所有学生 void PrintALL(){ Sort();//调用进行排序 struct Student* p=top; printf("\t系统中共有%d个学生\n\n",NodeNumber); if(p==NULL) printf("文件中没有学生信息!\n"); else { while(p!=NULL) { Out(p);//输出信息 p=p->Next;//指向下一节点 } } system("PAUSE"); system("CLS"); menu(); }; //打印含有相同成绩的学生 void PrintSame() { int n=1,m=0;//n用来统计p,m用来统计q bool flag=true;//flag判断当前节点 bool *Handle=(bool *)malloc(NodeNumber+1);//用bool型的数组关联链表,true代表相同的 for(int i=0;i<NodeNumber;i++) Handle[i]=true; struct Student *q=top,*p;//定义节点 if(q==NULL) { printf("系统中无学生信息!\n"); system("PAUSE"); system("CLS"); menu(); } else { p=q->Next;//指向下一结点 while(q->Next!=NULL) { while(p!=NULL) { if(strcmp(q->Data,p->Data)==0)//比较两节点是否一样 { //用flag控制当前节点的输出 if(flag) { Out(q); Out(p); flag=false; Handle[n++]=false; } else { Out(p); Handle[n++]=false; } } else n++; p=p->Next; } m++; q=q->Next; flag=true; //判断当前节点是否可访问 while(Handle[m]==false) { q=q->Next; if(q->Next==NULL) break; m++; } n=m+1; p=q->Next; } } system("PAUSE"); system("CLS"); menu(); }; int main() { system("color 04");//调用库函数对颜色进行选择 menu(); int num; printf("请输入功能选项:"); while(scanf("%d",&num)) { switch(num)//对输入项进行选择 { case 1:system("CLS"); WriteMessage(); break; case 2:system("CLS"); AddStudent(); break; case 3:system("CLS"); Amend(); break; case 4:system("CLS"); Delete(); break; case 5:system("CLS"); Save(); break; case 6:system("CLS"); PrintOne(); break; case 7:system("CLS"); PrintALL(); break; case 8:system("CLS"); PrintSame(); break; default:system("CLS"); printf("输入错误!\n"); system("PAUSE"); system("CLS"); menu(); break; } printf("请输入功能选项:"); } return 0; }
(1)功能界面:menu
(2)用文件进行信息的录入
(3)增加学生信息:
(4)修改学生信息:
(5)删除学生信息:
(6)将信息保存到文件中:
(7)打印某一位同学的信息
(8)按学号打印全部信息: