c语言程序

求一段程序,是关于学生成绩管理的
能输入学号 姓名 性别 数学成绩 英语成绩 软件成绩:能追加记录
能检索
能进行统计分析(求平均值,顺序给出每门课程成绩前三名的学生名单)
能退出。
只要要求的程序
<br>不要多余,我没有学过,摆脱

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
#include <string.h>
struct scorenode
{int number;/*学号*/
char name[10];/*姓名*/
float cyuyan;/*c成绩*/
float vbyuyan;/*vb成绩*/
float sqlyuyan;/*sql成绩 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/
/*==============================================================================================*/
score *creat2311(void)
/*函数creat2311,功能:创建链表,此函数带回一个指向链表头的指针*/
{
score*head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3; /*开辟一个新单元*/
printf("请输入学生资料,输0退出!\n");
repeat1: printf("请输入学生学号(学号应大于0):");/*输入学号,学号应大于0*/
scanf("%d",&p1->number);
while(p1->number<0)
{getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)
goto end;/*当输入的学号为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 repeat1;
/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入c成绩(0~100):");/*输入c成绩,成绩应在0-100*/
scanf("%f",&p1->cyuyan);
while(p1->cyuyan<0||p1->cyuyan>100)
{getchar();
printf("输入错误,请重新输入c成绩");/*输入错误,重新输入c成绩直到正确为止*/
scanf("%f",&p1->cyuyan);}
printf("请输入vb成绩(0~100):");/*输入vb成绩,成绩应在0-100*/
scanf("%f",&p1->vbyuyan);
while(p1->vbyuyan<0||p1->vbyuyan>100)
{getchar();
printf("输入错误,请重新输入vb成绩");/*输入错误,重新输入vb成绩直到正确为止*/
scanf("%f",&p1->vbyuyan);}
printf("请输入sql成绩(0~100):");/*输入sql成绩,成绩应在0-100*/
scanf("%f",&p1->sqlyuyan);
while(p1->sqlyuyan<0||p1->sqlyuyan>100)
{getchar();
printf("输入错误,请重新输入sql成绩");
scanf("%f",&p1->sqlyuyan);}/*输入错误,重新输入sql成绩直到正确为止*/
head=NULL;
while(p1->number!=0)
{
n=n+1;
if(n==1)
head=p1;
else

p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
printf("请输入学生资料,输0退出!\n");
repeat2:printf("请输入学生学号(学号应大于0):");
scanf("%d",&p1->number);/*输入学号,学号应大于0*/

while(p1->number<0)
{getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)
goto end;/*当输入的学号为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("请输入c成绩(0~100):");
scanf("%f",&p1->cyuyan);/*输入c成绩,成绩应在0-100*/
while(p1->cyuyan<0||p1->cyuyan>100)
{getchar();
printf("输入错误,请重新输入c成绩");
scanf("%f",&p1->cyuyan);}/*输入错误,重新输入c成绩直到正确为止*/
printf("请输入vb成绩(0~100):");
scanf("%f",&p1->vbyuyan);/*输入vb成绩,成绩应在0-100*/
while(p1->vbyuyan<0||p1->vbyuyan>100)
{getchar();
printf("输入错误,请重新输入vb成绩");
scanf("%f",&p1->vbyuyan);}/*输入错误,重新输入vb成绩直到正确为止*/
printf("请输入sql成绩(0~100):");
scanf("%f",&p1->sqlyuyan);/*输入sql成绩,成绩应在0-100*/
while(p1->sqlyuyan<0||p1->sqlyuyan>100)
{getchar();
printf("输入错误,请重新输入sql成绩");
scanf("%f",&p1->sqlyuyan);}/*输入错误,重新输入sql成绩直到正确为止*/

}

end: p1=head;
p3=p1;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;

if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/

strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->cyuyan;
max->cyuyan=p1->cyuyan;
p1->cyuyan=fen;
/*交换前后结点中的c成绩,使之与学号相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p1->vbyuyan;
p1->vbyuyan=fen;
/*交换前后结点中的vb成绩,使之与学号相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p1->sqlyuyan;
p1->sqlyuyan=fen;
/*交换前后结点中的sql成绩,使之与学号相匹配*/
}

}
max=head;p1=head;/*重新使max,p指向链表头*/
}
p2->next=NULL;/*链表结尾*/
printf("输入的学生数为:%d个!\n",n);
return(head);

}
/*==============================================================================================*/
/*==============================================================================================*/
score *load2311(score *head)
/*函数load2311,功能:从文件读入学生记录*/
{ 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;
}
fscanf(fp," 考试成绩管理系统 \n");
fscanf(fp,"作者:欣杰 班级: 信息E3 学号:24 \n");
fscanf(fp,"-----------------------------------------\n");
fscanf(fp,"|学号\t|姓名\t|c\t|vb\t|sql\t|\n");
fscanf(fp,"-----------------------------------------\n");/*读入表格域*/
printf(" 考试成绩管理系统 \n");
printf(" 作者:欣杰 班级: 信息E3 学号:24 \n");
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*打印表格域*/
m=m+1;
if(m==1)
{

p1=(score *)malloc(LEN); /*开辟一个新单元*/
fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->cyuyan,&p1->vbyuyan,&p1->sqlyuyan);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
/*文件读入与显示*/
head=NULL;
do
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN); /*开辟一个新单元*/
fscanf(fp,"%d%s%f%f%f\n",&p1->number,p1->name,&p1->cyuyan,&p1->vbyuyan,&p1->sqlyuyan);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
/*文件读入与显示*/
}while(!feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}printf("-----------------------------------------\n");/*表格下线*/
fclose(fp);/*结束读入,关闭文件*/

