脑子都想破了,还是做不出,大虾们帮帮我!
学生档案及简明信息生成。
菜单信息为:
* * * * * * * * * * * *
* * 1.输入数据* * * *
* * 2.显示原始数据 *
* * 3.制作简明数据 *
* * 4.删除男生数据 *
要求如下:
l 建立学生数据结构,l 结构包含有学生学号、姓名l 、性别、英语和数学信息。
l 输入10个学生的信息。
l 建立一简明数据结构,l 结构只包含姓名l 和总分,l 总分=英语+数学。
l 从学生数据结构中删除所有男生的数据,l 如果数组中没有要删除的学生,l 则输出没有男生的信息。
>> 本文固定链接: http://www.vcgood.com/archives/711
/*—–学生成绩管理系统——–
—————————–*/
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#define ST struct student
#define NULL 0
ST
{
char sno[10];
char name[10];
float gra_chin;
float gra_math;
float gra_eng;
ST * next;
};
FILE *fp;
/*————————————————————————
函数功能描述:
从文件中读出数据形成一个链表,并返回链表头指针。
————————————————————————*/
ST *load(char *fname)//load file to reform a link
{
ST *head,*tail,*p;
int count=0;
static sign=1;
ST stunode;
head=(ST *)malloc(sizeof(ST));
head=tail=NULL;
fp=fopen(fname,”r”);
if (fp==NULL)
return head;
else
{while(!feof(fp))
{
if (fread(&stunode,sizeof(ST),1,fp))
{
p=(ST *)malloc(sizeof(ST));
strcpy(p->sno,stunode.sno);
strcpy(p->name,stunode.name);
p->gra_chin=stunode.gra_chin;
p->gra_math=stunode.gra_math;
p->gra_eng=stunode.gra_eng;
if (head==NULL)
{head=p;tail=head;}
else
{tail->next=p;tail=p;}
count=count+1;
}
//if( ferror(fp) ){
// perror(“Read error”);
// break;
// }
tail->next=NULL;
}
if(sign==1)
{
printf(” %d 个记录被加载!”,count);
sign=0;
}
return head;
}
}
/*————————————————————————
函数功能描述:
判断输入的学号是否合法,是否在文件中已有同号
————————————————————————*/
int legalsno(char *string,char *fname)//tell a sno is legal or not
{
ST *p;
p=load(fname);
if(strlen(string)!=8)
return 0;
while (p!=NULL) //if the file has the sno,then the sno is not unique
{
if(strcmp(p->sno,string)==0)
return 0;
p=p->next;
}
return 1;
}
/*————————————————————————
函数功能描述:
接收传来的链表的头指针,将此链表写入文件保存,
并返回头指针。
————————————————————————*/
ST * save(ST *head,char *fname)//save the modified file
{
ST *p;
ST stu;
if((fp=fopen(fname,”w+”))==NULL)
{printf(“文件无法写入”);exit(1);}
else
{p=head;
while(p!=NULL)
{
strcpy(stu.sno,p->sno);
strcpy(stu.name,p->name);
stu.gra_chin=p->gra_chin;
stu.gra_math=p->gra_math;
stu.gra_eng=p->gra_eng;
if(fwrite(&stu,sizeof(ST),1,fp)!=1)
{
printf(“文件不能写入数据,评估检查后重新运行.\n”);
if( ferror( fp ) )
break;
exit(1);
}
p=p->next;
}
fclose(fp);
return head;
}
}
/*————————————————————————
函数功能描述:
将新输入的若干个结点建一个链表,并返回链表头指针。
————————————————————————*/
ST * create(char *fname)
{
char tellsno[10];
int count=0;
ST *head,*tail,*p;
head=tail=NULL;
printf(“\n\n\t\t\t当输入学号为0时退出输入!”);
printf(“\n\n\t\t\t请输入学号:”);
scanf(“%s”,tellsno);
while(strcmp(tellsno,”0″)!=0)
{
p=(ST *)malloc(sizeof(ST));
if (legalsno(tellsno,fname)!=1)// if sno is illegal,reinput;
{
printf(“\n学号输入非法或累同!请重新输入8位学号:”);
scanf(“%s”,tellsno);
continue;
}
strcpy(p->sno,tellsno);
printf(“\n\t\t\t请输入姓名:”);
scanf(“%s”,p->name);
printf(“\n\t\t\t请输入语文成绩:”);
scanf(“%f”,&p->gra_chin);
if(p->gra_chin<0||p->gra_chin>100)
{
printf(“\n分数应为1~100间的数,请重新输入语文分数:”);
scanf(“%f”,&p->gra_chin);
}
printf(“\n\t\t\t请输入数学成绩:”);
scanf(“%f”,&p->gra_math);
if(p->gra_math<0||p->gra_math>100)
{
printf(“\n分数应为1~100间的数,请重新输入数学分数:”);
scanf(“%f”,&p->gra_math);
}
printf(“\n\t\t\t请输入英语成绩:”);
scanf(“%f”,&p->gra_eng);
if(p->gra_eng<0||p->gra_eng>100)
{
printf(“\n分数应为1~100间的数,请重新输入英语分数:”);
scanf(“%f”,&p->gra_eng);
}
p->next=NULL;
if(head==NULL)
head=tail=p;
else
{
tail->next=p;
tail=p;
}
count=count+1;
printf(“\n\t\t\t请输入学号:”);
scanf(“%s”,tellsno);
}
//free(p);
printf(“\n\n\t\t%d个记录被添加!”,count);
return head;
}
/*————————————————————————
函数功能描述:
输入每个学生的成绩,判断学生成绩文件是否存在,
若存在则将输入的内容追加到文件,若不存在,则新建立,
若无法建立则退出。
————————————————————————*/
ST *data_input(ST * head,char *fname)
{
ST *p,*q;
system(“cls”);
p=head;
while (p)
{
if(p->next==NULL)
break;
p=p->next;
}
if (head==NULL)
head=create(fname);
else
p->next=create(fname);
q=head;
head=save(q,fname);
return head;
}
void show_rec(ST *rec) //show a record in link
{
printf(“\n\n\n\t*————————————- ————————*”);
printf(“\n\t学 号 姓 名 语文成绩 数学成绩 英语成绩 平均成绩”);
printf(“\n\t%10s”,rec->sno);
printf(“%10s”,rec->name);
printf(“%11.1f”,rec->gra_chin);
printf(“%11.1f”,rec->gra_math);
printf(“%10.1f”,rec->gra_eng);
printf(“%10.0f”,(rec->gra_chin+rec->gra_math+rec ->gra_eng)/3);
printf(“\n\t*———————————————– ————–*”);
return;
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按学号查询满足条件的结点
————————————————————————*/
void sno_query(ST * head,char * fname)
{
char selsno[10];
char ch;
ST *p;
system(“cls”);
while(1)
{
p=head;
printf(“\n\n\n\t请输入要查询的学生学号:”);
scanf(“%s”,selsno);
while(p!=NULL)
{
if(strcmp(p->sno,selsno)!=0)
p=p->next;
else
{
show_rec(p);
return;
}
}
if (p==NULL)
{
printf(“\n\n\t\t\t查无此人!是否继续查找?y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
return;
}
}
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按姓名查询满足条件的结点
————————————————————————*/
void name_query(ST *head,char *fname)
{char selname[10];
char ch;
ST *p,*q;
system(“cls”);
int sign=0;
int count=0;
while(1)
{
p=q=head;
printf(“\n\n\n\t请输入要查询的学生姓名:”);
scanf(“%s”,selname);
while(p!=NULL)
{
if(strcmp(p->name,selname)==0)
{ q=p;
sign=1;
show_rec(q);//if there are two student have the same name,find
count=count+1;//them all
p=p->next;
}
else
p=p->next;
}
if (p==NULL)
{
if(sign==1)
{
printf(“\n\n\t\t%d个学生被找到!”,count);
return;
}
else
{
printf(“\n\n\t\t\t查无此人!是否继续查找?y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
return;
}
}
}
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中查询平均分最高的学生
————————————————————————*/
void max_aver(ST *head,char *fname)
{
int max,ave,count=0;
ST *p,*fore,*q,*behind;
system(“cls”);
p=head;
max=(int)(p->gra_chin+p->gra_math+p->gra_eng) /3;//calculate the average of three course
while(p!=NULL)
{
ave=(int)(p->gra_chin+p->gra_math+p->gr a_eng)/3;//calculate the max average
if(max<ave)
{
max=ave;
}
p=p->next;
}
p=head;
fore=(ST * )malloc(sizeof(ST));
fore=behind=NULL;
while(p!=NULL)//form a new link from the all max averagegraders.
{
ave=(int)(p->gra_chin+p->gra_math+p->gr a_eng)/3;
if (ave==max)
{
q=(ST * )malloc(sizeof(ST));
strcpy(q->sno,p->sno);
strcpy(q->name,p->name);
q->gra_chin=p->gra_chin;
q->gra_math=p->gra_math;
q->gra_eng=p->gra_eng;
fore=q;q->next=behind;behind=fore;
count=count+1;
}
p=p->next;
}
printf(“\n\n\t\t\t平均成绩最大的学生情况如下:”);
while(fore!=NULL)
{
show_rec(fore);
fore=fore->next;
if (fore==NULL)
break;
}
printf(“\n\t%d个学生符合条件!”,count);
free(fore);
return;
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按学号查询平均分不及格
的结点
————————————————————————*/
void not_pass(ST *head,char *fname )
{
int ave;
int sign=0,count=0;
ST *p;
system(“cls”);
p=head;
printf(“\n\t\t\t不及格学生名单:”);
//max=(p->gra_chin+p->gra_math+p->gra_eng)/3; //calculate the average of three course
while(p!=NULL)
{
ave=(int)(p->gra_chin+p->gra_math+p->gr a_eng)/3;//calculate the max average
if(ave<60)
{
show_rec(p);
count=count+1;
sign=1;
if (p->next==NULL)
{
printf(“\n %d个记录被找到! “,count);
return;
}
}
p=p->next;
}
if (sign==1)
{
printf(” \n%d个记录被找到! “,count);
return;
}
if (p==NULL)
printf(“\n\t\t所有同学都及格!”);
}
void data_query(ST *head,char *fname)//查询子系统
{
int cho_req=1;
char ch;
do
{
system(“cls”);
printf(“\n\n\n\t\t\t\t查询子菜单”);
printf(“\n\t\t\t===============================”);
printf(“\n\t\t\t1.按学生学号查询成绩”);
printf(“\n\t\t\t2.按学生姓名查询成绩”);
printf(“\n\t\t\t3.查询平均分最高的学生姓名”);
printf(“\n\t\t\t4.查询平均分不及格的学生姓名”);
printf(“\n\t\t\t0.返回主菜单”);
printf(“\n\t\t\t===============================” );
printf(“\n\t\t\t请选择(0~4):”);
scanf(“%d”,&cho_req);
switch(cho_req)
{
case 1: sno_query(head,fname);break;
case 2: name_query(head,fname);break;
case 3: max_aver(head,fname);break;
case 4: not_pass(head,fname);break;
case 0: return;break;
default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
}
printf(“\n\n\t\t\t\t是否返回查询菜单:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
return;
} while(cho_req);
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按学号删除满足条件的结点
————————————————————————*/
void sno_del(ST *head,char *fname) //按学号删除记录
{
char snodel[10];
char ch;
//int count=0;
int delsign=0; //define a sign for sign,if the link has been del ,then save it
ST *p,*q;
system(“cls”);
while(1)
{
p=q=head;
printf(“\n\t\t请输入要删除的学生学号:”);
scanf(“%s”,snodel);
while(p!=NULL)
{
if (strcmp(p->sno,snodel)!=0)
{ q=p;
p=p->next;
}
else
{
printf(“\n\n\t\t%s 同学将被删除,确认删除吗?y/n:”,p->name);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
if(delsign==1)
save(head,fname);
//printf(” %d个记录被删除! “,count);
return;
}
else
{
//count=count+1;
delsign=1;
if(head==p)
head=p->next;
else
q->next=p->next;
free(p);
break;
}
}
}
if(p==NULL)
printf(“\n\n\t\t查无此人!”);
printf(“\n\n\t\t是否继续删除:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
save(head,fname);
//printf(” %d个记录被删除! “,count);
return;
}
}
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按群名删除满足条件的结点
————————————————————————*/
void name_del(ST *head,char *fname) //按姓名删除记录
{
char namedel[10];
char ch;
int delsign=0; //define a sign for sign,if the link has been del ,then save it
ST *p,*q,*k;
system(“cls”);
while(1)
{
p=q=head;
printf(“\n\t\t请输入要删除的学生姓名:”);
scanf(“%s”,namedel);
while(p!=NULL)
{
if (strcmp(p->name,namedel)!=0)
{ q=p;
p=p->next;
}
else
{
printf(“\n\n\t学号:%s %s 同学将被删除,确认删除吗?y/n:”,p->sno,p->name);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
if(delsign==1)
{
save(head,fname);
return;
}
p=p->next;//deal with the problem that more than one student have the same name
continue;
}
else
{
delsign=1;
k=p;
if(head==p)
head=p->next;
else
q->next=p->next;
// printf(“错”);
k=p->next;
free(p);
p=k;
// p=p->next;
}
}
}
if(p==NULL&&delsign==0)
printf(“\n\n\t\t没有你要删除的人!”);
printf(“\n\n\t\t是否继续删除:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
save(head,fname);
return;
}
}
}
void data_del(ST *head,char *fname)
{
int choice=1;
//char ch;
do
{
system(“cls”);
printf(“\n\n\n\t\t\t\t\t删除子菜单”);
printf(“\n\t\t\t=================================”);
printf(“\n\t\t\t\t1.按学生学号删除记录”);
printf(“\n\t\t\t\t2.按学生姓名删除记录”);
printf(“\n\t\t\t\t0.返回主菜单”);
printf(“\n\t\t\t================================ =”);
printf(“\n\t\t\t请选择(0~2):”);
scanf(“%d”,&choice);
switch(choice)
{
case 1: sno_del(head,fname);break;
case 2: name_del(head,fname);break;
case 0: return;break;
default : printf(“\n\n\t\t输入错误,请重新输入”);
}
// printf(“\n\n\t\t是否继续删除:y/n:”);
// getchar();
// scanf(“%c”,&ch);
// if(ch==’n'||ch==’N')
// return;
} while(choice);
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按学号修改满足条件的结点
————————————————————————*/
void sno_modi(ST *head,char *fname)
{
char snomodi[10];
char ch;
int sign=0;
ST *p;
system(“cls”);
while(1)
{
p=head;
printf(“\n\t\t请输入要修改的学生学号:”);
scanf(“%s”,snomodi);
while(p!=NULL)
{
if(strcmp(p->sno,snomodi)!=0)
p=p->next;
else
{
printf(“\n\t\t\t姓 名:%s的原各科成绩:”,p->name);
printf(“\n\n\t\t\t语文:%8.0f 数学:%8.0f 英语:%8.0f “,p->gra_chin,p->gra_math,p->gra_eng);
printf(“\n\t\t请修改:”);
printf(“\n\t\t\t语 文:”);
scanf(“%f”,&p->gra_chin);
if(p->gra_chin<0||p->gra_chin>100)
{
printf(“\n分数应为1~100间的数,请重新输入语文分数:”);
scanf(“%f”,&p->gra_chin);
}
printf(“\n\t\t\t数 学:”);
scanf(“%f”,&p->gra_math);
if(p->gra_math<0||p->gra_math>100)
{
printf(“\n分数应为1~100间的数,请重新输入数学分数:”);
scanf(“%f”,&p->gra_math);
}
printf(“\n\t\t\t英 语:”);
scanf(“%f”,&p->gra_eng);
if(p->gra_eng<0||p->gra_eng>100)
{
printf(“\n分数应为1~100间的数,请重新输入英语分数:”);
scanf(“%f”,&p->gra_eng);
}
sign=1;
printf(“\n\n\t\t是否继续修改:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
save(head,fname);
return;
}
else
break;
}
if (p==NULL)
{
printf(“\n\t\t查无此人!是否继续修改:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{if (sign==1)
save(head,fname);
return;
}
else
break;
}
}
}
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按学生姓名修改成绩
————————————————————————*/
void name_modi(ST *head,char * fname) //
{
char namemodi[10];
char ch;
int sign=0;
ST *p;
system(“cls”);
while(1)
{
p=head;
printf(“\n\t\t请输入要修改的学生姓名:”);
scanf(“%s”,namemodi);
while(p!=NULL)
{
if(strcmp(p->name,namemodi)!=0)
p=p->next;
else
{
printf(“\n\n\t\t学号:%s 姓 名:%s的原各科成绩:”,p->sno,p->name);
printf(“\n\n\t\t\t语文:%8.0f 数学:%8.0f 英语:%8.0f “,p->gra_chin,p->gra_math,p->gra_eng);
printf(“\n\t\t是否是修改此学生?y/n:”);//if there are more than one student have the
getchar(); //same name,you should ensure modify which one
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
p=p->next;
continue;
}
else
{
printf(“\n\n\t\t请修改:”);
printf(“\n\t\t\t语 文:”);
scanf(“%f”,&p->gra_chin);
if(p->gra_chin<0||p->gra_chin>100)
{
printf(“\n分数应为1~100间的数,请重新输入语文分数:”);
scanf(“%f”,&p->gra_chin);
}
printf(“\n\t\t\t数 学:”);
scanf(“%f”,&p->gra_math);
if(p->gra_math<0||p->gra_math>100)
{
printf(“\n分数应为1~100间的数,请重新输入数学分数:”);
scanf(“%f”,&p->gra_math);
}
printf(“\n\t\t\t英 语:”);
scanf(“%f”,&p->gra_eng);
if(p->gra_eng<0||p->gra_eng>100)
{
printf(“\n分数应为1~100间的数,请重新输入英语分数:”);
scanf(“%f”,&p->gra_eng);
}
sign=1;
}
printf(“\n\n\t\t是否继续修改:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{
save(head,fname);
return;
}
else
{
break;
}
}
if (p==NULL)
{
printf(“\n\t\t没有你要查找的人!是否继续修改:y/n:”);
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
{if(sign==1)
save(head,fname);
return;
}
else
break;
}
}
}
}
void data_modi(ST *head,char *fname)//修改子菜单
{
int choice=1;
//char ch;
do
{
system(“cls”);
printf(“\n\n\n\t\t\t\t\t修改子菜单”);
printf(“\n\t\t\t=================================”);
printf(“\n\t\t\t\t1.按学生学号修改成绩”);
printf(“\n\t\t\t\t2.按学生姓名修改成绩”);
printf(“\n\t\t\t\t0.返回主菜单”);
printf(“\n\t\t\t================================ =”);
printf(“\n\t\t\t请选择(0~2):”);
scanf(“%d”,&choice);
switch(choice)
{
case 1: sno_modi(head,fname);break;
case 2: name_modi(head,fname);break;
case 0: return;break;
default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
}
//printf(“\n\n\t\t\t\t是否继续修改:y/n:”);
//getchar();
//scanf(“%c”,&ch);
// if(ch==’n'||ch==’N')
// return;
} while(choice);
}
/*————————————————————————
函数功能描述:
接收链表头指针,打印链表中所有结点
————————————————————————*/
void print_show(ST *head)
{
ST *p;
p=head;
printf(“\n\n\n\t*——————————————- ——————-*”);
printf(“\n\t学 号 姓 名 语文成绩 数学成绩 英语成绩 平均成绩”);
printf(“\n\t*———————————————– —————*”);
while(p!=NULL)
{
printf(“\n\t%10s”,p->sno);
printf(“%10s”,p->name);
printf(“%11.1f”,p->gra_chin);
printf(“%11.1f”,p->gra_math);
printf(“%10.1f”,p->gra_eng);
printf(“%10.0f”,(p->gra_chin+p->gra_math+p->gra_eng )/3);
printf(“\n\t*———————————————– —————*”);
p=p->next;
}
getchar();
return;
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按学号排序显示
————————————————————————*/
void prin_all(ST *head)
{
ST *q,*t,*shead,*k;
ST *p;
p=NULL;
// int count,i,j;
//int count=1;
system(“cls”);
shead=k=p=t=q=NULL;
//q->next=stail;
for (p=head;p!=NULL;p=p->next)
{
t=(ST *)malloc(sizeof(ST));
strcpy(t->sno,p->sno);
strcpy(t->name,p->name);
t->gra_chin=p->gra_chin;
t->gra_math=p->gra_math;
t->gra_eng=p->gra_eng;
if(shead==NULL)
{shead=t;shead->next=NULL;p=p->next;contin ue;}
for(q=shead;q!=NULL;q=q->next)
{
if (strcmp(t->sno,q->sno)>0)
{
k=q;
//q=q->next;
//printf(“ok”);
}
else
{
if(q==shead)
{
t->next=shead;shead=t;break;
}
else
{
t->next=q;
k->next=t;
break;
}
}
}
if(k==NULL)
{
p=p->next;
continue;
}
else
if (k->next==NULL)
{
t->next=k->next;
k->next=t;
}
}
print_show(shead);
getchar();
return;
}
/*————————————————————————
函数功能描述:
接收链表头指针,在链表中按平均成绩排序显示
————————————————————————*/
void sort_gra(ST *head)
{
ST *q,*t,*shead,*k;
int avet,aveq;
ST *p;
p=NULL;
// int count,i,j;
//int count=1;
system(“cls”);
shead=k=p=t=q=NULL;
//q->next=stail;
for (p=head;p!=NULL;p=p->next)
{
t=(ST *)malloc(sizeof(ST));
strcpy(t->sno,p->sno);
strcpy(t->name,p->name);
t->gra_chin=p->gra_chin;
t->gra_math=p->gra_math;
t->gra_eng=p->gra_eng;
if(shead==NULL)
{shead=t;shead->next=NULL;p=p->next;contin ue;}
for(q=shead;q!=NULL;q=q->next)
{
avet=(int)(t->gra_chin+t->gra_math+t ->gra_eng)/3;
aveq=(int)(q->gra_chin+q->gra_math+q->gra_eng)/3;
if (avet<=aveq)
{
k=q;
//q=q->next;
//printf(“ok”);
}
else
{
if(q==shead)
{
t->next=shead;shead=t;break;
}
else
{
t->next=q;
k->next=t;
break;
}
}
}
if(k==NULL)
{
p=p->next;
continue;
}
else
if (k->next==NULL)
{
t->next=k->next;
k->next=t;
}
}
print_show(shead);
getchar();
return;
}
void data_prin(ST * head)
{
int choice=1;
//char ch;
do
{
system(“cls”);
printf(“\n\n\n\t\t\t\t打印子菜单”);
printf(“\n\t\t\t=================================”);
printf(“\n\t\t\t1.按学号顺序打印所有学生情况”);
printf(“\n\t\t\t2.按平均成绩高低顺序打印学生成绩”);
printf(“\n\t\t\t0.返回主菜单”);
printf(“\n\t\t\t================================ =”);
printf(“\n\t\t\t请选择(0~2):”);
scanf(“%d”,&choice);
switch(choice)
{
case 1: prin_all(head);break;
case 2: sort_gra(head);break;
case 0: return;break;
default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
}
//printf(“\n\n\t\t\t\t是否继续修改:y/n:”);
//getchar();
//scanf(“%c”,&ch);
// if(ch==’n'||ch==’N')
// return;
} while(choice);
}
void login() //系统登录界面
{
int i,times;
char usr[10],pwd[10];
for(times=0;times<3;times++)
{
//system(“cls”);
printf(“\n\n\n\n\n\t\t\t用户名:”);
gets(usr);
printf(“\n\n\t\t\t密 码:”);
for(i=0;i<10;i++)
{
pwd=_getch();
if(pwd==8&&i>0)
{
//pwd[i-2]=’ ‘;
printf(“\b \b”);
i=i-2;
continue;
}
if(pwd!=13)
printf(“*”);
else
{
pwd=’\0′;
break;
}
}
if (strcmp(usr,”123″)==0&&strcmp(pwd,”123″)==0)
return ;
else
{
printf(“\n\n\t\t\t\t\t用户名或密码错误!请重输!”);
continue;
}
}
printf(“\n\n\n\t\t您无权进入系统!”);
exit(1);
}
void main()
{
char choice=’1′;
char ch;
char fname[30];
ST *head;
system(“color 3f”);
login();
system(“cls”);
printf(“请输入要建立或找开的文件名(*.txt):”);
gets(fname);
do
{
system(“cls”);
head=load(fname);
printf(“\n\n\n\t\t\t\t 主菜单”);
printf(“\n\t\t\t=================================”);
printf(“\n\t\t\t\t1.输入学生成绩”);
printf(“\n\t\t\t\t2.查询学生成绩”);
printf(“\n\t\t\t\t3.删除学生成绩”);
printf(“\n\t\t\t\t4.修改学生成绩”);
printf(“\n\t\t\t\t5.打印输出成绩”);
printf(“\n\t\t\t\t0.退出系统”);
printf(“\n\t\t\t================================ =”);
printf(“\n\t\t\t请选择(0~5):”);
scanf(“%c”,&choice);
switch(choice)
{
case ’1′: head=data_input(head,fname);break;
case ’2′: data_query(head,fname);break;
case ’3′: data_del(head,fname);break;
case ’4′: data_modi(head,fname);break;
case ’5′: data_prin(head);break;
case ’0′: printf(“\n\n\t\t\t\t谢谢使用”);break;
default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
}
if(choice==’0′)
{
fclose(fp);
break;
}
getchar();
scanf(“%c”,&ch);
if(ch==’n'||ch==’N')
break;
} while(choice);
}