c语言学生成绩管理系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言学生成绩管理系统相关的知识,希望对你有一定的参考价值。

麻烦大家了阿
要求:要求有多个学生、多门课程,可以求全班单科的平均分、某个人的多门课的平均分,其他功能自定
(1)将数据存贮在单独的文件中
(2)以菜单方式进行管理。菜单项包括:数据的输入、显示、编辑、修改、删除、排序、查询等功能;用户输入1个选项,进行相应的操作
(3)若用户输入数据或信息不正确,给出相应的“错误”信息显示,重复刚才的操作。
(4)界面要求美观,提示信息准确,所有功能可以反复使用。
麻烦大家了阿 我挺着急的阿 这里先谢谢了阿

#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 yuwen;/*语文成绩*/
float yingyu;/*英语成绩*/
float shuxue;/*数学成绩 */
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("请输入语文成绩(0~100):");/*输入语文成绩,成绩应在0-100*/
scanf("%f",&p1->yuwen);
while(p1->yuwen<0||p1->yuwen>100)
getchar();
printf("输入错误,请重新输入语文成绩");/*输入错误,重新输入语文成绩直到正确为止*/
scanf("%f",&p1->yuwen);
printf("请输入英语成绩(0~100):");/*输入英语成绩,成绩应在0-100*/
scanf("%f",&p1->yingyu);
while(p1->yingyu<0||p1->yingyu>100)
getchar();
printf("输入错误,请重新输入英语成绩");/*输入错误,重新输入英语成绩直到正确为止*/
scanf("%f",&p1->yingyu);
printf("请输入数学成绩(0~100):");/*输入数学成绩,成绩应在0-100*/
scanf("%f",&p1->shuxue);
while(p1->shuxue<0||p1->shuxue>100)
getchar();
printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/
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("请输入语文成绩(0~100):");
scanf("%f",&p1->yuwen);/*输入语文成绩,成绩应在0-100*/
while(p1->yuwen<0||p1->yuwen>100)
getchar();
printf("输入错误,请重新输入语文成绩");
scanf("%f",&p1->yuwen);/*输入错误,重新输入语文成绩直到正确为止*/
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->yingyu);/*输入英语成绩,成绩应在0-100*/
while(p1->yingyu<0||p1->yingyu>100)
getchar();
printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->yingyu);/*输入错误,重新输入英语成绩直到正确为止*/
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->shuxue);/*输入数学成绩,成绩应在0-100*/
while(p1->shuxue<0||p1->shuxue>100)
getchar();
printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/



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->yuwen;
max->yuwen=p1->yuwen;
p1->yuwen=fen;
/*交换前后结点中的语文成绩,使之与学号相匹配*/

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

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



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," 作者:梅雪 班级:03电信 学号:303073011 \n");
fscanf(fp,"-----------------------------------------\n");
fscanf(fp,"|学号\t|姓名\t|语文\t|英语\t|数学\t|\n");
fscanf(fp,"-----------------------------------------\n");/*读入表格域*/
printf(" 考试成绩管理系统 \n");
printf(" 作者:梅雪 班级:03电信 学号:303073011 \n");
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|语文\t|英语\t|数学\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->yuwen,&p1->yingyu,&p1->shuxue);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
/*文件读入与显示*/
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->yuwen,&p1->yingyu,&p1->shuxue);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
/*文件读入与显示*/
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("请输入语文成绩(0~100):");
scanf("%f",&stu->yuwen); /*输入语文成绩,成绩应在0-100*/
while(stu->yuwen<0||stu->yuwen>100)
getchar();
printf("输入错误,请重新输入语文成绩");
scanf("%f",&stu->yuwen); /*输入错误,重新输入语文成绩直到正确为止*/
printf("请输入英语成绩(0~100):");
scanf("%f",&stu->yingyu);/*输入英语成绩,成绩应在0-100*/
while(stu->yingyu<0||stu->yingyu>100)
getchar();
printf("输入错误,请重新输入英语成绩");
scanf("%f",&stu->yingyu);/*输入错误,重新输入英语成绩直到正确为止*/
printf("请输入数学成绩(0~100):");
scanf("%f",&stu->shuxue);/*输入数学成绩,成绩应在0-100*/
while(stu->shuxue<0||stu->shuxue>100)
getchar();
printf("输入错误,请重新输入数学成绩");
scanf("%f",&stu->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/
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->yuwen;
max->yuwen=p1->yuwen;
p1->yuwen=fen;
/*交换前后结点中的语文成绩,使之与学号相匹配*/

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

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



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|语文\t|英语\t|数学\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->yuwen,p1->yingyu,p1->shuxue);
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|语文\t|英语\t|数学\t|\n");
printf("-----------------------------------------\n");/*打印表格域*/
p=head;
do
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue);
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|语文\t|英语\t|数学\t|总分\t|平均分\t|\n");
printf("---------------------------------------------------------\n");/*打印表格域*/
while(p!=NULL)

sum1=p->yuwen+p->yingyu+p->shuxue; /*计算个人总分*/
ave1=sum1/3;/*计算个人平均分*/

printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,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->yuwen;
sum2=sum2+p->yingyu;
sum3=sum3+p->shuxue;/*计算总分*/
y=y+1;
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*计算平均分*/
p=p->next;/*使p指向下一个结点*/

printf("语文平均分是%.1f\n",ave1);
printf("英语平均分是%.1f\n",ave2);
printf("数学平均分是%.1f\n",ave3);/*打印结果*/
return(head); break;
case 3:
if(head==NULL)
printf("\n没有任何学生资料!\n");return(head);/*链表为空*/
max=p->yuwen+p->yingyu+p->shuxue;
while(i<n)

i=i+1;
sum1=p->yuwen+p->yingyu+p->shuxue; /*计算个人总分*/
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->yuwen+p->yingyu+p->shuxue;
while(p!=NULL)
sum2=p->yuwen+p->yingyu+p->shuxue;

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," 作者:梅雪 班级:03电信 学号:303073011 \n");
fprintf(fp,"-----------------------------------------\n");
fprintf(fp,"|学号\t|姓名\t|语文\t|英语\t|数学\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->yuwen,p1->yingyu,p1->shuxue);

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按语文成绩排序\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++)

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->yuwen;
max->yuwen=p->yuwen;
p->yuwen=fen;
/*交换前后结点中的语文成绩,使之与学号相匹配*/

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

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



max=head;p=head;/*重新使max,p指向链表头*/

print2311(head);break;/*打印值排序后的链表内容
参考技术A #include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0; /* */
struct student

char num[10];/* 学号 */
char name[20];
char sex[4];
int cgrade;
int mgrade;
int egrade;
int totle;
int ave;
char neartime[10];/* 最近更新时间 */
;

typedef struct node

struct student data;
struct node *next;
Node,*Link;

void menu()

printf("********************************************************************************");
printf("\t1登记学生资料\t\t\t\t\t2删除学生资料\n");
printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");
printf("\t5保存学生资料\t\t\t\t\t0退出系统\n");
printf("********************************************************************************\n");


void printstart()

printf("-----------------------------------------------------------------------\n");

void Wrong()

printf("\n=====>提示:输入错误!\n");


void Nofind()

printf("\n=====>提示:没有找到该学生!\n");


void printc() /* 本函数用于输出中文 */

printf(" 学号\t 姓名 性别 英语成绩 数学成绩 C语言成绩 总分 平均分\n");


void printe(Node *p)/* 本函数用于输出英文 */

