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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
#1

ООП - C++

21.06.2010, 03:02. Просмотров 2846. Ответов 26
Метки нет (Все метки)

Привет всем, народ дайте какую-нибудь интересную задачку на ООП, (однообразные задачи из учебников достали уже), чтоб она затрагивала как можно больше тем ООП (можно сказать итоговая задача по разделу ООП), и чтоб ее можно было решить на консоли. (Морской бой не предлагать, этот пример разбирал в учебнике). Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2010, 03:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ООП (C++):

ООП - C++
наследование - понятно агрегация - понятно использование - не понятно. что такое использование? спасибо.

C++ ООП - C++
Просьба дать какую-нибудь интересную программу, дабы теста на курс ООП. Чтобы не из книжки, а реально придуманная про программистом, или...

ООП - C++
1) Для класса символьной строки определить отношение лексикографического порядка, перегрузив с помощью дружественной функции операцию «<» ...

ооп - C++
Нада книгу по ооп, такую что бы было все разжевано максимально. Так, что бы я за минимум времени и усилий разобрался.

ООП на С++ - C++
Помогите пожалуйста!! Не понимаю как это сделать(( Создать программу с классом Student порождающий обьекты - данные об студентах...

ООП - C++
Всем привет! Если можно, не могли бы вы ответить на пару вопросов по ООП, а то что-то не могу понять. Вопросы: Зачем используются такие...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
21.06.2010, 05:10 #2
напиши тетрис со всеми правилами настоящего тетриса, только придется использовать borland C++, насколько я знаю, только у них есть библиотеки для рисования в консоли.
AnTro.Net
131 / 127 / 16
Регистрация: 28.04.2010
Сообщений: 930
21.06.2010, 05:12 #3
хм, сделай пятнашки)

если выйдет, напиши мне 437675148 ,интересно)

можно еще сделать какие то карты, игру.
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
21.06.2010, 05:15  [ТС] #4
Aye Aye, У меня visual studio 2005, не знаю с графикой в консоли совсем не знаком (

Добавлено через 3 минуты
AnTro.Net, Пятнашки попробую написать)
AnTro.Net
131 / 127 / 16
Регистрация: 28.04.2010
Сообщений: 930
21.06.2010, 05:17 #5
_Eldar_, ок
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.06.2010, 06:59 #6
Бинарное дерево делал? Октодерево? Дерево с ненормированным числом потомков узла?
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
22.06.2010, 07:19  [ТС] #7
Пятнашки сделал прикольно получилось, только вводить с клавиатуры координаты долго
вот код (принимаю критику):

файл Pyatn.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
 
class Space{
private:
    std::vector<int> arr; // Игровое поле
    int num_X; // индекс пустого элемента (-1)
    int step;  // шаг игры
public:
    Space();
    void Show();
    void Move();
    bool Validate_num(int);
    bool Validate_End();
};
файл Pyatn.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "Pyatn.h"
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <conio.h>
 
using namespace std;
 
Space::Space(){
    for(int i = 0; i < 16; ++i)
        if (i < 15) arr.push_back(i + 1);
        else arr.push_back(-1);
 
    random_shuffle(arr.begin(), arr.end() - 1);
        
    num_X = 15;
    step = 0;
}
 
void Space::Show(){
    system("cls");
    cout << "======================================" << endl;
    cout << "Шаг " << ++step << endl << endl;
    int count = 0;
    cout << setw(6) << '|'
         << setw(3) << 'A' << " |"
         << setw(3) << 'B' << " |"
         << setw(3) << 'C' << " |"
         << setw(3) << 'D' << " |" << endl;
    cout << "--------------------------" << endl;
    for(vector<int>::iterator i = arr.begin(); i != arr.end(); ++i){
 
        
        if(! (count % 4)) cout << setw(3) << count / 4 + 1 << ". |";
        ++count;
        if(count % 4){
            if (*i == -1) cout << setw(3) << 'X' << " |";
            else cout << setw(3) << *i << " |";
 
        }
        else {
            if (*i == -1) cout << setw(3) << 'X' << " |";
            else cout << setw(3) << *i << " |";
            cout << endl;
            cout << "--------------------------" << endl;
        }
    }
    cout << endl;
         
}
 
void Space::Move(){
 
    string u_letter("ABCD");
    string l_letter("abcd");
    unsigned char row_cin;
    int row, col, value;
    int num_field;
    bool success = false;
    
    while(!success ){
        cout << "Введите координаты перемещаемой клетки: ";
        cin >> setw(3) >> row_cin;
        col = u_letter.find(row_cin);
        if(col == -1) col = l_letter.find(row_cin);
        if(col == -1) {
            cout << "Ошибка, повторите ввод" << endl;
            continue;
        }
        while(true){
            cin >> row;
            if(cin.peek() == '\n' && row <= 4){cin.get(); break;}
            else{
                cout << "Повторите ввод строки (ожидается целое число <= 4)" << endl;
                cin.clear();
                while(cin.get() != '\n'){};
            }
 
        }
        success = true;
    }
 
    num_field = col + (row - 1) * 4;
 
    if (Validate_num(num_field)){
        int temp = arr[num_field];
        arr[num_field] = arr[num_X];
        arr[num_X] = temp;
        num_X = num_field;
    }
}
 
bool Space::Validate_num(int num_field){    
 
    try{
        arr.at(num_field);
    }
    catch(out_of_range){
        cout << "Ошибка, повторите ввод" << endl;
        return false;
    }
    
    vector<int> round_elem;
    try{
        round_elem.push_back(arr.at(num_X - 1));
    } catch(out_of_range){};
    try{
        round_elem.push_back(arr.at(num_X + 1));
    } catch(out_of_range){};
    try{
        round_elem.push_back(arr.at(num_X - 4));
    } catch(out_of_range){};
    try{
        round_elem.push_back(arr.at(num_X + 4));
    } catch(out_of_range){};
 
    for(vector<int>::iterator i = round_elem.begin(); i != round_elem.end(); ++i){
        if(*i == arr.at(num_field)) 
            return true;    
    }
    cout << "Невозможно переместить клетку" << endl;
    return false;
 
}
bool Space::Validate_End(){
    
    vector<int> sort_arr(arr);
    vector<int>::iterator i, j ;
    sort(sort_arr.begin(), sort_arr.end());
 
    cout << endl;
    for(i = arr.begin(), j = sort_arr.begin(); i != arr.end() - 1; ++i, ++j){
        if(*i == -1) ++i;
        if(*j == -1 ) ++j;
        if(*i != *j) return false;
    }
    cout << "Победа на " << step << " шаге !!!" << endl;
    return true;
}
файл 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 "Pyatn.h"
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
 
using namespace std;
 
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    srand(unsigned(time(NULL)));
 
    Space game_field;
 
    while(!game_field.Validate_End()){
        game_field.Show();
        game_field.Move();
    }
    
    cout << endl;
    system("pause");
    return 0;
}
AnTro.Net
131 / 127 / 16
Регистрация: 28.04.2010
Сообщений: 930
22.06.2010, 09:15 #8
20 минут отдал пятнашкам) славная прога)
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
22.06.2010, 09:17  [ТС] #9
AnTro.Net, там я косяк нашел) шаги считаются даже если вводишь неверную координату:
переписал немного:
файл Pyatn.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
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "Pyatn.h"
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <conio.h>
#include <windows.h>
 
using namespace std;
 
Space::Space(){
    for(int i = 0; i < 16; ++i)
        if (i < 15) arr.push_back(i + 1);
        else arr.push_back(-1);
 
    random_shuffle(arr.begin(), arr.end() - 1);
        
    num_X = 15;
    step = 1;
}
 
void Space::Show(){ 
    system("cls");
    cout << "======================================" << endl;
    cout << "Шаг " << step << endl << endl;
    int count = 0;
    cout << setw(6) << '|'
         << setw(3) << 'A' << " |"
         << setw(3) << 'B' << " |"
         << setw(3) << 'C' << " |"
         << setw(3) << 'D' << " |" << endl;
    cout << "--------------------------" << endl;
    for(vector<int>::iterator i = arr.begin(); i != arr.end(); ++i){
 
        
        if(! (count % 4)) cout << setw(3) << count / 4 + 1 << ". |";
        ++count;
        if(count % 4){
            if (*i == -1) cout << setw(3) << 'X' << " |";
            else cout << setw(3) << *i << " |";
 
        }
        else {
            if (*i == -1) cout << setw(3) << 'X' << " |";
            else cout << setw(3) << *i << " |";
            cout << endl;
            cout << "--------------------------" << endl;
        }
    }
    cout << endl;
         
}
 
void Space::Move(){
 
    string u_letter("ABCD");
    string l_letter("abcd");
    unsigned char row_cin;
    int row, col, value;
    int num_field;
    bool success = false;
    
    while(!success ){
        cout << "Введите координаты перемещаемой клетки: ";
        cin >> setw(3) >> row_cin;
        col = u_letter.find(row_cin);
        if(col == -1) col = l_letter.find(row_cin);
        if(col == -1) {
            cout << "Ошибка, повторите ввод" << endl;
            continue;
        }
        while(true){
            cin >> row;
            if(cin.peek() == '\n' && row <= 4){cin.get(); break;}
            else{
                cout << "Повторите ввод строки (ожидается целое число <= 4)" << endl;
                cin.clear();
                while(cin.get() != '\n'){};
            }
 
        }
        success = true;
    }
 
    num_field = col + (row - 1) * 4;
 
    if (Validate_num(num_field)){
        int temp = arr[num_field];
        arr[num_field] = arr[num_X];
        arr[num_X] = temp;
        num_X = num_field;
        ++step;
    }
}
 
bool Space::Validate_num(int num_field){
    
 
    try{
        arr.at(num_field);
    }
    catch(out_of_range){
        cout << "Ошибка, повторите ввод" << endl;
        return false;
    }
    
    vector<int> round_elem;
    try{
        round_elem.push_back(arr.at(num_X - 1));
    } catch(out_of_range){};
    try{
        round_elem.push_back(arr.at(num_X + 1));
    } catch(out_of_range){};
    try{
        round_elem.push_back(arr.at(num_X - 4));
    } catch(out_of_range){};
    try{
        round_elem.push_back(arr.at(num_X + 4));
    } catch(out_of_range){};
 
    for(vector<int>::iterator i = round_elem.begin(); i != round_elem.end(); ++i){
        if(*i == arr.at(num_field)) 
            return true;    
    }
    cout << "Невозможно переместить клетку" << endl;
    Sleep(1000);
    return false;
 
}
bool Space::Validate_End(){
    
    vector<int> sort_arr(arr);
    vector<int>::iterator i, j ;
    sort(sort_arr.begin(), sort_arr.end());
 
    cout << endl;
    for(i = arr.begin(), j = sort_arr.begin(); i != arr.end() - 1; ++i, ++j){
        if(*i == -1) ++i;
        if(*j == -1 ) ++j;
        if(*i != *j) return false;
    }
    cout << "Победа на " << step << " шаге !!!" << endl;
    return true;
}
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
22.06.2010, 13:38 #10
Цитата Сообщение от _Eldar_ Посмотреть сообщение
вот код (принимаю критику):
Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
2
3
 for(int i = 0; i < 16; ++i)
    if (i < 15) arr.push_back(i + 1);
        else arr.push_back(-1);
Хм...

Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
2
3
4
while(!game_field.Validate_End()){
    game_field.Show();
    game_field.Move();
}
1) Где в программе комментарий, что надо именно так использовать данный класс(т.е. вызывать методы в таком порядке)?
2) Зачем вообще этому всему быть открытым?

Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
int num_X; // индекс пустого элемента (-1)
Вместо этого комментария лучше бы здесь было имя переменной говорящее само за себя.

Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
std::vector<int> arr; // Игровое поле
То же самое насчёт имени и комментария + не вижу никакого смысла в использовании вектора в данной программе.

Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
2
3
int temp = arr[num_field];
 arr[num_field] = arr[num_X];
 arr[num_X] = temp;
Используй std::swap вместо этого.

Плюс ко всему в коде куча "магических чисел"(15,16,4).

P.S. Лично я бы не стал использовать ООП для написания Пятнашек
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.06.2010, 13:55 #11
Цитата Сообщение от _Eldar_ Посмотреть сообщение
принимаю критику
1. Никогда не смешивай логику работы и пользовательский интерфейс.
2. То что ты читал - не ООП, а механизмы языка для написания программ в стиле ООП.
3. Пятнашки - никакой пример для изучения ООП.
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
22.06.2010, 16:24 #12
Цитата Сообщение от _Eldar_ Посмотреть сообщение
вот код (принимаю критику)
И где тут ООП?

Аналогично где может быть ООП при реализации морского боя или тетриса?

Добавлено через 20 секунд
Упс... опоздал...
N@um
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 1
22.06.2010, 16:27 #13
напиши шашки
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
22.06.2010, 16:40 #14
Цитата Сообщение от N@um Посмотреть сообщение
напиши шашки
Там тоже нет ООП
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.06.2010, 22:10 #15
Вот с таким интерфейсом по-моему удобнее играть:
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <vector>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <ctime>
 
class T_pyatnashki
{    
    const static int          MIN_ELEM_VAL  = 1;
    const static int          POLE_DIM      = 4;
    const static int          POLE_SIZE     = POLE_DIM * POLE_DIM;
    const static int          EMPTY_VAL     = POLE_SIZE;
    const static int          MAX_ELEM_VAL  = POLE_SIZE - 1;
    typedef std::vector<int>  T_pole;
 
