这个代码的college链表类是不是有问题呀?A.txt里面的内容好像输不出来,怎么改呀

baidu_34230506 2016-06-26 11:24:09
#include<iostream>
#include<string.h>
#include<fstream>
#include<iomanip>
using namespace std;
class Basic
{
public:
virtual int input(ifstream &its)=0;
virtual void input()=0;
virtual void display(ofstream &its)=0;
virtual void display()=0;
virtual void display_1() {}
friend class College;
protected:
Basic *next; //指针
int number; //学号
char name[40]; //姓名
int dom_number; //宿舍号
double mark; //综合成绩
int credit; //实得学分
};

class Student:virtual public Basic
{
public:
int input(ifstream &its) //输入流
{
its>>number;
if(number<=8)
return 0;
else
{
its>>name>>sex>>dom_number>>phone_number;
return 1;
}
}

void input()//输入
{
cout<<"学号:";
cin>>number;
cout<<"姓名:";
cin>>name;
cout<<"性别:";
cin>>sex;
cout<<"宿舍号:";
cin>>dom_number;
cout<<"电话号码:";
cin>>phone_number;
}

void display(ofstream &its)//输出流
{
its<<number<<" "<<name<<" "<<sex<<" "<<dom_number<<" "<<phone_number<<endl;
}
void display() //输出
{
cout<<number<<setw(10)<<name<<setw(6)<<sex<<setw(10)<<dom_number<<setw(13)<<phone_number<<endl;
}
private:
char sex[5]; //性别
char phone_number[20]; //电话号码
};

class Course:virtual public Basic
{
public:
int input(ifstream &its) //输入流
{
its>>number;
if(number<=8)
return 0;
else
{
its>>class_number>>class_name>>class_mark>>peacetime_mark>>experiment_mark>>txt_mark;
account ();
return 1;
}
}
void input()//输入
{
cout<<"学号=";
cin>>number;
cout<<"课程编号=";
cin>>class_number;
cout<<"课程名称=";
cin>>class_name;
cout<<"学分=";
cin>>class_mark;
cout<<"平时成绩=";
cin>>peacetime_mark;
cout<<"实验成绩=";
cin>>experiment_mark;
cout<<"卷面成绩=";
cin>>txt_mark;
account();
}
void account()//计算综合成绩和实得学分
{
int i;
if(experiment_mark!=-1)
mark=peacetime_mark*0.15+experiment_mark*0.15+txt_mark*0.7;
else
mark=peacetime_mark*0.3+txt_mark*0.7;
i=mark/10;
switch(i)
{
case 10:credit=class_mark; break;
case 9:credit=class_mark; break;
case 8:credit=class_mark*0.8; break;
case 7:credit=class_mark*0.75; break;
case 6:credit=class_mark*0.6; break;
default:credit=0; break;
}
}
void display(ofstream &its)//输出流
{
its<<number<<" "<<class_number<<" "<<class_name<<" "<<class_mark<<" "<<peacetime_mark<<" "
<<experiment_mark<<" "<<txt_mark<<endl;
}
void display() //输出
{
cout<<number<<setw(10)<<class_number<<setw(11)<<class_name<<setw(5)<<class_mark
<<setw(7)<<peacetime_mark<<setw(10)<<experiment_mark<<setw(10)<<txt_mark
<<setw(10)<<mark<<setw(10)<<credit<<endl;
}
void display_1()
{
cout<<"课程编号: "<<class_number<<" "<<"课程名称: "<<class_name
<<" "<<"综合成绩: "<<mark<<" "<<"实得学分: "<<credit<<endl;
}
private:
char class_number[30]; //课程编号
char class_name[30]; //课程名称
int class_mark; //学分
int peacetime_mark; //平时成绩
int experiment_mark; //实验成绩
int txt_mark; //卷面成绩

};

