Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
1

Знаю ли я основы ООП?

09.07.2012, 23:11. Показов 5752. Ответов 62
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ООП я изучал но не применял, ну если не считать собственный класс string и примитивную обертку WinAPI. Так что прошу дайте мне задачи по ООП, чтобы понять на каком уровне находятся мои знания, и на основе этих результатов понять могу ли я читать книгу четырех или еще рано.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2012, 23:11
Ответы с готовыми решениями:

Основы ООП
Доброго времени суток, немного запутался в основах. Есть ли возможность сделать у дочерних классов...

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

ООП Создание основы класса
Здравствуйте, получил задание, но немного недопонимаю как это сделать, с чего начать. Помогите...

Основы ООП, ввод данных
Собственно, осваивая основы ООП и выполняя заодно частичное задание с универа(1 курс :scratch:)...

62
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 18:34 21
Author24 — интернет-сервис помощи студентам
Ksan, Эксепшн и это будет правильно.
aram_gyumri, Напиши вектор/список не просто свою реализацию, а как в STL, заодно стандарт почитаешь и в реализации этих классов в стандартной библиотеке посмотришь.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:37 22
ForEveR, что проще - ловить исключения или посмотреть код ошибки? То-то и оно.
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:39  [ТС] 23
Цитата Сообщение от Ksan Посмотреть сообщение
aram_gyumri, а если я введу туда 5/0, что вернется?
в моем интерпретаторе будет выведено division by zero
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 18:39 24
Ksan, В таком случае кто мешает поставить переменную errno, раз коды ошибки для вас предпочтительнее исключений?)
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:40  [ТС] 25
Цитата Сообщение от ForEveR Посмотреть сообщение
aram_gyumri, Напиши вектор/список не просто свою реализацию, а как в STL, заодно стандарт почитаешь и в реализации этих классов в стандартной библиотеке посмотришь.
спосибо попробую
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
10.07.2012, 18:41 26
Цитата Сообщение от aram_gyumri Посмотреть сообщение
значит начну решать эту задачу
Цитата Сообщение от aram_gyumri Посмотреть сообщение
абстрактный класс Транспорт, а от него мотоцикл, автомобиль, паровоз, дризина...
Цитата Сообщение от Ksan Посмотреть сообщение
Напиши свою альтернативу вектору.
Цитата Сообщение от Ksan Посмотреть сообщение
aram_gyumri, односвязный список? Двусвязный?
Да это все не то. Для тренировки в ООП нет ни какого смысла писать задачи типа "напишите класс, который ...". Это кроме практики на С++ больше ни чего не дасть. ООП от этого понятней не станет.

Я тоже когда то переписал кучу подобных задач, где интуитивно понятно как должен выглядеть класс. И уже даже начал думать, что понимаю ОО подход. Потом начал пробывать устраиваться на работу, мне выслали тестовое задание, в котором не было сказано "напишите класс, который...". А было просто условие задачи и пожелание увидеть ООП. Вот тут то я и "сел в лужу", т.к. соверешенно не понимал, как выделить классы, что они должны делать, кто за что отвечает и т.д. В итоге написал жуткий быдлокод (то, что это быдлокод мне уже потом объяснили, я то думал, что это нормальный код) Вот тогда я понял, что я совершенно не понимаю ООП
В итоге временно оставил затею устроится программистом, прочитал Т.Бадд "Объектно-ориентированное программирование" и Г.Буч "Объектно-ориентированный анализ и проектирование", и уже после этого устроился программистом

Вот то самое задание, которое я провалил
Напишите (консольную) программу, принимающую на вход имя файла и набор параметров. В
зависимости от параметров программа должна работать в трёх режимах:
1) test -f Test.tst -m words -v mother
печатает количество слов «mother» в файле «Test.tst»
2) test -f Test.tst -m checksum
печатает 32-хбитную чексумму, рассчитанную по алгоритму checksum = word1 + word2 + …
+ wordN (word1..wordN – 32-хбитные слова, представляющие содержимое файла)
3) test -h
печатает информацию о программе и описание параметров.
Потом могу показать, как оно красиво (с точки зрения ООП) решается
2
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:43  [ТС] 27
спасибо, хорошая задача, подумаю
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:46 28
ForEveR, ну так все это лучше обернуть в класс.


Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот то самое задание, которое я провалил
Интересно было бы попробовать решить. У вас есть высшее?

0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.07.2012, 18:48 29
Цитата Сообщение от aram_gyumri Посмотреть сообщение
Так что прошу дайте мне задачи по ООП
ООП - это методика разработки ПО. Всё, что можно написать с помощью ООП, можно написать и без него(и наоборот). Дело не в самих задачах, а в подходе к решению задач.
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:55  [ТС] 30
непонемаю зачем тут нужен ООП? он только будет загромаждать код, или я неправ?
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:56 31
aram_gyumri, не загромождать, а делать понятней. Как для разработчика, так и для того, кто будет его кодом пользоваться
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:57  [ТС] 32
Цитата Сообщение от rangerx Посмотреть сообщение
ООП - это методика разработки ПО. Всё, что можно написать с помощью ООП, можно написать и без него(и наоборот). Дело не в самих задачах, а в подходе к решению задач.
я это знаю, просто хотел с помощью задая проверить знаю ли я на достаточном уровне ООП чтобы изучать паттерны

