c语言学生成绩管理系统

Posted

tags:

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

学生成绩管理系统
学生包含以下信息项:学号、姓名、学院、班级、高数成绩、英语成绩、C语言成绩、总分、平均分。
系统的主要功能包括:
1. 创建学生成绩信息文件,根据提示输入学生的各项信息,计算出总分和平均分,然后将学生成绩信息存储到一个二进制文件中。
2. 增加学生信息,在原有学生信息文件的基础上增加新的学生成绩信息,要求继续保存至原文件,并提示用户选择是否继续进行增加操作。
3. 删除学生信息,提示用户输入要进行删除操作的学号,如果在文件中有该信息存在,则将该学号所对应的学生信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。
4. 修改学生信息,提示用户输入要进行修改操作的学号,如果在文件中有该息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。
5. 按不同条件对学生信息进行查询操作,输出满足条件的学生信息。
(1) 按学号查询,输入学号。
(2) 按姓名查询,输入全名。
6. 按不同条件对学生成绩进行统计工作。
(1) 按平均分统计各个分数段的学生人数(不及格,60-69,70-79,80-89,90-100)。
(3) 分别找出3门课程成绩最高的学生,并输出他们的信息。
(4) 分别统计出3门课程的不及格率,并输出。

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

#define MAX 80 //学生最大人数

#define max 3 //科目数量

struct classname //科目结构体,科目名称,该科目分数

char name[20];
float score;
;

struct student //学生结构体,学号,学生姓名,科目,平均分,总分

char no[20];
char std_name[20];
struct classname km[max];
float ave;
float sum;
int save; //检验数,没有添加删除函数,此变量没有作用,可删除,但是注意删除要把初始函数里的初始语句也删除
;

struct student stu[MAX];//全局变量,结构体数组

int nu=0;//全局变量 文件已存人数

void chushi()//程序初始化函数,对全局变量stu初始化

int i,j;
for(i=0;i<MAX;i++)

for(j=0;j<20;j++)

stu[i].no[j]='\0';
stu[i].std_name[j]='\0';
stu[i].km[j].name[j]='\0';
stu[i].km[j].score=0;

stu[i].ave=0;
stu[i].sum=0;
stu[i].save=0;



void av()/*求平均值*/

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

stu[i].sum=stu[i].km[0].score+stu[i].km[1].score+stu[i].km[2].score;
stu[i].ave=stu[i].sum/3;



void first_check()

FILE *p;//文件指针
int i,j;
struct classname frist[max];//临时变量,接收第一次输入的科目名称
for(i=0;i<max;i++)

for(j=0;j<20;j++)
frist[i].name[j]='\0';
frist[i].score=0;

if ((p=fopen("e:\\kemu.txt","r"))==NULL)//如果文件不存在,执行下面语句

printf("您好,欢迎使用学生成绩管理系统\n\n因为您是第一次使用,请输入科目名称(三科)\n\n");
p=fopen("e:\\kemu.txt","w");//建立科目文件,保存c盘根目录
printf("输入课程1名称:");
scanf("%s",frist[0].name);
fprintf(p,"%s\n",frist[0].name);//课程写入文件
printf("输入课程2名称:");
scanf("%s",frist[1].name);
fprintf(p,"%s\n",frist[1].name);//同上
printf("输入课程3名称:");
scanf("%s",frist[2].name);
fprintf(p,"%s\n",frist[2].name);//同上

system("cls");//清屏函数
fclose(p);


void save_nu()//往人数文件写入人数信息

FILE *p;
p=fopen("e:\\renshu.txt","w");
fprintf(p,"%d\n",nu);
fclose(p);


void Save_add(int n)//写入成绩信息,成绩文件已存在,在文件内部末尾追加写入

FILE * p;
int i;
p= fopen("e:\\chengji.txt","at");
if (p == NULL)

printf("文件不存在!!\n");
exit(0);

save_nu();
for (i = 0;i<n;i++)
if(stu[i].save==1)

stu[i].sum=stu[i].km[1].score+stu[i].km[2].score+stu[i].km[3].score;
stu[i].ave=stu[i].sum/3;
fprintf(p,"%s %s %2.1f %2.1f %2.1f %2.1f %2.1f \n",stu[i].no,stu[i].std_name,stu[i].km[0].score,stu[i].km[1].score,stu[i].km[2].score,stu[i].ave,stu[i].sum);

