大一下学期C++课程设计,那时引用没学好,只知道用指针。。。故里面的参数都是用指针传递。现在看来有点好笑。。。
主要实现了查找,删除,修改,排名,显示,保存等功能。。。进入程序时会要求输入密码,密码是一个随机数,保存在程序运行结果的根目录的password.txt的里面,每次运行密码都不一样。退出程序时会提示是否要保存数据,如果保存的话,会在运行结果的根目录下生成一个记事本保存数据,下次运行时会自动导出上次的记录,以便继续操作。
源码:
#include
#include
#include
#include
#include
#include
#define null 0
using namespace std;
class Listnode
{
public:
Listnode *creat(); //建立资料库
Listnode *search(Listnode *); //查找模块
Listnode *del(Listnode *); //删除模块
Listnode *add(Listnode *); //添加模块
Listnode *show_menu(Listnode *); //显示模块
Listnode *modify(Listnode *); //修改模块
Listnode *stat(Listnode *); //统计模块
Listnode *save(Listnode *); //保存模块
Listnode *open(); //读出模块,自动执行
Listnode *arrange(Listnode *);//排名模块
double pass(Listnode *, string );//求及格率
float ave(Listnode *,string );//求平均分
int position(Listnode *,string ,Listnode *);//求名次
public:
int num; //学号
string name; //姓名
string sex;//性别
float M_score; //数学分数
float E_score; //外语分数
float C_score;//C++分数
float total;//总分
float ave1;//平均分
Listnode *next; //链接指针
};
Listnode *Listnode::show_menu(Listnode *p)//输出信息
{
Listnode *h;
h=p;
if(h==null)//链表为空
{
cout<<"系统里没有资料记录."< }
else
{
cout<<"学号"< while(p->next!=null)
{
cout<num<name<sex<M_score<E_score<C_score<total<ave1< p=p->next;
}
if(p->next==null)
{
cout<num<name<sex<M_score<E_score<C_score<total<ave1< }
}
cout< return(h);
}
void menu()//输出主菜单
{
cout<<" "<<"=============学生成绩管理系统============"< cout<<"********************************************************************************";
cout<<"\t1建学生资料库\t\t\t\t\t2查找学生资料\n";
cout<<"\t3删除学生资料\t\t\t\t\t4添加学生资料\n";
cout<<"\t5显示学生资料\t\t\t\t\t6修改学生资料\n";
cout<<"\t7查询学生成绩\t\t\t\t\t8学生总分排名\n";
cout<<"\t9关于系统信息\t\t\t\t\t10退出系统\n";
cout<<"********************************************************************************";
}
void announce()//输出声明
{
cout<<" "<<"本系统为大隐于市独立开发而成,仅供学习之用。任何人未经许可,不得用"< cout<<"于商业用途。如有任何问题可联系本人。"< cout<<" "<<"联系方式:"< cout<<" "<<"QQ:2263892**"<}
int password()//定义密码函数
{
srand(time(0));
int p;
p=(1+rand()%10000000);
ofstream outfile("password.txt",ios::out|ios::trunc);
if(!outfile)
{
cerr<<"没有找到密码文件,导入密码失败."< exit(1);
}
else
{
outfile< }
outfile.close();
return(p);
}
int inum(int t)//对学号是否为整数的判断
{
string str;
cout<<"请输入四位数学号:";
cin>>t;
while (t<1000||t>9999)
{
if (cin.fail())
{
cin.clear();
cin >> str;
}
else
{
cout<<"你的输入有误,请重新入."< cout<<"请输入四位数学号:";
cin>>t;
}
}
return(t);
}
void input(Listnode *p)//录入信息
{
cout<<"请输入姓名:";
cin>>p->name;
cout<<"请输入性别:";
cin>>p->sex;
while(p->sex!="男"&&p->sex!="女")
{
cout<<"你的输入有误,请重新输入."<提示:性别只能是男或女."< cout<<"请输入性别:";
cin>>p->sex;
}
cout<<"请输入数学成绩:";
cin>>p->M_score;
while(p->M_score<0||p->M_score>100)
{
cout<<"你的输入有误,请重新输入."<提示:数学最低分为0分,满分为100分."< cout<<"请输入数学成绩:";
cin>>p->M_score;
}
cout<<"请输入外语成绩:";
cin>>p->E_score;
while(p->E_score<0||p->E_score>100)
{
cout<<"你的输入有误,请重新输入."<提示:外语最低分为0分,满分为100分."< cout<<"请输入外语成绩:";
cin>>p->E_score;
}
cout<<"请输入C++成绩:";
cin>>p->C_score;
while(p->C_score<0||p->C_score>100)
{
cout<<"你的输入有误,请重新输入."<提示:C++最低分为0分,满分为100分."< cout<<"请输入C++成绩:";
cin>>p->C_score;
}
}
void minput(Listnode *p)//修改信息时的重新录入
{
cout<<"请输入新的姓名(原来是"<name<<"):";
cin>>p->name;
cout<<"请输入新的性别(原来是"<sex<<"):";
cin>>p->sex;
while(p->sex!="男"&&p->sex!="女")
{
cout<<"你的输入有误,请重新输入."<提示:性别只能是男或女."< cout<<"请输入性别:";
cin>>p->sex;
}
cout<<"请输入新的数学成绩(原来是"<M_score<<"):";
cin>>p->M_score;
while(p->M_score<0||p->M_score>100)
{
cout<<"你的输入有误,请重新输入."<提示:数学最低分为0分,满分为100分."< cout<<"请输入数学成绩:";
cin>>p->M_score;
}
cout<<"请输入新的外语成绩(原来是"<E_score<<"):";
cin>>p->E_score;
while(p->E_score<0||p->E_score>100)
{
cout<<"你的输入有误,请重新输入."<提示:外语最低分为0分,满分为100分."< cout<<"请输入外语成绩:";
cin>>p->E_score;
}
cout<<"请输入新的C++成绩(原来是"<C_score<<"):";
cin>>p->C_score;
while(p->C_score<0||p->C_score>100)
{
cout<<"你的输入有误,请重新输入."<提示:C++最低分为0分,满分为100分."< cout<<"请输入C++成绩:";
cin>>p->C_score;
}
}
Listnode *Listnode::creat()//建立资料库
{
Listnode *Listnode::show_menu(Listnode *p);
Listnode *head,*p,*p1=null;
int n;
while(n<=0)
{
cout<<"请输入学生的个数:";
cin>>n;
if(n<=0)
{
cout<<"没有学生资料."< }
else
{
head=p=new Listnode;
p->num=inum(p->num);
input(p);
p->total=p->C_score+p->E_score+p->M_score;
p->ave1=p->total/3;
for(int i=1;i
{
Listnode *r;
p1=new Listnode;
r=p;
p=p->next=p1;
p->num=inum(p->num);
while(r->num==p->num||(p->num>9999||p->num<1000))//对学号的判断
{
if(r->num==p->num)
{
cout<<"你的输入有误,请重新输入."<提示:学号不能相同."< cout<<"请输入4位学号:";
cin>>p->num;
}
if(p->num>9999||p->num<1000)
{
cout<<"你的输入有误,请重新输入."<提示:学号只能是四位数字组成."< cout<<"请输入学号4位数学号:";
cin>>p->num;
}
}
input(p);
p->total=p->C_score+p->E_score+p->M_score;//求个人总分
p->ave1=p->total/3;//平均分
}
}
}
p->next=null;
head->show_menu(head);
return(head);
}
Listnode *Listnode::search(Listnode *p)//查找
{
Listnode *h;
h=p;
int n;
cout<<"1 按学号查找 2按名字查找 3退出查找"< cout<<"请选择:";
cin>>n;
int d=0;
string name;
if(n==1)
{
d=inum(d);//输入要查找的学号并判断
}
else if(n==2)
{
cout<<"请输入姓名:";
cin>>name;
}
else if(n==3)
{
return(h);
}
else
{
cout<<"===>提示:你的输入有误,请重新输入."< h->search(h);
}
if(h==null)
{
cout<<"查找失败."<提示:没有学生资料,请先输入学生资料."< }
else
{
while(p->next!=null)
{
if(p->num==d||p->name==name)
{
break;
}
else
{
p=p->next;
}
}
if(p->next!=null)
{
cout<<"查找成功."< cout<<"学号"< cout<num<name<sex<M_score<E_score<C_score<total<ave1< }
else if(p->next==null&&(p->num==d||p->name==name))
{
cout<<"查找成功."< cout<<"学号"< cout<num<name<sex<M_score<E_score<C_score<total<ave1< }
else
{
cout<<"查找不成功."<提示:你要查的资料,系统里没有记录."< }
}
return(h);
}
Listnode *Listnode::del(Listnode *p)//删除
{
Listnode *Listnode::show_menu(Listnode *p);
Listnode *h,*q;
q=h=p;
int n,d=0;
string name;
cout<<"1按学号删除 2按名字删除 3退出删除"< cout<<"请输入你的选择:";
cin>>n;
if(n==1)
{
d=inum(d);//输入要删除的学号并判断
}
else if(n==2)
{
cout<<"请输入姓名:";//按姓名删除
cin>>name;
}
else if(n==3)
{
return(h);
}
else
{
cout<<"你的输入有误,请重新输入."< cout<<"===>提示:只能选择1或者2来进行删除操作."< h->del(h);
}
if(h==null)
{
cout<<"删除失败."<提示:没有学生资料,请先输入学生资料."< }
else if((p->num==d||p->name==name)&&p->next!=null)
{
h=p->next;
cout<<"删除成功."< delete p;
}
else if(p->next==null&&(p->num==d||p->name==name))
{
h=null;
delete p;
cout<<"删除成功."< }
else
{
while(p->next!=null)
{
if(p->num==d||p->name==name)
{
break;
}
else
{
p=p->next;
}
}
if(p->next!=null)
{
while(q->next!=p)
{
q=q->next;
}
q->next=p->next;
cout<<"删除成功."< delete p;
}
else if(p->next==null&&(p->num==d||p->name==name))
{
while(q->next!=p)
{
q=q->next;
}
q->next=null;
delete p;
cout<<"删除成功."< }
else
{
cout<<"删除失败."<提示:你要删除的资料,系统里没有记录"< }
}
h->show_menu(h);
return(h);
}
Listnode *Listnode::add(Listnode *p)//添加新资料
{
Listnode *Listnode::show_menu(Listnode *p);
Listnode *h,*p1,*p2;
p2=h=p;
if(h==null)//如果链表为空
{
h=new Listnode;
p=h;
cout<<"请输入你想要添加的学生资料."< p->num=inum(p->num);
input(p);
p->total=p->C_score+p->E_score+p->M_score;
p->ave1=p->total/3;
h->next=null;
}
else
{
while(p->next!=null)
{
p=p->next;
}
p=p->next=p1=new Listnode;
cout<<"请输入你想要添加的学生资料."< p->num=inum(p->num);
while(p2!=p)
{
if(p2->num==p->num)
{
cout<<"你的输入有误,请重新输入."<提示:学号不能相同."< cout<<"请输入4位数学号:";
cin>>p->num;
}
else if(p2->num!=p->num)
{
if(p->num>9999||p->num<1000)
{
while(p->num>9999||p->num<1000)
{
cout<<"你的输入有误,请重新输入."<提示:学号只能是四位数字组成."< cout<<"请输入4位数学号:";
cin>>p->num;
}
}
else
{
p2=p2->next;
}
}
}
input(p);
p->total=p->C_score+p->E_score+p->M_score;
p->ave1=p->total/3;
p->next=null;
}
h->show_menu(h);
return(h);
}
Listnode *Listnode::modify(Listnode *p)//修改资料
{
int n=0;
Listnode *h;
h=p;
n=inum(n);//输入要修改的学号并判断学号是否有误
if(p->num==n)
{
minput(p);
p->total=p->C_score+p->E_score+p->M_score;
p->ave1=p->total/3;
cout<<"修改成功."< }
else
{
while(p->num!=n)
{
if(p->next==null)
{
cout<<"修改失败."<提示:系统里没有关于该学号的资料记录."< return(h);
}
else
{
p=p->next;
}
}
if(p!=null)
{
minput(p);
p->total=p->C_score+p->E_score+p->M_score;
p->ave1=p->total/3;
cout<<"修改成功."< }
}
h->show_menu(h);
return(h);
}
Listnode *Listnode::stat(Listnode *p)//统计
{
float Listnode::ave(Listnode *p,string n);
Listnode *h;
h=p;
if(p==null)
{
cout<<"出错."<提示:没有学生资料的记录."< return(p);
}
else
{
int n;
cout<<"1查询全班的数学成绩 2查询全班的外语成绩 3查询全班的C++成绩 4查询个人情况"< cout<<"请输入你的选择:";
cin>>n;
if(n==1)
{
cout<<"全班数学平均分为:";
cout<ave(h,"M_score")< cout<<"全班数学及格率为:";
cout<pass(h,"M_score")<<"%"< }
else if(n==2)
{
cout<<"全班外语平均分为:";
cout<ave(h,"E_score")< cout<<"全班外语及格率为:";
cout<pass(h,"E_score")<<"%"< }
else if(n==3)
{
cout<<"全班C++平均分为:";
cout<ave(h,"C_score")< cout<<"全班C++及格率为:";
cout<pass(h,"C_score")<<"%"< }
else if(n==4)
{
int r=0;
r=inum(r);
int count=0;
if(p==null)
{
cout<<"系统里没有学生资料记录."< return(h);
}
else
{
while(p->num!=r)
{
if(p->num==r)
{
break;
}
p=p->next;
if(p==null)
{
cout<<"没有关于你的资料记录."< return(h);
break;
}
}
}
cout<<"学号"< cout<num<name<sex<M_score<E_score<C_score<total<ave1< cout<<"你的数学为班上第"<position(h, "M_score",p)<<"名"< cout<<"你的外语为班上第"<position(h, "E_score",p)<<"名"< cout<<"你的C++为班上第"<position(h, "C_score",p)<<"名"< cout<<"你的总分为班上第"<position(h, "total",p)<<"名"< }
else
{
cout<<"你的输入有误,请重新输入."< h->stat(h);
}
}
return(h);
}
float Listnode::ave(Listnode *p,string n)//求平均分
{
float ave,total=0;
int count=0;
if(p==null)
{
cout<<"系统里没有学生资料记录."< }
else {
while(p!=null)
{
if(n == "M_score")
{
total=total+p->M_score;
count++;
p=p->next;
}
if(n == "E_score")
{
total=total+p->E_score;
count++;
p=p->next;
}
if(n == "C_score")
{
total=total+p->C_score;
count++;
p=p->next;
}
}
ave=total/count;
}
return(ave);
}
double Listnode::pass(Listnode *p, string n)//求及格率
{
int count1=0,count2=0;
float pass;
if(p==null)
{
cout<<"系统里没有学生资料记录."< return(0);
}
else
{
while(p!=null)
{
if(n=="M_score"&&p->M_score>=60)
{
count1++;
}
if(n=="E_score"&&p->E_score>=60)
{
count1++;
}
if(n=="C_score"&&p->C_score>=60)
{
count1++;
}
count2++;
p=p->next;
}
}
pass=count1*100/count2;
return(pass);
}
int Listnode::position(Listnode *q,string n,Listnode *p)//求个人在班上的名字
{
Listnode *h;
h=q;
int count=0;
if(q==null)
{
cout<<"没有学生资料的记录."< return(0);
}
else
{
while(q!=null)
{
if(n=="M_score"&&(q->M_score>p->M_score))
{
count++;
}
if(n=="E_score"&&(q->E_score>p->E_score))
{
count++;
}
if(n=="C_score"&&(q->C_score>p->C_score))
{
count++;
}
if(n=="total"&&(q->total>p->total))
{
count++;
}
q=q->next;
}
}
return(++count);
}
Listnode *Listnode::arrange(Listnode *p)//对总分进行排名
{
Listnode *show_menu(Listnode *);
Listnode *h,*q,*r,*t;
int count=0;
t=q=h=p;
if(q==null)
{
cout<<"===>提示:没有学生资料的记录."< return(q);
}
else
{
while(q!=null)
{
count++;//用来统计结点个数
q=q->next;
}
}
delete q;
r=p->next;
for(int i=0;i {
for(int j=i+1;j {
if(p->totaltotal)
{
float t1=p->total;p->total=r->total;r->total=t1;
float t2=p->ave1;p->ave1=r->ave1;r->ave1=t2;
float t3=p->C_score;p->C_score=r->C_score;r->C_score=t3;
float t4=p->M_score;p->M_score=r->M_score;r->M_score=t4;
float t5=p->E_score;p->E_score=r->E_score;r->E_score=t5;
int t6=p->num;p->num=r->num;r->num=t6;
string t7=p->name;p->name=r->name;r->name=t7;
string t8=p->sex;p->sex=r->sex;r->sex=t8;
}
p=p->next;
r=p->next;
}
p=t;
r=p->next;
}
h->show_menu(h);
p=r=t=null;
return(h);
}
Listnode *Listnode::save(Listnode *p)//生成文件保存资料,以便下次接着操作
{
Listnode *h,*q;int count=0;
q=h=p;
ofstream outfile("student.txt",ios::out|ios::trunc);
if(!outfile)
{
cerr<<"没有找到文件,导入记录失败."< exit(1);
}
if(p==null)
{
cerr<<"没有资料导入,导入记录失败."< return(h);
}
else
{
while(q!=null)
{
count++;//统计要保存的记录的条数
q=q->next;
}
outfile< while(p!=null)
{
outfile<num<name<sex<M_score<E_score<C_score<total<ave1< p=p->next;
}
delete p;
}
outfile.close();
return(h);
}
Listnode *open()//打开文件,导出记录
{
Listnode *h=NULL,*p=NULL,*pTemp=NULL;
int count=0;
ifstream infile("student.txt",ios::in);
if (!infile)
{
cerr<<"没有找到文件,导出记录失败."< return(h);
}
else
{
int iCount = 0;
infile >> iCount;//导出结点个数
for(int i=0;i {
p=new Listnode;
p->next=NULL;
infile>>p->num>>setw(10)>>p->name>>setw(10)>>p->sex>>setw(10)>>p->M_score>>setw(10)>>p->E_score>>setw(10)>>p->C_score>>setw(10)>>p->total>>setw(10)>>p->ave1;
count++;//记录导出记录的条数
if(h==NULL)
{
h=p;
pTemp=p;
}
else
{
pTemp->next=p;
pTemp=p;
}
}
cout<<"正在导出记录。。。。请等待。。。。"< cout<<"导出成功,共导出"< }
infile.close();
return(h);
}
void sfnc(Listnode *p)//释放内存
{
if(p==null)
{
delete p;
}
while(p!=null)
{
Listnode *q;
q=p;
p=p->next;
delete q;
}
}
int main()//主函数
{
int n,m,e;
e=password();
cout<<"请输入密码:";
cin>>m;
if(m!=e)//从这里开始判断密码是否正确
{
while(m!=e)
{
cout<<"你输入的密码不正确,请重新输入."< cout<<"请输入密码:";
cin>>m;
if(m==e)
{
cout<<"欢迎进入学生成绩管理系统."< break;
}
password();
e=password();
}
}
else if(m==e)
{
cout<<"欢迎进入学生成绩管理系统."< }
Listnode student,*p;
p=open();
if(p==null)/*如果没有从文件中导出记录,则要控制用记的第一次输入,如果选择对数据的删除查找什么的操作,将会报错。。。*/
{
menu();
cout<<"请你选择操作:";
cin>>n;
while(n!=1&&n!=10)
{
if(n>1&&n<10)
{
if(n==9)
{
announce();
cout<<"请你选择操作:";
cin>>n;
}
else
{
cout<<"在你还没有建立资料库之前,你只能进行1,9或者10操作:";
cin>>n;
}
}
else
{
cout<<"===>提示:菜单里没有你输入的选项."< cout<<"你的输入有误,请重新输入:";
cin>>n;
}
}
if(n==1)
{
p=student.creat();
}
else
{
exit(0);
}
}
else
{;}
do
{
menu();
cout<<"请你选择操作:";
cin>>n;
while(n<=1&&n>=10)
{
cout<<"===>提示:菜单里没有你输入的选项."< cout<<"你的输入有误,请重新输入:";
cin>>n;
}
string t;
switch(n)//选择操作,并在每一次操作后返回该操作完成后的头指针,以便保存该操作。。。
{
case 1:
p=student.creat();break;
case 2:
p=student.search(p);break;
case 3:
p=student.del(p);break;
case 4:
p=student.add(p);break;
case 5:
p=student.show_menu(p);break;
case 6:
p=student.modify(p);break;
case 7:
p=student.stat(p);
break;
case 8:
p=student.arrange(p);break;
case 9:
announce();break;
case 10:
cout<<"是否保存资料(Y\\N):";
cin>>t;
while((t!="Y"&&t!="y")&&(t!="N"&&t!="n"))//输入大小写的Y或N都可以。。。
{
cout<<"===>提示:只能输入大写或小写的Y与N来进选择是否保存."< cout<<"你的输入有误,请重新输入:";
cin>>t;
}
if(t=="Y"||t=="y")
{
p=student.save(p);
cout<<"保存成功,退出系统,再见."< sfnc(p);//保存并释放内存
exit(0);
}
else if(t=="N"||t=="n")
{
cout<<"退出系统,再见."< sfnc(p);//释放链表内存
exit(0);
}
default ://输入选择的操作,如果菜单里没有,报错。。。
n=0;
cout<<"===>提示:菜单里没有你输入的选项."< cout<<"你的输入有误,请重新输入."< }
}
while(n<=10);
return 0;
}
阅读(6249) | 评论(10) | 转发(0) |