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

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

利用链表实现栈和队列

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

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

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

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

要求:

(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++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
|
5月前
|
Python 容器
面向对象详解,面向对象的三大特征:封装、继承、多态-2
面向对象详解,面向对象的三大特征:封装、继承、多态
|
6月前
|
Serverless PHP
当谈论面向对象编程时,这四个概念是非常重要的。以下是对接口、继承、封装和多态的简要说明
本文介绍了面向对象编程的四个核心概念:接口、继承、封装和多态。接口定义对象的行为规范,类通过实现接口确保符合所需行为。继承允许在已有类基础上创建新类,实现代码重用。封装是将数据和操作捆绑并隐藏内部细节,提高安全性和可维护性。多态使对象在运行时能表现出不同行为,增加代码灵活性和可扩展性。文中还提供了代码示例来说明这些概念。
38 0
|
算法 Java 编译器
类和面向对象
类和面向对象
105 0
|
6月前
|
算法 编译器 C语言
【C/C++ 编程题 01】用C++设计一个不能被继承的类
【C/C++ 编程题 01】用C++设计一个不能被继承的类
66 0
|
6月前
|
Java
Java面向对象编程,解释封装、继承和多态的概念。
Java面向对象编程,解释封装、继承和多态的概念。
78 2
|
6月前
掌握面向对象程序设计继承和派生机制的概念
掌握面向对象程序设计继承和派生机制的概念
43 0
|
存储 算法 Java
面向对象编程实践:类、对象与继承
面向对象编程实践:类、对象与继承
58 0
|
安全 Java 编译器
C++ 面向对象三大特性——继承
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的继承。
面向对象程序设计第六章:继承
面向对象程序设计第六章:继承
119 0