读书人

图书管理系统。C++代码哪里出错了

发布时间: 2012-06-08 12:55:24 作者: rapoo

求助,图书管理系统。C++代码哪里出错了
[code=C/C++][/code]

#include <iostream>
#include <iomanip>
#include <cstring>
#include <fstream>//输入/输出文件流类
using namespace std;
const int Maxr=100;//最多的读者
const int Maxb=100;//最多的图书
const int Maxzf=5;//每位读者最多借五本书
//读者类,实现对读者的信息的描述

class Reader
{
private:
int tag; //删除标记 1:已删 0:未删
int no; //读者编号
char name[10]; //读者姓名
int zfbook[Maxzf];//所借图书
public:
Reader() {}
char *getname() {return name;} //获取姓名
int gettag() {return tag;} //获取删除标记
int getno() {return no;} //获取读者编号
void setname(char na[]) //设置姓名
{
strcpy(name,na);

}
void delbook(){ tag=1; }//设置删除标记 1:已删 0:未删
void addreader(int n,char *na)//增加读者
{
tag=0;
no=n;
strcpy(name,na);
for(int i=0;i<Maxzf;i++)
zfbook[i]=0;
}
void zfrowbook(int bookid)//借书操作
{
for(int i=0;i<Maxzf;i++)
{
if (zfbook[i]==0)
{
zfbook[i]=bookid;
return;

}
}

}
int retbook(int bookid)//还书操作
{
for(int i=0;i<Maxzf;i++)
{
if(zfbook[i]==bookid)
{
zfbook[i]=0;
return 1;

}
}
return 0;
}
void disp()//读出读者信息
{
cout << setw(5) << no <<setw(10) << name<<"借书编号:[";
for(int i=0;i<Maxzf;i++)
if(zfbook[i]!=0)
cout << zfbook[i] << "|";
cout << "]"<<endl;

}
};

//读者类库,实现建立读者的个人资料
class RDatabase
{
private:
int top; //读者记录指针
Reader read[Maxr];//读者记录
public:
RDatabase() //构造函数,将reader.txt读到read[]中
{
Reader s;
top=-1;
fstream file("reader.txt",ios::in);//打开一个输入文件
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file)break;
top++;
read[top]=s;
}
file.close(); //关闭 reader.txt
}
void clear()//删除所有读者信息
{
top=-1;
}
int addreader(int n,char *na)//添加读者时先查找是否存在
{
Reader *p=query(n);
if (p==NULL)
{
top++;
read[top].addreader(n,na);
return 1;
}
return 0;
}
Reader *query(int readerid)//按编号查找
{
for (int i=0;i<=top;i++)
if (read[i].getno()==readerid &&
read[i].gettag()==0)
{
return &read[i];
}
return NULL;
}
void disp() //输出所有读者信息
{
for (int i=0;i<=top;i++)
read[i].disp();
}
void readerdata();//读者库维护
~RDatabase() //析构函数,将read[]写到reader.txt文件中
{
fstream file("reader.txt",ios::out);
for (int i=0;i<=top;i++)
if (read[i].gettag()==0)
file.write((char *)&read[i],sizeof(read[i]));
file.close();
}
};
void RDatabase::readerdata()
{
char choice;
char rname[20];
int readerid;
Reader *r;
while (choice!='0')
{
cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1 新 增\n\n\t\t 2 更 改\n\n\t\t 3 删 除\n\n\t\t 4 查 找\n\n\t\t 5 显 示\n\n\t\t 6 全 删\n\n\t\t 0 退 出"<<endl;


cin >> choice;
switch (choice)
{
case '1':
cout << "输入读者编号:";
cin >> readerid;
cout << "输入读者姓名:";
cin >> rname;
addreader (readerid,rname);
break;
case '2':
cout << "输入读者编号:";
cin >> readerid;
r=query(readerid);
if (r==NULL)
{
cout << " 该读者不存在 "<<endl;
break;
}
cout << "输入新的姓名:";
cin >> rname;
r->setname(rname);
break;
case '3':
cout << " 输入读者编号:";
cin >> readerid;
r=query(readerid);
if (r==NULL)
{
cout <<" 该读者不存在" << endl;
break;
}
r->delbook();
break;
case '4':
cout << "读入读者编号:";
cin >> readerid;
r=query(readerid);
if (r==NULL)
{
cout <<"该读者不存在"<< endl;
break;
}
r->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:cout<<"输入错误,请从新输入:";break;
}
}
}



