
Вам потрібно розробити систему для обробки музичних композицій різних жанрів та видів: пісні та
інструментальні треки. Для кожної композиції потрібно визначити назву, тривалість та жанр. Створіть базовий клас Composition, який містить назву, тривалість та методи для виведення інформації про композицію. Від класу Composition успадкуйте два підкласи: Song (пісня) та InstrumentalTrack (інструментальний трек). Клас Song має поле genre (жанр) та методи для визначення жанру пісні. Клас InstrumentalTrack має поле instrument (інструмент) та методи для визначення інструменту у треці. Реалізуйте методи для виведення інформації про композицію в кожному з підкласів. Створіть функцію void ProcessComposition(Composition *composition), яка приймає вказівник на об'єкт класу Composition і використовує оператори static_cast та dynamic_cast для виконання обробки композиції в залежності від її типу. Створіть декілька об'єктів різних типів композицій, помістіть їх в масив вказівників на базовий клас Composition і викличте функцію ProcessComposition для кожного з них. НА МОВІ С++

Ответы на вопрос

Ответ:
#include <iostream>
#include <string>
using namespace std;
class Composition {
protected:
string title;
int duration;
public:
Composition(string title, int duration) : title(title), duration(duration) {}
virtual void PrintInfo() {
cout << "Title: " << title << endl;
cout << "Duration: " << duration << endl;
}
};
class Song : public Composition {
private:
string genre;
public:
Song(string title, int duration, string genre) : Composition(title, duration), genre(genre) {}
void PrintInfo() override {
cout << "Title: " << title << endl;
cout << "Duration: " << duration << endl;
cout << "Genre: " << genre << endl;
}
void SetGenre(string genre) {
this->genre = genre;
}
};
class InstrumentalTrack : public Composition {
private:
string instrument;
public:
InstrumentalTrack(string title, int duration, string instrument) : Composition(title, duration), instrument(instrument) {}
void PrintInfo() override {
cout << "Title: " << title << endl;
cout << "Duration: " << duration << endl;
cout << "Instrument: " << instrument << endl;
}
void SetInstrument(string instrument) {
this->instrument = instrument;
}
};
void ProcessComposition(Composition *composition) {
cout << "=== Processing composition ===" << endl;
composition->PrintInfo();
Song* song_ptr = dynamic_cast<Song*>(composition);
if (song_ptr) {
cout << "This is a song." << endl;
// Perform logic specific to Song.
}
else {
InstrumentalTrack* inst_track_ptr = dynamic_cast<InstrumentalTrack*>(composition);
if (inst_track_ptr) {
cout << "This is an instrumental track." << endl;
// Perform logic specific to InstrumentalTrack.
}
}
}
int main() {
const int NUM_COMPOSITIONS = 3;
Composition* compositions[NUM_COMPOSITIONS];
Song song("Bohemian Rhapsody", 367, "Rock");
InstrumentalTrack inst_track1("Moon River", 160, "Piano");
InstrumentalTrack inst_track2("Linus and Lucy", 146, "Jazz");
compositions[0] = &song;
compositions[1] = &inst_track1;
compositions[2] = &inst_track2;
for (int i = 0; i < NUM_COMPOSITIONS; i++) {
ProcessComposition(compositions[i]);
cout << endl;
}
return 0;
}
#################################
Программа выводит следующий результат:
=== Processing composition ===
Title: Bohemian Rhapsody
Duration: 367
Genre: Rock
This is a song.
=== Processing composition ===
Title: Moon River
Duration: 160
Instrument: Piano
This is an instrumental track.
=== Processing composition ===
Title: Linus and Lucy
Duration: 146
Instrument: Jazz
This is an instrumental track.
####################################
@C++



Ось приклад реалізації вашої задачі на мові C++:
cpp#include <iostream>
#include <string>
class Composition {
public:
Composition(const std::string& title, int duration) : title(title), duration(duration) {}
void ShowInfo() const {
std::cout << "Title: " << title << ", Duration: " << duration << " seconds" << std::endl;
}
private:
std::string title;
int duration;
};
class Song : public Composition {
public:
Song(const std::string& title, int duration, const std::string& genre) : Composition(title, duration), genre(genre) {}
void ShowInfo() const {
Composition::ShowInfo();
std::cout << "Genre: " << genre << " song" << std::endl;
}
std::string GetGenre() const {
return genre;
}
private:
std::string genre;
};
class InstrumentalTrack : public Composition {
public:
InstrumentalTrack(const std::string& title, int duration, const std::string& instrument) : Composition(title, duration), instrument(instrument) {}
void ShowInfo() const {
Composition::ShowInfo();
std::cout << "Instrument: " << instrument << " track" << std::endl;
}
std::string GetInstrument() const {
return instrument;
}
private:
std::string instrument;
};
void ProcessComposition(Composition* composition) {
composition->ShowInfo();
if (dynamic_cast<Song*>(composition)) {
Song* song = dynamic_cast<Song*>(composition);
std::cout << "This is a " << song->GetGenre() << " song." << std::endl;
}
else if (dynamic_cast<InstrumentalTrack*>(composition)) {
InstrumentalTrack* track = dynamic_cast<InstrumentalTrack*>(composition);
std::cout << "This is an " << track->GetInstrument() << " track." << std::endl;
}
}
int main() {
Song song("My Song", 180, "Pop");
InstrumentalTrack track("Guitar Solo", 120, "Guitar");
Composition* compositions[] = {&song, &track};
for (Composition* comp : compositions) {
ProcessComposition(comp);
std::cout << "------------------------" << std::endl;
}
return 0;
}
У цьому коді ми створили базовий клас Composition
, а потім успадкували його у класи Song
та InstrumentalTrack
. Кожен клас має власні поля та методи для виведення інформації про композицію. Функція ProcessComposition
приймає вказівник на об'єкт класу Composition
, використовує dynamic_cast
для визначення типу композиції та виводить відповідну інформацію.
У main
створюються об'єкти різних типів композицій, поміщаються в масив вказівників на базовий клас і викликається функція ProcessComposition
для кожного об'єкта.


Похожие вопросы
Топ вопросов за вчера в категории Информатика








Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili