• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Полиморфизм.

  • Автор темы Waldemar
  • Дата начала
W

Waldemar

Доброго времени суток.
Вот условие задания: Создать класс периодическое издание (название, стоимость экземпляра и количество страниц) и классы газета ( количество экземпляров, стоимость подписки за год) и журнал ( вид переплета, стоимость подписки за год). Создать виртуальные методы; вывод информации и поиск по названию.
Код программы вот (он верный):
C++:
#include <iostream> 
#include <string> 
#include <conio.h>

using namespace std;
class izdan {
private:
string nazv;
float st;
int str;
int per;
public: 
izdan (string, float, int, int);
virtual void show_information (void);
};
izdan::izdan(std::string new_nazv, float new_st, int new_str, int new_per)
{
nazv=new_nazv;
st=new_st;
str=new_str;
per=new_per;
};
void izdan::show_information (void)
{
cout<<"название издания "<<nazv<<endl;
cout<<"стоимость экземпляра "<<st<<endl;
cout<<"количество страниц "<<str<<endl;
cout<<"периодичность "<<per<<endl;
};
class gazz: public izdan
{
private:
int exz;
int podp;
public: 
gazz (string, float, int, int, int, int);
void show_information(void);
};
gazz::gazz(string nazv1, float st1, int str1, int per1, int exz1, int podp1):izdan(nazv1, st1, str1, per1)
{
gazz::exz=exz1;
gazz::podp=podp1;
}
void gazz::show_information(void)
{
izdan::show_information();
cout<<"Количество экземпляров="<<exz<<endl;
cout<<"Стоимость подписки="<<podp<<endl;
}

class jour: public izdan
{
private:
string perepl;
int podp;
public: 
jour (string, float, int, int, string, int);
void show_information(void);
};
jour::jour(string nazv1, float st1, int str1, int per1, string perepl1, int podp1):izdan(nazv1, st1, str1, per1)
{
jour::perepl=perepl1;
jour::podp=podp1;
}
void jour::show_information(void)
{
izdan::show_information();
cout<<"Тип переплета="<<perepl<<endl;
cout<<"Стоимость подписки="<<podp<<endl;
}

int main ()
{
setlocale (LC_CTYPE, "Russian");
izdan* group[4];
group[0]=new izdan("Росмэн", 10500, 25, 2);
group[1]=new izdan("Росмэн", 25500, 34, 2);
group[2]=new gazz("Таймс", 13500, 31, 24, 5000, 45);
group[3]=new jour("Форбс", 13500, 31, 12, "Обычный", 10);

for (int i=0; i<4; i++)
{
cout<<"обьект номер"<<i+1<<endl;
group[i]->show_information();
};

system("pause");
getch();
};

Но как сделать поиск по имени я пока что не додумался. Помогите реализовать его.
Заранее благодарен.
 
Q

qqwertty

Вопрос: причем тут полиморфизм?

Делаете метод у предка, возвращающий название журнала и функцию поиска, которая (возможно перебором) находит объекты из массива.
 
W

Waldemar

Вопрос: причем тут полиморфизм?

Делаете метод у предка, возвращающий название журнала и функцию поиска, которая (возможно перебором) находит объекты из массива.
Как я понял, нужно в класс Izdan добавить метод, возвращающий название и потом в цикле сравнить строки. Но вот как это написать - для меня проблема... напишите код, пожалуста.
 
Q

qqwertty

Т.е Все остальное вы написали, а это не можете? ;)

C++:
#include <iostream> 
#include <string> 
#include <conio.h>

using namespace std;
class izdan {
private:
string nazv;
float st;
int str;
int per;
public: 
izdan (string, float, int, int);
virtual void show_information (void);
string GetName();
};
izdan::izdan(std::string new_nazv, float new_st, int new_str, int new_per)
{
nazv=new_nazv;
st=new_st;
str=new_str;
per=new_per;
};
void izdan::show_information (void)
{
cout<<"название издания "<<nazv<<endl;
cout<<"стоимость экземпляра "<<st<<endl;
cout<<"количество страниц "<<str<<endl;
cout<<"периодичность "<<per<<endl;
};

string izdan::GetName()
{
return nazv;
}
class gazz: public izdan
{
private:
int exz;
int podp;
public: 
gazz (string, float, int, int, int, int);
void show_information(void);
};
gazz::gazz(string nazv1, float st1, int str1, int per1, int exz1, int podp1):izdan(nazv1, st1, str1, per1)
{
gazz::exz=exz1;
gazz::podp=podp1;
}
void gazz::show_information(void)
{
izdan::show_information();
cout<<"Количество экземпляров="<<exz<<endl;
cout<<"Стоимость подписки="<<podp<<endl;
}

class jour: public izdan
{
private:
string perepl;
int podp;
public: 
jour (string, float, int, int, string, int);
void show_information(void);
};
jour::jour(string nazv1, float st1, int str1, int per1, string perepl1, int podp1):izdan(nazv1, st1, str1, per1)
{
jour::perepl=perepl1;
jour::podp=podp1;
}
void jour::show_information(void)
{
izdan::show_information();
cout<<"Тип переплета="<<perepl<<endl;
cout<<"Стоимость подписки="<<podp<<endl;
}

void Poisk(izdan **mas, int n, string what)
{
cout << "Найденные элементы: ";
for(int i = 0; i < n; ++i)
{
if (mas[i]->GetName() == what)
{
cout << i << " ";
}
}
cout << endl;
}

int main ()
{
setlocale (LC_CTYPE, "Russian");
izdan* group[4];
group[0]=new izdan("Росмэн", 10500, 25, 2);
group[1]=new izdan("Росмэн", 25500, 34, 2);
group[2]=new gazz("Таймс", 13500, 31, 24, 5000, 45);
group[3]=new jour("Форбс", 13500, 31, 12, "Обычный", 10);

for (int i=0; i<4; i++)
{
cout<<"обьект номер"<<i+1<<endl;
group[i]->show_information();
};
Poisk(group, 4, "Таймс");
getch();
};
 
W

Waldemar

Все остальное вы написали, а это не можете?
По уже написанному было что-то вроде трафарета, а метод поиска самому нужно организовать.

Кстати, поиск ведь не так должен работать, насколько я понимаю.... В конце надо строчку сделать, типа "ввидите имя" , а прога выдаст соответствующий журнал или газету с теми данными, которые уже запилены в них.
 
Q

qqwertty

Кстати, поиск ведь не так должен работать, насколько я понимаю.... В конце надо строчку сделать, типа "ввидите имя" , а прога выдаст соответствующий журнал или газету с теми данными, которые уже запилены в них.

Это вам в раздел: "Решите мне задачу". Если хотите, чтобы за вас всю лабу написали, так и указывайте в вопросе.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!