#include
#include
#include
#include
#define N 100
typedef struct student
{
long num;
char name[20];
float score;
struct student next;
}stu;
FILE *fp;
void menu()//在这里进行主菜单的调用
{
printf("\n ********************* \n");
printf("\n 学生成绩记录簿设计 \n");
printf("\n ********************** \n");
printf("\n");
printf("\n -------------主菜单-------------\n");
printf(" 1. 输入所有学生的学号、姓名、C语言成绩\n");
printf(" 2. 显示所有学生的信息\n");
printf(" 3. 按学号或姓名查询成绩\n");
printf(" 4. 添加成绩记录\n");
printf(" 5. 删除成绩记录\n");
printf(" 6. 修改指定学号或姓名的学生的成绩\n");
printf(" 7. 将学生成绩按从高到低排名\n");
printf("\n ---------------结束---------------\n");
}
struct student *creat()//创建学生信息链表,将学生信息动态传递下去
{
struct student *head,*p,*q;
int i=0,n;
printf("\n-----请输入学生数:");
scanf("%d",&n);
printf("\n\t\t\t 学生的信息如下:\n");
printf("\n\t\t\t 学号====姓名=====分数\n");
do
{
p=(struct student *)malloc(sizeof(struct student));//申请内存
printf("\t\t\t");
scanf("%ld%s%f",&p->num,&p->name,&p->score);//链表的传递
i++;
if(i==1)
head=p;
else
q->next=p;
q=p;
}
while(i<n);
q->next=NULL;
return head;
}
void print(struct student *head)//在这里使用文件中的 w+打开模式将学生信息读入磁盘
{
struct student *p=head;
fp=fopen("stut.txt","w");
while(p!=NULL)
{
fprintf(fp,"%d %s %f\n",p->num,p->name,p->score);
p=p->next;
}
fclose(fp);//关闭文件
}
void input()//具体功能是将文件中的内容读取到显示屏上,主要使用了文件中的 r+打开
{
FILE *fp;
stu *p;
if((fp=fopen("stut.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
p=(stu *)malloc(sizeof(stu));
while((fscanf(fp,"%ld%s%f",&p->num,&p->name,&p->score))!=EOF)
printf(" %ld %s %f\n",p->num,p->name,p->score);
fclose(fp);
}
//查找,实现了按学号或姓名查找,里面采用了子函数调用子函数的方法实现了该功
void name()
{
FILE *fp=NULL;
stu *xs=NULL,*temp=NULL,*pr=NULL;
char name[20];
int flag=1;
printf("\n 输入要查学生的姓名: ");
scanf("%s",name);
if((fp=fopen("stut.txt","r"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
temp=xs;
do
{
pr=(stu *)malloc(sizeof(stu));
if(pr==NULL)
printf("申请内存失败!"),exit(0);
if(xs==NULL)
xs=pr;
else
{
temp=xs;
while(temp->next!=NULL)
temp=temp->next;
temp->next=pr;
}
temp=pr;
temp->num=0;
fscanf(fp,"%d%s%f",&temp->num,temp->name,&temp->score);
temp->next=NULL;
}while(pr->num!=0);
pr=xs;
while(pr!=NULL)
{
if(strcmp(xs->name,name)==0)//当找到该生时输出该生的信息
{
printf("\n\t\t 该学生的信息如下:\n");
printf("\t");
printf("%10s %6d %6.2f\n",xs->name,xs->num,xs->score);
flag=0;
break;
}
pr=pr->next;
}
if(flag)
printf("没有找到该生的信息!");
fclose(fp);
}
void num()//按学号查找
{
FILE *fp=NULL;
stu *xs=NULL,*temp=NULL,*pr=NULL;
long num;
int flag=1;
printf("\n 输入要查学生的学号: ");
scanf("%ld",&num);
if((fp=fopen("stut.txt","r"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
temp=xs;
do
{
pr=(stu *)malloc(sizeof(stu));
if(pr==NULL)
printf("申请内存失败!"),exit(0);
if(xs==NULL)
xs=pr;
else
{
temp=xs;
while(temp->next!=NULL)
temp=temp->next;
temp->next=pr;
}
temp=pr;
temp->num=0;
fscanf(fp,"%d%s%f",&temp->num,temp->name,&temp->score);
temp->next=NULL;
}while(pr->num!=0);
pr=xs;
while(pr!=NULL)
{
if(pr->num==num)
{
printf("\n\n====学生的信息如下:\n");
printf("-----");
printf("%10s %6d %6.2f\n",pr->name,pr->num,pr->score);
flag=0;
}
pr=pr->next;
}
if(flag)
printf("没有找到该生的信息!");
fclose(fp);
}
void search()//主函数中的子函数调用了两个子函数,使用 switch 语句实现
{
int chioce;
system("cls");
printf("\t\t1-----姓名查询信息-----\n");
printf("\n\t\t2-----学号查询信息-----\n");
printf("\n 请选择以何种方式进行查询:");
scanf("%d",&chioce);
switch(chioce)
{
case 1:name();
break;
case 2:num();
break;
default:
printf("选择错误!\n");
}
}
//插入学生的信息
void insert()
{
int n=0;
int i,j;
struct student s,sx[N];
printf("\n 请输入插入的学生的姓名:");
scanf("%s",s.name);
printf("\n 学生的学号:");
scanf("%ld",&s.num);
printf("\n 学生的成绩:");
scanf("%f",&s.score);
if((fp=fopen("stut.txt","r+"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
while((fscanf(fp,"%ld%s%f",&sx[n].num,sx[n].name,&sx[n].score))!=EOF)
{
n++;
}
fclose(fp);
for(i=0;i
{
if(s.score
break;
}
for(j=n;j>=i;j--)
{sx[j+1]=sx[j];}
sx[i]=s;
if((fp=fopen("stut.txt","w"))==NULL)
{printf("不能建立文件!\n");exit(0);}
else
{for(i=0;i<=n;i++)
{fprintf(fp,"%d %s %f\n",sx[i].num,sx[i].name,sx[i].score);}
fclose(fp);}
}
void delete_data()
{
int chioce;
system("cls");
printf("\t\t1-----姓名删除选项-----\n");
printf("\n\t\t2-----学号删除选项-----\n");
printf("\n 请选择以何种方式进行删除:");
scanf("%d",&chioce);
switch(chioce)
{
struct student s,sx[N];
case 1:printf("\n请输入学生姓名;");
scanf("%s",s.name);
printf("\n删除成功");
break;
case 2:printf("\n请输入学生学号;");
scanf("%ld",&s.num);
printf("\n删除成功");
break;
default:
printf("选择错误!\n");
}
}
void modi(stu head)
{
stu *xs=head;
char name[20];
int flag=1;
system("cls");
printf("\n 输入要修改学生的姓名: ");
scanf("%s",name);
fp=fopen("stut.txt","a+");
while(xs!=NULL)
{if(strcmp(xs->name,name)==0)/判断输入要修改的姓名是否存在*/
{
fprintf(fp,"\n====修改前学生的信息如下:\n");
fprintf(fp,"\n%10s %6s %6s\n","姓名","学号","C 语言的成绩");
fprintf(fp,"\n%10s %6d %6.2f \n",xs->name,xs->num,xs->score);
printf("\n 请输入该生的 C 语言成绩:");
scanf("%f",&xs->score);
flag=0;
break;
}xs=xs->next;
}
fprintf(fp,"\n====修改后的学生的信息如下:\n");
fprintf(fp,"\n%10s %6s %6s\n","姓名","学号","C 语言的成绩");
fprintf(fp,"\n%10s %6d %6.2f\n",xs->name,xs->num,xs->score);
if(flag)
printf("\n 学生不存在,修改失败!!");
fclose(fp);
getchar();
}
void sort(stu *head)
{
stu *p=head;
printf("60 分以下:\n");
while(p!=NULL)
{
if(p->score
printf("%d\t%s\t%f\n",p->num,p->name,p->score);
p=p->next;
}
p=head;
printf("60~79 分:\n");
while(p!=NULL)
{
if(p->score>60 && p->score
printf("%d\t%s\t%f\n",p->num,p->name,p->score);
p=p->next;
}
p=head;
printf("80~89:\n");
while(p!=NULL)
{
if(p->score>80 && p->score
printf("%d\t%s\t%f\n",p->num,p->name,p->score);
p=p->next;
}
p=head;
printf("90 分以上:\n");
while(p!=NULL)
{
if(p->score>90)
printf("%d\t%s\t%f\n",p->num,p->name,p->score);
p=p->next;
}
fclose(fp);
getchar();
}
main()
{
int chioce;
stu *head;
menu();
printf("\n\n-----请选择序号:");
scanf("%d",&chioce);
while(chioce!=0)
{
switch(chioce)
{
case 1:
head=creat();
print(head);
break;
case 2:input();
break;
case 3:search();
menu();
break;
case 4:insert();
break;
case 5:delete_data();
break;
case 6:modi(head);
menu();
break;
case 7:sort(head);
break;
case 8:exit(0);
}
printf("\n 请继续输入你想选择的:");
scanf("%d",&chioce);
}
}