面向对象程序设计第七章:继承与派生

简介: 面向对象程序设计第七章:继承与派生

利用链表实现栈和队列

【问题描述】利用链表实现栈和队列

队列具有先进先出的特点,所有新来的元素都放在队列尾部,出队列的元素从队列头部出去。下面是队列的示意图:

栈具有后进先出的特点。所有入栈的元素都放在栈顶,出栈时栈顶元素先出。下面是栈的示意图:

这两种结构具有很多相似的地方:都存放了一系列的元素,元素的操作都在两头进行,元素个数都是动态可变的。我们可以设计一个基类,完成它们共同的功能,然后分别派生出队列类和栈类。本实验要求以上一个实验实现的链表类作为基类并设计它的两个派生类。

要求:

(1) 在上一个实验实现的链表类的基础上派生队列类和栈类,要求队列类可以进行元素入队列和出队列操作,栈类可以进行入栈和出栈操作。

(2) 在队列类中实现一个输出队列内容的函数printQueue,在栈类中实现一个输出栈中内容的函数printStack,

【输入形式】

【输出形式】

【样例输入】

【样例输出】

【样例说明】

【评分标准】

#include <iostream>
#include <string>
using namespace std;
class Person
{  public:
        Person(){ }
        Person(int ID,string name);
      void showMessage(); 
    int getId();
  private:
      int mId;                          //编号
      string mName; 
};
 Person::Person(int ID,string name)
 {  this->mId=ID;
     this->mName=name;
 }
int Person::getId()
{ return mId;}
void Person::showMessage()                          //输出数据 
{
  cout << this->mId << " " << this->mName << endl;
}
class Node
{
public:
  Node();
  Node(Person val);      
  friend class LinkList;
         //把Linklist作为自己的友元类
  void showMessage(); 
protected:
  Person
 data;                 
  Node *next;                       //指针指向下一个
};
class LinkList
{
public:
  LinkList();
  void addNodeAtTail(Person val);
  void print(); 
  void deleteNode(int id);
  int  getHead (Person &val);                    //从表头取出
  void addNodeAtHead(const Person &val);
protected:
  Node *head;                                 //指针指向头
};
int  LinkList::getHead (Person &val)
{ int n;
  if(head==NULL)
   {
      cout<<"error"<<endl; return 0;
   }
  else {n=(head->data).getId();
        val=head->data;
       Node *temp=head;
        head=head->next;
    delete temp;
    }
  return 1;
}
void LinkList::deleteNode(int id)
{
    Node* p=NULL, * q=NULL;
    if (head!= NULL)
    {
        p = head;
        while (p != NULL && p->data.getId() != id)
        {
            q = p;
            p = p->next;
        }
        if (p != NULL)
        {
            if (p == head)
            {
                head = head->next;
                delete p;
            }
            else
            {
                q->next = p->next;
                delete p;
            }
        }
    }
}
void  LinkList::addNodeAtHead(const  Person& val)
{
    Node* pNew = new Node(val);
    pNew->next = head;
    head = pNew;
}
void LinkList::addNodeAtTail(Person val)
{
    Node* p, * q;
    p = new Node(val);
    if (head == NULL)
        head = p;
    else
    {
        q = head;
        while (q->next != NULL)
            q = q->next;
        q->next = p;
    }
}
void LinkList::print()
{
    Node* ptmp = head;
    while (ptmp != NULL)
    {
        ptmp->showMessage();
        ptmp = ptmp->next;
    }
}
LinkList::LinkList()
{
    this->head = NULL;
}
class Queue:public LinkList
{
  public:
    void enterQueue(const Person &val);
    int outQueue(Person &val);
    void printQueue();
};
void Queue::enterQueue(const Person& val)
{
    addNodeAtTail(val);
}
int Queue::outQueue(Person& val)
{
    return getHead(val);
}
void Queue::printQueue()
{
    cout<<"queue member:"<<endl;
    print();
}
Node::Node()
{
    next = NULL;
}
Node::Node(Person val)
{
    data = val;
    next = NULL;
}
void Node::showMessage()
{
    data.showMessage();
}
class Stack :public LinkList
{
public:
    void push(const Person& val);
    int pop(Person &val);
    void printStack();
};
void Stack::push(const Person &val)
{addNodeAtHead(val);}
int Stack::pop(Person &val)
{return getHead(val);}
void Stack::printStack()
{cout<<"stack member:"<<endl;
 print();
}
int main()
{ string name;
  Queue *q1=new Queue;
  Stack *s1=new Stack;
  cout << "请输入学生姓名:" << endl;
  Person val;
  for (int i = 2018003; i >= 2018001; i--)      //依次输入名字
  {
    cin >> name;
    val=Person(i,name);
    s1->push(val);
  }
  for (int i = 2018004; i <= 2018006; i++)      //依次输入名字
  {
    cin >> name;
    val=Person(i,name);
    q1->enterQueue(val);
  }
  cout <<"学生信息为:"<< endl;
  q1->printQueue();
  s1->printStack();
  cout<<"outqueue:"<<endl;
  for(int i=0;i<2;i++)
  {q1->outQueue(val); 
   val.showMessage();
  } 
  cout<<"pop:"<<endl;
  for(int i=0;i<2;i++)
   { s1->pop(val);
    val.showMessage();
  }
  cout<<"after deletes:"<<endl;
   q1->printQueue();
  s1->printStack();
  delete q1;
  delete s1;
  return 0;
}

