Задать вопрос
@EgaNator
Учусь на программиста

Как в моём коде можно реализовать сортировку и поиск по “степени риска”?

Пишу небольшую программку с ооп и наследованием. Есть базовый класс и от него наследуются пять классов - видов страхование. Через меню необходимо вывести 3 пункта. 1 - Посмотреть виды страховок, 2 - Отсортировать по уменьшению степени риска, 3 - Найти по степени риска. Не получается сделать сортировку по степени риска и поиск. Подскажите, пожалуйста, как можно реализовать данные пункты?
Файл Derivativ.h
#pragma once
#include <iostream>
#include <conio.h>
#include <string>

class Derivativ
{
public:
	Derivativ();
	Derivativ(const char* n, int t, const char* o, const char* v, int s);
	Derivativ(const Derivativ& t);
	const char* getname() const;
	int getterm()const;
	const char* getoblig() const;
	const char* getvariety() const;
	int getstep()const;
	virtual void Show();
	virtual double Summa();

	virtual ~Derivativ();

protected:
	char* name;
	int term;
	char* oblig;
	char* variety;
	int step;
};


class Live : public Derivativ
{
public:
	Live();
	Live(const char* n, int t, const char* o, const char* v, int s);
	Live(const Derivativ& t);
	void Show() override;
	double Summa() override;

	virtual ~Live();

};

class Medicine : public Derivativ
{
public:
	Medicine();
	Medicine(const char* n, int t, const char* o, const char* v, int s);
	Medicine(const Derivativ& t);
	void Show() override;
	double Summa() override;

	virtual ~Medicine();

};

class Ncase : public Derivativ
{
public:
	Ncase();
	Ncase(const char* n, int t, const char* o, const char* v, int s);
	Ncase(const Derivativ& t);
	void Show() override;
	double Summa() override;

	virtual ~Ncase();
};

class Property : public Derivativ
{
public:
	Property();
	Property(const char* n, int t, const char* o, const char* v, int s);
	Property(const Derivativ& t);
	void Show() override;
	double Summa() override;

	virtual ~Property();
};

class CivilLiab : public Derivativ
{
public:
	CivilLiab();
	CivilLiab(const char* n, int t, const char* o, const char* v, int s);
	CivilLiab(const Derivativ& t);
	void Show() override;
	double Summa() override;

	virtual ~CivilLiab();
};

Файл Derivativ.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "Derivativ.h"
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

Derivativ::Derivativ()
{
	name = 0;
	term = 0;
	oblig = 0;
	variety = 0;
	step = 0;
}

Derivativ::Derivativ(const char* n, int t, const char* o, const char* v, int s)
	: name(new char[strlen(n) + 1]), term(t), oblig(new char[strlen(o) + 1]), variety(new char[strlen(v) + 1]), step(s)
{
	strcpy(name, n);
	strcpy(oblig, o);
	strcpy(variety, v);
}

Derivativ::Derivativ(const Derivativ& t)
	: name(new char[strlen(t.name) + 1]), term(t.term), oblig(new char[strlen(t.oblig) + 1]), variety(new char[strlen(t.variety) + 1]), step(t.step)
{
	strcpy(name, t.name);
	strcpy(oblig, t.oblig);
	strcpy(variety, t.variety);
}

void Derivativ::Show()
{ }

double Derivativ::Summa()
{
	return 0;
}

Derivativ::~Derivativ()
{
	delete[] name;
	delete[] oblig;
	delete[] variety;
}

const char* Derivativ::getname() const
{
	return name;
}

int Derivativ::getterm() const
{
	return term;
}

const char* Derivativ::getoblig() const
{
	return oblig;
}

const char* Derivativ::getvariety() const
{
	return variety;
}

int Derivativ::getstep() const
{
	return step;
}



Live::Live() :Derivativ()
{ }

Live::Live(const char* n, int t, const char* o, const char* v, int s) : Derivativ(n, t, o, v, s)
{ }

Live::Live(const Derivativ& t) : Derivativ(t)
{ }

void Live::Show()
{
	cout << "Страхование жизни";
}

double Live::Summa()
{
	return 10000 * term + 518;
}

Live::~Live()
{ }



Medicine::Medicine() :Derivativ()
{ }

Medicine::Medicine(const char* n, int t, const char* o, const char* v, int s) : Derivativ(n, t, o, v, s)
{ }

Medicine::Medicine(const Derivativ& t) : Derivativ(t)
{ }

void Medicine::Show()
{
	cout << "Медицинское страхование";
}

double Medicine::Summa()
{
	return 5000 * term + 482;
}