fclose(p);


void Save()//写入成绩信息,成绩文件不存在,新建成绩文件并写入信息

FILE * p;
int i;
p= fopen("e:\\chengji.txt","w");
if (p == NULL)

printf("文件不存在!!\n");
exit(0);

save_nu();
for (i = 0;i<nu;i++)
if(stu[i].save==1)

av();
fprintf(p,"%s %s %2.1f %2.1f %2.1f %2.1f %2.1f \n",stu[i].no,stu[i].std_name,stu[i].km[0].score,stu[i].km[1].score,stu[i].km[2].score,stu[i].ave,stu[i].sum);

fclose(p);


int read_nu()//读取人数文件中存在的人数信息

FILE *p;
char ch,s[10]='\0';
int i=0;
p=fopen("e:\\renshu.txt","r");
if(p==NULL)

save_nu();
return 0;

ch=fgetc(p);
while(ch!='\n')

s[i]=ch;
ch=fgetc(p);
i++;

nu=atoi(s);
fclose(p);
return 0;


int read_km()//读取科目文件中存储的科目信息

FILE *p;
int i,j=0;
char s[20]='\0';
chushi();
p=fopen("e:\\kemu.txt","r");
if(p==NULL)

printf("ERROR read_km");
return 0;

fgets(s,20,p);
while(strlen(s)!=0)

for(i=0;i<strlen(s);i++)
if(s[i]==10)

s[i]='\0';
break;

for(i=0;i<=nu;i++)
strcpy(stu[i].km[j].name,s);
for(i=0;i<20;i++)
s[i]='\0';
j++;
fgets(s,20,p);

return 0;


void read()//重要函数!读取成绩文件中以存储的学生成绩信息并存入内存

FILE *p;
int i,j,n,k,z=0;
char s[50]='\0';
char o[10]='\0';
p=fopen("e:\\chengji.txt","r");
if(p==NULL)
printf("ERROR_read");
chushi();
read_km();
fgets(s,50,p);
while(strlen(s)!=0)

j=0;
for(i=0;i<50;i++)

if(s[i]!='\n')

n=0;
while(j==0)

if(s[i]!=' ')

stu[z].no[n]=s[i];
n++;i++;

else
break;

while(j==1)

if(s[i]!=' ')

stu[z].std_name[n]=s[i];
n++;i++;

else
break;

while(j==2)

if(s[i]!=' ')

o[n]=s[i];
n++;i++;

else

stu[z].km[0].score=atoi(o);
break;


while(j==3)

if(s[i]!=' ')

o[n]=s[i];
n++;i++;

else

stu[z].km[1].score=atoi(o);
break;


while(j==4)

if(s[i]!=' ')

o[n]=s[i];
n++;i++;

else

stu[z].km[2].score=atoi(o);
break;


while(j==5)

if(s[i]!=' ')

o[n]=s[i];
n++;i++;

else

stu[z].ave=atoi(o);
break;


while(j==6)

if(s[i]!=' ')

o[n]=s[i];
n++;i++;

else

stu[z].sum=atoi(o);
break;


for(k=0;k<10;k++)
o[k]='\0';

else
break;
j++;

for(i=0;i<50;i++)
s[i]='\0';
fgets(s,50,p);
z++;



void putin()//功能函数,录入学生成绩信息

int n,i=0;
char ch;
read_km();
do

printf("\t\t\t\t录入学生信息\n输入第%d个学生的信息\n",i+1);
printf("\n输入学生学号:");
scanf("%s",stu[i].no);
printf("\n输入学员姓名:");
scanf("%s",stu[i].std_name);
printf("\n输入语文%s的分数:",stu[0].km[0].name);
scanf("%f",&stu[i].km[0].score);
printf("\n输入数学%s的分数:",stu[0].km[1].name);
scanf("%f",&stu[i].km[1].score);
printf("\n输入英语%s的分数:",stu[0].km[2].name);
scanf("%f",&stu[i].km[2].score);
stu[i].save=1;
printf("\n\n");
i++;
n=i;
printf("是否继续输入?(Y/N)");
fflush(stdin);
ch=getch();
system("cls");

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

nu=n;
Save();

else

nu=n+nu;
Save_add(n);



int putout()//功能函数,显示学生信息

int i;char s;
if(nu==0)

printf("学生信息为零!请录入...");
return 0;

read();
do

