#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[]);
void save(struct student *head);
void export1();
struct student *import();
int checkscore(char ch[]);
int IncludeChinese(char *str);
int main()
{
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)
{
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)
{
system("cls");
fflush(stdin);
return(head);
}
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");
while(transformint(p1->num)!=0)
{
n+=1;
if(n==1)
{
head=p1;
}else
{
p2->next=p1;
p2=p1;
}
p1=(struct student*)malloc(LEN);
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;
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);
printf("%s的成绩录入完了\n",p->name);
}
system("cls");
fflush(stdin);
}
void findinformation(struct student *head)
{
system("cls");
fflush(stdin);
char choose1[20],choose2[20];
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;
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)
{
head=p1->next;
free(p1);
}else
{
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;
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)) {
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[])
{
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)
if (*str & 0x80) return 1;
}
return 0;
}
int transformint(char ch[])
{
int i=0,sum=0;
for(i=0;i<strlen(ch);i++)
{
sum=sum*10+ch[i]-48;
}
return sum;
}