数据结构课程设计要做学生成绩统计系统怎么做 急急急!

 我来答
来自美国迷人的阿拉蕾
2011-06-21 · TA获得超过2896个赞
知道小有建树答主
回答量:338
采纳率:0%
帮助的人:199万
展开全部
望采纳~
#include<iostream>
#include<fstream>
#include<string>
#include<conio.h>
#include<windows.h>
using namespace std;
#define PATH "d:\\StudentFile.txt"

void Confirm();
void readin();
void savefile();
void newstudent();
void shengxu();
void jiangxu();
void FindExactAccordingName(char name[]);
void FindExactAccordingNumber(char number[]);
void find(char s1[],char s2[],int a,int b);
void FindAccordingName(char firstname[]);
void FindAccordingNumber(char number[]);
void InsertUp();
void InsertDown();
void Delete(char num[]);
void Revise(char num[]);
void MathAverage();
void EnglishAverage();
void ChineseAverage();
void Math();
void English();
void Chinese();
void Confirm();
void screen(int x);
void cometrue(char x);

class student
{
private:
char Number[20]; char Name[40];
int Math; int English; int Chinese; int Sum;
double Average;
public:
void GetInformation()
{
cout<<cout<<"学号\t\t姓名\t数学\t英语\t语文"<<endl;
cout<<"\t";
cin>>Number>>Name>>Math>>English>>Chinese;
}
void ShowInformation()
{
cout<<Number<<"\t"<<Name<<"\t"<<Math<<"\t"<<English<<"\t"<<Chinese<<endl;
}
void ShowInformation_Sum_Average()
{
GetSum(); GetAverage();
cout<<Number<<"\t"<<Name<<"\t"<<Math<<"\t"<<English<<"\t"<<Chinese<<"\t"<<Sum<<"\t"<<Average<<endl;
}
void GetAverage()
{
Average=0;
Average=(Math+English+Chinese)/3;
}
int SetSum() { return Sum; }
char *SetName(){ return Name; }
char *SetNumber(){ return Number; }
int SetMath(){ return Math; }
int SetEnglish(){ return English; }
int SetChinese(){ return Chinese; }
char GetName(char name[])
{
if(strcmp(Name,name))
return 1;
return 0;
}
void GetSum()
{
Sum=0;
Sum=Math+English+Chinese;
}
char GetNumber(char number[])
{
if(strcmp(Number,number)==0)
return 1;
return 0;
}
};
student *Math_max,*Math_min;
student *English_max,*English_min;
student *Chinese_max,*Chinese_min;
int math_max,math_min,english_max,english_min,chinese_max,chinese_min;
struct linklist
{
student *data;
linklist *next;
};
int N=0; //定义当前程序中共有多少学生
linklist *HEAD=NULL,*REAR=NULL;
void readin() //从文件中读取已经存储的学生数据;
{
ifstream in(PATH); /*PATH为存档文件路径*/
in.read((char*)(&N),sizeof(int)); //文件开始的前4个字节记录这当前文件中共有多少个学生信息,所以先将它读入程序
for(int i=0;i<N;i++)
if(i==0) //如果当前是第一个学生信息
{
HEAD=REAR=new linklist;
HEAD->next=NULL;
HEAD->data=new student;
in.read((char *)(HEAD->data),sizeof(student)); //读入学生信息
}
else
{ //头插法建立学生信息链表
linklist *p=new linklist;
REAR->next=p;
REAR=p;
p->next=NULL;
REAR->data=new student;
in.read((char *)(REAR->data),sizeof(student)); //读入学生信息
}
in.close();
}
void savefile() //存档
{
ofstream out(PATH);
out.write((char *)&N,sizeof(int)); //首先把多少个学生写进文件
for(int i=0;i<N;i++)
{
out.write((char *)(HEAD->data),sizeof(student)); //将学生信息入档

delete HEAD->data; //删除HEAD->data指向的学生

linklist *p=HEAD->next; //删除linklinklist节点
delete HEAD;
HEAD=p;
}

out.close();
}
void newstudent() //新建学生
{
linklist *p;
if(HEAD==NULL)
{
HEAD=REAR=new linklist;
HEAD->data=new student;
HEAD->data->GetInformation();
HEAD->next=NULL;
}
else
{
REAR->next=p=new linklist;
p->data=new student;
p->data->GetInformation();
p->next=NULL;
REAR=p;
}

}
void shengxu() //对学生总分升序排序
{
if(N<2) //如果学生数小于2,不用排了,直接返回
return ;
linklist *p,*k; /*k是前一个节点,P是后一个*/
for(int i=1,j;i<N;i++)
{
for(p=HEAD->next,k=HEAD,j=0;j<N-i;p=p->next,k=k->next,j++)
if(strcmp(p->data->SetNumber(),k->data->SetNumber())<0)
{
student *s=p->data;
p->data=k->data;
k->data=s;
}
}
}
void jiangxu()
{
if(N<2) //如果学生数小于2,不用排了,直接返回
return ;
linklist *p,*k; /*k是前一个节点,P是后一个*/
for(int i=1,j;i<N;i++)
{
for(p=HEAD->next,k=HEAD,j=0;j<N-i;p=p->next,k=k->next,j++)
if(strcmp(p->data->SetNumber(),k->data->SetNumber())>0)
{
student *s=p->data;
p->data=k->data;
k->data=s;
}
}
}
void FindExactAccordingName(char name[])
{
linklist *p;
p=HEAD;
for(int i=0;i<N;i++,p=p->next)
if(p->data->GetName(name)==1)
{
p->data->ShowInformation();
break;
}
}
void FindExactAccordingNumber(char number[])
{
linklist *p;
p=HEAD;
for(int i=0;i<N;i++,p=p->next)
if(p->data->GetNumber(number)==1)
{
p->data->ShowInformation();
break;
}
}
int MAXPIPEI;
void find(char s1[],char s2[],int a,int b)
{
if(b>MAXPIPEI)
MAXPIPEI=b;
if(b>=strlen(s2))
return;
for(;a<strlen(s1);a++)
if(s1[a]==s2[b])
find(s1,s2,a+1,b+1);
}
void FindAccordingName(char firstname[])//姓名模糊查询
{
linklist *p;
p=HEAD;
while(p)
{
MAXPIPEI=0;
find(p->data->SetName(),firstname,0,0);
if(MAXPIPEI*2>=strlen(firstname))
p->data->ShowInformation();
p=p->next;
}
}
void FindAccordingNumber(char number[])//学号模糊查询
{
linklist *p;
p=HEAD;
while(p)
{
MAXPIPEI=0;
find(p->data->SetNumber(),number,0,0);
if(MAXPIPEI*2>=strlen(number))
p->data->ShowInformation();
p=p->next;
}
}
void InsertUp()//插入(保持升序排列)
{
linklist *s;
s=new linklist;
s->data=new student;
s->data->GetInformation();
s->next=NULL;
s->next=HEAD;
HEAD=s;
shengxu();
N++;
}
void InsertDown()//插入(保持降序排列)
{
linklist *s;
s=new linklist;
s->data=new student;
s->data->GetInformation();
s->next=NULL;
s->next=HEAD;
HEAD=s;
jiangxu();
N++;
}
void Delete(char num[])//删除
{
linklist *p,*k;
k=p=HEAD;
while(p)
{
if(strcmp(p->data->SetNumber(),num)==0)
break;
k=p;
p=p->next;
}
if(p==HEAD)
{
HEAD=HEAD->next;
delete p->data;
delete p;
N--;
}
else if(p==NULL)
{
cout<<"输入有误。请重新输入。";
}
else
{
k->next=p->next;
delete p->data;
delete p;
N--;
}

}
void Revise(char num[])//修改(修改完成后需要再进行一下升序或降序排列)
{
linklist *p;
p=HEAD;
while(p)
{
if(strcmp(p->data->SetNumber(),num)==0)
break;
p=p->next;
}
p->data->GetInformation();
p->data->ShowInformation();
}
void MathAverage()
{
linklist *p;
p=HEAD;
double math=0;
while(p)
{
math+=p->data->SetMath();
p=p->next;
}
math=math/N;
cout<<"数学平均分:"<<math<<endl;
}
void EnglishAverage()
{
linklist *p;
p=HEAD;
double english=0;
while(p)
{
english+=p->data->SetMath();
p=p->next;
}
english=english/N;
cout<<"英语平均分:"<<english<<endl;
}
void ChineseAverage()
{
linklist *p;
p=HEAD;
double chinese=0;
while(p)
{
chinese+=p->data->SetMath();
p=p->next;
}
chinese=chinese/N;
cout<<"语文平均分:"<<chinese<<endl;
}
void Math()
{
linklist *p;
p=HEAD;
math_max=-1000000;
math_min=10000000;
while(p)
{
if(p->data->SetMath()>math_max)
{
math_max=p->data->SetMath();
Math_max=p->data;
}
if(p->data->SetMath()<math_min)
{
math_min=p->data->SetMath();
Math_min=p->data;
}
p=p->next;
}
cout<<"数学学科最高分:"<<math_max<<endl;
cout<<"数学学科最低分:"<<math_min<<endl;
}
void English()
{
linklist *p;
p=HEAD;
english_max=-1000000;
english_min=10000000;
while(p!=NULL)
{
if(p->data->SetEnglish()>english_max)
{
english_max=p->data->SetEnglish();
English_max=p->data;
}
if(p->data->SetEnglish()<english_min)
{
english_min=p->data->SetEnglish();
English_min=p->data;
}
p=p->next;
}
cout<<"英语学科最高分:"<<english_max<<endl;
cout<<"英语学科最低分:"<<english_min<<endl;
}
void Chinese()
{
linklist *p;
p=HEAD;
chinese_max=-1000000;
chinese_min=10000000;
while(p)
{
if(p->data->SetChinese()>chinese_max)
chinese_max=p->data->SetChinese();
if(p->data->SetChinese()<chinese_min)
chinese_min=p->data->SetChinese();

p=p->next;
}
cout<<"语文学科最高分:"<<chinese_max<<endl;

cout<<"语文学科最低分:"<<chinese_min<<endl;

}
void screen(int x)
{
if(x==0)
{
cout<<endl<<endl<<endl<<endl;
cout<<" 欢迎进入小型学生信息管理系统"<<endl;
}
else if(x==1)
{
system("cls");
cout<<"\t 学生信息管理系统 "<<endl<<endl;;
cout<<"\t*******************************************************************"<<endl<<endl;
cout<<"\t* 1 、新建学生信息\t\t8 、按学号模糊查询 *"<<endl;
cout<<"\t* 2 、显示已存学生信息\t\t9 、按姓名模糊查询 *"<<endl;
cout<<"\t* 3 、删除学生信息\t\t10、统计学生的平均分和总分 *"<<endl;
cout<<"\t* 4 、添加学生信息\t\t11、统计每个学科的平均分 *"<<endl;
cout<<"\t* 5 、修改学生信息\t\t12、统计每个学科的最高分和最低分 *"<<endl;
cout<<"\t* 6 、按学号精确查询\t\t13、对学生信息按学号升序排列 *"<<endl;
cout<<"\t* 7 、按姓名精确查询\t\t14、对学生信息按学号降序排列 *"<<endl;
cout<<"\t* *"<<endl;
cout<<"\t* 15、退出 * "<<endl<<endl;
cout<<"\t*******************************************************************"<<endl;
cout<<endl<<"\t"<<"请输入:";

}
}
void cometrue(int x)
{
switch(x)
{
case 1:
{
int people;
cout<<"请输入需要新建的学生人数:";
cin>>people;
for(int i=0;i<people;i++,N++)
{
newstudent();
}
Confirm();
break;
}
case 2:
{
readin();
linklist *p;
p=HEAD;
cout<<"学号\t\t姓名\t数学\t英语\t语文"<<endl;
while(p!=NULL)
{
p->data->ShowInformation();
p=p->next;
}
//savefile();
Confirm();
break;
}
case 3:
{
// readin();
char num[20];
cout<<"请输入需要删除的学生的学号:";
cin>>num;
Delete(num);
Confirm();
break;
}
case 4:
{
int m;
cout<<"请输入插入后保持学生信息升序排列还是降序排列"<<endl;
cout<<"\t\t\t\t1、保持升序排列"<<endl<<"\t\t\t\t2、保持降序排列"<<endl;
cin>>m;
if(m==1)
InsertUp();
else if(m==2)
InsertDown();
Confirm();
break;
}
case 5:
{
char num[20];
cout<<"请输入需要修改的学生的学号:";
cin>>num;
Revise(num);
Confirm();
break;
}
case 6:
{
char num[10];
cout<<"请输入需要查询的学生的学号:";
cin>>num;
FindExactAccordingNumber(num);
Confirm();
break;
}
case 7:
{
char name[40];
cout<<"请输入需要查询的学生的姓名:";
cin>>name;
FindExactAccordingName(name);
Confirm();
break;
}
case 8:
{
char num[10];
cout<<"请输入需要查询的学生的学号:";
cin>>num;
FindAccordingNumber(num);
Confirm();
break;
}
case 9:
{
char name[40];
cout<<"请输入需要查询的学生的姓名:";
cin>>name;
FindAccordingName(name);
Confirm();
break;
}
case 10:
{
linklist *p;
p=HEAD;
cout<<"学号\t\t姓名\t数学\t英语\t语文\t总分\t平均分"<<endl;
while(p!=NULL)
{
p->data->ShowInformation_Sum_Average();
p=p->next;
}
Confirm();
break;
}
case 11:
{
MathAverage();
EnglishAverage();
ChineseAverage();
Confirm();
break;
}
case 12:
{
Math();
English();
Chinese();
Confirm();
break;
}
case 13:
{
shengxu();
Confirm();
break;
}
case 14:
{
jiangxu();
Confirm();
break;
}

case 15:
{
char answer;
cout<<"是否存档(Y/N)"; cin>>answer;
if(answer=='Y' || answer=='y')
{
savefile();
exit(0);
}
else if(answer=='N' || answer=='n')
exit(0);
break;
}
}
}
void Confirm()
{
char x;
cout<<"是否继续(Y/N):";
cin>>x;
if(x=='Y' || x=='y')
return ;
else if(x=='N' || x=='n')
{
savefile();
exit(0);
}
}
int main()
{
int choose;
screen(0);
Sleep(1200);
while(1)
{
screen(1);
cin>>choose;
cometrue(choose);
}
return 0;
}
fb2dog
2011-06-20
知道答主
回答量:5
采纳率:0%
帮助的人:0
展开全部
简单,,去网上代码网站找找源代码啊,另外根据需求写出来就行了。设计的核心算法,用链表等实现
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式