return (head);
}

/*==============================================================================================*/
/*==============================================================================================*/
score *add2311(score *head,score *stu)
/*函数add2311,功能:追加学生资料,并且将所有学生资料按学号排序*/
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];

p3=stu=(score *)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!");
repeat4: printf("请输入学生学号(学号应大于0):");
scanf("%d",&stu->number);
/*输入学号,学号应大于0*/
while(stu->number<0)
{getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&stu->number);}/*输入错误,重新输入学号*/
/******************************************************/
if(stu->number==0)
goto end2;/*当输入的学号为0时,转到末尾,结束追加*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number)
p3=p3->next;
else
{printf("学号重复,请重输!\n");
goto repeat4;
/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}

}

/******************************************************/
printf("输入学生姓名:");
scanf("%s",stu->name); /*输入学生姓名*/
printf("请输入c成绩(0~100):");
scanf("%f",&stu->cyuyan); /*输入c成绩,成绩应在0-100*/
while(stu->cyuyan<0||stu->cyuyan>100)
{getchar();
printf("输入错误,请重新输入c成绩");
scanf("%f",&stu->cyuyan);} /*输入错误,重新输入c成绩直到正确为止*/
printf("请输入vb成绩(0~100):");
scanf("%f",&stu->vbyuyan);/*输入vb成绩,成绩应在0-100*/
while(stu->vbyuyan<0||stu->vbyuyan>100)
{getchar();
printf("输入错误,请重新输入vb成绩");
scanf("%f",&stu->vbyuyan);}/*输入错误,重新输入vb成绩直到正确为止*/
printf("请输入sql成绩(0~100):");
scanf("%f",&stu->sqlyuyan);/*输入sql成绩,成绩应在0-100*/
while(stu->sqlyuyan<0||stu->sqlyuyan>100)
{getchar();
printf("输入错误,请重新输入sql成绩");
scanf("%f",&stu->sqlyuyan);}/*输入错误,重新输入sql成绩直到正确为止*/
p1=head;
p0=stu;
if(head==NULL)
{head=p0;p0->next=NULL;}/*当原来链表为空时,从首结点开始存放资料*/
else/*原来链表不为空*/
{
if(p1->next==NULL)/*找到原来链表的末尾*/
{
p1->next=p0;
p0->next=NULL;/*将它与新开单元相连接*/
}
else
{
while(p1->next!=NULL)/*还没找到末尾,继续找*/
{
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}

}
n=n+1;

p1=head;
p0=stu;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;

if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/

strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->cyuyan;
max->cyuyan=p1->cyuyan;
p1->cyuyan=fen;
/*交换前后结点中的c成绩,使之与学号相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p1->vbyuyan;
p1->vbyuyan=fen;
/*交换前后结点中的vb成绩,使之与学号相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p1->sqlyuyan;
p1->sqlyuyan=fen;
/*交换前后结点中的sql成绩,使之与学号相匹配*/
}

}
max=head;p1=head;/*重新使max,p指向链表头*/
} end2:
printf("现在的学生数为:%d个!\n",n);
return(head);

}
/*==============================================================================================*/
/*==============================================================================================*/
score *search2311(score *head)
/*函数search2311,功能:查询学生成绩*/
{int number;
score *p1,*p2;
printf("输入要查询的学生的学号,");
scanf("%d",&number);

while(number!=0)
{
if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}

printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*打印表格域*/
p1=head;
while(number!=p1->number&&p1->next!=NULL)

{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
printf("-----------------------------------------\n");}/*打印表格域*/
else
printf("%d不存在此学生!\n",number);

printf("输入要查询的学生的学号,");
scanf("%d",&number);
}
printf("已经退出了!\n");
return(head);}

