Форум программистов, компьютерный форум CyberForum.ru

ООП - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
21.06.2010, 03:02     ООП #1
Привет всем, народ дайте какую-нибудь интересную задачку на ООП, (однообразные задачи из учебников достали уже), чтоб она затрагивала как можно больше тем ООП (можно сказать итоговая задача по разделу ООП), и чтоб ее можно было решить на консоли. (Морской бой не предлагать, этот пример разбирал в учебнике). Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2010, 03:02     ООП
Посмотрите здесь:

ООП на С++ C++
C++ ООП C++
C++ ООП
C++ ООП
C++ ООП
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
23.06.2010, 01:51  [ТС]     ООП #21
easybudda, ок, в этот раз торопиться не буду) основательно подойду.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
25.06.2010, 03:44  [ТС]     ООП #22
easybudda,

Что то у меня совсем туго стало со свободным временем , Вообщем не стал делать никакие менюшки, сделал все поминиму. Принимаю критику (по файлам Zoo.h и Zoo.cpp по Main.cpp сам понимаю что все криво написано)

файл Zoo.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <windows.h>
 
 
// базовый класс Animal
class Animal{
protected:
    std::string name;  // название
    int    limit_life; // продолжительность жизни
    double weight;     // вес
public:
    Animal(std::string, int, double); // конструктор
    Animal(); // конструктор по умолчанию
    std::string GetName(void) const {return name;} 
    int         GetLimitLife(void) const {return limit_life;}
    double      GetWeight(void) const {return weight;}
};
 
// производный класс Bird от Animal
class Bird: public Animal{
private:
    double   wing_span; // размах крыльев   
    std::string   flying;    // летающий?
public:
    Bird(std::string, int, double ,double , std::string);// конструктор
    Bird();   // конструктор по умолчанию
    double GetWingSpan(void) const {return wing_span;}
    std::string GetFlying(void) const {return flying;}  
    friend std::ostream& operator << (std::ostream&, Bird&);
    friend std::istream& operator >> (std::istream&, Bird&);
    friend std::ofstream& operator << (std::ofstream&, Bird&);
    friend std::ifstream& operator >> (std::ifstream&, Bird&);
};
 
// производный класс Fish от Animal
class Fish: public Animal{
private:
    std::string type_fish; // тип, речная или морская
    int count_fin;    // количество плавников
public:
    Fish(std::string, int, double , std::string, int); // конструктор
    Fish(); // конструктор по умолчанию
    std::string GetTypeFish(void) const {return type_fish;}
    int GetCountFin(void) const {return count_fin;}
    friend std::ostream& operator << (std::ostream&, Fish&);
    friend std::istream& operator >> (std::istream&, Fish&);
    friend std::ofstream& operator << (std::ofstream&, Fish&);
    friend std::ifstream& operator >> (std::ifstream&, Fish&);
};
файл Zoo.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "Zoo.h"
 
using namespace std;
 
//////////////////////////////////////////////////////////////
// базовый класс Animal
 
//конструктор
Animal::Animal(string _name, int _limit_life, double _weight):
    name(_name), limit_life(_limit_life), weight(_weight){
    //cout << "Конструктор Animal" << endl;
} 
 
//конструктор по умолчанию
Animal::Animal(): name("Неизвестно"), limit_life(0), weight(0){
    //cout << "Конструктор Animal по умолчанию" << endl;
}
 
//////////////////////////////////////////////////////////////
// производный класс Bird от Animal
 
//конструктор
Bird::Bird(string _name, int _limit_life, double _weight ,double _wing_span, string _flying):
Animal(_name, _limit_life, _weight), wing_span(_wing_span), flying(_flying){
    //cout << "Конструктор Bird" << endl;
}
 
//конструктор по умолчанию
Bird::Bird(): wing_span(0), flying("Неизвестно"){
    //cout << "Конструктор Bird по умолчанию" << endl;
}
 
/////////////////////////////////////////////////////////////
// производный класс Fish от Animal
 
// конструктор
Fish::Fish(string _name, int _limit_life, double _weight , string _type_fish, int _count_fin) :
Animal(_name, _limit_life, _weight), type_fish(_type_fish), count_fin(_count_fin){
    //cout << "Конструктор Fish" << endl;
}; 
 