Medicine::~Medicine()
{ }



Ncase::Ncase() :Derivativ()
{ }

Ncase::Ncase(const char* n, int t, const char* o, const char* v, int s) : Derivativ(n, t, o, v, s)
{ }

Ncase::Ncase(const Derivativ& t) : Derivativ(t)
{ }

void Ncase::Show()
{
	cout << "Страхование от несчастных случаев";
}

double Ncase::Summa()
{
	return 6500 * term + 491;
}

Ncase::~Ncase()
{ }



Property::Property() :Derivativ()
{ }

Property::Property(const char* n, int t, const char* o, const char* v, int s) : Derivativ(n, t, o, v, s)
{ }

Property::Property(const Derivativ& t) : Derivativ(t)
{ }

void Property::Show()
{
	cout << "Страхование имущества";
}

double Property::Summa()
{
	return 7400 * term + 504;
}

Property::~Property()
{ }



CivilLiab::CivilLiab() :Derivativ()
{ }

CivilLiab::CivilLiab(const char* n, int t, const char* o, const char* v, int s) : Derivativ(n, t, o, v, s)
{ }

CivilLiab::CivilLiab(const Derivativ& t) : Derivativ(t)
{ }

void CivilLiab::Show()
{
	cout << "Страхование гражданской ответственности";
}

double CivilLiab::Summa()
{
	return 6900 * term + 498;
}

CivilLiab ::~CivilLiab()
{ }

Файл main.cpp
#include <iostream>
    #include <conio.h>
    #include "Derivativ.h"
    #include <iomanip>
    using namespace std;
    
    void Menu() {
        cout << "1 - Посмотреть виды страховок" << endl;
        cout << "2 - Отсортировать по уменьшению степени риска" << endl;
        cout << "3 - Найти по степени риска" << endl;
        cout << "0 - Выход" << endl;
    }
    
    int main()
    {
        setlocale(LC_ALL, "Russian");
    
        int c;
    
        do {
            Menu();
            cout << "Ваш выбор: ";
            cin >> c;
            switch (c) {
            case 1:
                system("cls");
                
                Derivativ *ex[5];
                ex[0] = new Live("Страхование жизни", 3, "Добровальное", "Личное", 5);
                ex[1] = new Medicine("Медицинское страхование", 5, "Добровальное", "Личное", 3);
                ex[2] = new Ncase("Страхование от несчастных случаев", 5, "Добровальное", "Личное", 4);
                ex[3] = new Property("Страхование имущества", 1, "Добровальное", "Имущественное", 2);
                ex[4] = new CivilLiab("Страхование гражданской ответственности", 1, "Добровальное", "Имущественное", 1);
    
                for (int i = 0; i < 5; i++)
                {
                    cout << "Номер: " << (i + 1) << endl;
                    //cout << "Тип страховки: ";
                    //ex[i]->Show();
                    cout << endl;
                    cout << "Название: " << ex[i]->getname() << endl;
                    cout << "Срок действия (в годах): " << ex[i]->getterm() << endl;
                    cout << "Добровалиное/обязательное:" << ex[i]->getoblig() << endl;
                    cout << "Разновидность: " << ex[i]->getvariety() << endl;
                    cout << "Степень риска: " << ex[i]->getstep() << endl;
                    cout << "Стоимость страховки: " << ex[i]->Summa() << endl;
                    cout << endl << endl;
    
                }
    
                for (int i = 0; i < 5; ++i)
                    delete ex[i];
    
                break;
            case 2:
                system("cls");
                
                break;
            case 3:
                system("cls");
                
                break;
            case 0:
                break;
            default: cout << "Некорректный вариант выбора!" << endl;
            }
        } while (c != 0);
    
    
        _getch();
        return 0;
    }
  • Вопрос задан
  • 94 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
1. Функция сортировки из стандартной библиотеки: https://en.cppreference.com/w/cpp/algorithm/sort. Обратите пример с lambda функцией. В вашем случае ее параметры будут указатели на Derivativ, и в теле будет сравнение по соответствующему свойству.
2. У обычного массива нет begin() и end(). Используйте vector вместо массива или https://en.cppreference.com/w/cpp/iterator/begin
3. Массив со страховками у вас создается только если выбрана 1. Немного логичнее если он будет жить все время работы программы.
4. Сортировка меняет массив. Вероятно "2" должна создавать копию массива, сортировать его и печатать.
5. Используйте std::string для хранения строк. Жить станет немного проще и веселее.
5. Derivative Это что-то производное от чего-то. А у вас наоборот от него производят. Insurance или BaseInsurance более подходящее имя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы