编程实现一个基础的成绩管理系统。
通过本程序综合掌握结构体类型、指针、函数、文件等知识的综合使用。
(1)实现简单的菜单设计,如下所示:
1添加学生信息
2显示学生信息
3查找学生信息
4插入学生信息
5删除学生信息
6成绩计算
7按总分降序输出
0退出
(2)每个学生的信息至少包括姓名、学号、3门课程的成绩、班级等信息。
(3)”添加学生信息” :输入新的学生信息以后,系统将把相关信息存储到文件中。以班级为单位存放到不同的文件中。至少有3个班,每个班级至少10个学生。
(4) ”显示学生信息”:系统将从文件中读取数据,按要求显示所有的学生信息。为使界面美观,可考虑用二维表格的形式输出。
(5) “查找学生信息”:可进一 步设计,如按姓名查找或按学号查找,或者查找某门课程的最高/最低成绩、或者在所有学生中查找平均分最高/最低的学生信息等。
(6) “插入学生信息”:根据学号顺序进行插入。
(7) ”删除学生信息”:可进一步设计,根据姓名删除还是根据学号删除。删除前显示该条记录,并提交用户确认。
(8) "成绩计算”:可扩充,如计算每个学生的总分、平均分;计算每个班级每门课程的平均分。
(9) “按总分降序输出”:可扩展,按总分降序或升序。
4.要求采用模块化设计,独立的功能(如添加、显示、查询、删除等)应在各个自定义函数中实现。
5.撰写课程设计报告,内容包括:功能结构图、程序流程图、函数列表、各函数功能简介及完整的源程序(包含必要的注释),程序运行结果等。(设计报告格式自行设计)
6.原始学生数据输入后(如至少10个学生的信息),请用文件保存,以后其他操作的数据都要从文件中读出来,不允许手工再输入原始数据。其他操作对文件的读写不作特别要求。
7 请从第2页开始合理设计文档及排版。此表格内的格式请勿变动。
8 完成后的电子文档以姓名命名,如“张一一.doc”。正文采用5号宋体,1.5倍行距。
函数名 功能说明
void load(STU *head); 从文件中载入数据
void save(STU *head); 保存此次运行所进行的操作
STU *addl(STU *head); 添加新的学生信息
void shuru(STU *head); 打印输入界面并输入数据
void chakan(STU *head); 以不同的方式查看数据
void zhuanhuan(STU *head); 把指针指向文件传递给数组
void search(STU *head); 查找学生信息
void Amend(STU* head); 修改学生信息
void menu(); 主菜单的打印
void swap(STU* px); 排序交换学生信息
void Rank(STU* px); 学生信息排序
void insert(STU* head); 插入学生信息
void del(STU* head); 删除学生信息
int compare(char *a,char *b); 与密码函数并用,比较密码
void Password(int o); 密码系统,输入与修改密码
void gotopos(int x,int y); 光标到达指定位置
void Set(); 系统设置,与密码,颜色修改相关
void color(int); 修改系统颜色
Int main() 主函数
#include
#include
#include
#include
#include
typedef struct Students_Information
{
int id;
char name[20];
int sub[3];
double total_score;
struct Students_Information *next;
} STU;
typedef struct zerostu
{
int id;
char name[20];
int sub[3];
double total_score;
}zs;
zs num[30000];
int N=0;
char Right_pass[100];
STU *head,*node;
FILE *fp;
void load(STU *head);
void save(STU *head);
STU *addl(STU *head);
void shuru(STU *head);
void chakan(STU *head);
void zhuanhuan(STU *head);
void search(STU *head);
void Amend(STU* head);
void menu();
void swap(STU* px);
void Rank(STU* px);
void insert(STU* head);
void del(STU* head);
int compare(char *a,char *b);
void Password(int o);
void gotopos(int x,int y);
void Set();
void color(int);
int main()
{
system("color F1");
int n;
head=(STU*)malloc(sizeof(STU));
head->next = NULL;
load(head);
gets(Right_pass);
while(1)
{
menu();
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:shuru(head);break;
case 2:chakan(head);break;
case 3:search(head);break;
case 4:Amend(head);break;
case 5:insert(head);break;
case 6:del(head);break;
case 7:Rank(head);break;
case 8:save(head);break;
case 9:Set();break;
default:return 0;break;
}}
return 0;
}
void menu()
{
system("cls");
printf("\n");
printf(" |------------------------------------------------------|\n");
printf(" | ***欢迎来到学生管理系统*** 数据:[%d]条 |\n",N);
printf(" |------------------------------------------------------|\n");
printf(" | |\n");
printf(" | 1: 输 入 学 生 数 据 |\n");
printf(" | |\n");
printf(" | 2: 查 看 学 生 信 息 |\n");
printf(" | |\n");
printf(" | 3: 搜 索 学 生 信 息 |\n");
printf(" | |\n");
printf(" | 4: 修 改 数 据 |\n");
printf(" | |\n");
printf(" | 5: 插 入 学 生 信 息 |\n");
printf(" | |\n");
printf(" | 6: 删 除 学 生 信 息 |\n");
printf(" | |\n");
printf(" | 7: 进 行 排 序 |\n");
printf(" | |\n");
printf(" | 8: 保 存 本 次 内 容 |\n");
printf(" | |\n");
printf(" | 9: 系 统 设 置 |\n");
printf(" | |\n");
printf(" | 0: 退 出 系 统 |\n");
printf(" |------------------------------------------------------|\n");
printf(" |--- 请输入对应数字进行操作 ---|\n");
printf("\n");
printf(" Enter The Number: ");
};
void load(STU *head)
{
STU *p=NULL,*s=NULL;
s=(STU*)malloc(sizeof(STU));
fp=fopen("E:\\Text.dat","rb");
while(1)
{
if(fread(s,sizeof(STU),1,fp)!=0)
{
p=addl(head);
p->id=s->id;
p->sub[1]=s->sub[1];
p->sub[2]=s->sub[2];
p->sub[0]=s->sub[0];
p->total_score=s->total_score;
strcpy(p->name,s->name);
N++;
}
else { if(N==0) node=head;
else node=p;
break;}
}
free(s);
fclose(fp);
};
STU *addl(STU *head)
{
STU *q=head;
while(q->next!=NULL)
q=q->next;
q->next=(STU*)malloc(sizeof(STU));
q->next->next=NULL;
return q->next;
};
void save(STU *head)
{
STU *p;
p=head->next;
fp=fopen("E:\\Text.dat","wb");
while(p!= NULL)
{
fwrite(p, sizeof(STU), 1, fp);
p=p->next;
}
printf(" -----保存成功-----\n");
fclose(fp);
};
void shuru(STU *head)
{
Password(0);
STU *p,*p1,*p2,*s;
FILE *fp;
int id,sub1,sub2,sub3;
char name[20];
system("cls");
p=node;
printf("\n");
printf(" ----------------------------\n");
printf(" ^学号=0时结束^\n\n");
printf(" -->请输入学号:");
scanf("%d",&id);
while(id!=0)
{
printf(" 输入姓名:");
scanf("%s",name);
printf(" 输入第一科成绩:");
scanf("%d",&sub1);
printf(" 输入第二科成绩:");
scanf("%d",&sub2);
printf(" 输入第三科成绩:");
scanf("%d",&sub3);
s=(STU*)malloc(sizeof(STU));
s->id=id;
strcpy(s->name,name);
s->sub[0]=sub1;
s->sub[1]=sub2;
s->sub[2]=sub3;
s->total_score=sub1+sub2+sub3;
p->next=s;
p=s;
printf(" -->请输入学号:");
scanf("%d",&id);
N++;
}
p->next=NULL;
fp = fopen("D:/a.txt", "wb");
getchar();
};
void chakan(STU *head)
{
STU *p,*s;
char i;
system("cls");
p=head->next;
printf(" |-------------------------------------------------------------------------------------------------------------|\n");
printf(" | 学 生 学 号---------姓名---------学科一--------学科二---------学科三-----------总 成 绩 |\n\n");
while(p!=NULL)
{
printf(" %20d %6s %8d %9d %10d %13.1f \n",p->id,p->name,p->sub[0],p->sub[1],p->sub[2],p->total_score);
printf(" \n");
p=p->next;
}
printf(" |-------------------------------------------------------------------------------------------------------------|\n\n");
printf(" 按1返回主菜单;按2退出系统:");
getchar();
scanf("%c",&i);
if(i=='1') return;
else exit(0);
};
void zhuanhuan(STU *head)
{
int i=0,j;
STU *p,*s;
p=head->next;
while(p!=NULL)
{
num[i].id=p->id;
strcpy(num[i].name,p->name);
for(j=0;j<3;j++)
num[i].sub[j]=p->sub[j];
num[i].total_score=p->total_score;
i++;
p=p->next;
}
};
void search(STU* head)
{
int i,id;
char ch;
STU* px;
px=head;
system("cls");
printf("\n");
printf(" ----请输入需要搜索的学生学号----\n\n");
printf(" Enter The ID Number: ");
scanf("%d",&id);
printf("\n");
for(i=0;i<N;i++)
{
px=px->next;
if(id==px->id)
{
printf(" |----------------|\n");
printf(" ID: %d \n",px->id);
printf(" Name: %s \n",px->name);
printf(" Sub1: %d \n",px->sub[0]);
printf(" Sub2: %d \n",px->sub[1]);
printf(" Sub3: %d \n",px->sub[2]);
printf(" Toatl:%.1f \n",px->total_score);
printf(" |----------------|\n\n");
break;
}
}
if(i==N)
printf(" ------没 有 这 名 学 生------\n");
printf(" 按1返回主菜单;按2退出系统:");
getchar();
scanf("%c",&ch);
if(ch=='1') return;
else exit(0);
}
void Amend(STU* head)
{
int i,id;
char c;
STU* px;
px=head;
Password(0);
system("cls");
printf("\n");
printf(" ----请输入需要修改的学生学号----\n\n");
printf(" Enter The ID Number: ");
scanf("%d",&id);
if(id==0) {printf(" 无此数据!!! \n");return ;}
for(i=0;i<N;i++)
{
px=px->next;
if(id==px->id)
{
printf(" |----------------\n");
printf(" |A.Name: %s \n",px->name);
printf(" |B.Sub1: %d \n",px->sub[0]);
printf(" |C.Sub2: %d \n",px->sub[1]);
printf(" |D.Sub3: %d \n",px->sub[2]);
printf(" |E.Toatl: %.1f \n",px->total_score);
printf(" |----------------\n\n");
break;}}
if(i==N)
{printf(" ------No Such Student------\n");return ;}
printf(" ---请输入需要修改的选项----\n");
getchar();
printf(" 输入字母:");
scanf("%c",&c);
printf(" *输入新信息:");
switch(c)
{
case 'A':
case 'a':scanf("%s",px->name);break;
case 'B':
case 'b':scanf("%d",&px->sub[0]);break;
case 'C':
case 'c':scanf("%d",&px->sub[1]);break;
case 'D':
case 'd':scanf("%d",&px->sub[2]);break;
case 'E':
case 'e':scanf("%lf",&px->total_score);break;
default : {printf(" 选择错误!!\n");break;return;}
}
if('a'<=c&&c<='d'||'A'<=c&&c<='D')
{px->total_score=px->sub[0]+px->sub[1]+px->sub[2];}
printf(" 修改成功!!!\n");
getchar();
}
void swap(STU* px)
{
int t;
double tem,shu1;
STU* head;
char tname[20];
tem=px->total_score;
px->total_score=px->next->total_score;
px->next->total_score=tem;
t=px->id;
px->id=px->next->id;
px->next->id=t;
t=px->sub[0];
px->sub[0]=px->next->sub[0];
px->next->sub[0]=t;
t=px->sub[1];
px->sub[1]=px->next->sub[1];
px->next->sub[1]=t;
t=px->sub[2];
px->sub[2]=px->next->sub[2];
px->next->sub[2]=t;
strcpy(tname,px->name);
strcpy(px->name,px->next->name);
strcpy(px->next->name,tname);
}
void Rank(STU* head)
{
int i=0,j=0,t,k;
STU* px;
char ch;
system("cls");
px=head;
printf("\n");
printf(" |------------------------------------------------------|\n");
printf(" | 请输入对应数字进行操作 |\n");
printf(" |------------------------------------------------------|\n");
printf(" |1: 以总分进行排序 |\n");
printf(" | |\n");
printf(" |2: 以学科一进行排序 |\n");
printf(" | |\n");
printf(" |3: 以学科二进行排序 |\n");
printf(" | |\n");
printf(" |4: 以学科三进行排序 |\n");
printf(" | |\n");
printf(" |5: 以学号进行排序 |\n");
printf(" | |\n");
printf(" |6: 返回菜单 |\n");
printf(" |------------------------------------------------------|\n");
printf(" |--Please Enter the Corresponding Number to Operate----|\n");
printf("\n");
printf(" Enter The Number: ");
scanf("%d",&k);
for(i=0;i<N; i++)
{
px=head->next;
for(j=0; j<N-1; j++)
{
if(k==1)
{
if((px->total_score)<(px->next->total_score))
{
swap(px);
}
}
else if(k==2)
{
if((px->sub[0])<(px->next->sub[0]))
{
swap(px);
}
}
else if(k==3)
{
if((px->sub[1])<(px->next->sub[1]))
{
swap(px);
}
}
else if(k==4)
{
if((px->sub[2])<(px->next->sub[2]))
{
swap(px);
}
}
else if(k==5)
{
if((px->id)<(px->next->id))
{
swap(px);
}
}
else return ;
px=px->next;
}
}
px=head->next;
system("cls");
printf(" |-------------------------------------------------------------------------------------\n");
printf(" | ID Number-----Name-------Sub1-------Sub2-------Sub3-------Total Score\n |\n");
for(i=0; i<N; i++)
{
printf(" |Student %d: ",i+1);
printf(" %-10d ",px->id);
printf(" %-7s",px->name);
printf(" %-5d",px->sub[0]);
printf(" %-5d",px->sub[1]);
printf(" %-5d",px->sub[2]);
printf(" %-5.1f\n |\n",px->total_score);
px=px->next;
}
printf(" |-------------------------------------------------------------------------------------\n\n");
printf(" ------- %d Students In Total !!! -------\n\n",N);
printf(" ----->>>按1返回主菜单;按2退出系统:");
getchar();
scanf("%c",&ch);
if(ch=='1') return;
else exit(0);
}
void insert(STU* head)
{
Password(0);
int num;
STU *p1,*p2,*s;
system("cls");
printf(" ---请输入需要插入的学号---\n");
printf(" Enter The Number: ");
scanf("%d",&num);
s=(STU*)malloc(sizeof(STU));
s->id=num;
printf(" 输入姓名:");
scanf("%s",s->name);
printf(" 输入第一科成绩:");
scanf("%d",&s->sub[0]);
printf(" 输入第二科成绩:");
scanf("%d",&s->sub[1]);
printf(" 输入第三科成绩:");
scanf("%d",&s->sub[2]);
s->total_score=s->sub[0]+s->sub[1]+s->sub[2];
p1=head;p2=head->next;
while((p2!=NULL)&&(p2->id>num))
{
p1=p2;p2=p2->next;
}
s->next=p2;p1->next=s;
N++;
getchar();
}
void del(STU* head)
{
Password(0);
int num;
STU *p1,*p2;
system("cls");
printf(" ---请输入需要删除的学号---\n");
printf(" Enter The Number: ");
scanf("%d",&num);
if(head==NULL) {printf(" 输入错误\n");return ;}
p1=head;
while(num!=p1->id&&p1->next!=NULL)
{
p2=p1;p1=p1->next;
}
if(num==p1->id)
{
if(p1==head) head->next=p1->next;
else p2->next=p1->next;
printf(" ---已删除的学生学号:%d---\n",num);
N--;
}
else printf(" 输入错误\n");
getchar();
}
void Password(int o)//密码系统,有三次输入机会.
{
char pass[100],Re1[100],Re2[100];
system("cls");
printf("\n");
if(o==0){
printf(" ----------------------------------------------------------\n");
printf(" To Continue The Operation,You Need To Input The Password \n");
printf(" ----------------------------------------------------------\n");
for(int i=0; i<4; i++)
{
printf(" |----------------%d Times Left----------------|\a\n\n",4-i);
printf(" Please Enter The Password: ");
gets(pass);
if(!compare(pass,Right_pass))
{
printf("\n");
printf(" |----------------Wrong !!!--------------------|\n");
printf("\n");
if(3-i!=0)
{
printf("\n");
}
else{
printf(" --------Opportunities Have Been Run out!!!--------\n");
exit(0);}
}
else
{
printf("\n");
printf(" ---------------Password Correct !!!----------\n\n");
if(o==1) goto PA;
break;
}
}
}
else
{
Password(0);
PA:
printf(" 输 入 新 密 码: ");
gets(Re1);
printf("\n");
printf(" 确 认 密 码: ");
gets(Re2);
printf("\n");
if(compare(Re1,Re2)){
strcpy(Right_pass,Re1);
printf(" ------------密 码 修 改 成 功 !!!------------\n");
return ;
}
else{
printf(" ------前 后 密 码 不 一 致 !!!------\a\n\n");
goto PA;}
}
}
int compare(char *a,char *b)//密码比较函数,返回0||1
{
for(int i=0; i<100; i++)
{
if(*a!=*b)
return 0;
a++,b++;
if(*a==*b&&*a=='\0')
break;
}
return 1;
}
void gotopos(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void Set()
{
system("cls");
int ch;
printf(" |---------------------------|\n");
printf(" | 系统设置 |\n");
printf(" |---------------------------|\n");
printf(" |1: 修改密码 |\n");
printf(" |2: 系统字体颜色设置 |\n");
printf(" |---------------------------|\n");
printf(" |----->>请输入对应序号: ");
scanf("%d",&ch);
getchar();
switch(ch)
{
case 1:Password(1);break;
case 2:color(0);break;
default: return;
}
}
void color(int n)
{
int c;
if(n==0)
{
for(int i=1;i<=15;i++){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),i);
printf(" 第%d号颜色\n\n",i);}
printf("\n");
printf(" |----->>请输入对应序号: ");
scanf("%d",&c);
getchar();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
}