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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.93
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
09.07.2012, 23:11     Знаю ли я основы ООП? #1
ООП я изучал но не применял, ну если не считать собственный класс string и примитивную обертку WinAPI. Так что прошу дайте мне задачи по ООП, чтобы понять на каком уровне находятся мои знания, и на основе этих результатов понять могу ли я читать книгу четырех или еще рано.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 23:11     Знаю ли я основы ООП?
Посмотрите здесь:

С++ основы основ C++
C++ ООП Создание основы класса
C++ Основы массивов
Основы ветвления C++
Основы ООП, ввод данных C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 18:34     Знаю ли я основы ООП? #21
Ksan, Эксепшн и это будет правильно.
aram_gyumri, Напиши вектор/список не просто свою реализацию, а как в STL, заодно стандарт почитаешь и в реализации этих классов в стандартной библиотеке посмотришь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:37     Знаю ли я основы ООП? #22
ForEveR, что проще - ловить исключения или посмотреть код ошибки? То-то и оно.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:39  [ТС]     Знаю ли я основы ООП? #23
Цитата Сообщение от Ksan Посмотреть сообщение
aram_gyumri, а если я введу туда 5/0, что вернется?
в моем интерпретаторе будет выведено division by zero
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 18:39     Знаю ли я основы ООП? #24
Ksan, В таком случае кто мешает поставить переменную errno, раз коды ошибки для вас предпочтительнее исключений?)
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:40  [ТС]     Знаю ли я основы ООП? #25
Цитата Сообщение от ForEveR Посмотреть сообщение
aram_gyumri, Напиши вектор/список не просто свою реализацию, а как в STL, заодно стандарт почитаешь и в реализации этих классов в стандартной библиотеке посмотришь.
спосибо попробую
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
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
печатает информацию о программе и описание параметров.
Потом могу показать, как оно красиво (с точки зрения ООП) решается
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:43  [ТС]     Знаю ли я основы ООП? #27
спасибо, хорошая задача, подумаю
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:46     Знаю ли я основы ООП? #28
ForEveR, ну так все это лучше обернуть в класс.


Не по теме:

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

rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
10.07.2012, 18:48     Знаю ли я основы ООП? #29
Цитата Сообщение от aram_gyumri Посмотреть сообщение
Так что прошу дайте мне задачи по ООП
ООП - это методика разработки ПО. Всё, что можно написать с помощью ООП, можно написать и без него(и наоборот). Дело не в самих задачах, а в подходе к решению задач.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:55  [ТС]     Знаю ли я основы ООП? #30
непонемаю зачем тут нужен ООП? он только будет загромаждать код, или я неправ?
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:56     Знаю ли я основы ООП? #31
aram_gyumri, не загромождать, а делать понятней. Как для разработчика, так и для того, кто будет его кодом пользоваться
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:57  [ТС]     Знаю ли я основы ООП? #32
Цитата Сообщение от rangerx Посмотреть сообщение
ООП - это методика разработки ПО. Всё, что можно написать с помощью ООП, можно написать и без него(и наоборот). Дело не в самих задачах, а в подходе к решению задач.
я это знаю, просто хотел с помощью задая проверить знаю ли я на достаточном уровне ООП чтобы изучать паттерны

Добавлено через 57 секунд
Цитата Сообщение от Ksan Посмотреть сообщение
aram_gyumri, не загромождать, а делать понятней. Как для разраба, так и для того, кто будет его кодом пользоваться
ну незнаю, помоему функцианальный подход для этой задачи лучше
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.07.2012, 19:13     Знаю ли я основы ООП? #33
В этом собственно и соль, решить, казалось бы, чисто "процедурную" задачу при помощи ОО подхода. Решение будет показателем, на сколько ты владешь ООП.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 19:19  [ТС]     Знаю ли я основы ООП? #34
Kastaneda, скажи решение, а то у меня все мысли идут в сторону процедурного решения, или в сторону тупых классов
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 19:28     Знаю ли я основы ООП? #35
Kastaneda, Я бы пожалуй сделал простенький аналог boost:rogram_options (совсем простенький, конкретно под данную задачу), соответственно за проверку валидности параметров, может-ли параметр встречаться с другим, является-ли он обязательным (хотя это как раз можно) этот класс не отвечает, он отвечает только за использование допустимых параметров, а дальше можно либо сделать класс который решает задачу, либо сделать три функции, которые собственно будут зваться, зваться будут либо тупо через свитч, либо некая мапа строка -> указатель на функцию.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 19:30  [ТС]     Знаю ли я основы ООП? #36
но все ровно это будет лишь удленнять код
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
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, хотелось бы увидеть решение.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.07.2012, 20:59     Знаю ли я основы ООП? #38
Цитата Сообщение от ForEveR Посмотреть сообщение
... задача одноразовая.
это твое решение - одноразовое. главный смысл ооп не в том, чтобы классов наплодить, а чтобы повторно использовать что-нибудь было удобно. раздели мух и котлеты, потому что в твоем коде нет ни одной детали, которую можно себе представить примененной в другом месте "as is". только в качестве примера и скопипэйстить что-нибудь.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 21:16     Знаю ли я основы ООП? #39
novi4ok, Вообщем-то да, решение одноразовое не спорю, задача здесь абсолютно конкретная, абсолютно конкретно и ее решение, хотелось бы увидеть твой способ решения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 21:37     Знаю ли я основы ООП?
Еще ссылки по теме:

C++ Основы ООП. Создание стека через класс
C++ Где могу прочитать про основы ООП?
C++ Основы ООП

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

Или воспользуйтесь поиском по форуму:
Ksan
26 / 26 / 0
Регистрация: 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 секунды
Зы: это все было одним файлом. Я разделил для читабельности
Yandex
Объявления
10.07.2012, 21:37     Знаю ли я основы ООП?
Ответ Создать тему
Опции темы

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