printf("学生成绩信息:\n\n");
for(i=0;i<nu;i++)
printf("学号:%s 姓名:%s\n%s分数:%2.1f\t%s分数:%2.1f\t%s 分数:%2.1f\n平均分数:%2.1f\t总成绩:%2.1f\n\n",stu[i].no,stu[i].std_name,stu[i].km[0].name,stu[i].km[0].score,stu[i].km[1].name,stu[i].km[1].score,stu[i].km[2].name,stu[i].km[2].score,stu[i].ave,stu[i].sum);
printf("\t\t按任意键返回主菜单");
fflush(stdin);
s=getch();

while(!s);
system("cls");
return 0;


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

struct student temp;
int i,j;
char s;
if(nu==0)

printf("学生信息为零!请录入...");
return 0;

read();
for(i=1;i<nu;i++)

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

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

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



do

printf("学生成绩信息:\n\n");
for(i=0;i<nu;i++)
printf("学号:%s 姓名:%s 平均成绩:%2.1f\n\n",stu[i].no,stu[i].std_name,stu[i].ave);
printf("\t\t按任意键返回主菜单");
fflush(stdin);
s=getch();

while(!s);
system("cls");
return 0;


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

int j,i=0;
int c=0;
char search[20]='\0';
char as;
if(nu==0)

printf("学生信息为零!请录入...");
return 0;

read();
do

printf("输入要查询课程名称:");
scanf("%s",search);
for(j=0;j<max;j++)
if(!strcmp(stu[i].km[j].name,search))

c=1;
printf("\n该课程不及格学生姓名:\n");
for(i=0;i<nu;i++)
if(stu[i].km[j].score<60)
printf("%s\n",stu[i].std_name);

if(c==0)
printf("无此课程!");
printf("\n\t\t按任意键返回主菜单");
fflush(stdin);
as=getch();

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


int tongji()//功能函数,统计学生成绩信息

int j,m,z,i=0;
char s;
if(nu==0)

printf("学生信息为零!请录入...");
return 0;

read();
for(z=0;z<max;z++)