printf("%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);


Node* Locate(Link l,char findmess[],char nameornum[]) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */

Node *r;
if(strcmp(nameornum,"num")==0) /* 按学号查询 */

r=l->next;
while(r!=NULL)

if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;


else if(strcmp(nameornum,"name")==0) /* 按姓名查询 */

r=l->next;
while(r!=NULL)

if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;


return 0;


void Add(Link l) /* 增加学生 */

Node *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /* 将指针置于最末尾 */
while(1)

printf("请你输入学号(以'0'返回上一级菜单:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)

if(strcmp(s->data.num,num)==0)

printf("=====>提示:学号为'%s'的学生已经存在,若要修改请你选择'4 修改'!\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;

s=s->next;


p=(Node *)malloc(sizeof(Node));

strcpy(p->data.num,num);
printf("请你输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:");
scanf("%s",p->data.sex);
getchar();
printf("请你输入c语言成绩:");
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入数学成绩:");
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入英语成绩:");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle / 3;
/* 信息输入已经完成 */
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;




void Qur(Link l) /* 查询学生 */

int sel;
char findmess[20];
Node *p;

if(!l->next)

printf("\n=====>提示:没有资料可以查询!\n");
return;


printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/* 学号 */

printf("请你输入要查找的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)

printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();

else
Nofind();

else if(sel==2) /* 姓名 */

printf("请你输入要查找的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)

printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();

else
Nofind();

else
Wrong();



void Del(Link l) /* 删除 */

int sel;
Node *p,*r;
char findmess[20];
if(!l->next)

printf("\n=====>提示:没有资料可以删除!\n");
return;

printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)

printf("请你输入要删除的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)

r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该学生已经成功删除!\n");
shoudsave=1;

else
Nofind();

else if(sel==2)

printf("请你输入要删除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)

r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该学生已经成功删除!\n");
shoudsave=1;

else
Nofind();

else
Wrong();


void Modify(Link l)

Node *p;
char findmess[20];
if(!l->next)

printf("\n=====>提示:没有资料可以修改!\n");
return;

printf("请你输入要修改的学生学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)

printf("请你输入新学号(原来是%s):",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新性别(原来是%s):",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入新的数学成绩(原来是%d分):",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入新的英语成绩(原来是%d分):",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n=====>提示:资料修改成功!\n");
shoudsave=1;

else
Nofind();



void Disp(Link l)

int count=0;
Node *p;
p=l->next;

if(!p)

printf("\n=====>提示:没有资料可以显示!\n");
return;

printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)

printe(p);
p=p->next;

printstart();
printf("\n");


void Tongji(Link l)

Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */
Node *r=l->next;
if(!r)

printf("\n=====>提示:没有资料可以统计!\n");
return ;

pm=pe=pc=pt=pa=r;
while(r!=NULL)

if(r->data.cgrade>=pc->data.cgrade)
pc=r;
if(r->data.mgrade>=pm->data.mgrade)
pm=r;
if(r->data.egrade>=pe->data.egrade)
pe=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;

r=r->next;

printf("------------------------------统计结果--------------------------------\n");
printf("总分最高者:\t%s %d分\n",pt->data.name,pt->data.totle);
printf("平均分最高者:\t%s %d分\n",pa->data.name,pa->data.ave);

printf("英语最高者:\t%s %d分\n",pe->data.name,pe->data.egrade);
printf("数学最高者:\t%s %d分\n",pm->data.name,pm->data.mgrade);
printf("c语言最高者:\t%s %d分\n",pc->data.name,pc->data.cgrade);
printstart();


void Sort(Link l)

Link ll;
Node *p,*rr,*s;

ll=(Link)malloc(sizeof(Node)); /* 用于做新的连表 */
ll->next=NULL;

if(l->next==NULL)

printf("\n=====>提示:没有资料可以排序!\n");
return ;

p=l->next;
while(p)

s=(Node*)malloc(sizeof(Node)); /* 新建接点用于保存信息 */
s->data=p->data;
s->next=NULL;

rr=ll;
while(rr->next!=NULL && rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else

s->next=rr->next;
rr->next=s;

p=p->next;

free(l);
l->next=ll->next;
printf("\n=====>提示:排序已经完成!\n");


void Save(Link l)

FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)

printf("\n=====>提示:重新打开文件时发生错误!\n");
exit(1);

p=l->next;

while(p)

if(fwrite(p,sizeof(Node),1,fp)==1)

p=p->next;
count++;

else

flag=0;
break;


if(flag)

printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;

fclose(fp);


void main()

Link l;/* 连表 */
FILE *fp; /* 文件指针 */
int sel;
char ch;
char jian;

int count=0;
Node *p,*r;
printf("\t\t\t\t学生成绩管理系统\n\t\t\t\t-------福建农业职业学院计应0501 黄欢(32号)\n");
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;

fp=fopen("C:\\student","rb");
if(fp==NULL)

printf("\n=====>提示:文件还不存在,是否创建?(y/n)\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y')
fp=fopen("C:\\student","wb");
else
exit(0);

printf("\n=====>提示:文件已经打开,正在导入记录......\n");

while(!feof(fp))

p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)) /* 将文件的内容放入接点中 */

p->next=NULL;
r->next=p;
r=p; /* 将该接点挂入连中 */
count++;



fclose(fp); /* 关闭文件 */
printf("\n=====>提示:记录导入完毕,共导入%d条记录.\n",count);

while(1)

menu();
printf("请你选择操作:");
scanf("%d",&sel);

if(sel==0)

if(shoudsave==1)
getchar();
printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);

printf("\n=====>提示:你已经退出系统,再见!\n");
break;

switch(sel)

case 1:Add(l);break; /* 增加学生 */
case 2:Del(l);break;/* 删除学生 */
case 3:Qur(l);break;/* 查询学生 */
case 4:Modify(l);break;/* 修改学生 */
case 5:Save(l);break;/* 保存学生 */
case 9:printf("\t\t\t==========帮助信息==========\n");break;
default: Wrong();getchar();break;



/* */
参考技术B #include <time.h>
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 80
void input();
void sort();
void display();
void insert();
void del();
void average();
void find();
void save();
void read();
void del_file();
void average();
void modify();
int now_no=0;
struct student

int no;
char name[20];
char sex[4];
float score1;
float score2;
float score3;
float sort;
float ave;
float sum;
;
struct student stu[MAX],*p;
main()/*主函数*/

int as;
start: printf("\n\t\t\t欢迎使用学生成绩管理系统\n");
/*一下为功能选择模块*/
do

printf("\n\t\t\t\t1.录入学员信息\n\t\t\t\t2.显示学员信息\n\t\t\t\t3.成绩排序信息\n\t\t\t\t4.添加学员信息\n\t\t\t\t5.删除学员信息\n\t\t\t\t6.修改学员信息\n\t\t\t\t7.查询学员信息\n\t\t\t\t8.从文件读入学员信息\n\t\t\t\t9.删除文件中学员信息\n\t\t\t\t10.保存学员信息\n\t\t\t\t11.退出\n");
printf("\t\t\t\t选择功能选项:");
fflush(stdin);
scanf("%d",&as);
switch(as)

case 1:system("cls");input();break;
case 2:system("cls");display();break;
case 3:system("cls");sort();break;
case 4:system("cls");insert();break;
case 5:system("cls");del();break;
case 6:system("cls");modify();break;
case 7:system("cls");find();break;
case 8:system("cls");read();break;
case 9:system("cls");del_file();break;
case 10:system("cls");save();break;
case 11:system("exit");exit(0);
default:system("cls");goto start;

while(1);
/*至此功能选择结束*/

void input()/*原始数据录入模块*/

int i=0;
char ch;
do

printf("\t\t\t\t1.录入学员信息\n输入第%d个学员的信息\n",i+1);
printf("\n输入学生编号:");
scanf("%d",&stu[i].no);
fflush(stdin);
printf("\n输入学员姓名:");
fflush(stdin);
gets(stu[i].name);
printf("\n输入学员性别:");
fflush(stdin);
gets(stu[i].sex);
printf("\n输入学员成绩1:");
fflush(stdin);
scanf("%f",&stu[i].score1);
printf("\n输入学员成绩2:");
fflush(stdin);
scanf("%f",&stu[i].score2);
printf("\n输入学员成绩3:");
fflush(stdin);
scanf("%f",&stu[i].score3);
printf("\n\n");
i++;
now_no=i;
printf("是否继续输入?(Y/N)");
fflush(stdin);
ch=getch();
system("cls");

while(ch!='n'&&ch!='N');
system("cls");

void sort()/*排序数据函数*/

struct student temp;
int i,j;
average();
for(i=1;i<now_no;i++)

for(j=1;j<=now_no-i;j++)

if(stu[j-1].ave<stu[j].ave)

temp=stu[j];
stu[j]=stu[j-1];
stu[j-1]=temp;




void display()/*显示数据函数*/

int i;
char as;
average();
do

printf("\t\t\t班级学员信息列表\n");
printf("\t编号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
for(i=0;i<now_no&&stu[i].name[0];i++)printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);
printf("\t\t按任意键返回主菜单.");
fflush(stdin);
as=getch();

while(!as);
system("cls");

void insert()/*插入数据函数*/

char ch;
do

printf("\n\t\t输入新插入学员队信息\n");
printf("\n输入学生编号:");
scanf("%d",&stu[now_no].no);
fflush(stdin);
printf("\n输入学员姓名:");
fflush(stdin);
gets(stu[now_no].name);
printf("\n输入学员性别:");
fflush(stdin);
gets(stu[now_no].sex);
printf("\n输入学员成绩1:");
fflush(stdin);
scanf("%f",&stu[now_no].score1);
printf("\n输入学员成绩2:");
fflush(stdin);
scanf("%f",&stu[now_no].score2);
printf("\n输入学员成绩3:");
fflush(stdin);
scanf("%f",&stu[now_no].score3);
printf("\n\n");
now_no=now_no+1;
sort();
printf("是否继续输入?(Y/N)");
fflush(stdin);
ch=getch();
system("cls");

while(ch!='n'&&ch!='N');

void del()/*删除数据函数*/

int inum,i,j;
printf("输入要删除学员的编号:");
fflush(stdin);
scanf("%d",&inum);
for(i=0;i<now_no;i++)

if(stu[i].no==inum)

if(i==now_no)now_no-=1;
else

stu[i]=stu[now_no-1];
now_no-=1;

sort();
break;


system("cls");

void save()/*保存数据函数*/

FILE *fp;
int i;
char filepath[20];
printf("输入要保存的文件路径:");
fflush(stdin);
gets(filepath);
if((fp=fopen(filepath,"w"))==NULL)

printf("\n保存失败!");
exit(0);

for(i=0;i<now_no;i++)

stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;
stu[i].ave=stu[i].sum/3;
fprintf(fp,"\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);

fclose(fp);
printf("学生信息已保存在%s中!\n",filepath);
system("pause");
system("cls");

void find()/*查询函数*/

int i;
char str[20],as;
do

printf("输入要查询的学生姓名:");
fflush(stdin);
gets(str);
for(i=0;i<now_no;i++)
if(!strcmp(stu[i].name,str))

printf("\t编号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);

printf("\t\t按任意键返回主菜单.");
fflush(stdin);
as=getch();

while(!as);
system("cls");

void average()/*求平均数*/

int i;
for(i=0;i<now_no;i++)

stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;
stu[i].ave=stu[i].sum/3;


void modify()/*修改数据函数*/

int i;
char str[20],as;
printf("输入要修改的学生姓名:");
fflush(stdin);
gets(str);
for(i=0;i<now_no;i++)
if(!strcmp(stu[i].name,str))

system("cls");
printf("\n\t\t输入新插入学员队信息\n");
printf("\n输入学生编号:");
fflush(stdin);
scanf("%d",&stu[i].no);
printf("\n输入学员性别:");
fflush(stdin);
gets(stu[i].sex);
printf("\n输入学员成绩1:");
fflush(stdin);
scanf("%f",&stu[i].score1);
printf("\n输入学员成绩2:");
fflush(stdin);
scanf("%f",&stu[i].score2);
printf("\n输入学员成绩3:");
fflush(stdin);
scanf("%f",&stu[i].score3);
printf("\n\n");
sort();
break;

system("cls");


void read()

FILE *fp;
int i;
char filepath[20];
printf("输入要读入的文件路径:");
fflush(stdin);
gets(filepath);
if((fp=fopen(filepath,"r"))==NULL)

printf("找不到%s文件!\n",filepath);
system("pause");
exit(0);

now_no=0;
for(i=0;i<MAX&&!feof(fp);i++)

fscanf(fp,"\t%d\t%s\t%s\t%f\t%f\t%f\t%f\n",&stu[i].no,stu[i].name,stu[i].sex,&stu[i].score1,&stu[i].score2,&stu[i].score3,&stu[i].ave);
now_no++;

fclose(fp);
printf("保存的在文件%s中的所有信息已经读入!\n",filepath);
system("pause");
system("cls");


void del_file()

FILE *fp;
char filepath[20];
printf("输入要删除的文件路径:");
fflush(stdin);
gets(filepath);
fp=fopen(filepath,"w");
fclose(fp);
printf("保存的在文件%s中的所有信息已经删除!\n",filepath);
system("pause");
system("cls");
参考技术C #include <stdio.h>
#include <conio.h>

#define Back 8
#define Enter 13
#define Esc 27

#define home 71
#define end 79
#define upkey 72
#define dnkey 80
#define pgup 73
#define pgdn 81

struct person
char name[14];
char tel[13];
char eml[22];
char dpmnt[22];
;
int savstate=1;

int barup(int y) /*光条上移*/

if(y>=8)

int i;structunsigned char ch;unsigned char attr;t;
for(i=4;i<=30;i++)
gettext(i,y,i,y,&t);t.attr=0x07;puttext(i,y,i,y,&t);
y=y-2;
for(i=4;i<=30;i++)
gettext(i,y,i,y,&t);t.attr=0x70;puttext(i,y,i,y,&t);

return y;


int bardn(int y) /*光条下移*/

if(y<=18)

int i;structunsigned char ch;unsigned char attr;t;
for(i=4;i<=30;i++)
gettext(i,y,i,y,&t);t.attr=0x07;puttext(i,y,i,y,&t);
y=y+2;
for(i=4;i<=30;i++)
gettext(i,y,i,y,&t);t.attr=0x70;puttext(i,y,i,y,&t);

return y;


int rtnstr(char ary[],int l,int m) /*对按键逐个测试,排除部分非法输入,按后退键修改,Enter键确认*/

int i,x,y; char ch;
for(i=0;i<=m;i++)
x=wherex();y=wherey();
if(i<m) ary[i]=getch();
if(ary[i]==0) getch(); i=i-1; continue;

clreol();
if(i==m) do ch=getch(); if(ch==0)getch(); if(ch==Esc)return 0;
if(ch==Enter)ary[m]='\0'; return 1; if(ch==Back)break;
gotoxy(x+m-i,y) ;clreol(); cprintf(" # Can't be more than %d letters.",m);
gotoxy(x,y);
while(1);
if(ary[i]==Esc)return 0;
if(ary[i]==Back&&i==0) i=i-1;continue;
if(ary[i]==Enter)

if(i>=l)ary[i]='\0';return 1;
else gotoxy(x+m-i,y); clreol(); cprintf(" # Can't be less than %d letters.",l);
gotoxy(x,y); i=i-1; continue;


if(ary[i]==Back&&i>0||ch==Back) gotoxy(x-1,y); clreol(); i=i-2; ch=0; continue;
if(m==3||(l==7&&m==12))if(ary[i]<48||ary[i]>57)i=i-1;continue;
putchar(ary[i]);



int readrecord(struct person psn[],int n) /*读文件。若不存在则新建并写入初始化后的数组,返回记录个数*/
int i,rcd=1; FILE *fp;
if((fp=fopen("C:\\zhyx.c","rb"))==NULL)
rcd=0;if((fp=fopen("C:\\zhyx.c","wb"))==NULL)
printf(" Cannot open file!");
return n;


if(rcd==0) for(i=0;i<100;i++)fwrite(&psn[i],sizeof(struct person),1,fp);
else for(i=0;i<100;i++)

fread(&psn[i],sizeof(struct person),1,fp);if(psn[i].name[0]=='\0')break;n++;

fclose(fp); printf(" There are %d records now.\n Records in C://zhyx.c",n); return n;


int add(struct person psn[],int n) /*增加记录。任意位置按Esc键退出,返回记录总数,并于主菜单显示增加的个数*/
int i,cnt=1;int t=n;
while(n<100)
clrscr();
printf("\n\nAdded %d.\nPlease input the information,Esc back to menu:\n\n\n\n",n-t);
printf("name:");
cnt=rtnstr(psn[n].name,2,13);if(cnt==0)break;
printf("\n\nphonenumber:");
cnt=rtnstr(psn[n].tel,7,12);if(cnt==0)break;
printf("\n\nemail:");
cnt=rtnstr(psn[n].eml,7,21);if(cnt==0)break;
printf("\n\ndepartment:");
cnt=rtnstr(psn[n].dpmnt,2,21);if(cnt==0)break;
printf("\n\nRecord added successfully!");
n++;
if(n==100)
printf("\n\nThe record number has reached 100,can't add any more!");getch();

clrscr();if(cnt==0)psn[n]=psn[n+1];
if(t!=n)savstate=0;if(n-t!=1) printf(" Added %d records.\n",n-t);else printf(" Added 1 record.\n");
return n;


int delete(struct person psn[],int n) /* 删除一记录 。姓名重复则输入序号字符串再转化为整数,由于情况简单直接讨论*/

int i,indx,num=0,cnt=1; char ch; char str[14];
printf("\n\n\n\nDelete name:");
cnt=rtnstr(str,2,13);str[13]='\0'; if(cnt==0) clrscr();return n;
printf("\n");
for(i=0;i<n;i++)if(strcmp(psn[i].name,str)==0)
num++; printf("\n%-2d %-14s %-15s %-23s %-22s",i,psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);
if(num==1)indx=i;

if(num==1) printf("\n\nFind 1 recod. Delete it(Y/N)?:");
do ch=getch();
if(ch=='Y'||ch=='y') clrscr();printf(" Deleted a record! name: %s",str);
for(i=indx;i<n;i++)psn[i]=psn[i+1];savstate=0;n--;return n;

else if(ch=='N'||ch=='n')clrscr();return n;
while(1);

if(num>1) printf("\n\nFind %d recods.Input the number before a record to delete it:\n\n",num);
cnt=rtnstr(str,1,3);if(cnt==0)clrscr();return n;
cnt=strlen(str);if(cnt==3) clrscr();printf(" Index error!");return n; /*借用cnt(continue)*/
if(cnt==1)cnt=str[0]-48; /*续借,indx还要用到*/
else if(cnt==2)cnt=(str[0]-48)*10+str[1]-48;
if(cnt<n&&strcmp(psn[cnt].name,psn[indx].name)==0)
clrscr();printf(" Deleted a record! name: %s",psn[indx].name);
for(i=cnt;i<n;i++)psn[i]=psn[i+1];savstate=0;n--;return n;

else clrscr(); printf(" Index error!"); return n;

clrscr();
printf(" The name %s do not exist!",str);
return n;


void order(struct person psn[],int n) /*排序。可按姓名或电话按升序排序,主菜单中显示排序情况*/
char ch;
printf("\n\npress F to order by name,S by phonenumber.\n");
do
ch=getch();
if(ch==Esc)break;
while(ch!='f'&&ch!='F'&&ch!='s'&&ch!='S');
if(ch=='f'||ch=='F')

int i,j,k; struct person temp;
for(i=0;i<n-1;i++)

k=i;for(j=i+1;j<n;j++)if(strcmp(psn[j].name,psn[k].name)<0)k=j;
if(k!=j)temp=psn[i];psn[i]=psn[k];psn[k]=temp;
clrscr();
printf("\n Ordered by name.");
savstate=0;return;

if(ch=='s'||ch=='S')

int i,j,k; struct person temp;
for(i=0;i<n-1;i++)

k=i;for(j=i+1;j<n;j++)if(strcmp(psn[j].tel,psn[k].tel)<0)k=j;
if(k!=j)temp=psn[i];psn[i]=psn[k];psn[k]=temp;
clrscr();
printf("\n Ordered by phonenumber.");
savstate=0;return;

clrscr();


void modify(struct person psn[],int n) /*修改记录 。姓名重复输入序号字符串再转化为整数,由于情况简单直接讨论*/

int i,indx,num=0,cnt=1; char str[14]; struct person temp;
printf("\nPlease input the friend's name:");
cnt=rtnstr(str,2,13);str[13]='\0'; if(cnt==0) clrscr();return;
printf("\n");
for(i=0;i<n;i++)if(strcmp(psn[i].name,str)==0)
num++; printf("\n%-2d %-14s %-15s %-23s %-22s",i,psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);
if(num==1)indx=i;

if(num==1)

temp=psn[indx];
printf("\n\nPlease input new information,Esc back to menu:\n\n");
printf("name:");
cnt=rtnstr(psn[indx].name,2,13);if(cnt==0)psn[indx]=temp;clrscr();return;
printf("\n\nphonenumber:");
cnt=rtnstr(psn[indx].tel,7,12);if(cnt==0)psn[indx]=temp;clrscr();return;
printf("\n\nemail:");
cnt=rtnstr(psn[indx].eml,7,21);if(cnt==0)psn[indx]=temp;clrscr();return;
printf("\n\ndepartment:");
cnt=rtnstr(psn[indx].dpmnt,2,21);if(cnt==0)psn[indx]=temp;clrscr();return;

if(num>1) printf("\n\nFind %d recods.Input the number before a record to modify it:\n\n",num);
cnt=rtnstr(str,1,3);if(cnt==0)clrscr();return;
cnt=strlen(str);if(cnt==3) clrscr();printf(" Index error!");return; /*借用cnt*/
temp=psn[indx]; if(cnt==1)indx=str[0]-48;
if(cnt==2)indx=(str[0]-48)*10+str[1]-48;
if(indx<n&&strcmp(temp.name,psn[indx].name)==0)

temp=psn[indx];
printf("\n\nPlease input new information,Esc back to menu:\n\n");
printf("name:");
cnt=rtnstr(psn[indx].name,2,13);if(cnt==0)psn[indx]=temp;clrscr();return;
printf("\n\nphonenumber:");
cnt=rtnstr(psn[indx].tel,7,12);if(cnt==0)psn[indx]=temp;clrscr();return;
printf("\n\nemail:");
cnt=rtnstr(psn[indx].eml,7,21);if(cnt==0)psn[indx]=temp;clrscr();return;
printf("\n\ndepartment:");
cnt=rtnstr(psn[indx].dpmnt,2,21);if(cnt==0)psn[indx]=temp;clrscr();return;

else clrscr(); printf(" Index error!"); return;

clrscr();
if(num>0)printf(" Modified a record! name:%s->%s",temp.name,psn[indx].name);savstate=0;n--;
else printf(" The name %s do not exist!",str);


void print(struct person psn[],int n) /*显示所有记录。由pgup、pgdn、home、end及上下键控制*/

int i,k=0,l=0,j=n/10+(n%10?1:0); char ch;
do

printf("\n name:: phonenumber:: email:: department::\n\n");
for(i=k*10+l;i<(k+1)*10+l;i++)
if(i==n)break;
printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);

if(l%10==0) gotoxy(1,24);cprintf(" Press Esc back to menu. page %d / %d ",k+l/10+1,j);
else gotoxy(1,24);cprintf(" Press Esc back to menu. (%d pages)",j);
do
ch=getch();
if(ch==0)
ch=getch();
if(ch==pgdn&&((k+1)*10+l<n))k++;
if(ch==pgup&&(k*10+l>=10))k--;else if(ch==pgup)ch=home;
if(ch==home)k=0;l=0;
if(ch==end)k=j-1;l=0;
if(ch==upkey&&(k*10+l>0))l--;
if(ch==dnkey&&(k*10+l<n-1))l++;
break;

while(ch!=Esc);
if(ch==Esc) break;clrscr();
while(1);clrscr();


void find(struct person psn[],int n) /*查找记录。直接输入姓名或电话,则显示匹配内容,姓名为纯数字者不显示*/

int i,num=0,cnt=1; char str[15];
printf("\n\n\n Please input the name or phonenumber you want to find:\n\n");
printf(" name or phone:");
cnt=rtnstr(str,2,14);str[14]='\0'; if(cnt==0)return;
for(i=0;str[i]!='\0';i++)
if(str[i]<48||str[i]>57)

for(i=0;i<n;i++)
if(strcmp(psn[i].name,str)==0)
num++;
if(num==1)printf("\n\n name:: phonenumber:: email:: department::\n\n");
printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);

if(num==0) clrscr();printf("Can't find any record in accordance with %s!",str);return;
gotoxy(2,24); cprintf("Press any key to cotinue.");
getch(); clrscr(); return;

for(i=0;i<n;i++)
if(strcmp(psn[i].tel,str)==0)
num++;
if(num==1)printf("\n\n name:: phonenumber:: email:: department::\n\n");
printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);

if(num==0) clrscr();printf("Can't find any record in accordance with %s!",str);return;
gotoxy(2,24); cprintf("Press any key to cotinue.");
getch(); clrscr(); return;


void save(struct person psn[],int n) /*保存记录。若磁盘故障或已满则退出*/
FILE *fp; int i;
if(savstate==1)return;
if((fp=fopen("C:\\zhyx.c","wb"))==NULL)

printf(" Cannot open file!");return;

for(i=0;i<=n;i++) if(fwrite(&psn[i],sizeof(struct person),1,fp)!=1) /*多保存了一项,但没必要*/
printf(" File error!");fclose(fp);return;
savstate=1;printf(" Records saved!");
fclose(fp);

main() /*主函数。有两重循环,第一重打印菜单,第二重处理按键*/

int i,n=0,ex=0,y=8; char ch;
struct person psn[100];
for(i=0;i<100;i++)
strcpy(psn[i].name,"\0");
strcpy(psn[i].tel,"\0");
strcpy(psn[i].eml,"\0");
strcpy(psn[i].dpmnt,"\0");

n=readrecord(psn,n);
do

gotoxy(2,4); cprintf("#################################");
gotoxy(2,5); cprintf("# #");
gotoxy(2,6); cprintf("# A: add new records. #");
gotoxy(2,7); cprintf("# #");
gotoxy(2,8); cprintf("# D: delete certain records. #");
gotoxy(2,9); cprintf("# #");
gotoxy(2,10);cprintf("# O: order them. #");
gotoxy(2,11);cprintf("# #");
gotoxy(2,12);cprintf("# M: modify a record. #");
gotoxy(2,13);cprintf("# #");
gotoxy(2,14);cprintf("# P: print all. #");
gotoxy(2,15);cprintf("# #");
gotoxy(2,16);cprintf("# F: find certaen records. #");
gotoxy(2,17);cprintf("# #");
gotoxy(2,18);cprintf("# S: save. #");
gotoxy(2,19);cprintf("# #");
gotoxy(2,20);cprintf("# Esc: exit. #");
gotoxy(2,21);cprintf("# #");
gotoxy(2,22);cprintf("#################################");
y=8;y=barup(y);
gotoxy(2,24);cprintf("Please choose a menu form the table above.");
do
ch=getch();
if(ch==0) /*若按部分非字符键,可能是移动光条,y值跟踪光条改变*/

ch=getch();
switch(ch)

case upkey:
y=barup(y);ch=0;break;
case dnkey:
y=bardn(y);ch=0;


if(ch==Enter)

switch(y) /*光条对应y值,y值对应字符*/

case 6: ch='a';break;
case 8: ch='d';break;
case 10: ch='o';break;
case 12: ch='m';break;
case 14: ch='p';break;
case 16: ch='f';break;
case 18: ch='s';break;
case 20: ch=Esc;break;


switch(ch) /*对不同字符调用相应函数或其它操作*/
case 'a':
case 'A':
clrscr(); n=add(psn,n);
ch=Enter; break;

case 'd':
case 'D':
clrscr(); n=delete(psn,n);
ch=Enter; break;

case 'o':
case 'O':
clrscr(); order(psn,n);
ch=Enter; break;

case 'm':
case 'M':
clrscr(); modify(psn,n);
ch=Enter; break;

case 'p':
case 'P':
clrscr(); print(psn,n);
ch=Enter; break;

case 'f':
case 'F':
clrscr(); find(psn,n);
ch=Enter; break;

case 's':
case 'S':
clrscr(); save(psn,n);
ch=Enter; break;

case Esc: /*退出时的处理。按Y保存后退出,N直接退出,Esc返回程序*/
clrscr();ex=1;
if(savstate==0)
gotoxy(5,5); cprintf("Records not saved! save(y/n)? Cancel: Esc");
do ch=getch();
if(ch=='n'||ch=='N')savstate=1;
if(ch=='y'||ch=='Y')save(psn,n);
if(ch==Esc)ex=0;break;
while(savstate!=1);

clrscr(); ch=Enter; break;


while(ch!=Enter);
if(ex==1)break;
while(1);
clrscr();

再自己改改吧
参考技术D 你是中南的么
我是中南的
刚做了一个实习
和你的一模一样
我的QQ562888025
粘在这里乱码了
有空切磋下本回答被提问者采纳

用C语言写学生成绩管理系统基本功能:1、 输入一个班级的学生基本信息(包括学号,姓名,性别,5门课程成绩

2、 按姓名或学号查找、修改、删除和保存各个学生的信息。 3、 计算每个学生的各门功课总分和平均分,按学号或总分排序输出每个学生的基本信息及总分、平均分和名次等信息。4、 计算全班各门功课的平均分,显示每门课程中低于平均分的每一个学生的学号,姓名,性别,科目,成绩等信息。5、 显示每门科目中,成绩在90分以上的学生信息,以及每门科目中不及格的学生信息。6、 设置系统登录密码,只有正确输入密码方可进入管理系统。可更改和保存登录密码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

struct stud_node

long int ID; //学号
int age; //年龄
long int dormnumber,phonenumber; //宿舍号码,电话号码
char name[15]; //姓名
char sex; //性别
struct student*next;
;

struct stud_node*Create_Stu_Doc();//新建链表
int main(void)
system("color 3E");
FILE *fp=NULL;//定义文件指针
fp=fopen("stud.txt","wb");
if(fp==NULL)

printf("File open error \n");
exit (0);

struct stud_node*head,*p;
int choice,age;
long int ID,dormnumber,phonenumber;
char name[15],sex;
int size=sizeof(struct stud_node);

printf("+---------------------------+\n");
printf("| 欢迎使用教务信息管理系统 |\n");
printf("+---------------------------+\n");

printf("\n\t\t-----------------------------------------------------\n");
printf("\t\t+ 主菜单 +\n");
printf("\t\t-----------------------------------------------------\n");
printf("\t\t+ [1]--录入学生资料 +\n");
printf("\t\t+ [0]--退出系统 +\n");
printf("\t\t-----------------------------------------------------\n");
printf("\n");
printf("\t\t请输入您的选择:");

scanf("%d",&choice);
switch(choice)

case 0 : break;
case 1 : head=Create_Stu_Doc;break;
default:printf("\n无效选项!");



struct stud_node*Create_Stu_Doc()//新建链表

int y,age;
long int ID,dormnumber,phonenumber;
char name[15],sex;
int size=sizeof(struct stud_node);
struct stud_node*head,*tail,*p;
FILE *fp=NULL;//定义文件指针
fp=fopen("stud.txt","r");
head=tail=NULL;
printf("--------------------\n");
printf("请输入学生的学号:");
printf("请输入学生的姓名:");
printf("请输入学生的性别:");
printf("请输入学生的年龄:");
printf("请输入学生的宿舍号码:");
printf("请输入学生的电话号码:");
while(!feof(fp))

p=(struct stud_node *)malloc(size);
fscanf(fp,"%ld%c%c%d%ld%ld",&ID,&name,&sex,&age,&dormnumber,&phonenumber);
p->ID=ID;
strcpy(p->name,name);
strcpy(p->age,age);
p->dormnumber=dormnumber;
p->phonenumber=phonenumber;
p->next=NULL;
if(head==NULL) head=p;
else tail->next=p;
tail=p;

printf("\n1.继续输入.\n0.结束输入.\n");
printf("请选择:");
scanf("%d",&y);
if(y)
return head;
fclose(fp);

参考技术A 我正准备做这个程序,你想要什么版本的,是控制台版本的是还是win32版本的。

以上是关于c语言学生成绩管理系统的主要内容,如果未能解决你的问题,请参考以下文章

c语言大作业 学生成绩管理系统

学生成绩管理系统的c语言程序

c语言学生成绩管理系统

学生成绩管理系统c

C语言程序设计 班级学生成绩管理系统

C语言 学生成绩管理系统