c语言学生成绩管理系统
c语言学生成绩管理系统
#包含“stdio.h”
#包含" stdlib.h "
#包含" string.h "
int shoud save = 0;/* */
结构学生
{
字符编号[10];/*学生ID */
char name[20];
char sex[4];
国际贸易;
国际贸易;
int egrade
int totle
int ave
char near time[10];/*上次更新时间*/
};
typedef结构节点
{
构造学生数据;
结构节点* next
}节点,*链接;
无效菜单()
{
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *);
Printf("\t1注册学生数据\ t \ t \ t \ t2删除学生数据\ n ");
printf(" \ t 3查询学生信息\ t \ t \ t \修改学生信息\ n ");
Printf("\t5保存学生信息\ t \ t \ t \ t退出系统\ n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
}
void printstart()
{
printf("-\ n ");
}
无效错误()
{
printf(" \ n = = = = = & gt;提示:输入错误!\ n ");
}
void Nofind()
{
printf(" \ n = = = = = & gt;提示:找不到学生!\ 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-& gt;data.num,p-& gt;data.name,p-& gt;data.sex,p-& gt;data.egrade,p-& gt;data.mgrade,p-& gt;data.cgrade,p-& gt;data.totle,p-& gt;data . ave);
}
Node * locate (link L,char find mess [],char namernum [])/*该函数用于定位链表中符合条件的联系人,并返回指针*/
{
node * r;
If (strcmp (namernum," num") = = 0)/*按学号查询*/
{
r = l-& gt;接下来;
while(r!=空)
{
if(strcmp(r-& gt;data.num,findmess)==0)
return r;
r = r-& gt;接下来;
}
}
Elseif (strcmp (namernum," name") = = 0)/*按名称查询*/
{
r = l-& gt;接下来;
while(r!=空)
{
if(strcmp(r-& gt;data.name,findmess)==0)
return r;
r = r-& gt;接下来;
}
}
返回0;
}
Void Add(Link l) /*添加学生*/
{
节点*p,*r,* s;
字符编号[10];
r = l;
s = l-& gt;接下来;
while(r->;下一个!=空)
r = r-& gt;接下来;/*将指针放在末尾*/
while(1)
{
Printf("请输入你的学号(用' 0 ':)返回上一个菜单);
scanf("%s ",数字);
if(strcmp(num," 0")==0)
打破;
while(s)
{
if(strcmp(s-& gt;data.num,num)= 0)
{
printf(" = = = = = = & gt;提示:学号为“%s”的学生已经存在。请选择“4修改”进行修改!\n ",编号);
printstart();
printc();
印刷品;
printstart();
printf(" \ n ");
返回;
}
s = s-& gt;接下来;
}
p=(节点*)malloc(sizeof(节点));
strcpy(p-& gt;data.num,num);
Printf("请输入您的姓名:");
scanf("%s ",p-& gt;data . name);
getchar();
Printf("请输入您的性别:");
scanf("%s ",p-& gt;data . sex);
getchar();
Printf("请输入你的C语言成绩:");
scanf("%d ",& ampp->;data . cgrade);
getchar();
Printf("请输入你的数学成绩:");
scanf("%d ",& ampp->;data . m grade);
getchar();
Printf("请输入你的英语成绩:");
scanf("%d ",& ampp->;data . e grade);
getchar();
p->;data . totle = p-& gt;data . e grade+p-& gt;data . c grade+p-& gt;data . m grade;
p->;data . ave = p-& gt;data . totle/3;
/*信息输入已经完成*/
p->;next = NULL
r-& gt;next = p;
r = p;
shoudsave = 1;
}
}
Void Qur(Link l) /*查询学生*/
{
int sel
char find mess[20];
node * p;
如果(!l-& gt;下一个)
{
printf(" \ n = = = = = & gt;提示:没有可查询的信息!\ n ");
返回;
}
printf(" \ n = = = = = & gt;1按学号搜索\ n = = = = > 2按姓名搜索\ n ");
scanf("%d ",& ampsel);
If(sel==1)/*学生ID */
{
Printf("请输入要查找的学号:");
scanf("%s ",find mess);
p=Locate(l,findmess," num ");
如果(p)
{
printf(" \ t \ t \ t \ t \ t findings \ n ");
printstart();
printc();
printe(p);
printstart();
}
其他
nofind();
}
Else if(sel==2) /* name */
{
Printf("请输入要查找的名称:");
scanf("%s ",find mess);
p=Locate(l,findmess," name ");
如果(p)
{
printf(" \ t \ t \ t \ t \ t findings \ n ");
printstart();
printc();
printe(p);
printstart();
}
其他
nofind();
}
其他
错误();
}
Void Del(Link l) /* Delete */
{
int sel
节点*p,* r;
char find mess[20];
如果(!l-& gt;下一个)
{
printf(" \ n = = = = = & gt;提示:没有数据可以删除!\ n ");
返回;
}
printf(" \ n = = = = = & gt;1按学号删除\ n = = = = > 2按姓名删除\ n ");
scanf("%d ",& ampsel);
if(sel==1)
{
Printf("请输入要删除的学号:");
scanf("%s ",find mess);
p=Locate(l,findmess," num ");
如果(p)
{
r = l;
while(r->;下一个!=p)
r = r-& gt;接下来;
r-& gt;next = p-& gt;接下来;
免费(p);
printf(" \ n = = = = = & gt;提示:该学生已被成功删除!\ n ");
shoudsave = 1;
}
其他
nofind();
}
else if(sel==2)
{
Printf("请输入要删除的名称:");
scanf("%s ",find mess);
p=Locate(l,findmess," name ");
如果(p)
{
r = l;
while(r->;下一个!=p)
r = r-& gt;接下来;
r-& gt;next = p-& gt;接下来;
免费(p);
printf(" \ n = = = = = & gt;提示:该学生已被成功删除!\ n ");
shoudsave = 1;
}
其他
nofind();
}
其他
错误();
}
无效修改(链接l)
{
node * p;
char find mess[20];
如果(!l-& gt;下一个)
{
printf(" \ n = = = = = & gt;提示:没有数据可以修改!\ n ");
返回;
}
Printf("请输入要修改的学号:");
scanf("%s ",find mess);
p=Locate(l,findmess," num ");
如果(p)
{
Printf("请输入您的新学号(原来是%s):",p-& gt;data . num);
scanf("%s ",p-& gt;data . num);
Printf("请输入您的新名字(原来是%s):",p-& gt;data . name);
scanf("%s ",p-& gt;data . name);
getchar();
Printf("请输入您的新性别(原来是%s):",p-& gt;data . sex);
scanf("%s ",p-& gt;data . sex);
Printf("请输入您新的C语言分数(原来是%d):",p-& gt;data . cgrade);
scanf("%d ",& ampp->;data . cgrade);
getchar();
Printf("请输入您的新数学分数(原来是%d):",p-& gt;data . m grade);
scanf("%d ",& ampp->;data . m grade);
getchar();
Printf("请输入您的新英语成绩(原来是%d):",p-& gt;data . e grade);
scanf("%d ",& ampp->;data . e grade);
p->;data . totle = p-& gt;data . e grade+p-& gt;data . c grade+p-& gt;data . m grade;
p->;data . ave = p-& gt;data.totle/3;
printf(" \ n = = = = = & gt;提示:数据已修改成功!\ n ");
shoudsave = 1;
}
其他
nofind();
}
无效显示(链接l)
{
int count = 0;
node * p;
p = l-& gt;接下来;
如果(!p)
{
printf(" \ n = = = = = & gt;提示:没有数据可显示!\ n ");
返回;
}
printf(" \ t \ t \ t \ t显示结果\ n ");
printstart();
printc();
printf(" \ n ");
while(p)
{
printe(p);
p = p-& gt;接下来;
}
printstart();
printf(" \ n ");
}
虚空同济(环线l)
{
节点*pm,*pe,*pc,*pt,* pa/*用于指向得分最高的联系人*/
node * r = l-& gt;接下来;
如果(!r)
{
printf(" \ n = = = = = & gt;提示:没有数据可以统计!\ n ");
返回;
}
pm = PE = PC = pt = pa = r;
while(r!=空)
{
if(r-& gt;data . c grade & gt;= PC->;data.cgrade)
PC = r;
if(r-& gt;data . m grade & gt;= pm->;data.mgrade)
pm = r;
if(r-& gt;data . e grade & gt;= PE-& gt;data.egrade)
PE = r;
if(r-& gt;data.totle & gt= pt-& gt;data.totle)
pt = r;
if(r-& gt;data.ave & gt= pa->;data.ave)
pa = r;
r = r-& gt;接下来;
}
Printf (" -统计结果。
Printf("最高总分:\t%s %d \n ",pt-& gt;data.name,pt-& gt;data . totle);
Printf("最高平均分:\t%s %d \n ",pa-& gt;data.name,pa-& gt;data . ave);
Printf("英语最高:\t%s %d \n ",PE-& gt;data.name,PE-& gt;data . e grade);
Printf("数学最高分:\t%s %d \n ",pm-& gt;data.name,pm-& gt;data . m grade);
printf(" C语言最高:\t%s %d \n ",PC-& gt;data.name,PC-& gt;data . cgrade);
printstart();
}
无效排序(链接l)
{
链接ll;
节点*p,*rr,* s;
ll =(Link)malloc(sizeof(Node));/*用于创建新的链接表*/
ll-& gt;next = NULL
如果(l-& gt;next==NULL)
{
printf(" \ n = = = = = & gt;提示:没有可排序的数据!\ n ");
返回;
}
p = l-& gt;接下来;
while(p)
{
s =(Node *)malloc(sizeof(Node));/*新联系人用于保存信息*/
s-& gt;data = p-& gt;数据;
s-& gt;next = NULL
rr = ll
while(RR->;下一个!= NULL & amp& ampRR-& gt;下一个-& gt;data.totle & gt= p->;data.totle)
RR = RR-& gt;接下来;
if(RR-& gt;next==NULL)
RR-& gt;next = s;
其他
{
s-& gt;next = RR-& gt;接下来;
RR-& gt;next = s;
}
p = p-& gt;接下来;
}
免费(l);
l-& gt;next = ll-& gt;接下来;
printf(" \ n = = = = = & gt;提示:排序已完成!\ n ");
}
无效保存(链接l)
{
FILE * fp
node * p;
int flag=1,count = 0;
fp=fopen("c:\\student "," WB ");
if(fp==NULL)
{
printf(" \ n = = = = = & gt;提示:重新打开文件时出错!\ n ");
退出(1);
}
p = l-& gt;接下来;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p = p-& gt;接下来;
count++;
}
其他
{
flag = 0;
打破;
}
}
if(标志)
{
printf(" \ n = = = = = & gt;提示:文件保存成功。(%d条记录已被保存。)\n”,计数);
shoud save = 0;
}
fclose(FP);
}
void main()
{
链接l;/*链接表*/
FILE * fp/*文件指针*/
int sel
char ch
char jian
int count = 0;
节点*p,* r;
printf(" \ t \ t \ t \ t \ t学生成绩管理系统\n \ t \ t -黄欢(第32期)\ n ");
l=(Node*)malloc(sizeof(Node))。
l-& gt;next = NULL
r = l;
fp=fopen("C:\\student "," Rb ");
if(fp==NULL)
{
printf(" \ n = = = = = & gt;提示:文件尚不存在。您想创建它吗?(是/否)\ n ");
scanf("%c ",& amp简);
if(jian=='y'||jian=='Y ')
fp=fopen("C:\\student "," WB ");
其他
退出(0);
}
printf(" \ n = = = = = & gt;提示:文件已经打开,正在导入记录......\ n ");
而(!feof(fp))
{
p=(节点*)malloc(sizeof(节点));
If (fread (p,sizeof (node),1,FP))/*将文件内容放入联系人*/
{
p->;next = NULL
r-& gt;next = p;
r = p;/*在连接中挂起此联系人*/
count++;
}
}
fclose(FP);/*关闭文件*/
printf(" \ n = = = = = & gt;提示:导入记录后,* * *导入了%d条记录。\n ",计数);
while(1)
{
menu();
Printf("请选择一个操作:");
scanf("%d ",& ampsel);
if(sel==0)
{
if(shoudsave==1)
{ getchar();
printf(" \ n = = = = = & gt;提示:数据已被更改。是否要保存对文件的更改(y/n)?\ n ");
scanf("%c ",& ampch);
if(ch=='y'||ch=='Y ')
保存(l);
}
printf(" \ n = = = = = & gt;提示:您已经退出系统。再见!\ n ");
打破;
}
开关(选择)
{
案例1:添加(l);打破;/*增加学生*/
案例二:德尔(l);打破;/*删除学生*/
案例三:古兰经(左);打破;/*查询学生*/
情况四:修改(l);打破;/*修改学生*/
案例五:保存(l);打破;/*拯救学生*/
案例9: printf ("\ t \ t \ t = = = = = =帮助信息= = = = = = = ");打破;
默认:错误();getchar();打破;
}
}
}
/* */
/*
学生成绩管理计划
编写一个管理程序来统计学生的考试成绩。
假设学生成绩已经以一个学生一条记录的形式存储在档案中。
每个学生的记录包含姓名、学号、各门课程成绩等信息。
该程序具有以下功能:查找每门课程的总分,平均分,根据名称、
根据学号查找其记录并显示,浏览所有学生的成绩并根据总分从高到低显示学生信息。
*/
# include & ltstdio.h & gt
# define n3/*课程数量*/
#定义名称EN 20 /*名称中的最大字符数*/
#define CODELEN 10 /*学生编号的最大字符数*/
#define FNAMELEN 80 /*文件名的最大字符数*/
# definebullen80/*缓冲区中的最大字符数*/
/*课程名称列表*/
char课业[SWN][NAMELEN+1] = { "语文"、"数学"、"英语" };
结构记录
{
char name[name len+1];/*姓名*/
char code[CODELEN+1];/*学生ID */
int marks[SWN];/*各门课程的成绩*/
int total/*总分*/
}斯图;
结构节点
{
char name[name len+1];/*姓名*/
char code[CODELEN+1];/*学生ID */
int marks[SWN];/*各门课程的成绩*/
int total/*总分*/
结构节点* next/*后续表格元素指针*/
} *头;/*链表头指针*/
int total[SWN];/*每门课程的总成绩*/
FILE * stfpt/*文件指针*/
char stuff[fname len];/*文件名*/
/*从指定文件中读取记录*/
int readrecord(FILE *fpt,struct record *rpt)
{
char buf[buf len];
int I;
if(fscanf(fpt," %s ",buf)!=1)
返回0;/*文件结尾*/
strncpy(RPT-& gt;name,buf,name len);
fscanf(fpt," %s ",buf);
strncpy(RPT-& gt;code,buf,CODELEN);
for(I = 0;我& ltSWN;i++)
fscanf(fpt," %d ",& ampRPT->;marks[I]);
for(RPT-& gt;total=0,I = 0;我& ltSWN;i++)
RPT->;total+= RPT-& gt;标记[I];
返回1;
}
/*将记录写入指定文件*/
writerecord(FILE *fpt,struct record *rpt)
{
int I;
fprintf(fpt," %s\n ",RPT-& gt;姓名);
fprintf(fpt," %s\n ",RPT-& gt;码);
for(I = 0;我& ltSWN;i++)
fprintf(fpt," %d\n ",RPT-& gt;marks[I]);
返回;
}
/*显示学生记录*/
displaystu(结构记录*报告)
{
int I;
printf(" \ n名称:%s\n ",RPT-& gt;姓名);
printf("Code : %s\n ",RPT-& gt;码);
printf(" Marks:\ n ");
for(I = 0;我& ltSWN;i++)
printf(" %-15s : %4d\n ",schoolwork[i],RPT-& gt;marks[I]);
printf("总计:%4d\n ",RPT-& gt;合计);
}
/*计算各科总分*/
int totalmark(char *fname)
{
FILE * fp
结构记录;
int count,I;
if((fp=fopen(fname," r))= = NULL)
{
printf("无法打开文件%s.\n ",fname);
返回0;
}
for(I = 0;我& ltSWN;i++)
total[I]= 0;
count = 0;
while(readrecord(fp,& amps)!=0)
{
for(I = 0;我& ltSWN;i++)
total[I]+= s . marks[I];
count++;
}
fclose(FP);
返回计数;/*返回记录的数量*/
}
/*列表显示学生信息*/
void liststu(char *fname)
{
FILE * fp
结构记录;
if((fp=fopen(fname," r))= = NULL)
{
printf("无法打开文件%s.\n ",fname);
返回;
}
while(readrecord(fp,& amps)!=0)
{
display stu(& amp;s);
printf("\n按ENTER键继续...\ n ");
while(getchar()!= ' \ n ');
}
fclose(FP);
返回;
}
/*构造链表*/
结构节点*生成列表(char *fname)
{
FILE * fp
结构记录;
结构节点*p,*u,*v,* h;
int I;
if((fp=fopen(fname," r))= = NULL)
{
printf("无法打开文件%s.\n ",fname);
返回NULL
}
h =空;
p=(结构节点*)malloc(sizeof(结构节点));
while(readrecord(fp,(struct record *)p)!=0)
{
v = h;
而(v & amp& ampp->;总计& lt= v->;总计)
{
u = v;
v = v-& gt;接下来;
}
如果(v==h)
h = p;
其他
u-& gt;next = p;
p->;next = v;
p=(结构节点*)malloc(sizeof(结构节点));
}
免费(p);
fclose(FP);
返回h;
}
/*按顺序显示链表中的每个表格元素*/
void显示列表(结构节点*h)
{
而(h!=空)
{
display stu((struct record *)h);
printf("\n按ENTER键继续...\ n ");
while(getchar()!= ' \ n ');
h = h-& gt;接下来;
}
返回;
}
/*按学生姓名查找学生记录*/
int retrievebyn(char *fname,char *key)
{
FILE * fp
int c;
结构记录;
if((fp=fopen(fname," r))= = NULL)
{
printf("无法打开文件%s.\n ",fname);
返回0;
}
c = 0;
while(readrecord(fp,& amps)!=0)
{
if(strcmp(s.name,key)==0)
{
display stu(& amp;s);
c++;
}
}
fclose(FP);
如果(c==0)
printf("学生%s不在文件%s中,\n ",key,fname);
返回1;
}
/*按学号查找学生记录*/
int retrievebyc(char *fname,char *key)
{
FILE * fp
int c;
结构记录;
if((fp=fopen(fname," r))= = NULL)
{
printf("无法打开文件%s.\n ",fname);
返回0;
}
c = 0;
while(readrecord(fp,& amps)!=0)
{
if(strcmp(s.code,key)==0)
{
display stu(& amp;s);
c++;
打破;
}
}
fclose(FP);
如果(c==0)
printf("学生%s不在文件%s中,\n ",key,fname);
返回1;
}
主()
{
int i,j,n;
char c;
char buf[buf len];
FILE * fp
结构记录;
clr SCR();
printf("请输入学生成绩记录文件的名称:");
scanf("%s ",stuff);
if((FP = fopen(stuff," r))= = NULL)
{
printf("文件%s不存在,您想创建它吗?(是/否)”,填充);
getchar();
c = getchar();
if(c=='Y'||c=='y ')
{
FP = fopen(stuff," w ");
printf("请输入要写入文件的记录号:");
scanf("%d ",& ampn);
for(I = 0;我& ltn;i++)
{
printf("输入学生姓名:");
scanf("%s ",& amps . name);
printf("输入学生的代码:");
scanf("%s ",& amp美国代码);
for(j = 0;j & ltSWN;j++)
{
printf("输入%s标记: ",课业[j]);
scanf("%d ",& amps . marks[j]);
}
写记录(FP & amp;s);
}
fclose(FP);
}
}
fclose(FP);
getchar();
/* clrscr();*/
puts("现在您可以输入一个命令来管理记录。");
puts("m:分数的平均值。");
puts("t:总分数。");
puts("n:按学生姓名搜索记录。");
puts("c:按学生代码搜索记录。");
puts("l:列出所有记录。");
puts("s:按总数对记录进行排序和列出。");
puts("q:不干了!");
while(1)
{
puts("请输入命令:");
scanf(" %c ",& ampc);/*输入选择命令*/
if(c=='q'||c=='Q ')
{
puts("\n感谢您的使用。");
打破;/* q,结束程序运行*/
}
开关(c)
{
案例“m”:/*计算平均分*/
案例“M”:
if((n = total mark(stuff))= = 0)
{
puts("错误!");
打破;
}
printf(" \ n ");
for(I = 0;我& ltSWN;i++)
printf("%-15s的平均值为:%.2f.\n ",课业[i],(浮点)合计[I]/n);
打破;
案例' t': /*计算总分*/
案例“T”:
if((n = total mark(stuff))= = 0)
{
puts("错误!");
打破;
}
printf(" \ n ");
for(I = 0;我& ltSWN;i++)
printf("%-15s的总分是:%d.\n ",课业[i],总分[I]);
打破;
案例“n”:/*按学生姓名查找记录*/
案例“N”:
printf("请输入您要搜索的学生姓名:");
scanf("%s ",buf);
retrieve byn(stuff,buf);
打破;
案例“c”:/*按学生ID查找记录*/
案例“C”:
printf("请输入您要搜索的学生代码:");
scanf("%s ",buf);
retrievebyc(stuf,buf);
打破;
案例“l”:/*列出所有学生记录*/
案例“L”:
list stu(stuff);
打破;
案例':/*按总分降序显示*/
案例:
if((head = makelist(stuff))!=空)
displaylist(表头);
打破;
默认:break
}
}
}