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

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

利用链表实现栈和队列

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

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

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

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

要求:

(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;
}


目录
相关文章
|
6天前
|
Serverless PHP
当谈论面向对象编程时,这四个概念是非常重要的。以下是对接口、继承、封装和多态的简要说明
本文介绍了面向对象编程的四个核心概念:接口、继承、封装和多态。接口定义对象的行为规范,类通过实现接口确保符合所需行为。继承允许在已有类基础上创建新类,实现代码重用。封装是将数据和操作捆绑并隐藏内部细节,提高安全性和可维护性。多态使对象在运行时能表现出不同行为,增加代码灵活性和可扩展性。文中还提供了代码示例来说明这些概念。
5 0
|
3月前
掌握面向对象程序设计继承和派生机制的概念
掌握面向对象程序设计继承和派生机制的概念
14 0
|
7月前
|
算法 Java 编译器
类和面向对象
类和面向对象
67 0
|
4月前
|
Java
Java面向对象编程,解释封装、继承和多态的概念。
Java面向对象编程,解释封装、继承和多态的概念。
39 2
|
6月前
|
存储 算法 Java
面向对象编程实践:类、对象与继承
面向对象编程实践:类、对象与继承
34 0
|
9月前
|
存储 设计模式 算法
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
面向对象(OOP)、类的基本概念
面向对象基本概念 - 我们之前学习的编程方式就是 **面向过程** 的 - **面相过程** 和 **面相对象**,是两种不同的 **编程方式**
面向对象程序设计第六章:继承
面向对象程序设计第六章:继承
85 0
面向对象程序设计第九章:多态
面向对象程序设计第九章:多态
87 0