//图书类,实现对图书的描述,图书的编号,书名,借出,还入等
class Book
{
private:
int tag;//删除标记 1:已删 0:未删
int no;//图书编号
char name[20];//书名
char author[20];//作者
char cbs[20];//出版社
double price;//价格
int onshelf;//是否再架 1:再架 2:已借
public:
Book(){}
char *getname() { return name; }//获取姓名
char *getauthor() { return author; }//获取作者
char *getcbs() { return cbs; }//获取出版社
int getno(){ return no; }//获取图书编号
double getprice(){ return price; }//获取图书价格
int gettag(){ return tag; }//获取删除标记
void setname(char na[])//设置书名
{
strcpy(name,na);
}
void setauthor(char au[])//设置作者
{
strcpy(author,au);
}
void setcbs(char cbs[])//设置出版社
{

}
void setprice(double price){}//设置价格


void delbook(){ tag=1;}//删除图书
void addbook(int n,char *na,char *au,char *cbs,double price)//增加图书
{
tag=0;
no=n;
strcpy(name,na);
strcpy(author,au);
double p;
price=p;
onshelf=1;
return;
}

int zfrowbook()//借书操作
{
if (onshelf==1)
{
onshelf=0;
return 1;
}
return 0;
}
void retbook()//还书操作
{
onshelf=1;
}
void disp()//输出图书
{
cout << setw(6) << no << setw(18) << name << setw(18) << author<< setw(18) <<cbs<< setw(18)<< price<< setw(10)
<<(onshelf==1? "在架":"已借") <<endl;
}
};



//图书库类,实现对图书的维护,查找,删除等
class BDatabase
{
private:
int top; //图书记录指针
Book book[Maxb]; //图书记录
public:
BDatabase()//构造函数,将book.txt读到book[]中
{
Book b;
top=-1;
fstream file("book.txt",ios::in);
while (1)


{
file.read((char *)&b,sizeof(b));
if (!file) break;
top++;
}
book[top]=b;
file.close();
}
void clear()//全删
{
top=-1;
}
int addbook(int n,char *na,char *au,char *cbs,double price)//增加图书
{Book *query(int bookid);
Book *p=query(n);
if (NULL==p)
{
top++;
book[top].addbook(n,na,au,cbs,price);
return 1;
}
return 0;
}
};
Book *query(int bookid)//查找图书
{
for (int i=0;i<=top;i++)
if (Book::getname()==bookid &&Book::gettag()==0)
{
return book[i];
}
return NULL;
}
void bookdata();//图书库维护
void disp()
{
for (int i=0;i<=top;i++)
if (book[i].gettag()==0)
book[i].disp();
}
~BDatabase()//析构函数,将book[]写到book.txt文件中
{
fstream file("book.txt",ios::out);
for (int i=0;i<=top;i++);
if (book[i].gettag()==0)
file.write((char *)book[i],sizeof(book[i]));
file.close();
return;
};
void BDatabase::bookdata()
{
char choice;
char bname[40];
char bauthor[40];
char bcbs[40];
int bookid;
double bprice;
Book *b;
while (choice)
{
cout <<"\n\n\n\t\t\t图 书 维 护 "<<endl<<endl;
cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 删 除\n\t\t4 查 找\n\t\t5 显 示\n\t\t6 全 删\n\t\t0 退 出"<<endl;
cin >> choice;
switch (choice)
{
case '1':
cout << "输入图书编号:"<<endl;
cin >> bookid;
cout << "输入图书书名:"<<endl;
cin >> bname;
cout << "输入作者:"<<endl;
cin >> bauthor;
cout << "输入出版社:"<<endl;
cin >> bcbs;
cout << "输入图书价格:"<<endl;
cin >> bprice;
addbook(n,na,au,cbs,price);
break;
case '2':
cout << "输入图书编号:"<<endl;
cin >> bookid;
b=*query(bookid);
if (b==NULL)
{
cout << " 该图书不存在 "<<endl;
break;
}
cout << "输入新的书名:"<<endl;
cin >> bname;
b->setname(bname);

cout << "输入新的作者:"<<endl;
cin >> bauthor;
b->setauthor(bauthor);
cout << "输入新的出版社:"<<endl;
cin >> bcbs;
b->setcbs(bcbs);
cout << "输入新的价格:"<<endl;
cin >> bprice;
b->setprice(bprice);
break;
case '3':
cout <<" 读入图书编号:"<<endl;
cin >> bookid;
b=*query(bookid);
if (b==NULL)
{
cout <<" 该图书不存在" << endl;
break;
}
b->delbook();
break;
case '4':
cout << " 输入书名:"<<endl;
char bna[40];
cin >> bna;
int k;
for ( k=0;k<100;k++)
{if(strcmp(book[k].getname(),bna)==0)


if(book[k].gettag()==0)
{return ;
}
}



{
cout <<" 该图书不存在"<< endl;
break;
}
b->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:cout<<"输入错误,请从新输入:";
}
}
}