Добавлено через 57 секунд
Цитата Сообщение от Ksan Посмотреть сообщение
aram_gyumri, не загромождать, а делать понятней. Как для разраба, так и для того, кто будет его кодом пользоваться
ну незнаю, помоему функцианальный подход для этой задачи лучше
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
10.07.2012, 19:13 33
В этом собственно и соль, решить, казалось бы, чисто "процедурную" задачу при помощи ОО подхода. Решение будет показателем, на сколько ты владешь ООП.
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 19:19  [ТС] 34
Kastaneda, скажи решение, а то у меня все мысли идут в сторону процедурного решения, или в сторону тупых классов
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 19:28 35
Kastaneda, Я бы пожалуй сделал простенький аналог boost:rogram_options (совсем простенький, конкретно под данную задачу), соответственно за проверку валидности параметров, может-ли параметр встречаться с другим, является-ли он обязательным (хотя это как раз можно) этот класс не отвечает, он отвечает только за использование допустимых параметров, а дальше можно либо сделать класс который решает задачу, либо сделать три функции, которые собственно будут зваться, зваться будут либо тупо через свитч, либо некая мапа строка -> указатель на функцию.
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 19:30  [ТС] 36
но все ровно это будет лишь удленнять код
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 20:09 37
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
#include <iostream>
#include <string>
#include <fstream>
#include <boost/program_options.hpp>
#include <boost/algorithm/string.hpp>
 
namespace po = boost::program_options;
 
namespace params
{
    po::options_description desc;
    std::string file;
    std::string mode;
    std::string word;
}
 
void init_module(int argc, char* argv[])
{
   using namespace params;
   desc.add_options()
      ("help,h", "produce help")
      ("file,f", po::value<std::string>(&file), "input file")
      ("mode,m", po::value<std::string>(&mode), "mode (words, checksum)")
      ("word,v", po::value<std::string>(&word), "work for count (only if mode equal to words")
   ;
   po::variables_map vm;
   po::store(po::parse_command_line(argc, argv, desc), vm);
   po::notify(vm);
   if (vm.count("help"))
   {
       std::cout << desc << std::endl;
       throw std::logic_error("Config error");
   }
   if (!vm.count("file"))
   {
       throw std::logic_error("Config error");
   }
   if (!vm.count("mode"))
   {
       throw std::logic_error("Config error");
   }
   if ((mode == "words" && !vm.count("word")) ||
        (mode == "checksum" && vm.count("word")))
   {
       throw std::logic_error("Config error");
   }
}
 
void count_words(const std::string& file, const std::string& word)
{
    std::ifstream ifs(file.c_str());
    if (!ifs)
    {
        throw std::logic_error("Wrong file");
    }
    const std::string delims = "\n\t,.:!?";
    const std::string content((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
    std::vector<std::string> words;
    boost::split(words, content, boost::is_any_of(delims), boost::token_compress_on);
    std::cout << "Word " << word << " contains in file " << std::count(words.begin(), words.end(), word) << std::endl;
}
 
void print_checksum(const std::string& file)
{
    std::ifstream ifs(file.c_str(), std::ios::binary);
    if (!ifs)
    {
        throw std::logic_error("Wrong file");
    }
    int sum = 0;
    while (ifs)
    {
        int value = 0;
        ifs.read(reinterpret_cast<char*>(&value), sizeof(value));
        sum += value;
    }
    std::cout << "Checksum is: " << sum << std::endl;
}
 
int main(int argc, char* argv[])
{
    try
    {
        init_module(argc, argv);
    }
    catch (const std::logic_error& e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    try
    {
       if (params::mode == "words")
       {
           count_words(params::file, params::word);
       }
       else if (params::mode == "checksum")
       {
           print_checksum(params::file);
       }
       else
       {
           std::cerr << "Wrong argument" << std::endl;
           return 1;
       }
    }
    catch (const std::logic_error& e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}
Как-нибудь так бы сделал, куда тут совать ООП, кроме парсинга списка аргументов вписаться абсолютно не могу, оно тут просто не нужно, ибо задача одноразовая.
Собственно, Kastaneda, хотелось бы увидеть решение.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.07.2012, 20:59 38
Цитата Сообщение от ForEveR Посмотреть сообщение
... задача одноразовая.
это твое решение - одноразовое. главный смысл ооп не в том, чтобы классов наплодить, а чтобы повторно использовать что-нибудь было удобно. раздели мух и котлеты, потому что в твоем коде нет ни одной детали, которую можно себе представить примененной в другом месте "as is". только в качестве примера и скопипэйстить что-нибудь.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 21:16 39
novi4ok, Вообщем-то да, решение одноразовое не спорю, задача здесь абсолютно конкретная, абсолютно конкретно и ее решение, хотелось бы увидеть твой способ решения.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 21:37 40
Вот мое решение


main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
 
int main()
{
        CLSCommand Command;
        while(1)
        {
                Command.Enter();
        }
        return 0;   
}



CLSCommand
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
class CLSCommand
{
        #define COM_ERROR { cout << "Error\n"; return ; }
        #define VARIANT12 { Variant12(command); return ; }
        #define VARIANT2 { Variant2(filename); return ; }
        #define VARIANT3 { Variant3(command);   return ; }
        public:
                CLSCommand(){   }
                void Enter()
                {
                        char chbuff[64];
                        cout << "me: ";
                        gets(chbuff);
                        Analyse(chbuff);
                }
        private:
                void Analyse(string command) // ïåðâè÷íûé àíàëèç
                {
                        string strbuff;
                        
                        if(Str2Str(command, 5, strbuff)) COM_ERROR
                        if(strbuff != "test ") COM_ERROR
                        
                        if(Str2Str(command, 2, strbuff)) COM_ERROR
                        if(strbuff == "-f") VARIANT12
                        if(strbuff == "-h") VARIANT3
                        
                        COM_ERROR
                }
                void Variant12(string& command) // àíàëèç âàðèàíòà 1, 2
                {
                        string strbuff;
                        if(Str2Str(command, 1, strbuff)) COM_ERROR
                        
                        if(! Validate(command[0], false)) COM_ERROR
                        
                        string filename;
                        for(short i=0; i<command.length(); ++i)
                        {
                                if(! Validate(command[0])) break;
                                filename += command[0];
                                command.erase(0, 1);
                        }
                        
                        if(Str2Str(command, 4, strbuff)) COM_ERROR
                        if(strbuff != " -m ") COM_ERROR
                        
                        strbuff.clear();
                        for(short i=0; i<command.length(); ++i)
                        {
                                if(! Validate(command[0], false)) break;
                                strbuff += command[0];
                                command.erase(0, 1);
                        }
                        
                        if(strbuff == "words")
                        {
                                if(Str2Str(command, 4, strbuff)) COM_ERROR
                                if(strbuff != " -v ") COM_ERROR
                                
                                for(short i=0; i<command.length(); ++i)
                                {
                                        if(! Validate(command[i], false)) COM_ERROR
                                }
                                
                                Variant1(filename, command);
                                
                                return ;
                        }
                        if(strbuff == "checksum") VARIANT2
                        
                        COM_ERROR
                }
                void Variant1(string& path, string& word) // àíàëèç âàðèàíòà 1
                {
                        ifstream ifile(path.c_str());
                        int sum = 0;
                        string strbuff;
                        
                        if(! ifile.good()) COM_ERROR
                        
                        while(! ifile.eof())
                        {
                                strbuff.clear();
                                ifile >> strbuff;
                                if(strbuff == word) ++sum;
                        }
                        
                        ifile.close();
                        
                        cout << "sum = " << sum << endl;
                }
                void Variant2(string& path) // àíàëèç âàðèàíòà 2
                {
                        ifstream ifile(path.c_str());
                        int sum = 0;
                        char chbuff[5] = "qwer";
                        
                        if(! ifile.good()) COM_ERROR
                        
                        while(! ifile.eof())
                        {
                                ifile.get(chbuff, 4);
                                sum += *(int*)chbuff;
                        }
                        
                        ifile.close();
                        
                        cout << "checksum = " << sum << endl;
                }
                void Variant3(string& command) // àíàëèç âàðèàíòà 3
                {
                        if(! command.empty()) COM_ERROR
                        
                        cout << "1) test -f <filename> -m words -v <word>\nprint how many <word> in <filename>\n"
                                 << "2) test -f <filename> -m checksum\nprint 32bit checksum from <filename>\n"
                                 << "3) test -h\nprint help\n";
                }
                
                
                bool Str2Str(string& src, short n, string& dst) // return true if error, else - false
                {
                        dst.clear();
                        if(src.length() < n) return true;
                        
                        for(short i=0; i<n; ++i)
                        {
                                dst += src[i];
                        }
                        src.erase(0, n);
                }
                bool Validate(char ch, bool dota = true)
                {
                        return  (
                                            (ch >= 'a' && ch <= 'z')  ||  
                                            (ch >= 'A' && ch <= 'Z')  ||
                                            (ch >= '0' && ch <= '9')  ||
                                            (ch == '.' && dota)
                                      );
                                
                }
                
        #undef COM_ERROR
        #undef VARIANT12
        #undef VARIANT2
        #undef VARIANT3
};


Добавлено через 23 секунды
Зы: это все было одним файлом. Я разделил для читабельности
0
10.07.2012, 21:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2012, 21:37
Помогаю со студенческими работами здесь

Ооп. Изучаю основы, обьясните на примере
Класс: форум - сайт для общения. Объект форум - собственно любой форум. Тут все понятно. Форумный...

Где могу прочитать про основы ООП?
Где могу прочитать про основы ООП?

Основы ООП. Создание стека через класс
Приветствую всех пользователей форума. Относительно недавно начал осваивать ООП. Было необходимо...

Основы ООП [С++]
Немного знаю Java, написал программу которая по заданным 2-м сторонам и углом между нимию...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru