Наследование, работа супермаркета

Уровень сложности:

Разработать три класса, которые следует связать между собой, используя наследование:

  1. класс Product, который имеет три элемент-данных — имяцена и вес товара (базовый класс для всех классов);
  2. класс  Buy, содержащий данные о количестве покупаемого товара в штуках, о цене за весь купленный товар и  о весе товара (производный класс для класса Product и базовый класс для класса Check);
  3. класс Check, не содержащий никаких элемент-данных. Данный класс должен выводить на экран информацию о товаре и о покупке ( производный класс для класса Buy);

Для взаимодействия с данными классов разработать set- и getметоды. Все элемент-данные классов объявлять как private.

Наследование, работа супермаркета

Рисунок 1 — Наследование, работа супермаркета

// заголовочный файл базового класса Product для всех классов
#ifndef PRODUCT_H
#define PRODUCT_H

class Product
{
private:
    char name[50]; // имя товара
    double price, // цена
           weight; // вес 1 ед.
public:
    Product(); // конструктор

    void setName(const char *); // установить имя товара
    const char *getName() const; // возвратить имя товара

    void setPrice(const double &); // установить цену товара
    double getPrice() const; // возвратить цену товара

    void setWeight(const double &); // установить вес 1 ед. товара
    double getWeight() const; // возвратить вес 1 ед. товара
};

#endif  PRODUCT_H

Файл реализации базового класса Product.

#include "stdafx.h"

#include "product.h"

#include <cstring> // прототип strcpy()

Product::Product() // конструктор
    : price(0.0), weight(0.0)
{
    for (int counter = 0; counter < 50; counter++)
        name[counter] = '\0';
}

void Product::setName(const char *name_product) // установить имя товара
{
    strcpy(name, name_product); // имя товара копируем в элемент данных класса
}

const char *Product::getName() const // возвратить имя товара
{
    return name;
}

void Product::setPrice(const double & pr) // установить стоимость 1 ед. товара
{
    price = (pr >= 0 ? pr : 0);
}

double Product::getPrice() const // возвратить стоимость 1 ед. товара
{
    return price;
}

void Product::setWeight(const double & wgh) // установить вес товара
{
    weight = wgh;
}

double Product::getWeight() const
{
    return weight;
}

Каждый класс определён в двух файлах(заголовочный и исполняемый файлы). Далее показан заголовочный файл класса Buy, который является производным для класса  Product.

// заголовочный фай производного класса Buy для класса Product
#ifndef BUY_H
#define BUY_H

#include "product.h"

class Buy : public Product // открытое наследование
{
private:
     int    sum; // количество покупаемого товара в шт.
     double sum_price, // цена за весь купленный товар    
            sum_weight; // общий вес
public:
    Buy(); // конструктор

    void setSum(const int &); // установить количество покупаемого товара
    int getSum() const; // возвратить количество покупаемого товара

    double getSumPrice() const; // возвратить цену за весь купленный товар

    double getSumWeight() const; // возвратить общий вес покупки
};

#endif BUY_H

Файл реализации производного класса Buy.

#include "stdafx.h"

#include "buy.h"

Buy::Buy() // конструктор
    : sum(0), sum_price(0.0), sum_weight(0.0)
{
    // пустое тело конструктора
}

void Buy::setSum(const int &value) // установить количество покупаемого товара
{
    sum = (value >= 0 ? value : 0);
    sum_price = sum * getPrice(); // получаем стоимость всего товара
    sum_weight = sum * getWeight(); // получаем общий вес покупаемого товара
}

int Buy::getSum() const // возвратить количество покупаемого товара
{
    return sum;
}

double Buy::getSumPrice() const // возвратить цену за весь купленный товар
{
    return sum_price;
}

double Buy::getSumWeight() const // возвратить общий вес покупки
{
    return sum_weight;
}

Заголовочный файл производного класса Check для класса Buy. Заметьте, что класс Check  не имеет файла реализации, так как реализация его методов выполнена внутри класса. Это сделано для того, чтобы не создавать отдельный файл всего для двух простых методов.

// заголовочный файл производного класса Check для класса Buy
#ifndef CHECK_H
#define CHECK_H

#include "buy.h"

class Check : public Buy // открытое наследование
{
public:
    void printProductInfo()
    {
        cout << "Товар: " << getName()   << endl;
        cout << "Цена:  "  << getPrice()  << " грн\n";
        cout << "Вес:   "   << getWeight() << " кг\n\n";
    }

    void printBuyInfo()
    {
        cout << "Товара куплено: " << getSum() << " шт\n";
        cout << "На сумму:       " << getSumPrice() << " грн\n";
        cout << "Общий вес:      " << getSumWeight() << " кг\n\n";
    }

};
#endif CHECK_H

После определения всех классов, в главном исполняемом файле объявляем объект последнего созданного класса Check. Для этого, сначала подключим заголовочный файл данного класса, как показано в строке 7.

// supermarket.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
using namespace std;

#include "check.h"  // заголовочный файл производного класса Check от класса Buy

int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");

    Check product; // создаём объект класса

    product.setName("\"Уральские\" пельмени"); // устанавливаем название продукта
    product.setPrice(12); // цена продукта
    product.setWeight(1);   // вес

    product.setSum(30); // куплено шт.

    product.printProductInfo(); //чек продукта
    product.printBuyInfo(); // чек покупки

    system("pause");
    return 0;
}

Результат работы программы показан на рисунке 1.

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. Arthur

    #include<iostream>
    #include<cstring>
    #include<iomanip>
    using namespace std;
    
    class Product
    {
    private:
        char name[80];
        int price;
        float weight;
    public:
         Product()
         {
             strcpy(name, '');
             price = 0;
             weight = 0;
         }
         Product(char*str, int pr, float wgh)
         {
             strcpy(name, str);
             price = pr;
             weight = wgh;
         }
         int getPrice()  const
         {
             return price;
         }
         float getWeight()  const
         {
             return weight;
         }
         void showData()   const
        {
            cout<<left<<setw(18)<<"\nТовар:"<<name;
            cout<<setw(18)<<"\nЦена:" <<setw(8)<<price<<" руб";
            cout<<setw(18)<<"\nВес:"  <<setw(8)<<weight<<" кг"<<endl;
        }
    };
    
    class Buy:public Product
    {
    private:
        int col;
        int total_price;
        float total_weight;
    public:
         Buy():Product()
         {
             col = 0;
             total_price = 0;
             total_weight = 0;
         }
         Buy(int c)
        {
           col = c;
           int temp1 = getPrice();
           float temp2 = getWeight();
           total_price = temp1*c;
           total_weight = temp2*c;
        }
         Buy(char*n, int p, float w, int c):  Product(n, p, w)
         {
             col = c;
           total_price = c* getPrice();;
           total_weight = c* getWeight();
         }
    
         void showData()   const
        {
            cout<<"\nТовара куплено:  "<<setw(8)<<col<<" кг";
            cout<<"\nНа сумму:        "<<setw(8)<<total_price<<" руб";
            cout<<"\nОбщий вес:       "<<setw(8)<<total_weight<<" кг"<<endl;
        }
    };
    
    class Check:private Buy
    {
      public:
          Check(): Buy()
          {
          }
          Check(char*n, int p, float w, int cl):  Buy(n, p, w, cl)
          {
          }
        void showData()  const
        {
            Product::showData();
            Buy::showData();
        }
    };
    
    int main()
    {
        setlocale(LC_CTYPE, "rus");
        Check s1("Пельмешки", 235, 3.5, 5);
        s1.showData();
    
        return 0;
    }
  2. NaikoN

    Не припоминаю, что бы на сайте где-то было написано, что такое «Наследование» :)

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.