/*==============================================================================================*/
/*==============================================================================================*/
score *del2311(score *head)/*函数del2311,功能:删除学生资料*/
{
score *p1,*p2;
int number;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
getchar();
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;
/*否则将下一个结点地址 赋给前一结点地址*/
printf("删除:%d\n",number);n=n-1;
}
else
printf("%d不存在此学生!\n",number);
/*找不到该结点*/

printf("输入要删除的学生的学号:");
scanf("%d",&number);
getchar();
}
#ifdef DEBUG
printf("已经退出了!\n");
#endif
printf("现在的学生数为:%d个!\n",n);
return(head);
}

/*==============================================================================================*/
/*==============================================================================================*/
void print2311(score *head)
/*函数print2311,功能:显示学生成绩*/
{
score *p;
if(head==NULL)
{printf("\n没有任何学生资料!\n");}
else
{printf("%d\n",n);
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*打印表格域*/
p=head;
do
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cyuyan,p->vbyuyan,p->sqlyuyan);
printf("-----------------------------------------\n");/*打印表格域*/
p=p->next;}while (p!=NULL);/*打印完成了*/
}
}
/*==============================================================================================*/
/*==============================================================================================*/
score *statistics2311(score *head)
/*函数statistics2311,功能:统计学生成绩*/
{
float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min;
score *p;
int x,y=0,i=0;

p=head;
printf("1个人总分和平均分\t2单科平均分\t3总分最高分\t4总分最低分\n");
scanf("%d",&x);
getchar();

switch(x)
/*用switch语句实现功能选择*/
{
case 1: if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
else
{
printf("---------------------------------------------------------\n");
printf("|学号\t|姓名\t|c\t|vb\t|sql\t|总分\t|平均分\t|\n");
printf("---------------------------------------------------------\n");/*打印表格域*/
while(p!=NULL)
{
sum1=p->cyuyan+p->vbyuyan+p->sqlyuyan; /*计算个人总分*/
ave1=sum1/3;/*计算个人平均分*/

printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cyuyan,p->vbyuyan,p->sqlyuyan,sum1,ave1);
/*打印结果*/
printf("---------------------------------------------------------\n");/*打印表格域*/
p=p->next;}
}

return(head); break;
case 2: if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
while(p!=NULL)
{
sum1=sum1+p->cyuyan;
sum2=sum2+p->vbyuyan;
sum3=sum3+p->sqlyuyan;/*计算总分*/
y=y+1;
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*计算平均分*/
p=p->next;/*使p指向下一个结点*/
}
printf("c平均分是%.1f\n",ave1);
printf("vb平均分是%.1f\n",ave2);
printf("sql平均分是%.1f\n",ave3);/*打印结果*/
return(head); break;
case 3:
if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
max=p->cyuyan+p->vbyuyan+p->sqlyuyan;
while(i<n)
{
i=i+1;
sum1=p->cyuyan+p->vbyuyan+p->sqlyuyan; /*计算个人总分*/
if(max<sum1)
max=sum1;
p=p->next;
}

printf("总分最高分:%.1f",max);
printf("\n");
return(head); break;

case 4: if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
while(p!=NULL)
{
min=p->cyuyan+p->vbyuyan+p->sqlyuyan;
while(p!=NULL)
{sum2=p->cyuyan+p->vbyuyan+p->sqlyuyan;

if(min>sum2)
min=sum2;
p=p->next;
}
}

printf("总分最低分:%.1f",min);
printf("\n");
return(head); break;

default :printf("输入错误,请重试!\n");
}
return(head);

}

/*==============================================================================================*/
/*==============================================================================================*/

save2311(score *p1)
/*函数save2311,功能:保存学生的资料*/
{
FILE *fp;

char filepn[20];/*用来存放文件保存路径以及文件名*/

printf("请输入文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w+"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}

fprintf(fp," 考试成绩管理系统 \n");
fprintf(fp," 作者:欣杰 班级: 信息E3 学号:24 \n");
fprintf(fp,"-----------------------------------------\n");
fprintf(fp,"|学号\t|姓名\t|c\t|vb\t|sql\t|\n");
fprintf(fp,"-----------------------------------------\n");
/*打印表格域*/
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);

