#include<Stdio.h>
#include<Conio.h>
#include<math.h>
#include<string.h>
#define mall (xue *)malloc(sizeof(xue))
int n,r=0; char k[15][7]; /*n是学科的数目,r是在这个成绩表里的总人数,k[15][7]里存储了学科名称(每学科名不长于3个汉字或6个英文字母)*/
typedef struct node
{
int no; /*学号*/
char name[9];
char sex[5];
float kj[15];/*15为最大科目数,各科成绩*/
struct node *next;
}xue;
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
xue *shu(xue *head) /*输入数据函数*/
{
int j,c,i;
xue *p1,*p2,*p3,*p4;
ji3: p1=mall;p2=head;
if(p2->next!=NULL) /*先找到最后一个位置 */
p2=p2->next;
printf("\n注意:分数和学号等必须是数字,否则会出错\n");
ji2: printf("请输入学生学号(学号应大于0且小于10000):");/*输入学号,学号应大于0*/
scanf("%d",&p1->no);
while(p1->no<0||p1->no>9999)
{getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->no);}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->no==0)
goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/
else if(head->next!=NULL)
{
p3=head;
do
{
p3=p3->next;
if(p3->no==p1->no)
{printf("学号重复,请重输!\n");
goto ji2;}
}
while(p3->next!=NULL);
} /*学号输入到此为止*/
printf("请输入学生姓名:");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入学生性别:");
scanf("%s",&p1->sex);/*输入学生性别*/
for(i=0;i<n;i++) /*输入各科成绩*/
{
printf("请输入%s成绩(0---150分):",k[i]);
scanf("%f",&p1->kj[i]);
while(p1->kj[i]<0||p1->kj[i]>150)
{ getchar();
printf("输入错误,请重新输入成绩");
scanf("%f",&p1->kj[i]);
}/*输入错误,重新输入成绩直到正确为止*/
}
printf("\n输入是否有误?如果要重新输入请你选择:要: 1. 不要:其它数字.\n请输入你的选择:");
scanf("%d",&c);
if(c==1) goto ji2;
p1->next=p2->next;
p2->next=p1;
r++; /*记录人数*/
printf("\n你是否还要输入学生成绩资料,是: 1, 不是: 0\t\t请输入:");
scanf("%d",&c);
if(c==1) goto ji3;
end: for(j=1;r>1&&j<r;j++) /*主要用来按学号排好顺序来存储*/
{
p4=head;p2=p4->next;p3=p2->next;
while(p2->next!=NULL)
{
if(p2->no>p3->no)
{p2->next=p3->next;p4->next=p3;p3->next=p2;}
p4=p4->next;p2=p4->next;p3=p2->next;
}
}
printf("\n现在共有学生成绩资料有%d个\n",r);
getch();
return head;
}
min() /*用来建立学生成绩的学科数目和学科名称的函数*/
{
int i; /*n为科目总数,k[i]存储了科目的名称*/
ji1: printf("请输入科目总数(不要超过15科): ");
scanf("%d",&n); /*输入科目总数(不要超过15科)*/
for(i=0;i<n;i++)
{
printf("请输入第%d科的名称(名字为3个汉字或6个英文字母)\n",i+1);
scanf("%s",k[i]); /*输入第学科的名称*/
}
printf("请你查看是否有误,如果要重新输入请按0,按其它数字键继续\n");
scanf("%d",&i);
if(i==0) goto ji1;
}
xue *jian(xue *head) /*建立学生成绩资料函数*/
{
int i;
head=mall;
head->next=NULL;
min(); /*先为你的成绩表定学科数目和学科名称*/
head=shu(head); /*输入数据*/
printf("你要保存这个成绩表吗?要:1,不要:其它数字.\n请你输入:");
scanf("%d",&i);
if(i==1) save(head); /*保存成绩表*/
return head;
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
save(xue *head) /*保存成绩表*/
{
FILE *fp;
xue *p=head;
int i,j;
char file[30]; /*用来存放文件保存路径以及文件名*/
printf("请输入文件路径及文件名:");
scanf("%s",file);
if((fp=fopen(file,"wb"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
fprintf(fp,"%d\t%d\t",r,n); /*把人数和学科总数输到文件中去*/
for(j=0;j<n;j++)
{
fprintf(fp,"\t%s",k[j]); /*把学科名称输到文件中去*/
}
fprintf(fp,"\n");
for(i=0;i<r;i++) /*r为总的人数,n为科目总数*/
{ /*把成绩和姓名等输到文件中去*/
p=p->next;
fprintf(fp,"%d\t%s\t%s\t",p->no,p->name,p->sex);
for(j=0;j<n;j++)
fprintf(fp,"%.1f\t",p->kj[j]);
fprintf(fp,"\n");
}
fclose(fp);
printf("文件已经保存!\n");
getch();
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
xue *load(xue *head) /*打开文件*/
{
FILE *fp;
xue *p,*p1;
int i,j;
char file[30]; /*用来存放文件保存路径以及文件名*/
p=head;
printf("请输入文件路径及文件名:");
scanf("%s",file);
if((fp=fopen(file,"rb+"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
printf(" 考试成绩管理系统 \n");
printf("---------------------------------------------------------------------------\n");
printf("----------------------------------------------------------------------------\n");
fscanf(fp,"%d",&r);fscanf(fp,"%d",&n); /*从文件中提取人数和科目总数*/
for(j=0;j<n;j++)
{
fscanf(fp,"%s",&k[j]); /*从文件中提取学科名称*/
}
for(i=0;i<r;i++)
{
p1=mall;
p1->next=NULL;
fscanf(fp,"%d",&p1->no);
fscanf(fp,"%s",&p1->name); /*从文件中提取学生成绩信息*/
fscanf(fp,"%s",&p1->sex);
for(j=0;j<n;j++)
fscanf(fp,"%f",&p1->kj[j]);
p->next=p1;
p=p->next;
}
fclose(fp);
printf("文件读取成功!\n要显示结果吗:要:1; 不要:其它数字. \n输入你的选择: ");
scanf("%d",&i);
if(i==1) prin(head);
getch();
return(head);
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
prin(xue *head) /*显示学生成绩表*/
{
xue *p=head;
int i,j;
if(head->next==NULL)
{
printf("\n没有任何学生资料!\n");
return ;
}
printf("共有%d个人和%d科学科\n",r,n); /*显示学生和学科的总数*/
for(i=0,p=head;i<r;i++) /*r为总的人数,n为科目总数*/
{
p=p->next;
printf("学号:%d \t 姓名:%s\t性别:%s ",p->no,p->name,p->sex);
for(j=0;j<n;j++)
{printf("\t%s:",k[j]);printf("%.1f",p->kj[j]);} /*显示学生成绩信息*/
printf("\n\n");
}
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
/*删除一个学生的资料*/
xue *del(xue *head)/*函数del,功能:删除学生资料*/
{
xue *p1,*p2;
int number,i;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
getchar();
while(number!=0)/*输入学号为0时退出*/
{
if(head->next==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
p2=head;
p1=head->next;
while(number!=p1->no&&p1->next!=NULL) /*p1指向的不是所要找的首结点,并且后面还有结点*/
{
p2=p1;p1=p1->next;
} /*p1后移一个结点*/
if(number==p1->no) /*找到了*/
{
if(p1==head->next)
head->next=p1->next; /*若p1指向的是首结点,把地二个结点地址赋予head*/
else
p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址*/
free(p1); /*释放删除的结点*/
printf("\n%d已经删除了.\n",number);r=r-1;
}
else
printf("学号为%d的学生不存在!如果要建立该学生号,请先返回!\n",number);
/*找不到该结点*/
printf("如果还要删除,请输入要删除的学生的学号,返回请按0:");
scanf("%d",&number);
getchar();
}
printf("你要保存你的修改吗?要:1,不要:其它数字.\n请你输入:");
scanf("%d",&i);
if(i==1) save(head);
printf("现在的学生数为:%d个!\n",r);
return(head);
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
xue *add(xue *head) /*增加学生成绩资料的函数*/
{
int i;
head=shu(head); /*调用shu输入函数,先输入要增加的学生的成绩资料*/
printf("你要保存你的修改吗?要:1,不要:其它数字.\n请你输入:");
scanf("%d",&i);
if(i==1) save(head); /*保存新增加的资料*/
return(head);
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
pai(xue *head,int a,int i) /*查看学号是a,第i科的排名*/
{
xue *p1;
float f,f1=0,f2=0;
int j=1,l,u=1;
p1=head->next;
while(p1->no!=a)
p1=p1->next;
f=p1->kj[i]; /*找到学号为 a 的学生,并用 f 记录 i 这个学生的这科成绩*/
for(l=0;l<n;l++)
f1=f1+p1->kj[l]; /*记录这个学生的总成绩*/
p1=head->next;
while(p1!=NULL)
{
f2=0;
for(l=0;l<n;l++) f2=f2+p1->kj[l]; /* f2 计算每个学生的总成绩*/
if(f<p1->kj[i]) j++; /*总成绩比较,用j记录总成绩排名*/
if(f1<f2) u++; /*各科成绩排名,用u来记录排名*/
p1=p1->next;
}
if(i<0) printf("\t总分是%.1f 第%d名\t",f1,u); /*如果i传入的值是小于0,就做总分排名*/
else printf("%s第%d名\t",k[i],j); /*i>0就做各科排名*/
}
xue *cha(xue *head) /*用来查看学生成绩的函数*/
{
int a,j;
xue *p=head,*p1;
if(head->next==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
ji4: printf("\n输入你要查找的学生学号(1---10000):");
scanf("%d",&a);
if(a<1||a>10000) {printf("输入的学号错误");goto ji4; }
p1=head->next;
while(p1->no!=a&&p1->next!=NULL) /*查找学生*/
p1=p1->next;
if(p1->no==a) /*找到了学生*/
{ /*显示学生成绩及总分,总分排名*/
printf("学号:%d\t姓名:%s\t性别:%s\t",p1->no,p1->name,p1->sex);
for(j=0;j<n;j++)
{printf("\t%s:",k[j]);printf("%.1f",p1->kj[j]);}
printf("\n\n");
pai(head,p1->no,-1);
for(j=0;j<n;j++) pai(head,p1->no,j);
printf("\n\n");
getch();
printf("请你选择你要做的:1为继续查找学生成绩;选其它数字返回再进行其它操作(删除,修改,退出等);");
scanf("%d",&j);
if(j==1) goto ji4;
}
else /*如果输入的学号没找到*/
{printf("\n学号为%d的学生不存在!\n你要继续查找吗?要:1,不要:0。\n请选择:",a);
scanf("%d",&j);
if(j==1) goto ji4;
}
return(head);
}
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
[此贴子已经被作者于2006-5-18 22:10:23编辑过]