//main() 函数的实现,程序的主界面的引导
int main()
{
char choice;
int bookid,readerid;
RDatabase ReaderDB;
Reader *r;
BDatabase BookDB;
Book *b;
while(choice!='0')
{
cout <<endl<<endl<<"\t\t\t河 北 联 合 大 学 图 书 管 理 系 统\n\n\n";

cout <<"\t\t\t1 借 书\n\n\t\t\t2 还 书 \n\n\t\t\t3 图 书 维 护\n\n\t\t\t4 读 者 维 护\n\n\t\t\t0 离 开"<<endl;
cin >> choice;
switch (choice)
{
case '1':
cout <<" 借书 读者编号:";
cin >>readerid;
cout <<" 图书编号: ";
cin >>bookid;
r=ReaderDB.query(readerid);//按编号查找
if (NULL==r)
{
cout <<" 不存在该读者,不能借书"<< endl;
break;
}
b=BookDB.query(bookid);
if (b==NULL)
{
cout <<" 不存在该图书,不能借书"<< endl;
break;
}
if (b->zfrowbook()==0)
{
cout << " 该图书已借出,不能借书"<< endl;
break;
}
r->zfrowbook(b->getno());
break;
case '2':
cout<<"还书\n 读者编号:";
cin >>readerid;
cout << " 图书编号:";
cin >>bookid;
r=ReaderDB.query(readerid);
if (r==NULL)
{
cout <<" 不存在该读者,不能还书" << endl;
break;
}
b=BookDB.query(bookid);
if (b==NULL)
{
cout <<" 不存在该图书,不能还书" <<endl;
break;
}
b->retbook();
r->retbook(b->getno());
break;
case '3':
BookDB.bookdata();
break;
case '4':
ReaderDB.readerdata();
break;
default:cout<<"输入错误,请从新输入:";
}
}
}


[解决办法]
单步调试吧,这么长的代码啊。
[解决办法]
把你的错误全改掉了,但我没有运行, 感觉你写的逻辑挺乱的, 也不熟练。
剩下的你调试吧。Good luck.

C/C++ code
#include <iostream>#include <iomanip>#include <cstring>#include <fstream>//输入/输出文件流类using namespace std;const int Maxr=100;//最多的读者const int Maxb=100;//最多的图书const int Maxzf=5;//每位读者最多借五本书//读者类,实现对读者的信息的描述class Reader{  private: int tag; //删除标记 1:已删 0:未删 int no; //读者编号 char name[10]; //读者姓名 int zfbook[Maxzf];//所借图书  public:  Reader() {}  char *getname() {return name;} //获取姓名  int gettag() {return tag;} //获取删除标记  int getno() {return no;} //获取读者编号  void setname(char na[]) //设置姓名  {  strcpy(name,na);  } void delbook(){ tag=1; }//设置删除标记 1:已删 0:未删 void addreader(int n,char *na)//增加读者 {  tag=0;  no=n;  strcpy(name,na);  for(int i=0;i<Maxzf;i++)  zfbook[i]=0; } void zfrowbook(int bookid)//借书操作 {  for(int i=0;i<Maxzf;i++)  {  if (zfbook[i]==0)  {  zfbook[i]=bookid;  return;  }  } } int retbook(int bookid)//还书操作 {  for(int i=0;i<Maxzf;i++)  {  if(zfbook[i]==bookid)  {  zfbook[i]=0;  return 1;  }  }  return 0; } void disp()//读出读者信息 {  cout << setw(5) << no <<setw(10) << name<<"借书编号:[";  for(int i=0;i<Maxzf;i++)  if(zfbook[i]!=0)  cout << zfbook[i] << "|";  cout << "]"<<endl; }};//读者类库,实现建立读者的个人资料 class RDatabase{private:  int top; //读者记录指针  Reader read[Maxr];//读者记录public: RDatabase() //构造函数,将reader.txt读到read[]中 {  Reader s;  top=-1;  fstream file("reader.txt",ios::in);//打开一个输入文件  while (1)  {  file.read((char *)&s,sizeof(s));  if (!file)break;  top++;  read[top]=s;  }  file.close(); //关闭 reader.txt }  void clear()//删除所有读者信息 {  top=-1; } int addreader(int n,char *na)//添加读者时先查找是否存在 {  Reader *p=query(n);  if (p==NULL)  {  top++;  read[top].addreader(n,na);  return 1;  }  return 0; } Reader *query(int readerid)//按编号查找 {  for (int i=0;i<=top;i++)  if (read[i].getno()==readerid &&  read[i].gettag()==0)  {  return &read[i];  }  return NULL; } void disp() //输出所有读者信息 {  for (int i=0;i<=top;i++)  read[i].disp(); } void readerdata();//读者库维护 ~RDatabase() //析构函数,将read[]写到reader.txt文件中 {  fstream file("reader.txt",ios::out);  for (int i=0;i<=top;i++)  if (read[i].gettag()==0)  file.write((char *)&read[i],sizeof(read[i]));  file.close(); }};void RDatabase::readerdata(){  char choice; char rname[20]; int readerid; Reader *r; while (choice!='0') {  cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1 新 增\n\n\t\t 2 更 改\n\n\t\t 3 删 除\n\n\t\t 4 查 找\n\n\t\t 5 显 示\n\n\t\t 6 全 删\n\n\t\t 0 退 出"<<endl;  cin >> choice;  switch (choice)  {  case '1':  cout << "输入读者编号:";  cin >> readerid;  cout << "输入读者姓名:";  cin >> rname;  addreader (readerid,rname);  break;  case '2':  cout << "输入读者编号:";  cin >> readerid;  r=query(readerid);  if (r==NULL)  {  cout << " 该读者不存在 "<<endl;  break;  }  cout << "输入新的姓名:";  cin >> rname;  r->setname(rname);  break;  case '3':  cout << " 输入读者编号:";  cin >> readerid;  r=query(readerid);  if (r==NULL)  {  cout <<" 该读者不存在" << endl;  break;  }  r->delbook();  break;  case '4':  cout << "读入读者编号:";  cin >> readerid;  r=query(readerid);  if (r==NULL)  {  cout <<"该读者不存在"<< endl;  break;  }  r->disp();  break;  case '5':  disp();  break;  case '6':  clear();  break;  default:cout<<"输入错误,请从新输入:";break;  } }}//图书类,实现对图书的描述,图书的编号,书名,借出,还入等class Book{private:  int tag;//删除标记 1:已删 0:未删 int no;//图书编号 char name[20];//书名  char author[20];//作者  char cbs[20];//出版社  double price;//价格 int onshelf;//是否再架 1:再架 2:已借public: Book(){} char *getname() { return name; }//获取姓名 char *getauthor() { return author; }//获取作者 char *getcbs() { return cbs; }//获取出版社 int getno(){ return no; }//获取图书编号 double getprice(){ return price; }//获取图书价格 int gettag(){ return tag; }//获取删除标记 void setname(char na[])//设置书名 {  strcpy(name,na); } void setauthor(char au[])//设置作者 {  strcpy(author,au); } void setcbs(char cbs[])//设置出版社 { } void setprice(double price){}//设置价格 void delbook(){ tag=1;}//删除图书  void addbook(int n,char *na,char *au,char *cbs,double price)//增加图书 {  tag=0;  no=n;  strcpy(name,na);  strcpy(author,au);  double p;  price=p;  onshelf=1;  return; } int zfrowbook()//借书操作 {  if (onshelf==1)  {  onshelf=0;  return 1;  }  return 0; } void retbook()//还书操作 {  onshelf=1; } void disp()//输出图书 {  cout << setw(6) << no << setw(18) << name << setw(18) << author<< setw(18) <<cbs<< setw(18)<< price<< setw(10)  <<(onshelf==1? "在架":"已借") <<endl; }};//图书库类,实现对图书的维护,查找,删除等class BDatabase{private:  int top; //图书记录指针 Book book[Maxb]; //图书记录public: BDatabase()//构造函数,将book.txt读到book[]中 {  Book b;  top=-1;  fstream file("book.txt",ios::in);  while (1)  {  file.read((char *)&b,sizeof(b));  if (!file) break;  top++;  }  book[top]=b;  file.close(); }  void clear()//全删 {  top=-1; }  int addbook(int n,char *na,char *au,char *cbs,double price)//增加图书 {Book *query(int bookid);  Book *p=query(n);  if (NULL==p)  {  top++;  book[top].addbook(n,na,au,cbs,price);  return 1;  }  return 0; } Book *query(int bookid)//查找图书 {  for (int i=0;i<=top;i++)if (book[i].getno()==bookid &&book[i].gettag()==0)  {  return &book[i];  }  return NULL; } void bookdata();//图书库维护 void disp() {  for (int i=0;i<=top;i++)  if (book[i].gettag()==0)  book[i].disp(); } ~BDatabase()//析构函数,将book[]写到book.txt文件中 {  fstream file("book.txt",ios::out);  for (int i=0;i<=top;i++)  if (book[i].gettag()==0)      file.write(book[i].getname(),sizeof(book[i]));  file.close();return;}};void BDatabase::bookdata(){  char choice; char bname[40];  char bauthor[40];  char bcbs[40]; int bookid; double bprice; Book *b; while (choice) {  cout <<"\n\n\n\t\t\t图 书 维 护 "<<endl<<endl;  cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 删 除\n\t\t4 查 找\n\t\t5 显 示\n\t\t6 全 删\n\t\t0 退 出"<<endl;  cin >> choice;  switch (choice)  {  case '1':  cout << "输入图书编号:"<<endl;  cin >> bookid;  cout << "输入图书书名:"<<endl;  cin >> bname;cout << "输入作者:"<<endl;  cin >> bauthor;cout << "输入出版社:"<<endl;  cin >> bcbs;cout << "输入图书价格:"<<endl;  cin >> bprice;  //addbook(n,na,au,cbs,price);  addbook(bookid, bname, bauthor, bcbs, bprice);  break;  case '2':  cout << "输入图书编号:"<<endl;  cin >> bookid;  b=query(bookid);  if (b==NULL)  {  cout << " 该图书不存在 "<<endl;  break;  }  cout << "输入新的书名:"<<endl;  cin >> bname;  b->setname(bname);cout << "输入新的作者:"<<endl;  cin >> bauthor;  b->setauthor(bauthor);cout << "输入新的出版社:"<<endl;  cin >> bcbs;  b->setcbs(bcbs);cout << "输入新的价格:"<<endl;  cin >> bprice;  b->setprice(bprice);  break;  case '3':  cout <<" 读入图书编号:"<<endl;  cin >> bookid;  b=query(bookid);  if (b==NULL)  {  cout <<" 该图书不存在" << endl;  break;  }  b->delbook();  break;  case '4':  cout << " 输入书名:"<<endl;char bna[40];  cin >> bna;int k; for ( k=0;k<100;k++) {if(strcmp(book[k].getname(),bna)==0)  if(book[k].gettag()==0)  {return ;  }  }  {  cout <<" 该图书不存在"<< endl;  break;  }  b->disp();  break;  case '5':  disp();  break;  case '6':  clear();  break;  default:cout<<"输入错误,请从新输入:";  } }}//main() 函数的实现,程序的主界面的引导int main(){ char choice; int bookid,readerid; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; while(choice!='0') {  cout <<endl<<endl<<"\t\t\t河 北 联 合 大 学 图 书 管 理 系 统\n\n\n";  cout <<"\t\t\t1 借 书\n\n\t\t\t2 还 书 \n\n\t\t\t3 图 书 维 护\n\n\t\t\t4 读 者 维 护\n\n\t\t\t0 离 开"<<endl;  cin >> choice;  switch (choice)  {  case '1':  cout <<" 借书 读者编号:";  cin >>readerid;  cout <<" 图书编号: ";  cin >>bookid;  r=ReaderDB.query(readerid);//按编号查找  if (NULL==r)  {  cout <<" 不存在该读者,不能借书"<< endl;  break;  }  b=BookDB.query(bookid);  if (b==NULL)  {  cout <<" 不存在该图书,不能借书"<< endl;  break;  }  if (b->zfrowbook()==0)  {  cout << " 该图书已借出,不能借书"<< endl;  break;  }  r->zfrowbook(b->getno());  break;  case '2':  cout<<"还书\n 读者编号:";  cin >>readerid;  cout << " 图书编号:";  cin >>bookid;  r=ReaderDB.query(readerid);  if (r==NULL)  {  cout <<" 不存在该读者,不能还书" << endl;  break;  }  b=BookDB.query(bookid);  if (b==NULL)  {  cout <<" 不存在该图书,不能还书" <<endl;  break;  }  b->retbook();  r->retbook(b->getno());  break;  case '3':  BookDB.bookdata();  break;  case '4':  ReaderDB.readerdata();  break;  default:cout<<"输入错误,请从新输入:";  } }} 

读书人网 >C++

热点推荐