p1=p1->next;/*下移一个结点*/

}
fclose(fp);
printf("文件已经保存!\n");
return 0;
}
/*==============================================================================================*/
/*==============================================================================================*/
score *taxis2311(score *head)
/*定义排序函数。此函数带回一个指向链表头的指针*/
{ score *p,*max;
int i,j,x;
float fen;
char t[10];
if(head==NULL)
{printf("\n没有任何学生资料,请先建立链表!\n");return(head);}/*链表为空*/
max=p=head;

for(i=0;i<80;i++)
printf("*");
printf("1按学生学号排序\t2按学生姓名排序\t3按c成绩排序\n");
printf("4按vb成绩排序\t5按sql成绩排序\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++)
{
for(j=i+1;j<=n;j++)
{
max=p;
p=p->next;

if(max->number>p->number)
{
k=max->number;
max->number=p->number;
p->number=k;
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/

strcpy(t,max->name);
strcpy(max->name,p->name);
strcpy(p->name,t);
/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->cyuyan;
max->cyuyan=p->cyuyan;
p->cyuyan=fen;
/*交换前后结点中的c成绩,使之与学号相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p->vbyuyan;
p->vbyuyan=fen;
/*交换前后结点中的vb成绩,使之与学号相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p->sqlyuyan;
p->sqlyuyan=fen;
/*交换前后结点中的sql成绩,使之与学号相匹配*/
}

}
max=head;p=head;/*重新使max,p指向链表头*/
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-05-25
main()
{STUDENT *head,new;
head=init(); /*链表初始化,使head的值为NULL*/
for(;;) /*循环无限次*/
{switch(menu_select())
{
case 1:head=create();break;
case 2:print(head);break;
case 3:search(head);break;
case 4:head=delete(head);break;
case 5:head=sort(head);break;
case 6:head=insert(head,&new);break; /*&new表示返回地址*/
case 7:save(head);break;
case 8:head=load(); break;
case 9:exit(0); /*如菜单返回值为9则程序结束*/
}
}
}

/*初始化函数*/
STUDENT *init()
{
return NULL; /*返回空指针*/
}

/*菜单选择函数*/
menu_select()
{int n;
struct date d; /*定义时间结构体*/
getdate(&d); /*读取系统日期并把它放到结构体d中*/
printf("press any key to enter the menu......"); /*按任一键进入主菜单*/
getch(); /*从键盘读取一个字符,但不显示于屏幕*/
clrscr(); /*清屏*/
printf("********************************************************************************\n");
printf("\t\t Welcome to\n");
printf("\n\t\t The student score manage system\n");
printf("*************************************MENU***************************************\n");
printf("\t\t\t1. Enter the record\n"); /*输入学生成绩记录*/
printf("\t\t\t2. Print the record\n"); /*显示*/
printf("\t\t\t3. Search record on name\n"); /*寻找*/
printf("\t\t\t4. Delete a record\n"); /*删除*/
printf("\t\t\t5. Sort to make new a file\n"); /*排序*/
printf("\t\t\t6. Insert record to list\n"); /*插入*/
printf("\t\t\t7. Save the file\n"); /*保存*/
printf("\t\t\t8. Load the file\n"); /*读取*/
printf("\t\t\t9. Quit\n"); /*退出*/
printf("\n\t\t Made by Hu Haihong.\n");
printf("********************************************************************************\n");
printf("\t\t\t\t%d\\%d\\%d\n",d.da_year,d.da_mon,d.da_day); /*显示当前系统日期*/
do{
printf("\n\t\t\tEnter your choice(1~9):");
scanf("%d",&n);
}while(n<1||n>9); /*如果选择项不在1~9之间则重输*/
return(n); /*返回选择项,主函数根据该数调用相应的函数*/
}

/*输入函数*/
STUDENT *create()
{int i,s;
STUDENT *head=NULL,*p; /* 定义函数.此函数带回一个指向链表头的指针*/
clrscr();
for(;;)
{p=(STUDENT *)malloc(LEN); /*开辟一个新的单元*/
if(!p) /*如果指针p为空*/
{printf("\nOut of memory."); /*输出内存溢出*/
return (head); /*返回头指针,下同*/
}
printf("Enter the num(0:list end):");
scanf("%s",p->num);
if(p->num[0]=='0') break; /*如果学号首字符为0则结束输入*/
printf("Enter the name:");
scanf("%s",p->name);
printf("Please enter the %d scores\n",3); /*提示开始输入成绩*/
s=0; /*计算每个学生的总分,初值为0*/
for(i=0;i<3;i++) /*3门课程循环3次*/
{
do{
printf("score%d:",i+1);
scanf("%d",&p->score[i]);
if(p->score[i]<0 || p->score[i]>100) /*确保成绩在0~100之间*/
printf("Data error,please enter again.\n");
}while(p->score[i]<0 || p->score[i]>100);
s=s+p->score[i]; /*累加各门成绩*/
}
p->sum=s; /*将总分保存*/
p->average=(float)s/3; /*先用强制类型转换将s转换成float型,再求平均值*/
p->order=0; /*未排序前此值为0*/
p->next=head; /*将头结点做为新输入结点的后继结点*/
head=p; /*新输入结点为新的头结点*/
}
return(head);
}

/* 显示全部记录函数*/
void print(STUDENT *head)
{int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
clrscr();
p=head; /*初值为头指针*/
printf("\n************************************STUDENT************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
while(p!=NULL)
{
i++;
printf("| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("-------------------------------------------------------------------------------\n");
printf("**************************************END**************************************\n");
}

/*查找记录函数*/
void search(STUDENT *head)
{STUDENT *p; /* 移动指针*/
char s[5]; /*存放姓名用的字符数组*/
clrscr();
printf("Please enter name for searching.\n");
scanf("%s",s);
p=head; /*将头指针赋给p*/
while(strcmp(p->name,s) && p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(p!=NULL) /*如果指针不为空*/
{printf("\n*************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
}
else
printf("\nThere is no num %s student on the list.\n",s); /*显示没有该学生*/
}

/*删除记录函数*/
STUDENT *delete(STUDENT *head)
{int n;
STUDENT *p1,*p2; /*p1为查找到要删除的结点指针,p2为其前驱指针*/
char c,s[6]; /*s[6]用来存放学号,c用来输入字母*/
clrscr();
printf("Please enter the deleted num: ");
scanf("%s",s);
p1=p2=head; /*给p1和p2赋初值头指针*/
while(strcmp(p1->num,s) && p1 != NULL) /*当记录的学号不是要找的,或指针不为空时*/
{p2=p1; /*将p1指针值赋给p2作为p1的前驱指针*/
p1=p1->next; /*将p1指针指向下一条记录*/
}
if(strcmp(p1->num,s)==0) /*学号找到了*/
{printf("**************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
printf("Are you sure to delete the student Y/N ?"); /*提示是否要删除,输入Y删除,N则退出*/
for(;;)
{scanf("%c",&c);
if(c=='n'||c=='N') break; /*如果不删除,则跳出本循环*/
if(c=='y'||c=='Y')
{
if(p1==head) /*若p1==head,说明被删结点是首结点*/
head=p1->next; /*把第二个结点地址赋予head*/
else
p2->next=p1->next; /*否则将一下结点地址赋给前一结点地址*/
n=n-1;
printf("\nNum %s student have been deleted.\n",s);
printf("Don't forget to save.\n");break; /*删除后就跳出循环*/
}
}
}
else
printf("\nThere is no num %s student on the list.\n",s); /*找不到该结点*/
return(head);
}

/*排序函数*/
STUDENT *sort(STUDENT *head)
{int i=0; /*保存名次*/
STUDENT *p1,*p2,*t,*temp; /*定义临时指针*/
temp=head->next; /*将原表的头指针所指的下一个结点作头指针*/
head->next=NULL; /*第一个结点为新表的头结点*/
while(temp!=NULL) /*当原表不为空时,进行排序*/
{
t=temp; /*取原表的头结点*/
temp=temp->next; /*原表头结点指针后移*/
p1=head; /*设定移动指针p1,从头指针开始*/
p2=head; /*设定移动指针p2做为p1的前驱,初值为头指针*/
while(t->average<p1->average&&p1!=NULL) /*作成绩平均分比较*/
{
p2=p1; /*待排序点值小,则新表指针后移*/
p1=p1->next;
}
if(p1==p2) /*p1==p2,说明待排序点值大,应排在首位*/
{
t->next=p1; /*待排序点的后继为p*/
head=t; /*新头结点为待排序点*/
}
else /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/
{
t->next=p1; /*t的后继是p1*/
p2->next=t; /*p2的后继是t*/
}
}
p1=head; /*已排好序的头指针赋给p1,准备填写名次*/
while(p1!=NULL) /*当p1不为空时,进行下列操作*/
{
i++; /*结点序号*/
p1->order=i; /*将结点序号赋值给名次*/
p1=p1->next; /*指针后移*/
}
printf("Sorting is sucessful.\n"); /*排序成功*/
return (head);
}

/*插入记录函数*/
STUDENT *insert(STUDENT *head,STUDENT *new)
{STUDENT *p0,*p1,*p2;
int n,sum1,i;
p1=head; /*使p1指向第一个结点*/
p0=new; /*p0指向要插入的结点*/
printf("\nPlease enter a new record.\n"); /*提示输入记录信息*/
printf("Enter the num:");
scanf("%s",new->num);
printf("Enter the name:");
scanf("%s",new->name);
printf("Please enter the %d scores.\n",3);
sum1=0; /*保存新记录的总分,初值为0*/
for(i=0;i<3;i++)
{
do{
printf("score%d:",i+1);
scanf("%d",&new->score[i]);
if(new->score[i]>100||new->score[i]<0)
printf("Data error,please enter again.\n");
}while(new->score[i]>100||new->score[i]<0);
sum1=sum1+new->score[i]; /*累加各门成绩*/
}
new->sum=sum1; /*将总分存入新记录中*/
new->average=(float)sum1/3;
new->order=0;
if(head==NULL) /*原来的链表是空表*/
{head=p0;p0->next=NULL;} /*使p0指向的结点作为头结点*/
else
{while((p0->average<p1->average)&&(p1->next!=NULL))
{p2=p1; /*使p2指向刚才p1指向的结点*/
p1=p1->next; /*p1后移一个结点*/
}
if(p0->average>=p1->average)
{if(head==p1)head=p0; /*插到原来第一个结点之前*/
else p2->next=p0; /*插到p2指向的结点之后*/
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;} /*插到最后的结点之后*/
}
n=n+1; /*结点数加1*/
head=sort(head); /*调用排序的函数,将学生成绩重新排序*/
printf("\nStudent %s have been inserted.\n",new->name);
printf("Don't forget to save the new file.\n");
return(head);
}

/*保存数据到文件函数*/
void save(STUDENT *head)
{FILE *fp; /*定义指向文件的指针*/
STUDENT *p; /* 定义移动指针*/
char outfile[10];
printf("Enter outfile name,for example c:\\score\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,为只写方式*/
{
printf("Cannot open the file\n");
return; /*若打不开则返回菜单*/
}
printf("\nSaving the file......\n");
p=head; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,LEN,1,fp); /*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("Save the file successfully!\n");
}

/* 从文件读数据函数*/
STUDENT *load()
{STUDENT *p1,*p2,*head=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10];
printf("Enter infile name,for example c:\\score\n");
scanf("%s",infile);
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为只读方式*/
{
printf("Can not open the file.\n");
return(head);
}
printf("\nLoading the file!\n");
p1=(STUDENT *)malloc(LEN); /*开辟一个新单元*/
if(!p1)
{
printf("Out of memory!\n");
return(head);
}
head=p1; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(fread(p1,LEN,1,fp)!=1) break; /*如果没读到数据,跳出循环*/
p1->next=(STUDENT *)malloc(LEN); /*为下一个结点开辟空间*/
if(!p1->next)
{
printf("Out of memory!\n");
return (head);
}
p2=p1; /*使p2指向刚才p1指向的结点*/
p1=p1->next; /*指针后移,新读入数据链到当前表尾*/
}
p2->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp);
printf("You have success to read data from the file!\n");
return (head);
}
第2个回答  2007-05-23
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
class student
{ public:
char name[20];
double chinese,number;
public:
student(){}
student(char n[20],double nu,double chin)
{strcpy(name,n);
number=nu;
chinese=chin;
}
friend void main();
};

void main()
{
cout<<"请选择您需要的操作!"<<endl;

cout<<"\t\t\t**************************"<<endl;
cout<<"\t\t\t** 学生成绩管理系统 **"<<endl;
cout<<"\t\t\t**************************"<<endl;
cout<<"\t\t\t**************************"<<endl;
cout<<"\t\t\t**0、输入数据 **"<<endl;
cout<<"\t\t\t**1、增加数据 **"<<endl;
cout<<"\t\t\t**2、修改数据 **"<<endl;
cout<<"\t\t\t**3、按姓名查询 **"<<endl;
cout<<"\t\t\t**4、按学号查询 **"<<endl;
cout<<"\t\t\t**5、输出所有学生的成绩 **"<<endl;
cout<<"\t\t\t**6、统计及格和优秀人数 **"<<endl;
cout<<"\t\t\t**7、退出系统 **"<<endl;
cout<<"\t\t\t**************************"<<endl;
cout<<"选择0-7数字进行操作"<<endl;
char p;char w;
student *s[50];
ofstream *file[50];
int i=0;
int j=0;
bool flag2=0;
do
{
cin>>p;
if((p>='0'&&p<='10'))
flag2=1;
else
cout<<"指令错误!请重新输入:"<<endl;
}while(flag2==0);
do{
switch(p)
{
case '0':
{
char c;
char name[20];double number,chinese;
do{
cout<<"请输入姓名"<<endl;
cin>>name;
cout<<"请输入学号:"<<endl;
cin>>number;
cout<<"请输入语文成绩:"<<endl;
cin>>chinese;

file[j]=new ofstream("d:\document",ios::ate);
*file[j]<<"姓名"<<name<<"学号"<<number<<"语文成绩"<<chinese<<endl;
j++;
s[i]=new student(name, number, chinese);
i++;
cout<<"数据输入成功,想继续输入吗(y/n)"<<endl;
cin>>c;
flag2=0;
do
{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
else
flag2=1;
}while(flag2==0);
}while(c=='y');
break;
}

case '1':
{
char name[20];double number,chinese;
char c;
do
{
cout<<"请输入您要增加的学生的姓名:"<<endl;
cin>>name;
cout<<"请输入学号:"<<endl;
cin>>number;
cout<<"请输入语文成绩:"<<endl;
cin>>chinese;

file[j]=new ofstream("d:\document",ios::ate);
*file[j]<<"姓名"<<name<<"学号"<<number<<"语文成绩"<<chinese<<endl;
j++;
s[i]=new student(name, number, chinese);
i++;
cout<<"数据输入成功,想继续数入吗(y/n)"<<endl;
cin>>c;
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
}while(c=='y');
break;
}

case '2':
{
char name[20];double nu,chin,eng;flag2=0;
char c;
if(i==0)
{
cout<<"管理系统中没有输入数据!"<<endl;break;
}
do
{
cout<<"请输入您要修改的学生的姓名:"<<endl;
cin>>name;
for(int h=0;h<i;h++)
{
if(strcmp(name,s[h]->name)==0)
{
flag2=1;
cout<<"请输入新的学号:"<<endl;
cin>>nu;
cout<<"请输入新的语文成绩:"<<endl;
cin>>chin;

s[h]->chinese=chin;
s[h]->number=nu;

cout<<"数据修改成功!";
}
}
if(flag2==0)
{
cout<<"您要修改的学生本来就不存在!请检查重新输入!"<<endl;
}
cout<<"想继续修改吗(y/n)"<<endl;
cin>>c;
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
}while(c=='y');
break;
}

case '3':
{
char n[20];int j=0;char c;
if(i==0)
{
cout<<"管理系统中没有输入数据!"<<endl;break;
}
do{
int flag=0;
cout<<"请输入你要查询的学生姓名"<<endl;
cin>>n;
for(int j=0;j<i;j++)
{
if(strcmp(n,(*s[j]).name)==0)
{
flag=1;
cout<<"您要查询的学生是:"<<(*s[j]).name<<endl;
cout<<(*s[j]).name<<" 的成绩是: "<<(*s[j]).chinese<<endl;
}
}
if(flag==0)
cout<<"对不起!您要查询的学生不存在!"<<endl;
cout<<"您想继续查询吗?(y/n)"<<endl;
cin>>c;
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
}
while(c=='y');
break;
}
case '4':
{
int n,j=0;char c;
if(i==0){

cout<<"管理系统中没有输入数据!"<<endl;break;
}
do{
int flag=0;
cout<<"请输入你要查询的学生的学号"<<endl;
cin>>n;
for(int j=0;j<i;j++)
{
if(s[j]->number==n)
{
flag=1;
cout<<"您要查询的学生是:"<<(*s[j]).name<<endl;
cout<<(*s[j]).name<<" 的成绩是: "<<(*s[j]).chinese<<endl;
}
}
if(flag==0)
cout<<"对不起!您要查询的学生不存在!"<<endl;
cout<<"您想继续查询吗?(y/n)"<<endl;
cin>>c;
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
}
while(c=='y');
break;
}
case '5':
{
cout<<"本系统所有学生数据如下:"<<endl;
if(i==0)
cout<<"管理系统中没有输入数据!"<<endl;
for(int k=0;k<i;k++)
{
cout<<k+1<<" "<<"姓名:"<<" "<<s[k]->name<<" 学号:"<<" "<<s[k]->number
<<"语文:"<<" "<<s[k]->chinese
<<endl;
}
break;
}

case '6':
{
int good=0,jige=0;
if(i==0){

cout<<"管理系统中没有输入数据!"<<endl;break;
}
cout<<"本系统所有学生学号排名如下:"<<endl;
for(int x=0;x<i;x++)
{if(s[x]->chinese>=60)jige++;
if(s[x]->chinese>=90)good++;}

if(i==0)
cout<<"管理系统中没有输入数据或者数据已经被删除!";
cout<<"满90分的good students: "<<good<<"个人"<<endl;
cout<<"满60分的 students: "<<jige<<"个人"<<endl;
break;
}
case'7':
{exit(0);}
}
一等奖作品本回答被提问者采纳
第3个回答  2007-05-23
#include <stdio.h>

struct student
{
int no; //学号
char name[15]; //姓名
int score[3]; //三门课程的成绩
double avr; //平均成绩
};

struct student stu[50]; //声明一个结构数组变量

struct student input();
void display(struct student stud[],int count);
void sort(struct student stud[],int count);
void insert(struct student stud[],int count);
void del(struct student stud[],int count);

void main()
{
int count;
char ch;
ch='y';

printf("请输入学员信息。");
printf("\n");
count=0;
while ((ch=='y') || (ch=='Y'))
{

stu[count]=input(); //调用录入信息函数
count++;
printf("\n 是否继续?(y or n)");
scanf(" %c",&ch);
}
printf("\n排序前的学员信息如下:");
display(stu,count); //调用显示信息函数
sort(stu,count); //调用排序函数
printf("\n排序后的学员信息如下:");
display(stu,count);

printf("\n\n是否要插入新学员?(y or n)");
scanf(" %c",&ch);
if(ch=='y' || ch=='Y')
{
insert(stu,count); //调用插入信息函数
count++;
printf("\n插入新学员后的学员信息如下:");
display(stu,count);
}

printf("\n\n是否要删除某个学员?(y or n)");
scanf(" %c",&ch);
if(ch=='y' || ch=='Y')
{
del(stu,count); //调用删除信息函数
count--;
printf("\n删除后学员的信息如下:");
display(stu,count);
}
}

struct student input() //录入信息函数
{
struct student studn;
int sum,j;
printf("\n学号:");
scanf("%d",&studn.no);

printf("\n姓名:");
scanf("%s",studn.name);

printf("\n三门成绩:");
sum=0;
printf("\n");
for(j=0;j<3;j++)
{
printf("成绩%d: ",j+1);
scanf("%d",&studn.score[j]);
sum+=studn.score[j];
}
studn.avr=sum/3.0;
return studn;
}

void display(struct student stud[],int count) //显示信息函数
{
printf("\n学号\t姓名\t\t平均成绩");

printf("\n");
for(int i=0;i<count;i++)
{
printf("%-03d",stud[i].no);
printf("\t%-15s",stud[i].name);
printf("\t%-10.1f",stud[i].avr);
printf("\n");
}
}

void sort(struct student stud[],int count) //排序函数
{
/* 冒泡排序法*/
struct student t;
for(int i=0;i<count;i++)
{
for(int j=0;j<count-i-1;j++) //比较元素
{
if(stud[j].avr<stud[j+1].avr)
{
t=stud[j];
stud[j]=stud[j+1];
stud[j+1]=t;
}
}
}
}

void insert(struct student stud[],int count) //插入函数
{
/*插入一个学员的信息,要求插入后的学员信息依然有序*/
int i,j;
struct student temp;
printf("\n请输入要插入的学员信息");

temp=input();
for(i=0;i<count;i++)
{
if(stud[i].avr<temp.avr)
break;
}
for(j=count;j>=i;j--)
{
stud[j+1]=stud[j];
}
stud[i]=temp;
}

void del(struct student stud[],int count) //删除函数
{
int dno;
printf("请输入要删除的学员的学号:");
scanf("%d",&dno);
for(int i=0;i<count;i++)
{
if(stud[i].no==dno)
break;
}
for(int j=i;j<count-1;j++)
{
stud[j]=stud[j+1];
}
}

=================================================

这是我以前在学校做的项目,好像是你要的吧,不行的话可以去 这里 http://www.129c.com/ 找我,我在那叫黑侠
这个论坛全是搞编程的,看看吧
第4个回答  2007-05-22
牛人果然是牛人。。。
小弟正在学C,牛人就是偶的目标啊~