日期时间类编程

【问题描述】

编程定义日期类Date和时间类Time,Date类的数据成员为年、月、日,Time类则为时、分、秒。Date和Time类共同派生出日期时间类DateTime类。部分代码见代码区。请分析代码功能、设计各类并完善程序,使给出的程序代码正确执行。

Date类中数据输出格式:cout << year << “/” << month << “/” << day << endl;

Time类中数据输出格式:cout << hour << “:” << minute << “:” << second << endl;

【输入形式】

【输出形式】

【样例输入】

【样例输出】

【样例说明】

【评分标准】

#include <iostream>
#include<iostream>
using namespace std;
class Date
{
public:
    Date()
    {
    }
    Date(int y, int m, int d) :year(y), month(m), day(d)
    {
    }
    int year;
    int month;
    int day;
    void Display()
    {
        cout << year << "/" << month << "/" << day << endl;
    }
};
class Time
{
public:
    int hour;
    int minute;
    int second;
    Time()
    {
    }
    Time(int h, int m, int s) :hour(h), minute(m), second(s)
    {
    }
    void Display()
    {
        cout << hour << ":" << minute << ":" << second << endl;
    }
};
class DateTime :public Date, public Time
{
public:
    DateTime(int _year, int _month, int _day, int _hour, int _minute, int _second)
        :Date(_year, _month, _day), Time(_hour, _minute, _second)
    {
    }
    DateTime(Date d, Time t) :Date(d), Time(t)
    {
    }
    void Display()
    {
        Date::Display();
        Time::Display();
    }
    DateTime()
    {
    }
    void SetDateTime(int y, int m, int d, int h, int mi, int s)
    {
        year = y;
        month = m;
        day = d;
        hour = h;
        minute = mi;
        second = s;
    }
};
void InputDateTime(Date& da, Time& ti)
{
  cout << "请输入日期(年 月日):";
  cin >> da.year >> da.month >> da.day;
  cout << "请输入时间(小时 分钟 秒):";
  cin >> ti.hour >> ti.minute >> ti.second;
}
int main()
{
  Date da;
  Time ti;
  DateTime dt1(2020, 4, 4, 10, 0, 0);
  dt1.Display();
  InputDateTime(da, ti);
  DateTime dt2(da, ti);
  dt2.Display();
  DateTime dt3;
  dt3.SetDateTime(2020, 4, 4, 12, 47, 56);
  dt3.Display();
  return 0;
}


目录
相关文章
|
5月前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
7月前
|
Java
Java面向对象编程,解释封装、继承和多态的概念。
Java面向对象编程,解释封装、继承和多态的概念。
82 2
|
7月前
掌握面向对象程序设计继承和派生机制的概念
掌握面向对象程序设计继承和派生机制的概念
49 0
|
Java C++
面向过程、基于对象、面向对象、分析
面向过程、基于对象、面向对象、分析
80 0
面向过程、基于对象、面向对象、分析
|
存储 算法 编译器
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
面向对象程序设计第六章:继承
面向对象程序设计第六章:继承
128 0
面向对象程序设计第九章:多态
面向对象程序设计第九章:多态
148 0
|
存储 C语言 C++
面向对象实验 ——(二)类与对象
面向对象实验 ——(二)类与对象
106 0
面向对象实验 ——(二)类与对象
|
网络协议 测试技术 Go
面向对象编程-继承引出 | 学习笔记
快速学习面向对象编程-继承引出
面向对象编程-继承引出 | 学习笔记