class College //链表类
{
public:
College(int i)
{
ji=0;
Basic *p;
int t;
PL=i;
if(PL==0) //根据PL,打开相应文件
{
f.open("A.txt",ios::in);
head=new Student;
p=new Student;
}
else
{
f.open("B.txt",ios::in);
head=new Course;
p=new Course;
}
if(!f) //判断f是否打开文件
{
cout<<"错误"<<endl;
abort();
}
t=head->input(f);
head->next=p;
p->next=NULL;
for(;;) //读入文件数据,并将数据插入链表中
{
if(i==0)
p=new Student;
else
p=new Course;
t=p->input(f);
if(t==0) break;
head=Build(p);
}
f.close();
}

~College()
{
save();
}

Basic *Build(Basic *p) //插入函数,将p有序的插入链表中
{
Basic *p1=head,*p2=head;
int i;
for(i=0;p1->next!=NULL;i++)
{
if(i==0 && p->number < p1->number) //处理头链
{
p->next=p1;
head=p;
ji++;
break;
}
else if(p->number < p1->number) //处理中间
{
p2->next=p;
p->next=p1;
ji++;
break;
}
else if(i==ji) //处理尾
{
p2=p1;
p1=p1->next;
p2->next=p;
p->next=p1;
ji++;
break;
}
p2=p1;
p1=p1->next;
}
return head;
}

void display() //输出链表信息
{
Basic *a=head;
for(;a->next!=NULL;a=a->next)
a->display();
}

void find_number() //查找学号
{
int i;
Basic *h=head;
cout<<"请输入你想找的学号:";
cin>>i;
for(;h->next!=NULL;h=h->next)
{
if(h->number==i)
{
h->display();
break;
}
}
}

void find_name() //查找姓名
{
char i[40];
Basic *h=head;
cout<<"请输入你想找的姓名:";
cin>>i;
for(;h->next!=NULL;h=h->next)
{
if(strcmp(h->name,i)==0)
{
h->display();
break;
}
}
}

void find_dom_number() //查找宿舍号码
{
int i;
Basic *h=head;
cout<<"请输入你想找的宿舍号码:";
cin>>i;
for(;h->next!=NULL;h=h->next)
if(h->dom_number==i)
h->display();
}

Basic *get_head()
{ return head; }

void find(Basic *a) //输入一个学号时,查询出此生的所有课程情况
{
int i;
Basic *h=head;
cout<<"请输入你想查的学号:";
cin>>i;
for(;a->next!=NULL;a=a->next)
{
if(a->number==i)
{
cout<<"学号:"<<i<<" ";
cout<<"姓名:"<<a->name<<endl;
break;
}
}
for(;h->next!=NULL;h=h->next)
if(h->number==i)
h->display_1();
}

void Delete(int j) //删除,j表示学号
{
Basic *p1=head,*p2=head;
int i=0;
for(;p1->next!=NULL;)
{
if(i==0 && p1->number == j) //处理头
{
head=p1->next;
i=-1; //保证下次还可以删除头链
}
else if(p1->number==j) //处理尾
{
p2->next=p1->next;
}
p2=p1;
p1=p1->next;
i++;
}
}

void delete_student(College &b) //当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息
{
int i;
cout<<"请输入你想删除的学生的学号:";
cin>>i;
Delete(i);
b.Delete(i);
}

void taxis_mark() //综合成绩排序
{
Basic *a=head;
Basic *m[90],*t;
int i,j,k,b;
cout<<"升序-1 降序-2"<<endl;
cin>>b;
if(b==1) //升序
{
for(i=0;a->next!=NULL;i++)
{
m[i]=a;
a=a->next;
}
for(j=0;j<i;j++)
for(k=j;k<i;k++)
{
if(m[j]->mark > m[k]->mark)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout<<"按综合成绩升序排列为"<<endl;
for(j=0;j<i;j++)
m[j]->display();
}
else if(b==2) //降序
{
for(i=0;a->next!=NULL;i++)
{
m[i]=a;
a=a->next;
}
for(j=0;j<i;j++)
for(k=j;k<i;k++)
{
if(m[j]->mark < m[k]->mark)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout<<"按综合成绩降序排列为"<<endl;
for(j=0;j<i;j++)
m[j]->display();
}

}

void taxis_credit() //学分排序
{
Basic *a=head;
Basic *m[90],*t;
int i,j,k,b;
cout<<"升序-1 降序-2"<<endl;
cin>>b;
if(b==1) //升序
{
for(i=0;a->next!=NULL;i++)
{
m[i]=a;
a=a->next;
}
for(j=0;j<i;j++)
for(k=j;k<i;k++)
{
if(m[j]->credit > m[k]->credit)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout<<"按学分成绩升序排列为"<<endl;
for(j=0;j<i;j++)
m[j]->display();
}
else if(b==2) //降序
{
for(i=0;a->next!=NULL;i++)
{
m[i]=a;
a=a->next;
}
for(j=0;j<i;j++)
for(k=j;k<i;k++)
{
if(m[j]->credit < m[k]->credit)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout<<"按学分成绩降序排列为"<<endl;
for(j=0;j<i;j++)
m[j]->display();
}

}

void save() //保存函数
{
Basic *h=head;
int i=-1;
if(PL==0)
s.open("A.txt",ios::out);
else if(PL==1)
s.open("B.txt",ios::out);
for(;h->next!=NULL;h=h->next)
h->display(s);
s<<i<<endl;
s.close();
}

private:
ifstream f;
ofstream s;
Basic *head; //链表的头指针
int ji; //计算插入的数
int PL; //判断建立怎样的链表
};


int main()
{
int i,k[10];
Course *c;
College a(0),b(1);
cout<<" *****************************欢迎进入!***********************"<<endl;
cout<<" ****************************学籍管理系统*********************"<<endl;
cout<<" ****** ******"<<endl;
cout<<" ****** ******"<<endl;
to:cout<<" ****** <1> 录入 <2>查询 <3>删除 ******"<<endl;
cout<<" ****** ******"<<endl;
cout<<" ****** <4>排序 <5>全部输出 <6>结束 ******"<<endl;
cout<<" ****** ******"<<endl;
cout<<" ****** ******"<<endl;
cout<<" *************************************************************"<<endl;
cin>>i;
if(i==1)
{
c=new Course;
c->input();
b.Build(c);
goto to;
}
else if(i==2)
{
cout<<"1-学生基本情况查询 2-成绩查询"<<endl;
cin>>k[0];
if(k[0]==1)
{
cout<<"1-学号查询 2-姓名查询 3-宿舍号码查询"<<endl;
cin>>k[1];
if(k[1]==1)
a.find_number();
else if (k[1]==2)
a.find_name();
else if (k[1]==3)
a.find_dom_number();
goto to;
}
else if(k[0]==2)
b.find(a.get_head());
goto to;
}
else if(i==3)
{
a.delete_student(b);
goto to;
}
else if(i==4)
{
cout<<"1-综合成绩排序 2-实得学分排序"<<endl;
cin>>k[2];
if(k[2]==2)
b.taxis_credit();
else if(k[2]==1)
b.taxis_mark();
goto to;
}
else if(i==5)
{
cout<<"学号 姓名 性别 宿舍号码 电话号码"<<endl;
a.display();
cout<<endl;
cout<<"学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得成绩 实得学分"<<endl;
b.display();
goto to;
}
return 0;
}
...全文
757 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_34230506 2016-06-27
  • 打赏
  • 举报
回复
实在是找不出来
赵4老师 2016-06-27
  • 打赏
  • 举报
回复
引用 2 楼 wangyaninglm 的回复:
难道楼上是赵老师的小号。。。

经查是Matrix克隆的一台赵老师虚拟机。
shiter 2016-06-26
  • 打赏
  • 举报
回复
难道楼上是赵老师的小号。。。
小灸舞 2016-06-26
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