    T_pole                    pole_;
    int                       step_count_;
public:
    T_pyatnashki() : pole_(POLE_SIZE), step_count_(0)
    {
        struct T_generate_podrjad
        {
            int begin_num_;
            T_generate_podrjad(int  begin_num) : begin_num_(begin_num)
            {}
 
            int operator() ()
            {
                return begin_num_++;
            }
        };
        std::generate(pole_.begin(), pole_.end(), T_generate_podrjad(MIN_ELEM_VAL));
        std::random_shuffle(pole_.begin(), pole_.end());         
    }
    //------------------------------------------------------------------------------
    void play()
    {
        for(;;)
        {
            show();
            if(is_good_end())
            {
                std::cout << "Задача решена за "
                          << step_count_
                          << " шагов."
                          << std::endl;
                break;
            }
            if(is_bad_end())
            {
                std::cout << "Задача не имеет решения."
                          << std::endl;
                break;
            }
 
            ++step_count_;
            move();       
        }
    }
    //------------------------------------------------------------------------------
private:
    //------------------------------------------------------------------------------
    int i_from_k(int k)
    {
        return k / POLE_DIM;
    }
    //------------------------------------------------------------------------------
    int j_from_k(int k)
    {
        return k % POLE_DIM;
    }
    //------------------------------------------------------------------------------
    void show()
    {
        struct T_print_elem
        {
            enum
            {
                ELEM_WIDTH = 4
            };            
            int  row_len_;
            int  elem_count_;
            T_print_elem() : row_len_(POLE_DIM), elem_count_(0)
            {}
 
            void operator() (int elem)
            {                
                if(elem == EMPTY_VAL)
                {
                    std::cout << std::setw(ELEM_WIDTH)
                              << "";       
                }
                else
                {
                    std::cout << std::setw(ELEM_WIDTH)
                              << elem;
                }                
                if(++elem_count_ % row_len_ == 0)
                {
                    std::cout << std::endl
                              << std::endl;
                }           
            }
        };
        std::for_each(pole_.begin(), pole_.end(), T_print_elem());
        std::cout << std::endl;
    }
    //------------------------------------------------------------------------------
    int k_of_elem(int elem)
    {
        return  std::find(pole_.begin(), pole_.end(), elem) - pole_.begin();
    }
    //------------------------------------------------------------------------------
    bool is_ryadom_s_pustym(int elem)
    {
        int empty_elem_i  = i_from_k(k_of_elem(EMPTY_VAL)); 
        int empty_elem_j  = j_from_k(k_of_elem(EMPTY_VAL)); 
 
        int elem_i        = i_from_k(k_of_elem(elem)); 
        int elem_j        = j_from_k(k_of_elem(elem)); 
 
        int abs_i_shift = abs(empty_elem_i - elem_i);
        int abs_j_shift = abs(empty_elem_j - elem_j);
 
        return abs_i_shift + abs_j_shift == 1;
    }
    //------------------------------------------------------------------------------
    void swap_pole_elems
        (
            T_pole&  pole,
            int      elem1,
            int      elem2
        )
    {
         std::iter_swap(std::find(pole.begin(), pole.end(), elem1),
                        std::find(pole.begin(), pole.end(), elem2));        
    }
    //------------------------------------------------------------------------------
    void move()
    {        
        int  moving_elem;
        do
        {
            std::cout << "Шаг "
                      << step_count_
                      << ". Вы двигаете кость № ";
            std::cin >> moving_elem;
        }while(moving_elem < MIN_ELEM_VAL || MAX_ELEM_VAL < moving_elem
               || !is_ryadom_s_pustym(moving_elem));
 
        swap_pole_elems(pole_, moving_elem, EMPTY_VAL);
    }
    //------------------------------------------------------------------------------
    bool is_good_end()
    {
        T_pole  good_end_pole(pole_);
        std::sort(good_end_pole.begin(), good_end_pole.end());        
        return pole_ == good_end_pole;
    }
    //------------------------------------------------------------------------------
    bool is_bad_end()
    {
        T_pole  bad_end_pole(pole_);
        std::sort(bad_end_pole.begin(), bad_end_pole.end()); 
        swap_pole_elems(bad_end_pole, MAX_ELEM_VAL, MAX_ELEM_VAL - 1);
        return pole_ == bad_end_pole;
    }
};
 
int main()
{
    std::locale::global(std::locale(""));
    srand(static_cast<unsigned>(time(0)));
    T_pyatnashki  pyatnashki;
    pyatnashki.play();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2010, 22:10
Привет! Вот еще темы с ответами:

по ООП . - C++
Помогите пожалуйтса с решением задач ! на С++ 1.Дана неубывающая последовательность действительных чисел. Вставить в неё...

ООП - C++
проблема в классе квадрат- ниже код, я не прошу его переписывать, попробуйте кто то у себя запустите и будьте добры скажите почему там...

ООП - C++
Прочитал в википедии про ООП, но так толком и не понял. Подскажите, чем является создание программ с интерфейсом, допустим как калькулятор...

ООП - C++
Создать класс Vegetable, содержащий следующие элементы: - поле «вес» float Mass; - поле «зрелость» int Ripeness; - метод получения...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.06.2010, 22:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru