
#include "stdioh"
/定义学生结构体/
struct Student
{
char ID[20];
char Name[20];
float Mark1;
float Mark2;
float Mark3;
float Average;
};
/声明学生数组及学生数量/
struct Student students[1000];
int num=0;
/求平均值/
float Avg(struct Student stu)
{
return (stuMark1+stuMark2+stuMark3)/3;
}
/通过学号返回数组下标/
int Student_SearchByIndex(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i]ID,id)==0)
{
return i;
}
}
return -1;
}
/通过姓名返回数组下标/
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i]Name,name)==0)
{
return i;
}
}
return -1;
}
/显示单条学生记录/
void Student_DisplaySingle(int index)
{
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%82f%82f%82f%102f\n",students[index]ID,students[index]Name,
students[index]Mark1,students[index]Mark2,students[index]Mark3,students[index]Average);
}
/插入学生信息/
void Student_Insert()
{
while(1)
{
printf("请输入学号:");
scanf("%s",&students[num]ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[num]Name);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num]Mark1);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num]Mark2);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num]Mark3);
getchar();
students[num]Average=Avg(students[num]);
num++;
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/修改学生信息/
void Student_Modify()
{
float mark1,mark2,mark3;
while(1)
{
char id[20];
int index;
printf("请输入要修改的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要修改的学生信息为:\n");
Student_DisplaySingle(index);
printf("-- 请输入新值--\n");
printf("请输入学号:");
scanf("%s",&students[index]ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[index]Name);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index]Mark1);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index]Mark2);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index]Mark3);
getchar();
students[index]Average=Avg(students[index]);
}
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/删除学生信息/
void Student_Delete()
{
int i;
while(1)
{
char id[20];
int index;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_DisplaySingle(index);
printf("是否真的要删除(y/n)");
if (getchar()=='y')
{
for (i=index;i<num-1;i++)
{
students[i]=students[i+1];
}
num--;
}
getchar();
}
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/按姓名查询/
void Student_Select()
{
while(1)
{
char name[20];
int index;
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
printf("是否继续(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/按平均值排序/
void Student_SortByAverage()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (students[j-1]Average<students[j]Average)
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/显示学生信息/
void Student_Display()
{
int i;
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");
printf("-------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s%10s%82f%82f%82f%102f\n",students[i]ID,students[i]Name,
students[i]Mark1,students[i]Mark2,students[i]Mark3,students[i]Average);
}
}
/将学生信息从文件读出/
void IO_ReadInfo()
{
FILE fp;
int i;
if ((fp=fopen("Databasetxt","rb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
/将学生信息写入文件/
void IO_WriteInfo()
{
FILE fp;
int i;
if ((fp=fopen("Databasetxt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n");
}
}
fclose(fp);
}
/主程序/
main()
{
int choice;
IO_ReadInfo();
while(1)
{
/主菜单/
printf("\n------ 学生成绩管理系统------\n");
printf("1 增加学生记录\n");
printf("2 修改学生记录\n");
printf("3 删除学生记录\n");
printf("4 按姓名查询学生记录\n");
printf("5 按平均成绩排序\n");
printf("6 退出\n");
printf("请选择(1-6):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Insert();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Select();
break;
case 5:
Student_SortByAverage();
Student_Display();
break;
case 6:
exit();
break;
}
IO_WriteInfo();
}
}
我这的基本上能满足你的要求!
有些模块没有自己添加下就OK 咯!
#ifndef H_STUDENT_HH /xxx如果没有定义xxx/
#define H_STUDENT_HH /xxx定义xx/
#include "stdioh"
#include "stringh"
#include "malloch"
#define LEN sizeof(struct message_student) /一个结构体数组元素的长度/
#define numsubs 5 /学科数目/
typedef struct message_student /结构体定义/
{
char number[6];
char name[20];
char sex[4];
float subject[numsubs];
float score;
float average;
int index;
}student;
extern int numstus; /学生数目/
extern student pointer; /指向结构体数组/
extern int lens;
int menu_select(); /函数声明/
int openfile(student stu[]);
int findrecord(student stud[]);
int writetotext(student stud[]);
void welcome();
void display1();
void showtable();
void sort(student stu[]);
void deleterecord(student stu[],int i);
void addrecord(student stud[]);
void display(student stud[],int n1,int n2);
void amendrecord(student stud[]);
void count(student stud[]);
void sortnum(student stud[]);
void sortnum2(student stud[]);
void sortname(student stud[]);
void sortname2(student stud[]);
void sortcount(student stud[]);
void sortcount2(student stud[]);
void statistic(student stud[]);
void display1();
#endif
#include "stdioh"
int menu_select()
{
char c;
printf("\n\n");
printf(" | 1 增加学生记录 5统计信息 |\n");
printf(" | 2 查询学生记录 6打开文件 |\n");
printf(" | 3 修改学生记录 7保存文件 |\n");
printf(" | 4 学生纪录排序 8显示记录 |\n");
printf(" | 0退出系统 |\n");
printf("\n\n");
printf("请选择(0-8):");
c=getchar();
getchar();
return (c-'0');
}
#include "stdioh"
int findrecord(student stud[]) /查找信息/
{
char str[2];
int i,num;
if(numstus==0)
{
printf("没有可被查找的记录\n");
return -1;
}
else
{
printf("以何种方式查找?\n1学号\t2姓名\t3名次\n");
gets(str);
if(str[0]=='1') /按学号查找/
{
printf("请输入学号:");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i]number)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='2') /按姓名查找/
{
printf("请输入姓名:");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i]name)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='3') /按名次查找/
{
printf("请输入名次:");
scanf("%d",&num);
getchar();
for(i=0;i<=numstus;i++)
if(num==stud[i]index)
{
display(stud,i,i);
break;
}
else continue;
}
if(i>numstus)
{
printf("没有查找所要的信息。\n");
return -1;
}
return i;
}
}
#include"stdioh"
int openfile(student stu[])
{
int i=0,j;
FILE fp;
char filename[20],str[2];
if(numstus!=0)
{
printf("已经有记录存在,是否保存(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(stu);
}
printf("请输入文件名:");
gets(filename);
numstus=0;
if((fp=fopen(filename,"rb+"))==NULL)
{
printf("无法打开该文件\n");
return(-1);
}
fscanf(fp,"%d",&numstus);
fgetc(fp);
while(i<numstus)
{
fscanf(fp,"%s",stu[i]number);
fscanf(fp,"%s",stu[i]name);
fscanf(fp,"%s",stu[i]sex);
for(j=0;j<numsubs;j++)
fscanf(fp,"%f",&stu[i]subject[j]);
fscanf(fp,"%f",&stu[i]score);
fscanf(fp,"%f",&stu[i]average);
fscanf(fp,"%d",&stu[i]index);
i++;
}
fclose(fp);
printf("文件读取成功\n");
printf("是否显示纪录(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
display(stu,0,numstus-1);
return(0);
}
#include "stdioh"
void sort(student stud[])
{
int i,j=0;
char str[5];
student p;
p=stud;
if(numstus==0)
{
printf("没有可供查询的记录!");
}
while(1)
{
for(i=0;;i++)
{
printf(" 请输入查询方式:");
printf("(直接输入回车则结束查询 *** 作)\n");
printf("1按照学号\t");
printf("2按照姓名\t");
printf("3按照名次\n");
gets(str);
if(strlen(str)==0) break;
if(str[0]=='1')
{
printf("请输入排序次序:\n");
printf("1升序排列\t");
printf("2降序排列\n");
gets(str);
if(str[0]=='1')
sortnum2(p);
else
sortnum(p);
display(stud,0,numstus-1);
}
else if(str[0]=='2')
{
printf("请输入排序次序:\n");
printf("1升序排列\t");
printf("2降序排列\n");
gets(str);
if(str[0]=='1')
sortname2(p);
else
sortname(p);
display(stud,0,numstus-1);
}
else if(str[0]=='3')
{
printf("请输入排序次序:\n");
printf("1升序排列\t");
printf("2降序排列\n");
gets(str);
if(str[0]=='1')
sortcount2(p);
else
sortcount(p);
display(stud,0,numstus-1);
}
else printf("请输入1~3");
printf("是否退出排序(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y') break;
}
return;
}
}
void sortnum(student stud[])
{
int i,j;
student temp;
student p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(strcmp(stud[j+1]number,stud[j]number)>0)
{
temp=(p+j);
(p+j)=(p+j+1);
(p+j+1)=temp;
}
}
}
void sortnum2(student stud[])
{
int i,j;
student temp;
student p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(strcmp(stud[j]number,stud[j+1]number)>0)
{
temp=(p+j);
(p+j)=(p+j+1);
(p+j+1)=temp;
}
}
}
void sortname(student stud[])
{
int i,j;
student temp;
student p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(strcmp(stud[j+1]name,stud[j]name)>0)
{
temp=(p+j);
(p+j)=(p+j+1);
(p+j+1)=temp;
}
}
}
void sortname2(student stud[])
{
int i,j;
student temp;
student p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(strcmp(stud[j]name,stud[j+1]name)>0)
{
temp=(p+j);
(p+j)=(p+j+1);
(p+j+1)=temp;
}
}
}
void sortcount(student stud[])
{
int i,j;
student temp;
student p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(stud[j+1]index>stud[j]index)
{
temp=(p+j);
(p+j)=(p+j+1);
(p+j+1)=temp;
}
}
}
void sortcount2(student stud[])
{
int i,j;
student temp;
student p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(stud[j]index>stud[j+1]index)
{
temp=(p+j);
(p+j)=(p+j+1);
(p+j+1)=temp;
}
}
}
#include"stdioh"
void statistic(student stud[]) /新增功能,输出统计信息/
{
int i,j=0,k=0;
char c1,str[2];
float average[numsubs],sum=0;
if(numstus==0)
printf("没有可被查找的记录\n");
else
{
while(1)
{
printf("下面将统计考试成绩\n");
printf("请选择你要统计哪科的成绩 1A\t2B\t3C\t4D\t5E\n");
c1=getchar();
printf("\t一共有个%d记录\n",numstus); /总共记录数/
switch(c1)
{
case '1':
for(i=0;i<numstus;i++) /循环输入判断/
{
sum+=stud[i]subject[0];
if(stud[k]subject[0]>stud[i]subject[0]) k=i;
if(stud[j]subject[0]<stud[i]subject[0]) j=i;
}
average[0]=sum/numstus;
printf("\t科目A的最高分:\n"); /最高分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[j]number,stud[j]name,stud[j]subject[0]);
printf("\t科目A的最低分是:\n"); /最低分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[k]number,stud[k]name,stud[k]subject[0]);
printf("\t科目A的平均分是 %52f\n",average[0]); /平均分/
break;
case '2':
for(i=0;i<numstus;i++) /循环输入判断/
{
sum+=stud[i]subject[1];
if(stud[k]subject[1]>stud[i]subject[1]) k=i;
if(stud[j]subject[1]<stud[i]subject[1]) j=i;
}
average[1]=sum/numstus;
printf("\t科目B的最高分:\n"); /最高分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[j]number,stud[j]name,stud[j]subject[1]);
printf("\t科目B的最低分是:\n"); /最低分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[k]number,stud[k]name,stud[k]subject[1]);
printf("\t科目B的平均分是 %52f\n",average[1]); /平均分/
break;
case '3':
for(i=0;i<numstus;i++) /循环输入判断/
{
sum+=stud[i]subject[2];
if(stud[k]subject[2]>stud[i]subject[2]) k=i;
if(stud[j]subject[2]<stud[i]subject[2]) j=i;
}
average[2]=sum/numstus;
printf("\t科目C的最高分:\n"); /最高分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[j]number,stud[j]name,stud[j]subject[2]);
printf("\t科目C的最低分是:\n"); /最低分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[k]number,stud[k]name,stud[k]subject[2]);
printf("\t科目C的平均分是 %52f\n",average[2]); /平均分/
break;
case '4':
for(i=0;i<numstus;i++) /循环输入判断/
{
sum+=stud[i]subject[3];
if(stud[k]subject[3]>stud[i]subject[3]) k=i;
if(stud[j]subject[3]<stud[i]subject[3]) j=i;
}
average[3]=sum/numstus;
printf("\t科目D的最高分:\n"); /最高分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[j]number,stud[j]name,stud[j]subject[3]);
printf("\t科目D的最低分是:\n"); /最低分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[k]number,stud[k]name,stud[k]subject[3]);
printf("\t科目D的平均分是 %52f\n",average[3]); /平均分/
break;
case '5':
for(i=0;i<numstus;i++) /循环输入判断/
{
sum+=stud[i]subject[4];
if(stud[k]subject[4]>stud[i]subject[4]) k=i;
if(stud[j]subject[4]<stud[i]subject[4]) j=i;
}
average[4]=sum/numstus;
printf("\t科目E的最高分:\n"); /最高分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[j]number,stud[j]name,stud[j]subject[4]);
printf("\t科目E的最低分是:\n"); /最低分/
printf("\t\t学号:%s 姓名:%s 分数:%2f\n",stud[k]number,stud[k]name,stud[k]subject[4]);
printf("\t科目E的平均分是 %52f\n",average[4]); /平均分/
break;
default:printf("输入错误!请输入1~5之间的数\n");
}
sum=0;
getchar();
printf("是否继续进行统计(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y') ;
else break;
}
}
}
#include"stdioh"
int writetotext(student stud[]) /将所有记录写入文件/
{
int i=0,j;
FILE fp;
char filename[20];
printf("输入文件名称:");
gets(filename);
fp=fopen(filename,"w");
fprintf(fp,"%d\n",numstus);
while(i<numstus)
{
fprintf(fp,"%s %s %s ",stud[i]number,stud[i]name,stud[i]sex);
for(j=0;j<numsubs;j++)
fprintf(fp,"%f ",stud[i]subject[j]);
fprintf(fp,"%f %f %d ",stud[i]score,stud[i]average,stud[i]index);
i++;
}
fclose(fp);
printf("已成功存储!\n");
display(stud,0,numstus-1);
numstus=0;
return 0;
}
#include"stdioh"
void welcome()
{
printf("\t\n");
printf("\t\t\t\t欢迎进入学生成绩管理系统\t\t\t\t\t\t\t\t 晓 欢迎使用!\n");
printf("\t\n");
printf("\t\t\t\t\t\t本系统由“晓”一组亲情制作\n\n");
printf("\t\t\t\t\t\t制作人员列表: \n");
printf("\t\t\t\t\t\t吴彦兵 黄进 汪红波\n\t\t\t\t\t\t刘玉萧 杨超 章耀\n");
printf("输入回车进入菜单栏:\n");
printf("\n\n");
getchar();
}
void showtable()
{
printf("-------------------------------------------------------------------------------\n");
printf("学号\t姓名\t性别\tA\tB\tC\tD\tE 总分 平均分 名次\n");
printf("-------------------------------------------------------------------------------\n");
}
void display(student stud[],int n1,int n2)
{
int i;
showtable(); /显示表头/
for(i=n1;i<=n2;i++)
printf("%s\t%s\t%s\t%1f\t%1f\t%1f\t%1f\t%1f %1f %1f %d\t\n",stud[i]number,stud[i]name,stud[i]sex,stud[i]subject[0],stud[i]subject[1],stud[i]subject[2],stud[i]subject[3],stud[i]subject[4],stud[i]score,stud[i]average,stud[i]index);
/通过循环输出数据/
}
void display1()
{
printf("\t\t本系统由晓一组亲情制作\n\n");
printf("\t\t制作人员列表: \n");
printf("\t\t\t\t\t\t吴彦兵 黄进 汪红波\n\t\t\t\t\t\t刘玉萧 杨超 章耀\n");
printf("\t\t\t=========欢迎下次使用=========");
printf("\n\n");
getchar();
}
#include"stdioh"
#include<stringh>
void amendrecord(student stud[])
{
char str[5]; /供用户输入/
int i=-1,j;
if(numstus==0) /没有记录返回/
printf("没有可供修改的记录!");
while(i<0)
{
i=findrecord(stud);
if(i>=0)
{
printf("要删除这个学生的信息吗(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
deleterecord(stud,i);
count(stud);
}
else
{
printf("确定要修改这个学生的信息吗(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
printf("下面请重新输入学生的信息:\n");
printf("请输入学号:");
gets(stud[i]number);
printf("请输入姓名:");
gets(stud[i]name);
printf("请输入性别(男/女 1/0):");
gets(str);
if(str[0]=='0')
strcpy(stud[i]sex,"女");
else
strcpy(stud[i]sex,"男");
stud[i]score=0;
printf("请按顺序输入成绩:");
for(j=0;j<numsubs;j++)
{
scanf("%f",&stud[i]subject[j]);
stud[i]score+=stud[i]subject[j];
}
getchar();
stud[i]average=stud[i]score/numsubs;
}
count(stud);
}
display(stud,0,numstus-1);
}
printf("是否继续进行其他修改(y/n)\n");
gets(str);
if(str[0]=='y'||str[0]=='Y')
i=-1;
else i=1;
}
}
void deleterecord(student stu[],int i) /删除信息/
{
int j;
while(i>=0)
{
for(j=i;j<numstus;j++)
stu[j]=stu[j+1];
numstus--;
printf("删除成功!\n");
}
}
void count(student stud[])
{
int i,j;
for(i=0;i<numstus;i++)
{
stud[i]index=1;
for(j=0;j<numstus;j++)
if(stud[j]score>stud[i]score)
stud[i]index++;
}
}
#include "stdioh"
void addrecord(student stud[])
{
int i=0,j,num;
char str[5];
if(numstus!=0)
{
printf("已有记录存在是否覆盖(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
else i=numstus;
}
printf("请输入增加的学生信息条目数:");
scanf("%d",&num);
if(i==0)
numstus=num;
else numstus+=num;
if(numstus>lens)
{
lens+=50;
pointer=(student )realloc(pointer,lensLEN);
}
printf("请输入学生信息:\n");
for(;i<numstus;i++)
{
getchar();
printf("请输入学号:");
gets(pointer[i]number);
printf("请输入姓名:");
gets(pointer[i]name);
printf("请输入性别(男/女 1/0):");
gets(pointer[i]sex);
if(pointer[i]sex[0]=='0') strcpy(pointer[i]sex,"女");
else strcpy(pointer[i]sex,"男");
printf("请输入各科成绩:(按ABCDE的顺序):");
stud[i]score=0;
for(j=0;j<numsubs;j++)
{
scanf("%f",&stud[i]subject[j]); /计算总分/
stud[i]score+=stud[i]subject[j];
}
stud[i]average=stud[i]score/numsubs; /计算平均分/
}
count(stud); /附名次/
display(stud,0,numstus-1);
getchar();
}
#include "stdioh"
int numstus;
int lens;
student pointer;
void main()
{
int i=1;
char str[2];
lens=100;
pointer=(student )malloc(lensLEN); /分配内存/
numstus=0;
welcome(); /欢迎界面/
while(i>0)
{
i=menu_select(); /控制菜单/
switch(i)
{
case 1:addrecord(pointer);break; /增加学生信息/
case 2:findrecord(pointer);break; /查询学生信息/
case 3:amendrecord(pointer);break; /修改学生信息/
case 4:sort(pointer);break; /学生信息排序/
case 5:statistic(pointer);break; /统计信息/
case 6:openfile(pointer);break; /打开文件/
case 7:writetotext(pointer);break; /保存文件/
case 8:display(pointer,0,numstus-1);break; /显示记录/
case 0:
if(numstus!=0) printf("是否保存当前记录(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(pointer);
i=-1;break; /退出系统/
default:printf("请输入数字0~8:\n");i=1; /输入错误/
}
}
printf("\t\t======欢迎再次使用本系统======= \n");
display1();
}
我大一时写了个,贴上来给你。
/
创建日期:2011-04-27
程序名称:链表综合 *** 作(学生成绩管理系统)
程序作者:木芽锺
备注信息:
/
#include <stdioh>
#include <stringh>
#include <stdlibh>
#define SN 3 //课程门数,可以自定义
typedef struct student
{
char num[10],
name[10];
float score[SN],
sum,
avg;
struct student next;
}STU;
/输入链表单元内容/
void input(STU p)
{
int i;
printf("please input number:\n");
scanf("%s",p->num);
printf("please input name:\n");
scanf("%s",p->name);
printf("please input %d scores:\n",SN);
p->sum=0;
for(i=0;i<SN;i++)
{
scanf("%f",&p->score[i]);
p->sum+=p->score[i];
}
p->avg=p->sum/SN;
}
/创建一个链表单元/
STU creat_node()
{
STU p;
p=(STU )malloc(sizeof(STU));
if(p == NULL)
{ printf("No enough memory !");
exit(0);
}
input(p);
p->next=NULL;
return p;
}
/创建一个链表/
STU creat_list()
{
STU head=NULL,tail=NULL,p;
char str[4];
printf("List creating\n");
do
{
printf("Do you want to continue (yes/no) :");
scanf("%s",str);
if(strcmp(str,"yes")==0)
{
p=creat_node();
if(head==NULL){head=tail=p;continue;}
tail->next=p;
tail=p;
}
if(strcmp(str,"yes")!=0&&strcmp(str,"no")!=0)
{
printf("You must input 'yes' or 'no'\n");
//getchar();
continue;
}
if(strcmp(str,"no")==0)break;
//getchar();
}while(1);
printf("List create end\n\n");
return head;
}
/输出一个链表单元/
void print_a_node(STU fin)
{
int i;
printf("%s;\t%s;\t%02f;\t%02f\t",fin->num,fin->name,fin->avg,fin->sum);
for(i=0;i<SN;i++)
printf("%02f\t",fin->score[i]);
putchar(10);
}
/输出一个链表头部/
void print_a_head()
{
int i;
printf("number\tname\tavg\tsum\t");
for(i=0;i<SN;i++)
printf("score%d\t",i+1);
putchar(10);
}
/输出 *** 作菜单/
void print_menu_list()
{
printf("======the operation menu list======\n");
printf("[0]-->exit\n[1]-->creat a list\n[2]-->print the list\n[3]-->insert a list node\n[4]-->select by number\n[5]-->select by name\n");
printf("[6]-->delete a list node\n[7]-->update a list node\n[8]-->order the list by score\n[9]-->print the operation menu list\n");
printf("======the operation menu list======\n");
putchar(10);
}
/输出链表/
int print_list(STU stu)
{
STU p=stu;
if(stu==NULL)
{
printf("no records!!!\n");
return (0);
}
print_a_head();
while(p!=NULL)
{
print_a_node(p);
p=p->next;
}
putchar(10);
return (0);
}
/插入链表单元/
void insert(STU stu)
{
STU tail=stu,p;
printf("now insert a list node\n");
while(tail->next!=NULL)
{
tail=tail->next;
}
p=creat_node();
tail->next=p;
printf("Insert end\n\n");
}
/查找链表num/
STU find_num(STU stu, char num[])
{
STU p=stu,pr=NULL;
while(p!=NULL)
{
if(strcmp(p->num,num)==0){pr=p;break;}
p=p->next;
}
return pr;
}
/查找链表name/
STU find_name(STU stu, char name[])
{
STU p=stu,pr=NULL;
while(p!=NULL)
{
if(strcmp(p->name,name)==0){pr=p;break;}
p=p->next;
}
return pr;
}
/删除链表单元/
STU delet(STU stu, char name[])
{
STU p=stu,front=stu;
if((p=find_name(stu,name))!=NULL)
{
printf("the delete record:\n");
print_a_head();
print_a_node(p);
}
else
{
printf("can not find the student!\n");
return stu;
}
p=stu;
while(p!=NULL&&strcmp(p->name,name)!=0)
{
front=p;
p=p->next;
}
if(p==stu&&front==stu)stu=NULL;
else front->next=p->next;
if(p!=NULL)p->next=NULL;
free(p);
printf("delete end\n\n");
return stu;
}
/更新链表单元/
void update(STU stu, char name[])
{
STU fin;
if((fin=find_name(stu,name))!=NULL)
{
printf("before update:\n");
print_a_head();
print_a_node(fin);
}
else
{
printf("can not find the student!\n");
exit(0);
}
printf("please input the new records now\n");
input(fin);
printf("update end\n\n");
}
/链表单元排序/
void order(STU stu)
{
STU pi,pj,max,temp;
int i;
if(stu!=NULL&&stu->next!=NULL)
{
for(pi=stu;pi!=NULL;pi=pi->next)
{
max=pi;
for(pj=pi->next;pj!=NULL;pj=pj->next)
{
if(max->sum<pj->sum)
max=pj;
}
if(max!=pi)
{
strcpy(tempnum,max->num);
strcpy(max->num,pi->num);
strcpy(pi->num,tempnum);
strcpy(tempname,max->name);
strcpy(max->name,pi->name);
strcpy(pi->name,tempname);
tempsum=pi->sum;
pi->sum=max->sum;
max->sum=tempsum;
tempavg=max->avg;
max->avg=pi->avg;
pi->avg=tempavg;
for(i=0;i<SN;i++)
{
tempscore[i]=max->score[i];
max->score[i]=pi->score[i];
pi->score[i]=tempscore[i];
}
}
}
printf("order end\n\n");
}
else
printf("do not need to order\n\n");
}
/释放链表/
void fre(STU stu)
{
STU p=stu,pf;
if(stu==NULL)
{
printf("the list is NULL!\n");
exit(0);
}
while(p!=NULL)
{
pf=p->next;
free(p);
p=pf;
}
if(stu==NULL)
printf("free the list\n");
}
STU menu(STU stu,int cas)
{
STU fin=NULL;
char a[10];
switch(cas)
{
//创建链表
case 1:
if(stu!=NULL)fre(stu);
stu=creat_list();
break;
//输出链表
case 2:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
print_list(stu);
break;
//插入链表单元
case 3:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
insert(stu);
break;
//查找输出number
case 4:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
printf("please input the 'number' you want to find:\n");
scanf("%s",a);
if((fin=find_num(stu,a))!=NULL)
{
print_a_head();
print_a_node(fin);
}
else printf("no found!\n");
break;
//查找输出name
case 5:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
printf("please input the 'name' you want to find:\n");
scanf("%s",a);
if((fin=find_name(stu,a))!=NULL)
{
print_a_head();
print_a_node(fin);
putchar(10);
}
else printf("no found!\n");
break;
//删除链表单元
case 6:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
printf("please input the 'name' you want to delete:\n");
scanf("%s",a);
stu=delet(stu,a);
break;
//更新链表单元
case 7:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
printf("please input the 'name' you want to update:\n");
scanf("%s",a);
update(stu,a);
break;
//链表单元排序
case 8:
if(stu==NULL){printf("can not do this operation!\n");putchar(10);break;}
printf("order by score\n");
order(stu);
break;
//打印链表 *** 作菜单
case 9:
print_menu_list();
break;
default:
printf("can not do this operation!\n");putchar(10);break;
}
return stu;
}
void main()
{
STU stu=NULL;
int cas;
//打印 *** 作提示
print_menu_list();
//用户 *** 作
do
{
printf("press 0~9 to choose operation!\n");
scanf("%d",&cas);
if(cas<0||cas>9){printf("you must press 0 to 9 !\n");continue;}
if(cas!=0)stu=menu(stu,cas);
if(cas==0){printf("operation end !\n\n");fre(stu);}
}while(cas!=0);
//释放链表
fre(stu);
}
学生成绩管理系统代码
#include<stdioh>
#include<malloch>
#include<stringh>
typedef struct Student
{
int no;
char name[10];
float score[3]; //three scores
float average; //average score
struct Student next;
}Student;
void Initial(Student p)
{
p=(Student)malloc(sizeof(Student));//the head of the linklist
p->next=NULL;
}
void Input(Student p)
{
Student stu=(Student)malloc(sizeof(Student));
printf("学号:"); scanf("%d",&stu->no);
printf("姓名:"); scanf("%s",stu->name);
printf("成绩1:"); scanf("%f",&stu->score[0]);
printf("成绩2:"); scanf("%f",&stu->score[1]);
printf("成绩3:"); scanf("%f",&stu->score[2]);
stu->average=(stu->score[0]+stu->score[1]+stu->score[2])/3;
stu->next=NULL;
Student ps=(Student)malloc(sizeof(Student));
ps=p;
while(ps->next)
ps=ps->next;
ps->next=stu;
//free(ps);
}
void Output(Student p)
{
Student ps=(Student)malloc(sizeof(Student));
ps=p->next;
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分\n");
while(ps!=NULL)
{
printf("%d\t",ps->no);
printf("%s\t",ps->name);
printf("%1f\t",ps->score[0]);
printf("%1f\t",ps->score[1]);
printf("%1f\t",ps->score[2]);
printf("%1f\t\n",ps->average);
ps=ps->next;
}
free(ps);
}
void Find(Student p)
{
Student ps=(Student)malloc(sizeof(Student));
ps=p->next;
char name[10];
printf("输入要查询的学生姓名:");
scanf("%s",name);
while(strcmp(ps->name,name)!=0) //相同时为0
ps=ps->next;
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分\n");
printf("%d\t",ps->no);
printf("%s\t",ps->name);
printf("%1f\t",ps->score[0]);
printf("%1f\t",ps->score[1]);
printf("%1f\t",ps->score[2]);
printf("%1f\t\n",ps->average);
}
void swap(Student p1, Student p2) //swap two nodes for sorting
{
Student temp=(Student)malloc(sizeof(Student));
temp->no=p1->no;
strcpy(temp->name,p1->name);
temp->score[0]=p1->score[0];
temp->score[1]=p1->score[1];
temp->score[2]=p1->score[2];
temp->average=p1->average;
p1->no=p2->no;
strcpy(p1->name,p2->name);
p1->score[0]=p2->score[0];
p1->score[1]=p2->score[1];
p1->score[2]=p2->score[2];
p1->average=p2->average;
p2->no=temp->no;
strcpy(p2->name,temp->name);
p2->score[0]=temp->score[0];
p2->score[1]=temp->score[1];
p2->score[2]=temp->score[2];
p2->average=temp->average;
free(temp);
}
void Sort(Student p) //sort by average
{
Student p1=(Student)malloc(sizeof(Student));
Student p2=(Student)malloc(sizeof(Student));
p1=p->next;
while(p1)
{
float avg=p1->average;
p2=p1->next;
while(p2)
{
if( avg< (p2->average))
{
swap(p1,p2);
avg=p2->average;
}
p2=p2->next;
}
p1=p1->next;
}
}
void Insert(Student p)
{
printf("按平均分高低插入数据!\n");
Student stu=(Student)malloc(sizeof(Student));//the data being inserted
printf("学号:"); scanf("%d",&stu->no);
printf("姓名:"); scanf("%s",stu->name);
printf("成绩1:"); scanf("%f",&stu->score[0]);
printf("成绩2:"); scanf("%f",&stu->score[1]);
printf("成绩3:"); scanf("%f",&stu->score[2]);
stu->average=(stu->score[0]+stu->score[1]+stu->score[2])/3;
stu->next=NULL;
Student p1=(Student)malloc(sizeof(Student));//temp
p1=p;
while(p1->next && ((p1->next)->average) >(stu->average))
p1=p1->next;
//p1=p1->next;
stu->next=p1->next;
p1->next=stu;
}
void Menu(Student p)
{
int select;
printf("您好,欢迎使用学生成绩管理系统!\n");
printf("1:输入学生成绩数据\n2:输出全部学生信息\n3:按姓名查找学生记录\n4:按平均成绩进行排序\n5:按平均成绩高低插入数据\n6:退出\n");
scanf("%d",&select);
while(select<=6 && select>0)
{
switch(select)
{
case 1: Input(p);break;
case 2: Output(p);break;
case 3: Find(p); break;
case 4: Sort(p); break;
case 5: Insert(p); break;
case 6: printf("成功退出,欢迎再次使用!\n"); return ; break;
}
printf("1:输入学生成绩数据\n2:输出全部学生信息\n3:按姓名查找学生记录\n4:按平均成绩进行排序\n5:按平均成绩高低插入数据\n6:退出\n");
scanf("%d",&select);
}
}
int main()
{
Student head=(Student)malloc(sizeof(Student));
Menu(head);
}
以上就是关于C语言程序设计学生成绩管理系统全部的内容,包括:C语言程序设计学生成绩管理系统、C语言编程:学生成绩管理系统、怎样用c语言编写一个学生成绩管理系统等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)