问题描述
- C++学生管理系统交不了差我就死定了,大叔大婶行行好
-
送人玫瑰手有余香,救人一命胜造七级浮屠,C++学生管理系统交不了差我就死定了,大叔大婶行行好
解决方案
解决方案二:
我也在做这个>__<
解决方案三:
不用叫我叔叔,叫我哥哥就好 . 如果觉得合适,就给个采纳 另外要祝我早日追到女神
解决方案四:
特别感谢这样的好人,技术强,又乐于帮忙,赞赞赞
解决方案五:
我也在做这个>__<
解决方案六:
只是用C的话,去看看关于MFC的书,简洁的编程,对于DB的链接也很简单,可视化的界面,有点基础的话,一周就差不多
解决方案七:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
struct student{ //结构体定义
char name[20]; //姓名
int num; //学号
int no; //排名
float score[6]; //各科成绩
float ave; //平均成绩
float tot; //总成绩
struct student *next;
};
struct student *head; //定义全局变量 链表头
int i; //定义全局变量 科目总数
void key1(); //用户界面1
void key2(); //用户界面2
void fileinput(void); //文件录入函数
void maninput(void); //手动录入函数
void avetotal(); //求学生平均分总分函数
void number(); //求学生排名函数
void deorder(); //总分由高到低排序
void asorder(); //总分由低到高排序
void numorder(); //学号由小到大排序
void dictionary(); //按字典顺序排序
void output(); //输出函数
void save(); //保存函数
void senum(); //学号查找函数
void senam(); //名字查找函数
void modify(); //学生信息修改函数
void del(); //删除学生信息函数
void add(); //增加学生信息函数
void analy(); //统计各科各类别人数
void ansave(int a[6][5],float b[6][5]); //统计结果保存函数
void caculate(); //统计各科平均分及总分
void key1(){ //用户界面1
int j;
printf("nnt\****************欢迎来到学生管理系统*******************\n");
printf("tRead a filen");
printf("t1.文件录入n");
printf("t1.Record from filen");
printf("t2.手动录入n");
printf("t2.Append record manuallyn");
printf("t0.exitn");
printf("t请输入你选择的录入方式:");
scanf("%d",&j);
switch(j)
{
case 1:fileinput();break; //调用文件录入函数
case 2:maninput();break; //调用手动输入函数
case 0:exit(0);break; //退出
default:{
printf("nt请重新选择");
key1();}
}
}
void fileinput(void) //文件录入函数
{
FILE *fp;
struct student *p1=NULL,*p2=NULL;
int j,k,l;
char filename[20];
printf("nnt请输入文件路径:"); //键盘输入文件名
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("nt对不起,文件错误,打开文件失败");
exit(0);
}
printf("nt文件打开成功.....");
printf("nt请输入科目总数:");
scanf("%d",&i);
printf("nt请输入录入人数:");
scanf("%d",&j);
head=p1=(struct student*)malloc(sizeof(struct student));
for(l=1;l<=j;l++)
{
fscanf(fp,"%s",p1->name);
fscanf(fp,"%d",&p1->num);
for(k=0;k<i;k++)
fscanf(fp,"%f",&p1->score[k]);
p1->next=(struct student*)malloc(sizeof(struct student));
p2=p1;
p1=p1->next;
}
p1->next=NULL;
p2->next=NULL;
fclose(fp);
printf("nt文件录入成功.....");
}
void maninput(void){ //手动录入函数
struct student *p1=NULL,*p2=NULL;
int j;
char ch;
printf("nt请输入录入科目总数:");
scanf("%d",&i);
head=p1=(struct student*)malloc(sizeof(struct student));
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf("nt");
scanf("%s%d",p1->name,&p1->num);
for(j=0;j<i;j++)
scanf("%f",&p1->score[j]);
printf("nt是否继续输入(y/n):");
getchar();
ch=getchar();
printf("nt");
while(ch=='y')
{
p2=(struct student*)malloc(sizeof(struct student));
scanf("%s%d",p2->name,&p2->num);
for(j=0;j<i;j++)
scanf("%f",&p2->score[j]);
printf("nt是否继续输入(y/n):");
getchar();
ch=getchar();
printf("nt");
p1->next=p2;
p1=p2;
};
p1->next=NULL;
printf("nt手动录入成功......");
printf("nt进入功能菜单");
}
void avetotal(){ //求学生平均分总分
struct student *p1=NULL,*p2=NULL;
int k;
p1=head;
while(p1!=NULL)
{
p1->tot=0;
for(k=0;k<i;k++)
p1->tot=p1->tot+p1->score[k];
p1->ave=p1->tot/i;
p2=p1;
p1=p1->next;
}
}
void number(){ //求学生排名函数
struct student *p1=NULL,*p2=NULL,*p3=NULL;
bool flag;
int j=1;
p3=p1=head;
p2=p1->next;
do{
if(p2==NULL)
{
p1->no=1;
break;
}
flag=false;
if((p1->tot)<(p2->tot))
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p2=p1->next;
p3=head;
flag=true;
}
else{
p2=p2->next;
p1=p1->next;
};
while(p2!=NULL)
{
if((p1->tot)<(p2->tot))
{
p1->next=p2->next;
p3->next=p2;
p2->next=p1;
p3=p2;
p2=p1->next; //调用交换函数
flag=true;
}
else
{
p2=p2->next;
p1=p1->next;
p3=p3->next;
};
};
p3=p1=head;
p2=p1->next;
}while(flag);
while(p1!=NULL)
{
p1->no=j;
j++;
p1=p1->next;
}
}
void key2(){ //用户界面2
int j;
char ch;
printf("nnnnnt");
printf("nt***********************主菜单*****************************");
printf("nnt");
printf("nt*********************排序区域(Sort)***********************");
printf("nt1. Sort in descending order by total score of every student");
printf("nt2. Sort in ascending order by total score of every student");
printf("nt3. Sort in ascending order by number");
printf("nt4. Sort in dictionary order by name");
printf("n");
printf("nt*********************查询区域(Search)********************");
printf("nt5. Search by number");
printf("nt6. Search by name");
printf("nt");
printf("nt*********************修改区域(Modify)**********************");
printf("nt7. Modify information of student");
printf("nt8. Delete student");
printf("nt9. Add student");
printf("nt");
printf("nt*********************课程操作区域(Course)******************");
printf("nt10. Statistic analysis for every course");
printf("nt11.Calculate total and average score of every course");
printf("nt*********************保存文件区域(Save)********************");
printf("nt12.Write to a file");
printf("nt0.exit");
printf("nt请输入你的选择:");
scanf("%d",&j);
switch(j)
{
case(1):deorder();break; //调用升序函数
case(2):asorder();break; //调用降序函数
case(3):numorder();break; //调用学号排序函数
case(4):dictionary();break; //调用字典排序函数
case(5):senum();break; //调用学号查询函数
case(6):senam();break; //调用名字查找函数
case(7):modify();break; //调用修改学生信息函数
case(8):del();break; //调用删除学生信息函数
case(9):add();break; //调用增加学生信息函数
case(10):analy();break; //调用各科各类别统计函数
case(11):caculate();break; //调用统计各科总分及平均分函数
case(12):save(); //调用保存函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
case(0):exit(0); //停止运行
default:{
printf("nt请重新选择");
key2();}
}
}
void deorder(){ //总分由高到低排序
struct student *p1=NULL,*p2=NULL,*p3=NULL;
bool flag;
char ch;
p3=p1=head;
p2=p1->next;
do{
if(p2==NULL)
break;
flag=false;
if((p1->tot)<(p2->tot))
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p2=p1->next;
p3=head;
flag=true;
}
else{
p2=p2->next;
p1=p1->next;
};
while(p2!=NULL)
{
if((p1->tot)<(p2->tot))
{
p1->next=p2->next;
p3->next=p2;
p2->next=p1;
p3=p2;
p2=p1->next; //调用交换函数
flag=true;
}
else
{
p2=p2->next;
p1=p1->next;
p3=p3->next;
};
};
p3=p1=head;
p2=p1->next;
}while(flag);
output(); //调用输出函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
else
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void asorder(){ //总分由低到高排序
struct student *p1=NULL,*p2=NULL,*p3=NULL;
bool flag;
char ch;
p3=p1=head;
p2=p1->next;
do{
if(p2==NULL)
break;
flag=false;
if((p1->tot)>(p2->tot))
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p2=p1->next;
p3=head;
flag=true;
}
else{
p2=p2->next;
p1=p1->next;
};
while(p2!=NULL)
{
if((p1->tot)>(p2->tot))
{
p1->next=p2->next;
p3->next=p2;
p2->next=p1;
p3=p2;
p2=p1->next;
flag=true;
}
else
{
p2=p2->next;
p1=p1->next;
p3=p3->next;
};
};
p3=p1=head;
p2=p1->next;
}while(flag);
output(); //调用输出函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
else
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void output(){ //输出函数
struct student *p1=NULL;
int j;
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf(" 平均分 总分 排名");
printf("nt");
p1=head;
while(p1!=NULL)
{
printf("%-13s%-6d",p1->name,p1->num);
for(j=0;j<i;j++)
printf("%-7.1f",p1->score[j]);
printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no);
printf("nt");
p1=p1->next;
}
}
void numorder(){ //学号排序
struct student *p1=NULL,*p2=NULL,*p3=NULL;
bool flag;
char ch;
p3=p1=head;
p2=p1->next;
do{
if(p2==NULL)
break;
flag=false;
if((p1->num)>(p2->num))
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p2=p1->next;
p3=head;
flag=true;
}
else{
p2=p2->next;
p1=p1->next;
};
while(p2!=NULL)
{
if((p1->num)>(p2->num))
{
p1->next=p2->next;
p3->next=p2;
p2->next=p1;
p3=p2;
p2=p1->next;
flag=true;
}
else
{
p2=p2->next;
p1=p1->next;
p3=p3->next;
};
};
p3=p1=head;
p2=p1->next;
}while(flag);
output(); //调用输出函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
else
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void dictionary(){ //字典排序
struct student *p1=NULL,*p2=NULL,*p3=NULL;
bool flag;
char ch;
p3=p1=head;
p2=p1->next;
do{
if(p2==NULL)
break;
flag=false;
if(strcmp(p1->name,p2->name)>0)
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p2=p1->next;
p3=head;
flag=true;
}
else{
p2=p2->next;
p1=p1->next;
};
while(p2!=NULL)
{
if(strcmp(p1->name,p2->name)>0)
{
p1->next=p2->next;
p3->next=p2;
p2->next=p1;
p3=p2;
p2=p1->next;
flag=true;
}
else
{
p2=p2->next;
p1=p1->next;
p3=p3->next;
};
};
p3=p1=head;
p2=p1->next;
}while(flag);
output(); //调用输出函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
else
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void save(){ //保存函数
char filename[20];
FILE *fp;
struct student *p1=NULL;
int k;
p1=head;
printf("nt请输入你要保存到的目标文件:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("nt对不起,文件打开失败!!!");
save();
exit(0);
}
while(p1!=NULL)
{
fprintf(fp,"%20s%6d",p1->name,p1->num);
for(k=0;k<i;k++)
fprintf(fp,"%6.1f",p1->score[k]);
fprintf(fp,"%6.1f%7.1f%4dn",p1->ave,p1->tot,p1->no);
p1=p1->next;
}
fclose(fp);
printf("nt保存成功.....");
}
void senum(){ //学号查询函数
int n,j;
char ch;
bool flag;
struct student *p1;
do
{
flag=true;
printf("nt请输入该学生学号:");
scanf("%d",&n);
p1=head;
while(p1!=NULL)
{
if(p1->num==n)
{
flag=false;
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf(" 平均分 总分 排名");
printf("nt");
printf("%-10s%-6d",p1->name,p1->num);
for(j=0;j<i;j++)
printf("%-7.1f",p1->score[j]);
printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no);
break;
}
p1=p1->next;
}
if(flag)
printf("nt对不起,该学号不存在!!!!");
printf("nt是否继续查找(y/n):");
getchar();
ch=getchar();
}while(ch=='y');
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void senam(){ //名字查询函数
int j;
bool flag;
char ch,na[20];
struct student *p1;
do
{
printf("nt请输入该学生姓名:");
scanf("%s",na);
p1=head;
flag=true;
while(p1!=NULL)
{
if(strcmp(p1->name,na)==0)
{
flag=false;
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf(" 平均分 总分 排名");
printf("nt");
printf("%-10s%-6d",p1->name,p1->num);
for(j=0;j<i;j++)
printf("%-7.1f",p1->score[j]);
printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no);
}
p1=p1->next;
}
if(flag)
printf("nt对不起,该学生不存在!!!");
printf("nt是否继续查找(y/n):");
getchar();
ch=getchar();
}while(ch=='y');
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void modify(){ //修改学生信息函数
int n,j;
char ch;
bool flag;
struct student *p1=NULL;
do{
flag=true;
p1=head;
printf("nt请输入修改学生的学号:");
scanf("%d",&n);
while(p1!=NULL)
{
if(p1->num==n)
{
flag=false;
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf(" 平均分 总分 排名");
printf("nt");
printf("%-13s%-6d",p1->name,p1->num);
for(j=0;j<i;j++)
printf("%-7.1f",p1->score[j]);
printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no);
printf("nt是否修改(y/n):");
getchar();
ch=getchar();
if(ch=='n')break;
printf("nt请重新输入该学生信息..");
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf("nt");
scanf("%s%d",p1->name,&p1->num);
for(j=0;j<i;j++)
scanf("%f",&p1->score[j]);
printf("nt修改成功....");
break;
}
p1=p1->next;
}
if(flag)
printf("nt对不起,该学号不存在!!!!");
printf("nt是否继续修改(y/n):");
getchar();
ch=getchar();
}while(ch=='y');
avetotal(); //调用求总分平均分函数
number(); //调用求排名函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void del(){ //删除学生信息函数
struct student *p1=NULL,*p2=NULL;
int n,j;
bool flag;
char ch;
do{
flag=true;
printf("nt请输入删除学生的学号:");
scanf("%d",&n);
p1=head;
p2=p1->next;
if(p1->num==n)
{ flag=false;
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf(" 平均分 总分 排名");
printf("nt");
printf("%-13s%-6d",p1->name,p1->num);
for(j=0;j<i;j++)
printf("%-7.1f",p1->score[j]);
printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no);
printf("nt是否修改(y/n):");
getchar();
ch=getchar();
if(ch=='n')break;
free(p1);
head=p1=p2;
p2=p1->next;
printf("nt删除成功....");
}
while(p2!=NULL)
{
if(p2->num==n)
{
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf(" 平均分 总分 排名");
printf("nt");
printf("%-13s%-6d",p1->name,p1->num);
for(j=0;j<i;j++)
printf("%-7.1f",p1->score[j]);
printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no);
printf("nt是否修改(y/n):");
getchar();
ch=getchar();
if(ch=='n')break;
flag=false;
p1->next=p2->next;
free(p2);
printf("nt删除成功....");
break;
}
p1=p2;
p2=p1->next;
}
if(flag)
printf("nt对不起,该学号不存在!!!!");
printf("nt是否继续删除(y/n):");
getchar();
ch=getchar();
}while(ch=='y');
number(); //调用求排名函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void add(){ //增加学生信息函数
struct student *p1;
int j;
char ch;
do{
p1=(struct student*)malloc(sizeof(struct student));
printf("nt姓名 学号");
for(j=1;j<=i;j++)
printf(" 成绩%d",j);
printf("nt");
scanf("%s%d",p1->name,&p1->num);
for(j=0;j<i;j++)
scanf("%f",&p1->score[j]);
p1->next=head;
head=p1;
printf("nt添加成功....");
printf("nt是否继续添加(y/n):");
getchar();
ch=getchar();
}while(ch=='y');
avetotal(); //调用求总分平均分函数
number(); //调用求排名函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void analy(){ //统计各科各类别人数函数
struct student *p1;
int cou[6][5];
float per[6][5];
int j,k,l=0;
char ch;
for(j=0;j<i;j++)
for(k=0;k<5;k++)
cou[j][k]=0; //计数器清零
p1=head;
while(p1!=NULL)
{ l++;
for(j=0;j<i;j++)
{
if(p1->score[j]>=90)
cou[j][0]++;
else if(p1->score[j]>=80)
cou[j][1]++;
else if(p1->score[j]>=70)
cou[j][2]++;
else if(p1->score[j]>=60)
cou[j][3]++;
else
cou[j][4]++;
}
p1=p1->next;
}
printf("nt");
for(j=1;j<=i;j++) //输出统计结果
printf("科目%d ",j);
printf("n100-90");
for(j=0;j<i;j++)
{
per[j][0]=cou[j][0]*1.0/l;
printf("%2d(%3.2f)",cou[j][0],per[j][0]);
}
printf("n89-80 ");
for(j=0;j<i;j++)
{
per[j][1]=cou[j][1]*1.0/l;
printf("%2d(%3.2f)",cou[j][1],per[j][1]);
}
printf("n79-70 ");
for(j=0;j<i;j++)
{
per[j][2]=cou[j][2]*1.0/l;
printf("%2d(%3.2f)",cou[j][2],per[j][2]);
}
printf("n69-60 ");
for(j=0;j<i;j++)
{
per[j][3]=cou[j][3]*1.0/l;
printf("%2d(%3.2f)",cou[j][3],per[j][3]);
}
printf("n59-0 ");
for(j=0;j<i;j++)
{
per[j][4]=cou[j][4]*1.0/l;
printf("%2d(%3.2f)",cou[j][4],per[j][4]);
}
printf("nt是否保存统计结果到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
ansave(cou,per); //调用统计结果保存函数
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存学生信息到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void ansave(int a[6][5],float b[6][5]){ //统计结果保存函数
FILE *fp;
int j;
char filename[20];
printf("nt请输入保存的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("nt对不起,文件打开失败!!!!");
key2();
}
for(j=1;j<=i;j++)
fprintf(fp,"科目%d ",j);
fprintf(fp,"n100-90");
for(j=0;j<i;j++)
fprintf(fp,"%2d(%3.2f)",a[j][0],b[j][0]);
fprintf(fp,"n89-80 ");
for(j=0;j<i;j++)
fprintf(fp,"%2d(%3.2f)",a[j][1],b[j][1]);
fprintf(fp,"n79-70 ");
for(j=0;j<i;j++)
fprintf(fp,"%2d(%3.2f)",a[j][2],b[j][2]);
fprintf(fp,"n69-60 ");
for(j=0;j<i;j++)
fprintf(fp,"%2d(%3.2f)",a[j][3],b[j][3]);
fprintf(fp,"n59-0 ");
for(j=0;j<i;j++)
fprintf(fp,"%2d(%3.2f)",a[j][4],b[j][4]);
fclose(fp);
printf("nt保存成功......");
}
void caculate(){ //统计各科总分平均分函数
struct student *p1=NULL;
float to[6],av[6];
int j,l=0;
char ch;
for(j=0;j<6;j++)
to[j]=0;
p1=head;
while(p1!=NULL)
{
l++;
for(j=0;j<i;j++)
to[j]=to[j]+p1->score[j];
p1=p1->next;
}
for(j=0;j<i;j++)
av[j]=to[j]*1.0/l;
printf("nt");
for(j=1;j<=i;j++) //输出统计结果
printf("科目%d ",j);
printf("n总分 ");
for(j=0;j<i;j++)
printf("%8.1f",to[j]);
printf("n平均分");
for(j=0;j<i;j++)
printf("%8.1f",av[j]);
printf("nt是否返回主菜单(y/n):");
getchar();
ch=getchar();
if(ch=='y')
key2(); //调用用户界面2
printf("nt是否保存学生信息到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
exit(0);
}
void main(){
char ch;
key1();
avetotal();
number();
key2();
printf("nt是否保存修改到文件(y/n):");
getchar();
ch=getchar();
if(ch=='y')
save(); //调用保存函数
}
时间: 2024-10-26 20:35:28