C语言问题,编写一个程序
学生成绩管理编写一个菜单驱动的学生成绩管理程序。实现如下管理功能:• 能输入并显示n个学生的m门考试科目的成绩、总分和平均分。•...
学生成绩管理
编写一个菜单驱动的学生成绩管理程序。实现如下管理功能:
• 能输入并显示 n 个学生的 m 门考试科目的成绩、总分和平均分。
• 按总分进行排序。
• 按学号进行排序。
• 任意输入一个学号,能显示该学生的姓名、各门功课的成绩。
• 将输入的学生成绩数据保存到文件中。
• 从文件中读出学生成绩数据。
具体要求如下:
1 )先用静态的数据结构(结构体数组)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
2 )再换用动态数据结构(链表)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
3 ) 排序函数是一个 具有多种排序方式的 通用的 排序程序,即 不仅可以实现成绩的升序排序,还可以实现成绩的降序排序。
4 )程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
5 )输出菜单形式如下:
Management for Students' scores
1. Append record
2. List record
3. Delete record
4. Modify record
5. Search record
6. Sort Score in descending order by sum
7. Sort Score in ascending order by sum
8. Sort Score in descending order by num
9. Sort Score in ascending order by num
W. Write to a File
R. Read from a File
0. Exit
Please Input your choice: 展开
编写一个菜单驱动的学生成绩管理程序。实现如下管理功能:
• 能输入并显示 n 个学生的 m 门考试科目的成绩、总分和平均分。
• 按总分进行排序。
• 按学号进行排序。
• 任意输入一个学号,能显示该学生的姓名、各门功课的成绩。
• 将输入的学生成绩数据保存到文件中。
• 从文件中读出学生成绩数据。
具体要求如下:
1 )先用静态的数据结构(结构体数组)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
2 )再换用动态数据结构(链表)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
3 ) 排序函数是一个 具有多种排序方式的 通用的 排序程序,即 不仅可以实现成绩的升序排序,还可以实现成绩的降序排序。
4 )程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
5 )输出菜单形式如下:
Management for Students' scores
1. Append record
2. List record
3. Delete record
4. Modify record
5. Search record
6. Sort Score in descending order by sum
7. Sort Score in ascending order by sum
8. Sort Score in descending order by num
9. Sort Score in ascending order by num
W. Write to a File
R. Read from a File
0. Exit
Please Input your choice: 展开
1个回答
展开全部
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#include <string.h>
struct scorenode
{
int number; /*学号*/
char name[10]; /*姓名*/
float physics; /*物理成绩*/
float English; /*英语成绩*/
float maths; /*数学成绩 */
struct scorenode *next;
};
typedef struct scorenode score;
int n; /* n为全局变量 */
void swap(score *max, score *p )
{
int k;
char t[10];
float temp;
k=max->number; /*交换结点中的学号值*/
max->number=p->number;
p->number=k;
strcpy(t,max->name); /*交换结点中的姓名*/
strcpy(max->name,p->name);
strcpy(p->name,t);
temp=max->physics; /*交换前后结点中的物理成绩*/
max->physics=p->physics;
p->physics=temp;
temp=max->English; /*交换结点中的英语成绩*/
max->English=p->English;
p->English=temp;
temp=max->maths; /*交换结点中的数学成绩*/
max->maths=p->maths;
p->maths=temp;
printf("*********************************");
}
/*=================================================================*/
int save(score *p1) /* 保存学生的资料 */
{
FILE *fp;
char filepn[20]; /*用来存放文件保存路径以及文件名*/
printf("请输入文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->physics,
p1->English,p1->maths);
p1=p1->next; /*下移一个结点*/
}
fclose(fp);
printf("文件已保存!\n");
return 0;
}
/*==================================================================*/
void print_s(score *head) /* 显示学生成绩 */
{
score *p;
if(head==NULL)
printf("\n没有任何学生资料!\n");
else
{
printf("\n输入的学生人数为%d\n",n);
printf("-------------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|\n");
printf("------------------------------------------\n"); /*打印表格域*/
p=head;
do
{
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->physics,
p->English,p->maths);
printf("--------------------------------------\n");/*打印表格域*/
p=p->next;
} while (p!=NULL); /*打印结束*/
}
}
/*==================================================================*/
score *sort(score *head) /*排序, 返回链表的头指针*/
{
score *p,*max,*temp;
int i,j,k,x;
if(head==NULL)
{
printf("\n没有任何学生资料,请先建立链表!\n");
return 0;
} /*链表为空*/
max=p=head;
for(i=0;i<80;i++)
printf("*");
printf("1按学生学号排序\t2按学生姓名排序\t3按物理成绩排序\n");
printf("4按英语成绩排序\t5按数学成绩排序\t\n");
for(i=0;i<80;i++ )
printf("*");
printf("请选择操作:");
scanf("%d",&x); /*选择操作*/
getchar();
switch(x) /*用switch语句实现功能选择*/
{
case 1 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++)
{
p=p->next;
if(max->number>p->number)
swap(max,p);
}
}
print_s(head); break; /*打印排序后的链表内容*/
case 2 :
for(i=1;i<n;i++)
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(strcmp(max->name,p->name)>0) swap(max,p);
}
}
print_s(head); break;
case 3 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(max->physics>p->physics)
swap(max,p);
}
}
print_s(head); break;
case 4 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(max->English>p->English)
swap(max,p);
}
}
print_s(head); break;
case 5 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(max->maths>p->maths)
swap(max,p);
}
}
print_s(head); break;
}
save(head);
return(head);
}
/*===============================================================*/
score *create(void) /* 创建链表,并返回链表的头指针 */
{
score *head;
score *p1,*p2,*p3;
int i;
n=0; head=NULL;
p1=p2=p3=(score *)malloc(LEN); /*开辟一个新单元*/
while(1)
{
printf("请输入学生资料,输0退出!\n");
repeat: printf("请输入学生学号(学号应大于0):");
scanf("%d",&p1->number);
while(p1->number<0)
{
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);
}
if (p1->number==0)
goto endd; /*当输入的学号为0时,结束创建链表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++ )
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat; /*当输入的学号已经存在,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name); /*输入学生姓名*/
printf("请输入物理,英语,数学成绩(0~100):");
/*输入三门课成绩,成绩应在0-100*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
while(p1->physics<0||p1->physics>100|| p1->English<0||p1->English>100
|| p1->maths<0|| p1->maths >100)
{
printf("输入错误,请重新输入成绩");
/*输入错误,重新输入成绩直到正确为止*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
}
n=n+1;
if(n==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=(score *)malloc(LEN);
}
endd:
p2->next=NULL;
save(head);
return(head);
}
/*===============================================================*/
score *load(score *head) /*从文件读入学生记录*/
{
score *p1,*p2;
int m=0;
char filepn[10];
FILE *fp;
printf("请输入文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"r"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
printf(" \t\t成绩管理系统 ");
printf("\t专业: 计11 \n");
printf("-----------------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|\n");
printf("-----------------------------------------------------------\n");
/*文件读入与显示*/
head=NULL;
p1=p2=(score *)malloc(LEN); /*开辟一个新单元*/
while(!feof(fp))
{
fscanf(fp,"%d\t%s\t%f\t%f\t%f\t\n",&p1->number,p1->name,
&p1->physics,&p1->English,&p1->maths);
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,
p1->physics,p1->English,p1->maths);
m=m+1;
if(m==1) head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=(score *)malloc(LEN); /*开辟一个新单元*/
}
p2->next=NULL;
printf("--------------------------------------------------\n");/*表格下线*/
fclose(fp); /*结束读入,关闭文件*/
n=n+m;//更新学生记录的数目
return (head);
}
/*===============================================================*/
score *add(score *head,score *stu) /*追加学生资料,并且将所有学生资料按学号排序*/
{
score *p0,*p1, *p3;
int i;
p1=head;
while(1)
{
p1=stu=(score *)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!");
repeat2:
printf("请输入学生学号(学号应大于0):");
scanf("%d",&stu->number);
while(p1->number<0)
{
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number); /*输入学号为字符或小于0时,提示重新输入学号*/
}
if (p1->number==0)
break; /*当输入的学号为0时,结束创建链表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++ )
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat2; /*当输入的学号已经存在,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name); /*输入学生姓名*/
printf("请输入物理,英语,数学成绩(0~100):");
/*输入三门课成绩,成绩应在0-100*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
while(p1->physics<0||p1->physics>100|| p1->English<0||p1->English>100
|| p1->maths<0|| p1->maths >100)
{
printf("输入错误,请重新输入成绩"); /* 重新输入成绩直到正确为止*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
}
p1->next=NULL;
p0=head;
if (p0==NULL)
head=p1;
else
{
while (p0->next!=NULL)
p0=p0->next;
p0->next=p1;
}
n=n+1;
}
printf("现在的学生数为:%d个!\n",n);
sort(head);
save(head);
return(head);
}
/*================================================================*/
score *search(score *head) /* 查询学生成绩 */
{
int number;
score *p1,*p2;
printf("输入要查询的学生的学号:");
scanf("%d",&number);
printf("-------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|\n");
printf("---------------------------------------------------\n");/*打印表格域*/
while(number!=0)
{
if(head==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(number==p1->number)
{
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,
p1->physics,p1->English,p1->maths);
printf("-----------------------------------------------------\n");
} /*打印表格域*/
else
printf("%d不存在此学生!\n",number);
printf("输入要查询的学生的学号:");
scanf("%d",&number);
}
printf("退出查询!\n");
return(head);
}
/*===============================================================*/
score *del(score *head) /* 删除学生资料 */
{
score *p1,*p2;
int number;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
while(number!=0) /*输入学号为0时退出*/
{
if (head==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
/*p1指向的不是所要找的首结点,并且后面还有结点*/
{p2=p1;p1=p1->next; } /*p1后移一个结点*/
if(number==p1->number) /*找到了*/
{
if(p1==head)
head=p1->next; /*若p1指向的是首结点,把第二个结点地址赋予head*/
else
p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址域*/
n=n-1;
}
else
printf("很抱歉,未能找到该学号的记录。\n");
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
}
printf("现在的学生数为:%d个!\n",n);
save( head);
return(head);
}
/*================================================================*/
score *statistics(score *head)
/* 统计学生成绩,包括:个人总分和平均分、单科平均分、总分最高分、总分最低分*/
{
float sum,sum1=0,sum2=0,sum3=0,ave,ave1=0,ave2=0,ave3=0,max=0,min=1000;
score *p;
int y=0,i=0;
p=head;
if(head==NULL) /*链表为空*/
{
printf("\n没有任何学生资料!\n");return(head);
}
else
{
printf("--------------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|总分\t|平均分\t|\n");
printf("--------------------------------------------\n");/*打印表格域*/
while(p!=NULL)
{
sum=p->physics+p->English+p->maths; /*计算个人总分*/
ave=sum/3;/*计算个人平均分*/
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,
p->name,p->physics,p->English,p->maths,sum,ave); /*打印结果*/
printf("------------------------------------------------------\n");
sum1=sum1+p->physics;
sum2=sum2+p->English;
sum3=sum3+p->maths; /*计算总分*/
y=y+1;
if (max<sum) max=sum;
else if (min>sum) min=sum;
p=p->next;
}
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*计算平均分*/
printf("物理平均分是%.1f\n",ave1);
printf("英语平均分是%.1f\n",ave2);
printf("数学平均分是%.1f\n",ave3); /*打印结果*/
printf("总分最高分:%.1f\n",max);
printf("总分最低分:%.1f\n",min);
printf("\n");
}
return(head);
}
/*==================================================================*/
int menu( ) /* 菜单选择界面 */
{
int i,k;
printf("\t\t\t欢迎进入成绩管理系统\n\n\t\t考试成绩管理系统");
printf("\t专业 计11\n");
for(i=0;i<80;i++ )
printf("*");
printf("1输入学生的资料\t\t\t2从文件调入资料\t\t\t3查询学生的成绩\n");
printf("4删除学生的资料\t\t\t5追加学生的资料\t\t\t6显示学生的成绩\n");
printf("7统计学生的成绩\t\t\t8保存输入的资料\t\t\t9对成绩进行排序\n");
for(i=0;i<80;i++ )
printf("*");
printf("请选择您的操作(0退出)");
scanf("%d",&k);/*选择操作*/
getchar( );
return (k);
}
/*==============================================================*/
void main() /*调用creat,search,del,add,print,ststistics,save,taxis等函数,实现成绩管理 */
{
score *head=NULL,*stu=NULL;
int k;
while(1)
{
k=menu( );
switch(k) /*用switch语句实现功能选择*/
{
case 1: head=create( );break; /*调用创建链表函数*/
case 2: head=load(head);break; /*调用从文件读入记录哈函数*/
case 3: head=search(head);break; /*调用成绩查询函数*/
case 4: head=del(head); break; /*调用删除学生资料函数*/
case 5: head=add(head,stu);break; /*调用追加学生资料函数*/
case 6: print_s(head); break; /*调用显示学生资料函数*/
case 7: statistics(head); break; /*调用统计函数*/
case 8: save(head);break; /*调用保存函数*/
case 9: sort(head);break; /*调用排序函数*/
case 0: exit(0); /*退出系统,返回主界面*/
default: printf("输入错误,请重试!\n");
}
}
}
/*==================================================================*/
这是我以前写的,有点类似。希望能帮到您!
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#include <string.h>
struct scorenode
{
int number; /*学号*/
char name[10]; /*姓名*/
float physics; /*物理成绩*/
float English; /*英语成绩*/
float maths; /*数学成绩 */
struct scorenode *next;
};
typedef struct scorenode score;
int n; /* n为全局变量 */
void swap(score *max, score *p )
{
int k;
char t[10];
float temp;
k=max->number; /*交换结点中的学号值*/
max->number=p->number;
p->number=k;
strcpy(t,max->name); /*交换结点中的姓名*/
strcpy(max->name,p->name);
strcpy(p->name,t);
temp=max->physics; /*交换前后结点中的物理成绩*/
max->physics=p->physics;
p->physics=temp;
temp=max->English; /*交换结点中的英语成绩*/
max->English=p->English;
p->English=temp;
temp=max->maths; /*交换结点中的数学成绩*/
max->maths=p->maths;
p->maths=temp;
printf("*********************************");
}
/*=================================================================*/
int save(score *p1) /* 保存学生的资料 */
{
FILE *fp;
char filepn[20]; /*用来存放文件保存路径以及文件名*/
printf("请输入文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->physics,
p1->English,p1->maths);
p1=p1->next; /*下移一个结点*/
}
fclose(fp);
printf("文件已保存!\n");
return 0;
}
/*==================================================================*/
void print_s(score *head) /* 显示学生成绩 */
{
score *p;
if(head==NULL)
printf("\n没有任何学生资料!\n");
else
{
printf("\n输入的学生人数为%d\n",n);
printf("-------------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|\n");
printf("------------------------------------------\n"); /*打印表格域*/
p=head;
do
{
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->physics,
p->English,p->maths);
printf("--------------------------------------\n");/*打印表格域*/
p=p->next;
} while (p!=NULL); /*打印结束*/
}
}
/*==================================================================*/
score *sort(score *head) /*排序, 返回链表的头指针*/
{
score *p,*max,*temp;
int i,j,k,x;
if(head==NULL)
{
printf("\n没有任何学生资料,请先建立链表!\n");
return 0;
} /*链表为空*/
max=p=head;
for(i=0;i<80;i++)
printf("*");
printf("1按学生学号排序\t2按学生姓名排序\t3按物理成绩排序\n");
printf("4按英语成绩排序\t5按数学成绩排序\t\n");
for(i=0;i<80;i++ )
printf("*");
printf("请选择操作:");
scanf("%d",&x); /*选择操作*/
getchar();
switch(x) /*用switch语句实现功能选择*/
{
case 1 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++)
{
p=p->next;
if(max->number>p->number)
swap(max,p);
}
}
print_s(head); break; /*打印排序后的链表内容*/
case 2 :
for(i=1;i<n;i++)
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(strcmp(max->name,p->name)>0) swap(max,p);
}
}
print_s(head); break;
case 3 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(max->physics>p->physics)
swap(max,p);
}
}
print_s(head); break;
case 4 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(max->English>p->English)
swap(max,p);
}
}
print_s(head); break;
case 5 :
for(i=1;i<n;i++ )
{
temp=head;
for(k=0;k<i-1;k++)
{
temp=temp->next;
}
max=p=temp;
for(j=i+1;j<=n;j++ )
{
p=p->next;
if(max->maths>p->maths)
swap(max,p);
}
}
print_s(head); break;
}
save(head);
return(head);
}
/*===============================================================*/
score *create(void) /* 创建链表,并返回链表的头指针 */
{
score *head;
score *p1,*p2,*p3;
int i;
n=0; head=NULL;
p1=p2=p3=(score *)malloc(LEN); /*开辟一个新单元*/
while(1)
{
printf("请输入学生资料,输0退出!\n");
repeat: printf("请输入学生学号(学号应大于0):");
scanf("%d",&p1->number);
while(p1->number<0)
{
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);
}
if (p1->number==0)
goto endd; /*当输入的学号为0时,结束创建链表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++ )
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat; /*当输入的学号已经存在,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name); /*输入学生姓名*/
printf("请输入物理,英语,数学成绩(0~100):");
/*输入三门课成绩,成绩应在0-100*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
while(p1->physics<0||p1->physics>100|| p1->English<0||p1->English>100
|| p1->maths<0|| p1->maths >100)
{
printf("输入错误,请重新输入成绩");
/*输入错误,重新输入成绩直到正确为止*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
}
n=n+1;
if(n==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=(score *)malloc(LEN);
}
endd:
p2->next=NULL;
save(head);
return(head);
}
/*===============================================================*/
score *load(score *head) /*从文件读入学生记录*/
{
score *p1,*p2;
int m=0;
char filepn[10];
FILE *fp;
printf("请输入文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"r"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
printf(" \t\t成绩管理系统 ");
printf("\t专业: 计11 \n");
printf("-----------------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|\n");
printf("-----------------------------------------------------------\n");
/*文件读入与显示*/
head=NULL;
p1=p2=(score *)malloc(LEN); /*开辟一个新单元*/
while(!feof(fp))
{
fscanf(fp,"%d\t%s\t%f\t%f\t%f\t\n",&p1->number,p1->name,
&p1->physics,&p1->English,&p1->maths);
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,
p1->physics,p1->English,p1->maths);
m=m+1;
if(m==1) head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=(score *)malloc(LEN); /*开辟一个新单元*/
}
p2->next=NULL;
printf("--------------------------------------------------\n");/*表格下线*/
fclose(fp); /*结束读入,关闭文件*/
n=n+m;//更新学生记录的数目
return (head);
}
/*===============================================================*/
score *add(score *head,score *stu) /*追加学生资料,并且将所有学生资料按学号排序*/
{
score *p0,*p1, *p3;
int i;
p1=head;
while(1)
{
p1=stu=(score *)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!");
repeat2:
printf("请输入学生学号(学号应大于0):");
scanf("%d",&stu->number);
while(p1->number<0)
{
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number); /*输入学号为字符或小于0时,提示重新输入学号*/
}
if (p1->number==0)
break; /*当输入的学号为0时,结束创建链表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++ )
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat2; /*当输入的学号已经存在,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name); /*输入学生姓名*/
printf("请输入物理,英语,数学成绩(0~100):");
/*输入三门课成绩,成绩应在0-100*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
while(p1->physics<0||p1->physics>100|| p1->English<0||p1->English>100
|| p1->maths<0|| p1->maths >100)
{
printf("输入错误,请重新输入成绩"); /* 重新输入成绩直到正确为止*/
scanf("%f,%f,%f",&p1->physics, &p1->English,&p1->maths);
}
p1->next=NULL;
p0=head;
if (p0==NULL)
head=p1;
else
{
while (p0->next!=NULL)
p0=p0->next;
p0->next=p1;
}
n=n+1;
}
printf("现在的学生数为:%d个!\n",n);
sort(head);
save(head);
return(head);
}
/*================================================================*/
score *search(score *head) /* 查询学生成绩 */
{
int number;
score *p1,*p2;
printf("输入要查询的学生的学号:");
scanf("%d",&number);
printf("-------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|\n");
printf("---------------------------------------------------\n");/*打印表格域*/
while(number!=0)
{
if(head==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(number==p1->number)
{
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,
p1->physics,p1->English,p1->maths);
printf("-----------------------------------------------------\n");
} /*打印表格域*/
else
printf("%d不存在此学生!\n",number);
printf("输入要查询的学生的学号:");
scanf("%d",&number);
}
printf("退出查询!\n");
return(head);
}
/*===============================================================*/
score *del(score *head) /* 删除学生资料 */
{
score *p1,*p2;
int number;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
while(number!=0) /*输入学号为0时退出*/
{
if (head==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
/*p1指向的不是所要找的首结点,并且后面还有结点*/
{p2=p1;p1=p1->next; } /*p1后移一个结点*/
if(number==p1->number) /*找到了*/
{
if(p1==head)
head=p1->next; /*若p1指向的是首结点,把第二个结点地址赋予head*/
else
p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址域*/
n=n-1;
}
else
printf("很抱歉,未能找到该学号的记录。\n");
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
}
printf("现在的学生数为:%d个!\n",n);
save( head);
return(head);
}
/*================================================================*/
score *statistics(score *head)
/* 统计学生成绩,包括:个人总分和平均分、单科平均分、总分最高分、总分最低分*/
{
float sum,sum1=0,sum2=0,sum3=0,ave,ave1=0,ave2=0,ave3=0,max=0,min=1000;
score *p;
int y=0,i=0;
p=head;
if(head==NULL) /*链表为空*/
{
printf("\n没有任何学生资料!\n");return(head);
}
else
{
printf("--------------------------------------------------------------\n");
printf("\t|学号\t\t|姓名\t|物理\t|英语\t|数学\t|总分\t|平均分\t|\n");
printf("--------------------------------------------\n");/*打印表格域*/
while(p!=NULL)
{
sum=p->physics+p->English+p->maths; /*计算个人总分*/
ave=sum/3;/*计算个人平均分*/
printf("\t|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,
p->name,p->physics,p->English,p->maths,sum,ave); /*打印结果*/
printf("------------------------------------------------------\n");
sum1=sum1+p->physics;
sum2=sum2+p->English;
sum3=sum3+p->maths; /*计算总分*/
y=y+1;
if (max<sum) max=sum;
else if (min>sum) min=sum;
p=p->next;
}
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*计算平均分*/
printf("物理平均分是%.1f\n",ave1);
printf("英语平均分是%.1f\n",ave2);
printf("数学平均分是%.1f\n",ave3); /*打印结果*/
printf("总分最高分:%.1f\n",max);
printf("总分最低分:%.1f\n",min);
printf("\n");
}
return(head);
}
/*==================================================================*/
int menu( ) /* 菜单选择界面 */
{
int i,k;
printf("\t\t\t欢迎进入成绩管理系统\n\n\t\t考试成绩管理系统");
printf("\t专业 计11\n");
for(i=0;i<80;i++ )
printf("*");
printf("1输入学生的资料\t\t\t2从文件调入资料\t\t\t3查询学生的成绩\n");
printf("4删除学生的资料\t\t\t5追加学生的资料\t\t\t6显示学生的成绩\n");
printf("7统计学生的成绩\t\t\t8保存输入的资料\t\t\t9对成绩进行排序\n");
for(i=0;i<80;i++ )
printf("*");
printf("请选择您的操作(0退出)");
scanf("%d",&k);/*选择操作*/
getchar( );
return (k);
}
/*==============================================================*/
void main() /*调用creat,search,del,add,print,ststistics,save,taxis等函数,实现成绩管理 */
{
score *head=NULL,*stu=NULL;
int k;
while(1)
{
k=menu( );
switch(k) /*用switch语句实现功能选择*/
{
case 1: head=create( );break; /*调用创建链表函数*/
case 2: head=load(head);break; /*调用从文件读入记录哈函数*/
case 3: head=search(head);break; /*调用成绩查询函数*/
case 4: head=del(head); break; /*调用删除学生资料函数*/
case 5: head=add(head,stu);break; /*调用追加学生资料函数*/
case 6: print_s(head); break; /*调用显示学生资料函数*/
case 7: statistics(head); break; /*调用统计函数*/
case 8: save(head);break; /*调用保存函数*/
case 9: sort(head);break; /*调用排序函数*/
case 0: exit(0); /*退出系统,返回主界面*/
default: printf("输入错误,请重试!\n");
}
}
}
/*==================================================================*/
这是我以前写的,有点类似。希望能帮到您!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询