//конструктор по умолчанию
Fish::Fish() : type_fish("Неизвестно"), count_fin(0){
    //cout << "Конструктор Fish по умолчанию" << endl;
}
 
/////////////////////////////////////////////////////////////
// переопределение операций сдвига (Класс Bird)
ostream& operator << (ostream& out, Bird& obj){
    return out 
        << "Название:                " << left << obj.name << endl
        << "Продолжительность жизни: " << left << obj.limit_life << endl
        << "Вес                      " << left << obj.weight << endl
        << "Размах крыльев:          " << left << obj.wing_span << endl
        << "Летающий:                " << left << obj.flying << endl;
}
 
istream& operator >> (istream& in, Bird& obj){
    cout << "Введите:" << endl;
    cout << "\nНазвание - ";              in >> obj.name;
    cout << "Продолжительность жизни - "; in >> obj.limit_life;
    cout << "Вес - ";                     in >> obj.weight;
    cout << "Размах крыльев - ";          in >> obj.wing_span;
    cout << "Летающий - ";                in >> obj.flying;
    cout << endl;
    return in; 
}
 
ofstream& operator << (ofstream& out, Bird& obj){
    out << obj.name       << " " 
        << obj.limit_life << " " 
        << obj.weight     << " " 
        << obj.wing_span  << " " 
        << obj.flying     << endl;
    return out;
}
 
ifstream& operator >> (ifstream& in, Bird& obj){
    in >> obj.name >> obj.limit_life >> obj.weight >> obj.wing_span >> obj.flying;
    return in; 
}
 
/////////////////////////////////////////////////////////////
// переопределение операций сдвига (Класс Fish)
ostream& operator << (ostream& out, Fish& obj){
    return out 
        << "Название:                " << left << obj.name       << endl
        << "Продолжительность жизни: " << left << obj.limit_life << endl
        << "Вес                      " << left << obj.weight     << endl
        << "Тип рыбы:                " << left << obj.type_fish  << endl
        << "Кол-во плавников:        " << left << obj.count_fin  << endl;
}
 
istream& operator >> (istream& in, Fish& obj){
    cout << "Введите:" << endl;
    cout << "Название:                "; in >> obj.name;
    cout << "Продолжительность жизни: "; in >> obj.limit_life;
    cout << "Вес:                     "; in >> obj.weight;
    cout << "Тип рыбы:                "; in >> obj.type_fish;
    cout << "Кол-во плавников:        "; in >> obj.count_fin;
    cout << endl;
    return in; 
}
 
ofstream& operator << (ofstream& out, Fish& obj){
    out << obj.name       << " " 
        << obj.limit_life << " " 
        << obj.weight     << " " 
        << obj.type_fish  << " " 
        << obj.count_fin     << endl;
    return out;
}
 
ifstream& operator >> (ifstream& in, Fish& obj){
    in >> obj.name >> obj.limit_life >> obj.weight >> obj.type_fish >> obj.count_fin;
    return in; 
}
файл Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "Zoo.h"
 
using namespace std;
 
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Программа запущена" << endl;
    
    ifstream fin("birds.txt");
    if(!fin){
        cout << "Файл birds.txt не найден" << endl;
        system("pause");
        return 1;
    }
 
    vector<Bird> bird ;
 
    while(!fin.eof()){
        Bird temp;
        fin >> temp;
        bird.push_back(temp);
    }
 
    cout << "Птицы зоопарка: " << endl; 
    vector<Bird>::iterator i;
    for(i = bird.begin(); i != bird.end(); ++i){
        cout << "==============================" << endl;
        cout << *i;
    }
 
    cout << "\n/****************************************/\n" << endl;
    cout << "Нелетающие птицы" << endl;
    for(i = bird.begin(); i != bird.end(); ++i){        
        if (i->GetFlying() == "Нет"){
            cout << "==============================" << endl;
            cout << *i;
        }
    }
 
    cout << "\n/****************************************/\n" << endl;
    cout << "Птицы, вес которых > 60 кг" << endl;
    for(i = bird.begin(); i != bird.end(); ++i){        
        if (i->GetWeight() > 60){
            cout << "==============================" << endl;
            cout << *i;
        }
    }
    
    cout << endl;
    system("pause");
    return 0;
}
файл birds.txt
Альбатрос 45 68 50 Да
Пингвин 30 15 10 Нет
Чайка 5 3 21 Да
Страус 100 150 60 Нет
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.06.2010, 04:20     ООП #23

Не по теме:

Цитата Сообщение от _Eldar_ Посмотреть сообщение
Что то у меня совсем туго стало со свободным временем
А так всегда бывает. Появится время, думаешь - ну сейчас чем-нибудь полезно-образовательным займусь... Ага, щас! Только начнёшь - тут же как прорывает всех!



_Eldar_, с виду вроде похоже на правду, только я бы в самом классе Animal чисто виртуальный метод прописал (например возвращающий строкой способ размножения, а лучше объявленной констанотой), чтобы нельзя было объект типа "неведома зверушка" создать, а функции, возвращающие значения полей правильнее константными делать...
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
25.06.2010, 04:39     ООП #24
Цитата Сообщение от _Eldar_ Посмотреть сообщение
rangerx, Коментарии я начал писать (хватило только на первые три строки)
Вот как раз эти три строки комментировать было не обязательно(см. мой предыдущий пост).

Цитата Сообщение от _Eldar_ Посмотреть сообщение
У меня эти элементы находятся в private:
Вообще-то я о том, что находится в функции main.

Цитата Сообщение от _Eldar_ Посмотреть сообщение
Про магические числа - можно было конечно все сделать через именнованные константы, но не думаю что правилы игры в пятнашки будут меняться.
Логика программы будет прозрачней как минимум.

Цитата Сообщение от _Eldar_ Посмотреть сообщение
По поводу векторов - а чем бы воспользовался?
Нет, ну можно и вектор использовать конечно... Просто интересно зачем понадобился вектор в программе, где число хранимых в нём элементов константно, и его функционал не используется вовсе? Почему не использовать простой массив? И в функции Validate_End... Зачем копировать один вектор в другой, а потом это всё сортировать и сравнивать элементы этих векторов? Не проще сделать что-то вроде
C++
1
2
for(int i = 0; i < size-1; ++i)
   if(array[i] != i+1) ...
?
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
25.06.2010, 04:53  [ТС]     ООП #25
easybudda,
а функции, возвращающие значения полей правильнее константными делать...
Так у меня и так эти методы константые:
C++
1
 std::string GetName(void) const {return name;}
С чисто виртуальными методами я еще не баловался(только читал), как появиться время попробую

Не по теме:


Как перевести объект типа string в верхний регистр средствами?



Добавлено через 39 секунд

Не по теме:

средствами С++

rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
25.06.2010, 05:08     ООП #26
Цитата Сообщение от _Eldar_ Посмотреть сообщение
Не по теме:
Как перевести объект типа string в верхний регистр средствами C++?

Не по теме:

C++
1
std::transform(str.begin(), str.end(), str.begin(), toupper);

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2010, 05:42     ООП
Еще ссылки по теме:

ООП C++
C++ ООП
C++ ООП

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
25.06.2010, 05:42  [ТС]     ООП #27
easybudda, Попробовал добавить виртуальный метод

метод в классе Animal:
C++
1
virtual void method_multiplication() = 0;
метод в классе Bird:
C++
1
void method_multiplication(){std::cout << "Размножаются яйцами:)" << std::endl;}
метод в классе Fish:
C++
1
void method_multiplication(){std::cout << "Размножаются икрой:)" << std::endl;}
C++
1
Bird* bird("Альбатрос", 45, 68, 50, "Да")
Не пойму почему не компилится((, почему нельзя так вызывать конструктор? Я сделал немного по другому:


файл Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "Zoo.h"
 
using namespace std;
 
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Программа запущена" << endl;
 
    Bird temp_1("Альбатрос", 45, 68, 50, "Да");
    Fish temp_2("Акула", 45, 68, "Морская", 6);
 
    Bird* bird = &temp_1;
    Fish* fish = &temp_2;
 
    Bird* temp_3("Альбатрос", 45, 68, 50, "Да");
 
    bird->method_multiplication();
    fish->method_multiplication();
    
    cout << endl;
    system("pause");
    return 0;
}
Yandex
Объявления
25.06.2010, 05:42     ООП
Ответ Создать тему
Опции темы

Текущее время: 06:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru