您的位置:自考365 > 复习指导 > 历年试题 > 北大“面向对象程序设计”上机试题(含答案)

北大“面向对象程序设计”上机试题(含答案)

2007-03-06 14:06   【 】【我要纠错

  1、Annie的宠物小屋里有12个笼子,每个笼子可以放不同的动物,包括猫,狗和蛇,但同一时刻一个笼子只能放0只或1只宠物,本题要求完成:

  (1)实现一个简单的管理系统,可以增加,删除指定笼子中的宠物,查询每个笼子中存放宠物的情况,统计宠物的种类和数量。

  (2)定义描述宠物小屋的类Shelves,其中包括12个笼子用于存放各种宠物;

  (3)定义虚拟基类Animal,至少包含纯虚函数Showme;

  (4)定义派生类Cat,Dog,Snake,具体实现上述纯虚函数showme,显示该宠物的种类,名称,着色,体重和喜欢的食物。

  (5)重载输入>>操作符,使得可以通过cin直接读入宠物的着色,体重,和喜欢的食物;

  (6)编写main函数,测上述所要求的各种功能;

  Main.cpp

  #include<iostream>

  #include“animal.h”

  using std::cout;

  using std::cin;

  using std::endl;

  int main()

  {

  Shelves * shelves=new Shelves;

  Cat *cat;

  Dog *dog;

  Snake *snake;

  int n;

  int i=0;

  char ch;

  while(i!=5)

  {

  cout<<“ please chiose(1-5):”<<endl;

  cout<<“ 1:add an animal”<<endl;

  cout<<“2:delete an animal”<<endl;

  cout<<“ 3:query”<<endl;

  cout<<“4:stat”<<endl;

  cout<<“5:exit”<<endl;

  cin>>i;

  switch(i)

  {

  case 1:

  cout<<“which cage?”;

  cin>>n;

  cout<<“c:cat d:dog s:snake”<<endl;

  cout<<“please choise an animal:”;

  cin>>ch;

  switch(ch)

  {

  case'c':

  cat=new Cat;

  cin>>*cat;

  if(!shelves ->add(n,cat))

  cat->deleteme();

  break;

  case'd':

  dog=new Dog;

  cin>>*dog;

  if(!shelves->add(n,dog))

  dog->deleteme();

  break;

  case's':

  snake=new Snake;

  cin>>*snake;

  if(!shelves->add(n,snake))

  snake->deleteme();

  break;

  default:

  cout<<“ your choise is wrong”<<endl;

  break;

  }

  break;

  case 3:

  cout<<“ thich cage ?”;

  cin>>n;

  shelves->query(n);

  break;

  case 2:

  cout<<“which cage?”;//由于不想重写所以就改了数字;

  cin>>n;

  shelves->Delete(n);

  break;

  case 4:

  shelves->stat();

  break;

  case 5:

  break;

  }

  }

  return 0;

  }

  Animal.h

  #ifndef ANIMAL_H

  #define ANIMAL_H

  #include<iosfwd>

  class Animal

  {

  public:

  virtual void showme()=0;

  virtual void deleteme()=0;

  ~Animal(){}

  protected:

  char *name ;

  char *color;

  float weight;

  char *food;

  int type;

  };

  class Cat:public Animal

  {

  public:

  Cat();

  void showme();

  static int number();

  friend std::istream & operator >>(std::istream & is,Cat &cat);

  void deleteme();

  ~Cat();

  private:

  static int Catnum;

  };

  class Dog:public Animal

  {

  public:

  Dog();

  void showme();

  static int number();

  friend std::istream & operator>>(std::istream & is,Dog &dog);

  void deleteme();

  ~Dog();

  private:

  static int Dognum;

  };

  class Snake:public Animal

  {

  public:

  Snake();

  void showme();

  static int number();

  friend std::istream & operator>>(std::istream & is ,Snake &snake);

  void deleteme();

  ~Snake();

  private:

  static int Snakenum;

  };

  class Shelves

  {

  public:

  Shelves();

  int add(int n,Animal *animal);

  void Delete(int n);

  void query(int n);

  void stat();

  private:

  Animal * shelves[12];

  };

  #endif

  Animal.cpp

  #include<iostream>

  #include“animal.h”

  using std::cout;

  using std::cin;

  using std::endl;

  int Cat::Catnum=0;

  Cat::Cat()

  {

  type=0;

  weight=0;

  name=new char[20];

  color =new char [20];

  food=new char [20];

  Catnum++;

  }

  void Cat::showme()

  {

  cout<<“I am a Cat.”<<endl;

  cout<<“ My name is ”<<name<<endl;

  cout<<“ My color is ”<<color<<endl;

  cout<<“My weight is ”<<weight<<endl;

  cout <<“ My favorite foood is ”<<food <<endl;

  return ;

  }

  int Cat::number()

  {

  return Catnum;

  }

  std::istream & operator>>(std::istream & is ,Cat &cat)

  {

  cout<<“ the cat's name is :”;

  is>>cat.name;

  cout<<endl<<“the cat's color is:”;

  is>>cat.color;

  cout<<endl<<“ the cat's weight is :”;

  is>>cat.weight;

  cout<<endl<<“the cat's fovarite food is :”;

  cin>>cat.food;

  return is;

  }

  void Cat::deleteme()

  {

  Catnum——;

  }

  Cat::~Cat()

  {

  }

  int Dog::Dognum=0;

  Dog::Dog()

  {

  type=1;

  name=new char [20];

  color =new char [20];

  food=new char [20];

  weight=0;

  Dognum++;

  }

  void Dog::showme()

  {

  cout<<endl<<“I am a Dog”<<endl;

  cout<<“My name is ”<<name<<endl;

  cout<<“ My color is ”<<color<<endl;

  cout<<“My weight is ”<<weight<<endl;

  cout<<“My favorite food is ”<<food<<endl;

  return ;

  }

  int Dog::number()

  {

  return Dognum;

  }

  std::istream & operator>>(std::istream &is ,Dog &dog)

  {

  cout<<“the dog's name is”;

  is>>dog.name;

  cout<<endl<<“ the dog's color is ”;

  is>>dog.color;

  cout<<endl<<“the dog's weight is ”;

  is>>dog.weight;

  cout<<endl<<“the dog's fovarite food is:”;

  is>>dog.food;

  return is;

  }

  void Dog::deleteme()

  {

  Dognum——;

  }

  Dog::~Dog()

  {}

  int Snake::Snakenum=0;

  Snake::Snake()

  {

  type=2;

  name=new char [20];

  color=new char [20];

  food=new char [20];

  Snakenum++;

  }

  void Snake::showme()

  {

  cout<<endl<<“I am a Snake”<<endl;

  cout<<“My name is ”<<name<<endl;

  cout<<“ My color is ”<<color<<endl;

  cout<<“My weight is ”<<weight<<endl;

  cout<<“My favorite food is ”<<food<<endl;

  return ;

  }

  int Snake::number()

  {

  return Snakenum;

  }

  std::istream & operator>>(std::istream &is ,Snake &snake)

  {

  cout<<“the snake's name is”;

  is>>snake.name;

  cout<<endl<<“ the snake's color is ”;

  is>>snake.color;

  cout<<endl<<“the snake's weight is ”;

  is>>snake.weight;

  cout<<endl<<“the snake's fovarite food is:”;

  is>>snake.food;

  return is;

  }

  void Snake::deleteme()

  {

  Snakenum——;

  }

  Snake::~Snake()

  {}

  Shelves::Shelves()

  {

  for(int i=0;i<12;i++)

  {

  shelves[i]=NULL;

  }

  }

  int Shelves::add(int n,Animal * animal)

  {

  int successful=1;

  if(shelves[n]!=NULL)

  {

  cout<<“the ”<<n<<“ the shelve is full”<<endl;

  successful=0;

  return successful;

  }

  shelves[n]=animal;

  cout<<“ successful!”<<endl;

  return successful;

  }

  void Shelves::query(int n)

  {

  if(shelves[n]==NULL)

  {

  cout<<“the ”<<n<<“ the shelve is empty!”<<endl;

  return ;

  }

  shelves[n]->showme();

  return ;

  }

  void Shelves::Delete(int n)

  {

  if(shelves[n]==NULL)

  {

  cout<<“the ”<<n<<“ shelves is empty”<<endl;

  return ;

  }

  shelves[n]->deleteme();

  shelves[n]=NULL;

  cout<<“successful!”<<endl;

  return ;

  }

  void Shelves::stat()

  {

  cout<<“there ar ”<<Cat::number()<<“cats”

  <<Dog::number()<<“dog,and”<<Snake::number()

  <<“snake.”<<endl;

  return ;

  }

  2、请实现一个简单的银行储蓄系统,承担活期用户的存款和取款业务,要求如下:

  (1) 实现描述银行的类Bank,记录系统中现有哪些储户,(可用数组实现但注意越界),定义了生成储户的函数append,按照账户删除储户的函数Delete,按账号查询储户的函数query,并显示结果。

  (2)定义储户类Account,具有属性账号,存款人姓名和余额,操作saving withdraw和showme.

  函数saving 存储业务,函数withdraw处理取款业务,(余额不足时不予以取并给提示信息),showme函数显示储户所有信息。

  (3)编写main函数,测试上述所要求的各种功能,即可以根据菜单命令增加,删除,和查询储户,以及储户存款和取款操作。

  Main.cpp

  #include<iostream>

  #include“bank.h”

  using std::cout;

  using std::cin;

  using std::endl;

  int main()

  {

  Bank bank;

  int choice=0;

  cout<<“ welcome to bank system ”<<endl;

  while(choice!=4)

  {

  cout<<“ 1: add an account ”<<endl;

  cout<<“2: delete an account ”<<endl;

  cout<<“ 3: query an account ”<<endl;

  cout<<“ 4: exit ”<<endl;

  cout<<“ please input your choice:”;

  cin >>choice;

  switch(choice)

  {

  case 1:

  bank.append();

  break;

  case 2:

  bank.deletes();

  break;

  case 3:

  bank.query();

  break;

  case 4:

  break;

  }

  }

  return 0;

  }

  Bank.h

  #ifndef BANK_H

  #define BANK_H

  class Account

  {

  public:

  Account();

  Account(int ,const char *,double);

  void saving();

  int withdrow();

  void showme();

  int getID();

  private:

  int ID;

  char *name;

  double balance;

  };

  class Bank

  {

  public:

  Bank();

  void append();

  void deletes();

  void query();

  private:

  Account *account[50];

  int maxID;

  int accnum;

  };

  #endif

  Bank.cpp

  #include<iostream>

  #include<cstring>

  #include“bank.h”

  using std::cout;

  using std::cin;

  using std::endl;

  Account::Account()

  {

  ID=0;

  strcpy(name,“”);

  balance=0;

  }

  Account::Account(int id,const char *names,double balances)

  {

  ID=id;

  name=new char[50];

  strcpy(name,names);

  balance=balances;

  }

  void Account::saving()

  {

  double number;

  cout<<“please input saving number: ”;

  cin>>number;

  balance=balance+number;

  cout<<“now the balance of your account is ”<<balance <<endl;

  return ;

  }

  int Account::withdrow()

  {

  double number;

  cout<<“ please input withdraw number:”;

  cin>>number;

  if(balance<number)

  {

  cout<<“sorry,now thd balance of your account is less than ”<<number;

  cout<<“。”<<endl<<“so you can not withdraw !”<<endl;

  return 0;

  }

  balance =balance-number;

  cout<<“now the balance of your account is ”<<balance<<endl;

  return 1;

  }

  void Account::showme()

  {

  cout<<“ account ID: ”<<ID<<endl;

  cout<<“name: ”<<name<<endl;

  cout<<“balance: ”<<balance<<endl;

  return ;

  }

  int Account::getID()

  {

  return ID;

  }

  Bank::Bank()

  {

  for(int i =0;i<50;i++)

  account[i]=NULL;

  maxID=0;

  accnum=0;

  }

  void Bank::append()

  {

  if(accnum==50)

  {

  cout<<“ sorry,the bank is full ,so can not add new account!”<<endl;

  return ;

  }

  int id;

  char *names=new char [50];

  double balance;

  cout<<endl<<“please input the name of the account: ”;

  cin>>names;

  id=maxID;

  balance=0;

  Account *acc=new Account(id,names,balance);

  account[accnum]=acc;

  cout<<“append successful ”<<endl;

  account[accnum]->showme();

  maxID++;

  accnum++;

  return ;

  }

  void Bank::deletes()

  {

  int ID;

  cout<<“ please input the account ID that you want to delete”;

  cin>>ID;

  int flag=1;

  int i=0;

  while ((i<accnum)&&(flag))

  {

  if(ID==account[i]->getID())

  {

  flag=0;

  }

  else

  {

  i++;

  }

  }

  if(flag)

  {

  cout<<“the account does not exist !”<<endl;

  }

  else{

  for( int j=i;j<accnum;j++)

  {

  account[j]=account[j+1];

  }

  delete account[accnum-1];

  accnum——;

  cout<<“ delete successful ”<<endl;

  }

  return ;

  }

  void Bank::query()

  {

  int ID;

  cout<<“ please input the account ID that you want to query: ”;

  cin>>ID;

  int flag=1;

  int i=0;

  while((i<accnum)&&(flag))

  {

  if(ID==account[i]->getID())

  flag=0;

  else

  i++;

  }

  if(flag)

  cout<<endl<<“ the account does not exist ”<<endl;

  else

  {

  account[i]->showme();

  int choice =0;

  while (choice!=3)

  {

  cout<<“ 1: save money ”<<endl;

  cout<<“ 2: withdraw money ”<<endl;

  cout<<“3: return ”<<endl;

  cout<<“ please input your choice:”;

  cin>>choice;

  cout<<endl;

  switch( choice)

  {

  case 1:

  account[i]->saving();

  break;

  case 2:

  account[i]->withdrow();

  break;

  case 3:

  break;

  }

  }

  }

  return ;

  }

  3、(1)定义基类MYgraph,至少包含纯虚函数 Area,计算图形面积。

  (2)从基类MYgraph中派生圆形类MYcircle和矩形类MYrectangle,其中圆形信息包括圆形半径

  和圆心,矩形信息包括矩形的长和宽,具体实现上述纯虚函数Area,计算圆形和矩形的面积。

  (3)重载输入>>操作符,使得可以通过cin 直接读入上述圆形类和矩形类的对象值。

  (4)编定main 函数,测试上述所要求的各种功能,即可以读入圆或矩形的对象值,计算读入图形的面积并显示。

  Main.cpp

  #include“string.h”

  #include<iostream>

  int main()

  {mycircle circle;

  myrectangle rectangles;

  std::cin>>circle;

  std::cout<<“the area of the circle is ”<<circle.area()<<'\n';

  std::cin>>rectangles;

  std::cout<<“the area of the rectangle is ”<<rectangles.area()<<'\n';

  return 0;

  }

  String.h

  #ifndef STRING_H

  #define STRING_H

  #include<iomanip>

  #include<iostream>

  using std::istream;

  class graphy

  {

  public:

  virtual double area()=0;

  };

  class mycircle:graphy

  {

  public:

  mycircle();

  double area();

  friend istream &operator >>(istream & is,mycircle &circle);

  private:

  int centerx;

  int centery;

  int radius;

  };

  class myrectangle :graphy

  {

  public:

  myrectangle();

  double area();

  friend istream &operator >>(istream & is ,myrectangle &rectangle);

  private:

  int length;

  int width;

  };

  #endif

  String.cpp

  #include<cmath>

  #include<iostream>

  #include“string.h”

  //using std::istream;

  mycircle ::mycircle()

  {

  centerx=0;

  centery=0;

  radius=0;

  }

  double mycircle::area()

  {

  double area;

  area=3.14*radius*radius;

  return area;

  }

  istream &operator >>(istream & is,mycircle &circle)

  {

  std::cout<<“please input x coordinate of the circle center(interger):”<<'\n';

  is>>circle.centerx;

  std::cout<<“please input y coordinate of the circle center(integer)”<<'\n';

  is>>circle.centery;

  std::cout<<“please input the radius of the circle (integer)”<<'\n';

  is>>circle.radius;

  return is;

  }

  myrectangle ::myrectangle()

  {

  length=0;

  width=0;

  }

  double myrectangle::area()

  {

  double area;

  area=length*width;

  return area;

  }

  istream &operator >>(istream &is ,myrectangle& rectangle)

  {

  std::cout<<“please in put the length of the rectangle (integer)”<<'\n';

  is>>rectangle.length;

  std::cout<<“please input the width of the rectangle (integer)”<<'\n';

  is>>rectangle.width;

  return is;

  }

  4、(1) 实现描述栈的类Stack ,其中定义了栈的大小size,(即栈中元素的个数),并包括进栈函数Push

  ,出栈函数Pop和显示栈顶元素的函数Top,(自已定义了一个gettop函数)。

  (2)定义基类element,至少包含纯虚函数showme;

  (3)从基类element中派生整数类MYinteger和字符串类mystring,具体实现上述纯虚函数showme,

  显示该元素的类型和相应值。

  (3)重载“>>”操作符,使得可以通过cin直接读入上述整数类和字符类的对象值。

  编定main 测试以上功能

  Main.cpp

  #include“stack.h”

  #include<iostream>

  using std::cout;

  using std::cin;

  int main()

  {

  int i=0;

  integer *myint;

  mystring *mystrings;

  stack* stack1=new stack;

  while(i!=6){

  cout<<“please chiose(1-6):”;

  cout<<“1:push an integer”<<'\n';

  cout<<“2:push a string ”<<'\n';

  cout<<“3:pop”<<'\n';

  cout<<“4:top”<<'\n';

  cout<<“5:gettop”<<'\n';

  cout<<“6:exit”<<'\n';

  cin>>i;

  switch(i)

  {

  case 1:

  myint=new integer;

  cin>>*myint;

  stack1->push(myint);

  break;

  case 2:

  mystrings =new mystring;

  cin>>*mystrings;

  stack1->push(mystrings);

  break;

  case 3:

  stack1->pop();

  break;

  case 4:

  stack1 ->top();

  break;

  case 5:

  stack1->gettop();

  break;

  case 6:

  break;

  }

  }

  return 0;

  }

  Stack.h

  #ifndef STACK_H

  #define STACK_H

  #include<iosfwd>

  class element

  {

  public:

  virtual void showme()=0;

  };

  class integer:public element

  {

  public:

  integer();

  void showme();

  friend std::istream &operator>>(std::istream & is,integer &myint);

  protected:

  int myint;

  };

  class mystring:public element

  {

  public:

  mystring();

  void showme();

  friend std::istream &operator>>(std::istream &is,mystring &myster);

  protected:

  char *mystr;

  };

  class stack

  {

  public:

  stack();

  void push(element *myele);

  void pop();

  void top();

  void gettop();

  private:

  element *stacks[5];

  int size;

  };

  #endif

  Stack.cpp

  #include<iostream>

  #include“stack.h”

  using std::cout;

  using std::cin;

  integer::integer()

  {

  myint=0;

  }

  void integer::showme()

  {

  cout<<“the element is an integer,and its value is ”<<myint<<'\n';

  }

  std::istream &operator>>(std::istream & is,integer &myint)

  {

  cout<<“please input the value of integer:”;

  return is>>myint.myint;

  }

  mystring::mystring()

  {

  mystr=“”;

  }

  void mystring::showme()

  {

  cout<<“the element is an string ,and its value ”<<mystr<<'\n';

  }

  std::istream & operator>>(std::istream &is,mystring &myster)

  {

  cout<<“please input the value of string :”;

  myster.mystr=new char [20];

  return is>>myster.mystr;

  }

  stack::stack()

  {

  size =0;

  for(int i=0;i<5;i++)

  {

  stacks[i]=NULL;

  }

  }

  void stack::pop()

  {

  if(size==0)

  {

  cout<<“the stack is empty!”<<'\n';

  return ;

  }

  for (int i=0;i<size-1;i++)

  {

  stacks[i]=stacks[i+1];

  }

  stacks[size-1]=NULL;

  size——;

  return ;

  }

  void stack::top()

  {

  if(size ==0)

  {

  cout<<“the stack is empty!”<<'\n';

  return ;

  }

  stacks[0]->showme();

  return ;

  }

  void stack::push(element *myele)

  {

  if(size==5)

  {

  cout<<“the stack is full your element can not be pushed !”<<'\n';

  return ;

  }

  for (int i=size;i>0;i——)

  stacks[i]=stacks[i-1];

  stacks[0]=myele;

  size++;

  return ;

  }

  void stack::gettop()

  {

  void top();

  void pop();

  return ;

  }

本文转载链接:北大“面向对象程序设计”上机试题(含答案)

分享到:
  • 站内搜索
  • 课程搜索
  • 试题搜索

热门搜索:教材 报名 查分 免考 考试计划