- #include<stdio.h>
- #include<malloc.h>
- #include<string.h>
- #include<stdlib.h>
- #define LEN sizeof(struct student)
- struct student
- {
- char num[20];//学号
- char name[20];//姓名
- char sex[20];//性别
- char room[20];//宿舍号码
- char tel[20];//电话号码
- char CHN[20];//语文
- char MATH[20];//数学
- char ENG[20];//英语
- char PE[20];//体育
- char PRO[20];//专业
- char average_score[20];//平均分
- struct student *next;
- };
- int n;//节点数
- struct student *creat();//信息录入
- void score(struct student *head);//成绩录入
- void findinformation(struct student *head);//信息查询
- void findscore(struct student *head);//成绩查询
- struct student *del(struct student *head);//信息删除
- struct student *insert(struct student *head);//信息插入
- void update(struct student *head);//修改分数
- void Oscore(struct student*head);//排序输出
- void swap(struct student*p1,struct student*p2);//交换数据
- void fenduan(struct student*head);//分段输出
- int checknum(char ch[]);//检查纯数字的数据里是否混入了非数字的非法输入
- int transformint(char ch[]);//纯数字整数(字符串转向int类型)
- void save(struct student *head); //文件存储
- void export1();//文件输出
- struct student *import();//文件导入
- int checkscore(char ch[]);//检查分数是否为0-99的纯数字
- int IncludeChinese(char *str); //检查性名、性别是否包含汉字
- int main()
- {
- //微信关注公众号:C语言中文社区,免费领取更多
- struct student *head=NULL;
- char choose[20];
- menu://设置主菜单的点
- printf("\n");
- printf("\t\t\t\t\t\t【学生管理系统2.0】\t\t\t\t\t\n");
- printf("\t\t★————————————————————————————————————————★\n\n");
- printf("\t\t\t | 1. 信息录入\t\t2. 成绩录入\t\t3. 信息查询 |\n\n");
- printf("\t\t\t | 4. 成绩查询\t\t5. 删除信息\t\t6. 信息追加 |\n\n");
- printf("\t\t\t | 7. 更改分数\t\t8. 查看排名\t\t9. 成绩分段 |\n\n");
- printf("\t\t\t | 10.保存文件\t\t11.文件输出\t\t12.文件导入 |\n\n");
- printf("\t\t★————————————————按0并回车退出——————————————————★\n");
- printf("请输入执行数字:");
- while(scanf("%s",choose)&&checknum(choose)==0)//检查到不是纯数字 让用户重新输入
- {
- printf("输入无效,重新输入:");
- }
- switch(transformint(choose))
- {
- case 1:
- head=creat();
- break;
- case 2:
- score(head);
- break;
- case 3:
- findinformation(head);
- break;
- case 4:
- findscore(head);
- break;
- case 5:
- head=del(head);
- break;
- case 6:
- head=insert(head);
- break;
- case 7:
- update(head);
- break;
- case 8:
- Oscore(head);
- break;
- case 9:
- fenduan(head);
- break;
- case 10:
- save(head);
- break;
- case 11:
- export1();
- break;
- case 12:
- head=import();
- break;
- }
- if(transformint(choose)<0||transformint(choose)>12)//输入了不在执行数字范围内的数字返回主菜单的点
- {
- system("cls");//清理屏幕和缓冲区
- fflush(stdin);
- goto menu;
- }
- if(transformint(choose)!=0)//输入不是0,继续回到主菜单
- {
- goto menu;
- }
- system("cls");//结束时清理屏幕和缓冲区,打印下方的校徽
- fflush(stdin);
- printf("\n感谢使用!\n");
- printf("\n *\n");
- printf(" * *** ****\n");
- printf(" *** **** ****\n");
- printf(" **** **** **** ****\n");
- printf(" **** **** **** ****\n");
- printf(" **** **** **** ****\n");
- printf(" **** **** **** ****\n");
- printf(" **** **** **** ****\n");
- printf(" **** ******* ****\n");
- printf(" *************\n");
- printf(" *****\n");
- system("pause");
- return 0;
- }
- struct student *creat()//录入信息,创建链表
- {
- system("cls");
- fflush(stdin);
- printf("*****************************************************信息录入***********************************************************\n");
- printf("依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。 \n");
- printf(" 【退出请输入'0'并回车】 \n");
- printf("样例:\n541913460230 张三 男 1717 66666\n在此输入:\n");
- n=0;
- struct student *head,*p1,*p2;
- head = NULL;
- p1=p2=(struct student*)malloc(LEN);
- while(scanf("%s",p1->num)&&checknum(p1->num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- if(transformint(p1->num)==0)//输入了0退出函数调用,传回去表头指针head给主函数的head
- {
- system("cls");
- fflush(stdin);
- return(head);
- }
- while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)//这几行while(scanf)都是具有容错的输入,整个程序中都存在输入容错!!!
- {
- printf("输入错误的名字,重新输入:\n");
- }
- while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
- {
- printf("输入错误的性别,重新输入:\n");
- }
- while(scanf("%s",p1->room)&&checknum(p1->room)==0)
- {
- printf("输入错误的宿舍号码,重新输入:\n");
- }
- while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
- {
- printf("输入错误的手机号码,重新输入:\n");
- }
- printf("\n");
- while(transformint(p1->num)!=0)//输入每个节点的学号不是0的时候开始循环。
- {
- n+=1;//节点+1
- if(n==1) //PS:此处为建立链表常规过程(参考了谭浩强C程序设计第九章链表,红皮那本)
- {
- head=p1;//第一个节点 表头指向上面开辟的第一个节点 p1 p2 head都指向此处此时
- }else
- {
- p2->next=p1;//后面的节点,p2的next指向p1将两个节点连接到一起
- p2=p1;//p2再跟p1
- }
- p1=(struct student*)malloc(LEN);//p1指向开辟的新节点
- while(scanf("%s",p1->num)&&checknum(p1->num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- if(transformint(p1->num)==0)
- {
- break;
- }
- while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)
- {
- printf("输入错误的名字,重新输入:\n");
- }
- while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
- {
- printf("输入错误的性别,重新输入:\n");
- }
- while(scanf("%s",p1->room)&&checknum(p1->room)==0)
- {
- printf("输入错误的宿舍号码,重新输入:\n");
- }
- while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
- {
- printf("输入错误的手机号码,重新输入:\n");
- }
- printf("\n\n");
- }
- p2->next=NULL;//最后p1开辟的新节点丢弃了,让p2的next指向空,形成表尾结束链表。 录入结束
- system("cls");
- fflush(stdin);
- return(head);
- }
- void score(struct student *head)//拿到链表,录入成绩
- {
- system("cls");
- fflush(stdin);
- printf("*****************************************************成绩录入***********************************************************\n");
- printf("依次键入语文、数学、英语、体育、专业成绩,用一个空格隔开各数据,每一条输入完成后按回车键进行下一条输入。\n");
- printf(" 【录完分数后自动退出】 \n");
- printf("例如:\n10 20 30 40 50\n在此输入:\n");
- int Aver;//平均分
- struct student *p;
- for(p=head;p!=NULL;p=p->next)//遍历链表
- {
- printf("\n现在录入%s(%s)的成绩\n",p->name,p->num);
- while(scanf("%s",p->CHN)&&checkscore(p->CHN)==0)
- {
- printf("输入错误的语文分数,重新输入:\n");
- }
- while(scanf("%s",p->MATH)&&checkscore(p->MATH)==0)
- {
- printf("输入错误的数学分数,重新输入:\n");
- }
- while(scanf("%s",p->ENG)&&checkscore(p->ENG)==0)
- {
- printf("输入错误的英语分数,重新输入:\n");
- }
- while(scanf("%s",p->PE)&&checkscore(p->PE)==0)
- {
- printf("输入错误的体育分数,重新输入:\n");
- }
- while(scanf("%s",p->PRO)&&checkscore(p->PRO)==0)
- {
- printf("输入错误的专业分数,重新输入:\n");
- }
- Aver=(transformint(p->CHN)+transformint(p->MATH)+transformint(p->ENG)+transformint(p->PE)+transformint(p->PRO))/5;
- itoa(Aver,p->average_score,10);//Aver十进制形式转化为字符串存储在链表的average_score平均分里
- printf("%s的成绩录入完了\n",p->name);
- }
- system("cls");
- fflush(stdin);
- }
- void findinformation(struct student *head)//学生信息查询
- {
- system("cls");
- fflush(stdin);
- char choose1[20],choose2[20];//两个选择的地方,choose1选择学号/姓名 or 宿舍号 ,choose2在选择了学号/姓名时选择 学号 or 姓名
- char num[20]={'1'};//用户即将输入的学号
- char name[20];//用户即将输入的姓名
- char room[20]={'1'};//用户即将输入的宿舍号
- struct student *p;
- p=head;
- int flag=0;
- printf("*****************************************************信息查询***********************************************************\n");
- printf("\n选择查找方式,学号/姓名查找(输入1),宿舍号(输入2)\n请在此输入:");
- choosestation1://第一次选择的点
- fflush(stdin);
- while(scanf("%s",choose1)&&checknum(choose1)==0)
- {
- printf("输入无效,重新输入:\n");
- }
- if(transformint(choose1)==1)
- {
- printf("通过学号(输入1),姓名(输入2):");
- choosestation2://第二次选择的点
- fflush(stdin);
- while(scanf("%s",choose2)&&checknum(choose2)==0)
- {
- printf("输入无效,重新输入:\n");
- }
- if(transformint(choose2)==1)
- {
- while(transformint(num)!=0)
- {
- printf("\n输入学号(输入0并回车结束):");
- while(scanf("%s",num)&&checknum(num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- for(p=head;p!=NULL;p=p->next)
- {
- if(transformint(p->num)==transformint(num))
- {
- printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
- flag=1;
- break;
- }
- }
- if(flag==0&&transformint(num)!=0)
- {
- printf("未找到此学生信息\n");
- }
- }
- }else if(transformint(choose2)==2)
- {
- while(name[0]!='#')
- {
- printf("\n输入姓名(输入#并回车结束):");
- scanf("%s",name);
- for(p=head;p!=NULL;p=p->next)//遍历链表
- {
- if(strcmp(p->name,name)==0)//比较两字符串
- {
- printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
- flag=1;
- break;
- }
- }
- if(flag==0&&name[0]!='#')
- {
- printf("未找到此学生信息!\n");
- }
- }
- }else
- {
- printf("输入了错误的第二次选择数字!重新输入:\n");
- goto choosestation2;//返回上面第二次选择的点
- }
- }else if(transformint(choose1)==2)
- {
- while(transformint(room)!=0)
- {
- printf("\n输入宿舍号(输入0并回车结束):");
- while(scanf("%s",room)&&checknum(room)==0)
- {
- printf("输入错误的宿舍号码,重新输入:\n");
- }
- for(p=head;p!=NULL;p=p->next)
- {
- if(p->room==room)
- {
- printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
- flag=1;
- break;
- }
- }
- if(flag==0&&transformint(room)!=0)
- {
- printf("未找到此学生信息!\n");
- }
- }
- }else
- {
- printf("输入了错误的第一次选择数字!重新输入:\n");
- goto choosestation1;//返回最上面第一次选择的点
- }
- system("cls");
- fflush(stdin);
- }
- void findscore(struct student *head)//成绩查询
- {
- system("cls");
- fflush(stdin);
- char num[20]={'1'};//初始化用户即将输入的学号
- struct student *p;
- int flag=0;//学号是否找到的标志,1找到0没找到
- p=head;
- printf("*****************************************************成绩查询***********************************************************\n");
- printf("因为有重名的可能,暂时只能通过学号进行查询。请输入学号并回车进行查询!\n");
- printf(" 【退出请输入'0'并回车】 \n");
- while(transformint(num)!=0)
- {
- printf("\n输入学号:");
- while(scanf("%s",num)&&checknum(num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- for(p=head;p!=NULL;p=p->next)
- {
- if(transformint(p->num)==transformint(num))
- {
- printf("学号:%s 姓名:%s 语文:%s 数学:%s 英语:%s 体育:%s 专业:%s \n",p->num,p->name,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
- flag=1;
- break;
- }
- }
- if(flag==0)
- {
- printf("学号未找到!\n");
- }
- }
- system("cls");
- fflush(stdin);
- }
- struct student *del(struct student *head)//删除信息函数
- {
- system("cls");
- fflush(stdin);
- char num[20]={'1'};//用户即将输入的学号
- struct student *p1,*p2;
- printf("*****************************************************信息删除***********************************************************\n");
- if(head == NULL)
- {
- system("cls");
- fflush(stdin);
- return(head);
- }
- printf("\n***************************************输入学号进行删除学生信息(输入0结束)**********************************************\n");
- do{
- printf("\n请输入学号:");
- while(scanf("%s",num)&&checknum(num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- if(transformint(num)==0)
- {
- break;
- }
- p1=p2=head;
- while(transformint(num)!=transformint(p1->num)&&p1->next!=NULL)
- {
- p2=p1;
- p1=p1->next;
- }
- if(transformint(num)==transformint(p1->num))//找到数字
- {
- if(p1==head)//如果是要删开头的节点,直接改变表头指向第二个节点,让第二个节点成为新的表头,原来的头用free释放掉
- {
- head=p1->next;
- free(p1);
- }else//如果删后面的节点,要把p2连到p1所在节点后面的一个节点,将p1所在节点free释放掉
- {
- p2->next=p1->next;
- free(p1);
- }
- printf("已删除学号为%s的信息",num);
- n=n-1;
- }else
- {
- printf("没有找到学号为%s的学生\n",num);
- }
- }while(transformint(num)!=0);
- system("cls");
- fflush(stdin);
- return(head);
- }
- struct student *insert(struct student *head)//插入信息函数
- {
- system("cls");
- fflush(stdin);
- printf("*****************************************************信息追加***********************************************************\n");
- printf(" 【加入一组信息后自动退出】 \n");
- printf("请按照 学号 姓名 性别 宿舍号码 电话号码 语文 数学 英语 体育 专业 顺序输入\n");
- printf("样例:\n542013460658 李四 男 1206 10086 10 20 30 40 50\n");
- int Aver;
- struct student *stud=(struct student*)malloc(LEN);//开辟一个单元,这一块存我们追加的信息,后面的操作把这一块连接到链表的表头
- stud->next=NULL;
- stud->next=head;
- head=stud;
- while(scanf("%s",stud->num)&&checknum(stud->num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- while(scanf("%s",stud->name)&&IncludeChinese(stud->name)==0)
- {
- printf("输入错误的名字,重新输入:\n");
- }
- while(scanf("%s",stud->sex)&&IncludeChinese(stud->sex)==0)
- {
- printf("输入错误的性别,重新输入:\n");
- }
- while(scanf("%s",stud->room)&&checknum(stud->room)==0)
- {
- printf("输入错误的宿舍号码,重新输入:\n");
- }
- while(scanf("%s",stud->tel)&&checknum(stud->tel)==0)
- {
- printf("输入错误的电话号码,重新输入:\n");
- }
- while(scanf("%s",stud->CHN)&&checkscore(stud->CHN)==0)
- {
- printf("输入错误的语文分数,重新输入:\n");
- }
- while(scanf("%s",stud->MATH)&&checkscore(stud->MATH)==0)
- {
- printf("输入错误的数学分数,重新输入:\n");
- }
- while(scanf("%s",stud->ENG)&&checkscore(stud->ENG)==0)
- {
- printf("输入错误的英语分数,重新输入:\n");
- }
- while(scanf("%s",stud->PE)&&checkscore(stud->PE)==0)
- {
- printf("输入错误的体育分数,重新输入:\n");
- }
- while(scanf("%s",stud->PRO)&&checkscore(stud->PRO)==0)
- {
- printf("输入错误的专业分数,重新输入:\n");
- }
- Aver=(transformint(stud->CHN)+transformint(stud->MATH)+transformint(stud->ENG)+transformint(stud->PE)+transformint(stud->PRO))/5;//计算平均分
- itoa(Aver,stud->average_score,10);
- n=n+1; //节点+1
- system("cls");
- fflush(stdin);
- return(head);
- }
- void update(struct student *head)//修改分数
- {
- system("cls");
- fflush(stdin);
- int Aver;
- struct student *p1,*p2;
- char num[20]={'1'};//用户即将输入的学号
- char choose[20];
- printf("*****************************************************分数修改***********************************************************\n");
- if(head == NULL)//没有录信息 空表直接返回
- {
- system("cls");
- fflush(stdin);
- return;
- }
- printf("\n***************************************输入学号进行修改学生分数(输入0结束)**********************************************\n");
- do{
- printf("\n请输入学号:");
- while(scanf("%s",num)&&checknum(num)==0)
- {
- printf("输入错误的学号,重新输入:\n");
- }
- if(transformint(num)==0)
- {
- break;
- }
- p1=p2=head;
- while(transformint(p1->num)!=transformint(num)&&p1->next!=NULL)//没找到,往后走
- {
- p2=p1;
- p1=p1->next;
- }
- if(transformint(p1->num)==transformint(num))//找到了,开始选修改的科目
- {
- printf("修改语文请输入1,数学输入2,英语3,体育4,专业5\n");
- printf("请输入修改科目对应的数字:");
- while(scanf("%s",choose)&&checknum(choose)==0||transformint(choose)<1||transformint(choose)>5)
- {
- printf("输入无效的编号,重新输入:\n");
- }
- printf("请输入修改后的分数:");
- switch(transformint(choose))
- {
- case 1:
- while(scanf("%s",p1->CHN)&&checknum(p1->CHN)==0)
- {
- printf("输入错误的语文分数,重新输入:\n");
- }
- break;
- case 2:
- while(scanf("%s",p1->MATH)&&checknum(p1->MATH)==0)
- {
- printf("输入错误的数学分数,重新输入:\n");
- }
- break;
- case 3:
- while(scanf("%s",p1->ENG)&&checknum(p1->ENG)==0)
- {
- printf("输入错误的英语分数,重新输入:\n");
- }
- break;
- case 4:
- while(scanf("%s",p1->PE)&&checknum(p1->PE)==0)
- {
- printf("输入错误的体育分数,重新输入:\n");
- }
- break;
- case 5:
- while(scanf("%s",p1->PRO)&&checknum(p1->PRO)==0)
- {
- printf("输入错误的专业分数,重新输入:\n");
- }
- break;
- }
- Aver=(transformint(p1->CHN)+transformint(p1->MATH)+transformint(p1->ENG)+transformint(p1->PE)+transformint(p1->PRO))/5;
- itoa(Aver,p1->average_score,10);//平均分转换字符串形式
- }else
- {
- printf("没有找到学号为%s的学生\n",num);
- }
- }while(transformint(num)!=0);
- system("cls");
- fflush(stdin);
- }
- void Oscore(struct student*head)//排序输出
- {
- system("cls");
- fflush(stdin);
- printf("*****************************************************查看排名***********************************************************\n");
- int ranking=0;
- struct student *p=NULL,*p1=NULL;
- for(p=head;p!=NULL;p=p->next)
- {
- if(checkscore(p->average_score)==0)
- {
- printf("有同学只录取了信息,没有录成绩。所以无法公布排名\n");
- system("pause");
- system("cls");
- fflush(stdin);
- return;
- }
- }
- for(p=head;p!=NULL;p=p->next)
- {
- for(p1=p->next;p1!=NULL;p1=p1->next)
- {
- if(transformint(p->average_score)<transformint(p1->average_score))
- {
- swap(p,p1);
- }
- }
- }
- printf("学号\t\t姓名\t\t平均分\t\t名次\t语文\t数学\t英语\t体育\t专业\t\n");
- for(p=head;p!=NULL;p=p->next)
- {
- ranking+=1;
- printf("%s\t\t%s\t\t%s\t\t%d\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,ranking,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
- }
- printf("\n");
- system("pause");
- system("cls");
- fflush(stdin);
- }
- void swap(struct student*p1,struct student*p2)//交换数据(辅助函数)
- {
- char tempCHN[20];
- char tempMATH[20];
- char tempENG[20];
- char tempPE[20];
- char tempPRO[20];
- char tempaverage[20];
- char tempname[20];
- char tempnum[20];
- strcpy(tempnum,p1->num);///
- strcpy(p1->num,p2->num);
- strcpy(p2->num,tempnum);
- strcpy(tempname,p1->name);//
- strcpy(p1->name,p2->name);
- strcpy(p2->name,tempname);
- strcpy(tempCHN,p1->CHN);///
- strcpy(p1->CHN,p2->CHN);
- strcpy(p2->CHN,tempCHN);
- strcpy(tempMATH,p1->MATH);///
- strcpy(p1->MATH,p2->MATH);
- strcpy(p2->MATH,tempMATH);
- strcpy(tempENG,p1->ENG);///
- strcpy(p1->ENG,p2->ENG);
- strcpy(p2->ENG,tempENG);
- strcpy(tempPE,p1->PE);///
- strcpy(p1->PE,p2->PE);
- strcpy(p2->PE,tempPE);
- strcpy(tempPRO,p1->PRO);///
- strcpy(p1->PRO,p2->PRO);
- strcpy(p2->PRO,tempPRO);
- strcpy(tempaverage,p1->average_score);///
- strcpy(p1->average_score,p2->average_score);
- strcpy(p2->average_score,tempaverage);
- }
- void fenduan(struct student*head)//分段输出
- {
- system("cls");
- fflush(stdin);
- printf("*****************************************************成绩分段***********************************************************\n\n");
- struct student *p;
- for(p=head;p!=NULL;p=p->next)
- {
- if(checkscore(p->average_score)==0)
- {
- printf("有同学只录取了信息,没有录成绩。所以无法公布分段\n");
- system("pause");
- system("cls");
- fflush(stdin);
- return;
- }
- }
- printf("********************************************************A***************************************************************\n");
- printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
- for(p=head;p!=NULL;p=p->next)
- {
- if(transformint(p->average_score)>=80)
- {
- printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
- }
- }
- printf("********************************************************B***************************************************************\n");
- printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
- for(p=head;p!=NULL;p=p->next)
- {
- if(transformint(p->average_score)<80&&transformint(p->average_score)>=60)
- {
- printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
- }
- }
- printf("********************************************************C***************************************************************\n");
- printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
- for(p=head;p!=NULL;p=p->next)
- {
- if(transformint(p->average_score)<60)
- {
- printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
- }
- }
- printf("\n");
- system("pause");
- system("cls");
- fflush(stdin);
- }
- void save(struct student *head)//文件保存
- {
- system("cls");
- fflush(stdin);
- FILE *fp;
- struct student *p;
- fp=fopen("stu.db","wb");
- for(p=head;p!=NULL;p=p->next)
- {
- fwrite(p,LEN,1,fp);
- }
- fclose(fp);
- printf("♂♂♂♂保存完毕♂♂♂♂♂\n");
- system("pause");
- system("cls");
- fflush(stdin);
- }
- void export1()//文件输出
- {
- system("cls");
- fflush(stdin);
- FILE *fp;
- struct student *t;
- t=(struct student *)malloc(LEN);
- if((fp=fopen("stu.db","r"))==NULL){
- printf("未找到文件\n");
- }
- else{
- printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
- int w;
- fseek(fp,0,2);
- w=ftell(fp);
- fseek(fp,0,0);
- while(w!=ftell(fp)){
- fread(t,LEN,1,fp);
- printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",t->num,t->name,t->average_score,t->CHN,t->MATH,t->ENG,t->PE,t->PRO);
- }
- fclose(fp);
- }
- system("pause");
- system("cls");
- fflush(stdin);
- }
- struct student *import()//文件导入
- {
- system("cls");
- fflush(stdin);
- FILE *fp;
- if((fp=fopen("stu.db","r"))==NULL){
- printf("未找到文件\n");
- }
- else{
- struct student *p1,*p2,*head;
- p1=p2=(struct student *)malloc(LEN);
- fread(p1,LEN,1,fp);
- while(!feof(fp)) {//end of file
- n+=1;
- if(n==1){
- head=p1;
- }
- else{
- p2->next=p1;
- }
- p2=p1;
- p1=(struct student *)malloc(LEN);
- fread(p1,LEN,1,fp);
- }
- p2->next=NULL;
- fclose(fp);
- printf("文件导入成功\n");
- system("pause");
- system("cls");
- fflush(stdin);
- return head;
- }
- system("cls");
- fflush(stdin);
- return NULL;
- }
- int checknum(char ch[])//检查纯数字的数据里是否混入了非数字的非法输入;
- {
- int i,flag=1;
- for(i=0;i<strlen(ch);i++)
- {
- if(ch[i]<'0'||ch[i]>'9')
- {
- flag=0;
- break;
- }
- }
- return flag;
- }
- int checkscore(char ch[])//检查0-99分数
- {
- int i,flag=1;
- if(strlen(ch)>=3)
- {
- return 0;
- }
- for(i=0;i<strlen(ch);i++)
- {
- if(ch[i]<'0'||ch[i]>'9')
- {
- flag=0;
- break;
- }
- }
- return flag;
- }
- int IncludeChinese(char *str)//是否包含中文
- {
- char c;
- while(1)
- {
- c=*str++;
- if (c==0) break; //如果到字符串尾则说明该字符串没有中文字符
- if (c&0x80) //如果字符高位为1且下一字符高位也是1则有中文字符
- if (*str & 0x80) return 1;
- }
- return 0;
- }
- int transformint(char ch[])//纯数字整数(字符串转向int类型)
- {
- int i=0,sum=0;
- for(i=0;i<strlen(ch);i++)
- {
- sum=sum*10+ch[i]-48;
- }
- return sum;
- }