m=stu[i].km[z].score;j=0;
printf("%s 最高分: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(m<stu[i].km[z].score)

m=stu[i].km[z].score;
j=i;

printf("%s\t",stu[j].std_name);
j=0;i=0;m=stu[i].km[z].score;
printf("%s 最低分: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(m>stu[i].km[z].score)

m=stu[i].km[z].score;
j=i;

printf("%s\t",stu[j].std_name);
m=0;j=0;i=0;
printf("%s 平均分: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
m=m+stu[i].km[z].score;
printf("%d\n",m/nu);
m=0;i=0;
printf("%s 分数低于的60人数: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(stu[i].km[z].score<60)
m++;
printf("%d\t",m);
m=0;j=0;i=0;
printf("%s 分数高于60的人数: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(stu[i].km[z].score>60)
m++;
printf("%d\n\n",m);

do

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

while(!s);
system("cls");
return 0;


void main()/*主函数*/

int as;
first_check();
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");
printf("\t\t\t\t选择功能选项:");
fflush(stdin);
read_nu();
scanf("%d",&as);
switch(as)

case 1:system("cls");putin();break;
case 2:system("cls");putout();break;
case 3:system("cls");sort();break;
case 4:system("cls");find();break;
case 5:system("cls");tongji();break;
case 6:system("exit");exit(0);
default:system("cls");goto start;


while(1);
/*至此功能选择结束*/
参考技术A 主程序如下 希望可以帮到

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 10
struct student

int num;
char name[12];
char sex[4];
char clas[20];
int a,b,c;
double pjf;
;

void main()

void shuru(struct student stu[N]);
void chuli(struct student stu[N]);
void xiugai(struct student stu[N]);
void shuchu(struct student stu[N]);
void paixu(struct student stu[N]);
void chaxun(struct student stu[N]);
void tongj(struct student stu[N]);
double pjf(struct student stu[N]);
void bjgkm(struct student stu[N]);
struct student stu[N];
int i=0,j=0,p=0,u=0;
char str[70][500];
FILE *fp1,*fp;
if((fp=fopen("学生信息.txt","r"))==NULL)
printf("注意:为免出错,第一次使用本程序,请选1 手动输入数据. \n");
else

for(i=1;i<=N;i++)

if(i==1)
fp=fopen("学生信息.txt","r");
fscanf(fp,"%d%s%s%s%d%d%d",&stu[i].num,stu[i].name,stu[i].sex,stu[i].clas,&stu[i].a,&stu[i].b,&stu[i].c);
if(1==N)
fclose(fp);


int choice;
do
for(i=0;i<14;i++)
printf("**");
printf("主菜单");
for(j=0;j<14;j++)
printf("**");
printf("\n");
printf("#请选择: 1 数据输入 2 数据修改 3 数据处理 4 数据输出 5 退出#\n");
for(i=0;i<20;i++)
printf("***");
printf("**\n");
scanf("%d",&choice);
switch(choice)

case 1 :
shuru(stu) ; break;
case 2 :
xiugai(stu) ; break;
case 3 :
chuli(stu) ; break;
case 4 :
shuchu(stu) ; break;
case 5 : break;
default : puts("error"); return;


while(choice!=5);
fp1=fopen("学生信息.txt","w");
for(i=1;i<=N;i++)


fprintf(fp1,"%d ",stu[i].num);
fprintf(fp1,"%s ",stu[i].name);
fprintf(fp1,"%s ",stu[i].sex);
fprintf(fp1,"%s ",stu[i].clas);
fprintf(fp1,"%d ",stu[i].a);
fprintf(fp1,"%d ",stu[i].b);
fprintf(fp1,"%d ",stu[i].c);
fprintf(fp1,"\n");

puts("信息已保存在“学生信息.txt”中 Thank you!!");
fclose(fp1);
参考技术B 有基本功能,可参考

参考资料:http://zhidao.baidu.com/question/183583385.html

C语言编程题目,关于学生成绩管理系统的。向各位求助了

#include<stdio.h>
#include<string.h>
#include <malloc.h>
#include <stdlib.h>
#include<conio.h>
#define LEN sizeof(struct student)
typedef struct student
long numb;
int chinese;
int math;
int english;
int totalscore;
char name[12];
struct student *next;
STU;
//声明部分
STU* creat();
void output(STU *head);
STU* creatByN(int num);
STU* findByNumb(STU *head, long num);
STU* findByNumbEx(STU *head, long num, STU **ppBefore);
STU* findByName(STU *head, char *name);
void find(STU *head);
STU* del(STU *head);
STU* insert(STU *head);
void update(STU *head);
STU* sort(STU *head);
void save_info(STU *head);
STU *load_info();
void Backup_info(STU *head);
int n;//全局变量
void main()

STU *head;
int choice;

for(;;)
system("cls");/*清屏*/
printf("\t欢迎使用成绩管理系统\t\n");
printf("\t1:输入多个学生信息\t\n");
printf("\t2:显示全部学生信息\t\n");
printf("\t3:删除\t\n");
printf("\t4:查找\t\n");
printf("\t5:插入\t\n");
printf("\t6:修改\t\n");
printf("\t7:排序\t\n");
printf("\t8:保存到文件\t\n");
printf("\t9:从文件加载\t\n");
printf("\t10:备份\t\n");
printf("\t0:退出\t\n");
printf("*请输入数字(0-9)进行功能选择 :");
scanf("%d",&choice);
if(choice==0) break;
switch(choice)
case 1: head=creat(); break;
case 2: output(head); break;
case 3: head=del(head); break;
case 4: find(head); break;
case 5: head=insert(head); break;
case 6: update(head); break;
case 7: head=sort(head);break;
case 8: save_info(head); break;
case 9: head=load_info(); break;
case 10:Backup_info(head);break;

printf("按任意键继续....\n");
getch();/*暂停*/

printf("欢迎使用,再见!\n");

STU *creat()/*创建链表*/

STU *head,*pnew,*ptail;
head=NULL;
n=0;//初始化
printf("现在进行学生信息的输入,学号输入为0时结束\n");
while(1)
//不断申请新节点
pnew=(STU *)malloc(LEN);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%ld",&pnew->numb);
if(pnew->numb==0)
break;
scanf("%s",pnew->name);
scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
pnew->totalscore=0; pnew->totalscore=pnew->chinese+pnew->math+pnew->english;
pnew->next=NULL;//将节点连接到链表尾部
n++;
if(n==1)
head=pnew;
ptail=pnew;

else
ptail->next=pnew;
ptail=pnew;
//这个算法的思路是让pnew指向新开辟的结点,ptail指向链表中最后一个结点,把pnew所指的结点连接在ptail所指的结点后面,用"ptail->next=pnew"来实现.

return head;//因为可能对head进行赋值,所以有返回值


void output(STU *head)

STU *p;//定义一个可动指针,使其不断下移完成多个输出
printf("当前共有%d个节点:\n",n);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
for(p=head;p!=NULL;p=p->next)
printf("%ld\t%s\t%d\t%d\t%d\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore);
//无变动不返回
struct student *creatByN(int num)

STU *head,*pnew,*ptail;
int i;
//链表初始化
head=NULL;
n=0;
//链表创建,一个循环
for(i=0;i<num;i++)
//获得一个节点,并赋值,节点由pnew指向
pnew=(STU *)malloc(LEN);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%ld",&pnew->numb);
scanf("%s",pnew->name);
scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
pnew->next=NULL;//将pnew所指向的节点,插入到链表尾部
n++;
if(n==1)
head=pnew;
ptail=pnew;

else
ptail->next=pnew;
ptail=pnew;


return head;

STU* findByNumb(STU *head, long num)

STU *p,*presult;
presult=NULL;
for(p=head;p!=NULL;p=p->next)
if(p->numb==num)
presult=p;//记录此时指针的位置
break;

return presult;

STU* findByName(STU *head, char *name)

STU *p,*presult;
presult=NULL;
for(p=head;p!=NULL;p=p->next)
if(strcmp(p->name,name)==0)
presult=p;
break;

return presult;//位置变更有返回值

STU* findByNumbEx(STU *head, long num, STU **ppBefore)

STU *p,*presult,*pBefore;
presult=pBefore=NULL;
for(p=head;p!=NULL;pBefore=p,p=p->next)//记录指针的前一个位置
if(p->numb==num)
presult=p;
break;

*ppBefore=pBefore;
return presult;

void find(STU *head)

int num,choice;
STU *pr;
char name[12];
printf("输入要查找的方式(1:按学号,2:按姓名):");
scanf("%d",&choice);
if(choice==1)
printf("输入要查找的学号:");
scanf("%ld",&num);
pr=findByNumb(head,num);

else if(choice==2)
printf("输入要查找的姓名:");
scanf("%s",name);
pr=findByName(head,name);

if(pr==NULL)
printf("对不起,查无此人\n");
else
printf("找到了,该生信息如下:\n");
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english,pr->totalscore);


void update(STU *head)

int num;
STU *pr;
printf("输入要查找的学号:");
scanf("%ld",&num);
pr=findByNumb(head,num);
if(pr==NULL)
printf("对不起,查无此人\n");
else
printf("找到了,该生信息如下:\n");
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english);
printf("请输入修改信息\n");
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%ld%s%d%d%d%d",&pr->numb,&pr->name,&pr->chinese,&pr->math,&pr->english);
pr->totalscore=0; pr->totalscore=pr->chinese+pr->math+pr->english;


STU* del(STU *head)

long num;
STU *pCur,*pBefore;
//查找要删除的节点,用pCur记录该节点
printf("输入要删除的学号:");
scanf("%ld",&num);
pCur=findByNumbEx(head,num,&pBefore);
//如果该节点存在,进行删除
if(pCur!=NULL)
n--;//记录删除后节点个数
//根据pCur所指节点位置进行判断:头节点或后续节点
//删除的是头节点
if(pCur==head)
head=pCur->next;

//删除的是后续节点
else
//获取前向节点指针pBefore

//利用pBefore和pCur完成删除
pBefore->next=pCur->next;


return head;

STU* insert(STU *head)

STU *pCur,*pnew,*pBefore,*p;
//申请一个新节点,并赋值
pnew=(STU *)malloc(LEN);
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
scanf("%d",&pnew->numb);
scanf("%s",&pnew->name);
scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english);
pnew->totalscore=0; pnew->totalscore=pnew->chinese+pnew->math+pnew->english;
pnew->next=NULL;
if(head==NULL)//链表为空
head=pnew;
else//链表不为空
//找位置,即获取pCur
for(p=head;p!=NULL;pBefore=p,p=p->next)
if(p->numb > pnew->numb)
pCur=p;
break;

//没有找到pCur,则应将pnew插入到尾节点之后
if(p==NULL)
pBefore->next=pnew;

//找到pCur,则应将pnew插入到pCur之前,根据pCur的位置分为:头结点之前和中间节点之前两种情况
else
//pCur是头结点
if(pCur==head)
pnew->next=pCur;
head=pnew;

//pCur是中间结点
else
pnew->next=pCur;
pBefore->next=pnew;



n++;
return head;

STU* sort(STU *head)

STU *first; /*排列后有序链的表头指针*/
STU *tail; /*排列后有序链的表尾指针*/
STU *p_min; /*保留键值更小的节点的前驱节点的指针*/
STU *min; /*存储最小节点*/
STU *p; /*当前比较的节点*/
(STU *)malloc(LEN);
first = NULL;
while (head != NULL) /*在链表中找键值最小的节点。*/

/*注意:这里for语句就是体现选择排序思想的地方*/
for (p=head,min=head; p->next!=NULL; p=p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/

if (p->next->totalscore < min->totalscore) /*找到一个比当前min小的节点。*/

p_min = p; /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/
min = p->next; /*保存键值更小的节点。*/


/*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/
/*第一件事*/
if (first == NULL) /*如果有序链表目前还是一个空链表*/

first = min; /*第一次找到键值最小的节点。*/
tail = min; /*注意:尾指针让它指向最后的一个节点。*/

else /*有序链表中已经有节点*/

tail->next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/
tail = min; /*尾指针也要指向它。*/

/*第二件事*/
if (min == head) /*如果找到的最小节点就是第一个节点*/

head = head->next; /*显然让head指向原head->next,即第二个节点,就OK*/

else /*如果不是第一个节点*/

p_min->next = min->next; /*前次最小节点的next指向当前min的next,这样就让min离开了原链表。*/


if (first != NULL) /*循环结束得到有序链表first*/

tail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/

head = first;
return head;

//保存
void save_info(STU *head)

STU *p;
FILE *fp;
char filename[20];
printf("输入保存文件的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
printf("can not open the file");
exit(0);

fprintf(fp,"当前共有%d个节点:\n",n);
fprintf(fp,"学号\t姓名\t语文\t数学\t英语\t总分\n");
for(p=head;p!=NULL;p=p->next)
fprintf(fp,"%ld\t%s\t%d\t%d\t%d%\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore);
fclose(fp);
printf("保存成功!\n");

//加载
STU *load_info()

STU *head,*pnew,*ptail;
FILE *fp;
char filename[20],secondLine[20];
int num,i;
printf("输入读取文件的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
printf("can not open the file");
exit(0);

fscanf(fp,"当前共有%d个节点:",&num);

//过滤第二行
for(i=0;i<6;i++)
fscanf(fp,"%s",secondLine);
//链表初始化
head=NULL;
n=0;
//链表创建,一个循环
for(i=0;i<num;i++)
//获得一个节点,并赋值,节点由pnew指向
pnew=(STU *)malloc(LEN);
fscanf(fp,"%ld%s%d%d%d%d",&pnew->numb,&pnew->name,&pnew->chinese,&pnew->math,&pnew->english,&pnew->totalscore);
pnew->next=NULL;
//将pnew所指向的节点,插入到链表尾部
n++;//记录加载后节点个数
if(n==1)
head=pnew;
ptail=pnew;

else
ptail->next=pnew;
ptail=pnew;


fclose(fp);
printf("读取成功!\n");
return head;

void Backup_info(STU *head)//备份
FILE *in,*out;
char infile[10],outfile[10];
printf("Enter the inflie name:\n");
scanf("%s",infile);
printf("Enter the outflie name:\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)

printf("cannot open infile\n");
exit(0);

if((out=fopen(outfile,"w"))==NULL)

printf("cannot open outfile\n");
exit(0);

while(! feof(in)) fputc(fgetc(in),out);
fclose(in);
fclose(out);
printf("备份成功!\n");
参考技术A 定义一个结构体,结构体成员为学生的学号、姓名、各科成绩。然后在主函数里申请一个结构体数组的动态内存 因为不超过三十人 你就申请三十个就行了。然后就是写那几个函数了 第一个要传结构体数组的指针进去 因为要对值进行修改 剩下几个传值就行了 思路就是这样 我也没动手试过 不过应该差不多 你要是嫌传指针什么的麻烦 把结构体数组设为全局变量也行。

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

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

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

c语言学生成绩管理系统

学生成绩管理系统c

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

C语言 学生成绩管理系统