Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2017, 08:04   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию [C++] Системный подход. Как Вы подходите к решению задачи?

Здравствуйте!
Я прошу людей опытных поделиться этим самым опытом))
Как Вы подходите к решению задачи?
Т.е. Вы видите текст задачи, по которому надо написать программу.
Как Вы начинаете думать?
Подсчитываете количество возможных переменных?
Определяете наличие-отсутствие циклов?
И т.д. и т.п.
Т.е. каков Ваш системный подход?
KAMLS вне форума Ответить с цитированием
Старый 16.04.2017, 09:06   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Способ 1 - написать свой личный миллион строк кода. Чем ближе к нему, тем проще это все видеть. (примерно 10 лет при стандартном рабочем графике 5х8).

...если вас интересует именно "формализация", есть методологии, например, Test Driven Development нынче в почете. Смысл такой - сначала пишите проверку, а потом программу, так чтоб заработала проверка.
...как по мне - чепуха еще та, код по сути вывернутый получается.

Смысл у всего простой - делить задачу на подзадачи и каждую решать отдельно. При решении каждой будут вам переменные сами по себе (например, счетчик числа элементов и т.д.).
Способов деления тоже великое множество придумали
1. процедурное
2. декларативное (тут вообще не делите, а говрите мне нада тото - sql)
3. функциональное - за основу взяты ф. из математики, в том смысле, что нет переменных, ф. не влияет на другие ф. и т.д.
4. ООП двух ввидов - ООП "классическое" и ООП "по образцу" (луа, джаваскрипт). В классическом - вы описываете "чертеж", а потом из него "детали", в "по образцу" - чертеж и деталь = одно и тоже.

...я бы рекомендовал, после краткой практики по всем управляющим конструкциям (циклы и т.д.) сразу переходить к ООП. Т.к. "процедурное" и "ООП" вкорне не совместны (они как бы "вывернуты" к друг другу), настроив мозг на одно, будете писать лапшу в другом.

Если действительно волнуетесь о "лишних" переменных:

берете эмулятор древней техники тут

https://play.google.com/store/apps/d...om.cax.pmk.ext

(а у меня и оригиналов 2 есть рабочих еще

И пишите на него программы, например, решение квадратных уравнений, численное интегрирование, радиотех. расчеты и т.д.
В условиях жестко ограниченых ресурсов, привыкните иметь план по переменным

Последний раз редактировалось alexzk; 16.04.2017 в 09:41.
alexzk вне форума Ответить с цитированием
Старый 16.04.2017, 10:41   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да я учусь еще только. Именно ООП С++.
Поэтому сразу систему какую-то хочу "впаять" себе.
Пока за собой замечаю, "рваный" какой-то подход, то циклы лезут на ум, то какие переменные создавать и т.п.
Метод подхода к "впитыванию" задачи нужен.))
KAMLS вне форума Ответить с цитированием
Старый 16.04.2017, 11:02   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Да я учусь еще только. Именно ООП С++.
Поэтому сразу систему какую-то хочу "впаять" себе.
Пока за собой замечаю, "рваный" какой-то подход, то циклы лезут на ум, то какие переменные создавать и т.п.
Метод подхода к "впитыванию" задачи нужен.))
Ничего плохого, у любой задачи всегда два решение - за счет памяти (переменные создавать) и за счет времени (циклы). Это взаимозаменяемые ресурсы. Просто нужно найти баланс.
Вот вам схемка на стену https://habrahabr.ru/company/infopulse/blog/194726/
Пользуйтесь и будет счастье - правильный выбор типа данных (или правильное описание своего), это 70% решения.

Вот простой пример
std::map
Позволяет по "ключу" получить значение, причем ключ может быть чем угодно, например строкой текста. Это требует доп. памяти и доп времени при заполнении, зато поиск в 1 вызов и быстрый:

val = some_map.at(key)

Похожее вы можете провернуть циклом перебора массива, т.о. сэкономите память и время вставки, но проиграете во времени поиска и сложности кода.

Последний раз редактировалось alexzk; 16.04.2017 в 11:10.
alexzk вне форума Ответить с цитированием
Старый 16.04.2017, 11:31   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Берём и начинаем. Рассмотрим три подхода.
Но прежде отвечу на ваш вопрос.
0)
Цитата:
Определяете наличие-отсутствие циклов?
Это просто структуры+алгоритмы=программы.
Вначале выписываем структуры у каждой структуры есть свои алгоритмы. Если это массив. то будет цикл. Если двухмерный массив, то это вложенные циклы.
Если дерево, то будет рекурсия с обходом в ширину или глубину.
Если стек то будут условия на проверку верхушки стека.
Если структура, то наверняка это будут условия на правильность заполнения этой структуры.
Если это числа, то это будут математические функции.

1) Дедуктивный подход или по простому сведение к предыдущим знаниям.
Обычно школьные и студенческие задачи имеют чёткую постановку. Это значит что их решение сводится к изученному материалу. Или же к поиску сведений которые лежат на поверхности.

Видим задачу делим её на ключевые моменты. Существительные в одну кучу глаголы в другую. Существительные как раз и будут объектами или переменными. А глаголы и действия относятся к функциям и методам. Прилагательные обычно не использую, хотя они годятся в качестве состояний автомата.

Потом используя предыдущий опыт дополняем нужные переменные и функции до тех пор пока задача не будет решена. Происходит это примерно так, как описал Прат:
Цитата:
Другим новшеством было так называемое нисходящее проектирование. В языке С эта
идея состояла в том, чтобы разделить большую программу на небольшие,
поддающиеся управлению задачи. Если после разбиения одна из задач все равно остается
крупной, этот процесс продолжается до тех пор, пока программа не будет разделена
на небольшие модули, с которыми будет просто работать. (Организуйте свой процесс
обучения. Ах, нет! Приведите в порядок свой рабочий стол, картотеку и наведите
порядок на книжных полках. Ах, нет! Начните со стола, наведите порядок в каждом
выдвижном ящике, начиная со среднего. Да, судя по всему, справиться с этой задачей
вполне реально.) Этот подход вполне осуществим в языке С, т.к. он позволяет
разрабатывать программные модули, называемые функциями, которые отвечают за
выполнение конкретной задачи.
2)Индукция или движение от простого к сложному.
Апологетом этого движения является Кент Бек. Базируется этот подход на теории ТРИЗ.
Кент это назвал экстремальным программирование. Для заказчика как и для программиста оно выматывает много нерв, так как результат заранее не известен. Удастся или не удастся.
В чём суть метода. Плотно работаем с заказчиком вместо громоздкого ТЗ используется карточки предложений. Если заказчик одобряет, то делаем данную функцию или вносим данное изменение.
ТРИЗ нам подсказывает разные способы изменения программ. Скрещивания двух других: к примеру взять текстовый редактор и архиватор, получится редактор со сжатыми файлами. Добавление чего-то нового: к примеру сплешь заставку. Либо инверсия(перевернуть с ног на голову или вывернуть наизнанку). К примеру были законченные программы для научных и бухгалтерских расчётов, вывернули на изнанку получился Excel, MatchCad где пользователям предлагают сами решать математические задачи.
Или научного тыка. Берём какую либо проблемы или пожелания от пользователя и пробуем её решить получается хорошо внедряем не получается улучшений не внедряем пробуем решить другую проблему.

При внесении изменений или добавление чего-то нового важно не поломать старое. Поэтому начинать надо с написания тестов. Подход TDD. Процесс поиска изменений не системный. При индукции мы просто перебираем возможные варианты и ищем, тот который нас устроит.

3) Системный анализ. Или изучения предметной области. Такой процесс требует много денег и очень долгий и в основном деньги идут на создание документации, а не самой программы. Процесс этот начинается со сбора материала для будущей программы. Затем производится его систематизация.

Маркетологи любят это называть как мозговой штурм. Результатом которой рождается карта будущей программы. Наверно вы уже слышали про CASE средства и UML диаграммы. Это инструменты, а также методы помогающие в системном анализе.
Первое, что нам предлагает UML это нарисовать поведенческую модель пользователей. Выписать или зарисовать все возможные поведения будущих пользователей. Потом обвести получившиеся действия в общие объекты. Выделить пользователей в общие группы.

Есть два правила. Бритва Оккамы - отсекаем всё лишнее. И второе правило подстановки Барбары Лисковой. При наследовании предки должны включать максимум от своих внуков. Поэтому при выделение общего предка следует включать в него все свойства внуков(почти все). А также тут помогают паттерны проектирования и теория ООП с их инкапсулированием, DI и так далее.

Когда вы наметили структуру программы вы начинаете уже сводить её к предыдущим выбирать кратчайшие пути решения. Начинается второй цикл разработки когда уже от эскиза или концептуальной модели переходят к практической стороне. Идёт повторный сбор информации поиска аналогов и готовых решений и выбор генераторов кода.
---------------------
Сейчас размышляю над рефакторингом.
Разработка носит часто не системный характер. Мы решаем и делаем функции которые нам нужны в данный момент. А потом когда этих функций набирается достаточно их следует объединить в классы или модуль.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 16.04.2017 в 11:38.
Pavia вне форума Ответить с цитированием
Старый 16.04.2017, 11:39   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Про рефакторинг - я выношу отдельную сущность, начиная со 2 использования. Для чепухи, типа поиск в строке одной из подстрок - функция-шаблон, для вещей, где нужны состояния - сразу класс.
И вот как раз с такими вещами наступает "лень-матушка", поэтому проще все сразу писать отдельными модулями, даже если используется 1 раз пока.
alexzk вне форума Ответить с цитированием
Старый 16.04.2017, 11:49   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Кент это назвал экстремальным программирование. Для заказчика как и для программиста оно выматывает много нерв, так как результат заранее не известен. Удастся или не удастся.
В чём суть метода. Плотно работаем с заказчиком вместо громоздкого ТЗ используется карточки предложений. Если заказчик одобряет, то делаем данную функцию или вносим данное изменение.
Экстремальное программирование (XP) не только из этого состоит же. https://ru.wikipedia.org/wiki/%D0%AD...BD%D0%B8%D0%B5
И никто не заставляет применять сразу все его элементы.

https://www.youtube.com/watch?v=hpat...tu.be&t=18m41s
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 16.04.2017 в 12:16.
Alex11223 вне форума Ответить с цитированием
Старый 16.04.2017, 12:05   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Да я учусь еще только. Именно ООП С++.
Поэтому сразу систему какую-то хочу "впаять" себе.
Пока за собой замечаю, "рваный" какой-то подход, то циклы лезут на ум, то какие переменные создавать и т.п.
Метод подхода к "впитыванию" задачи нужен.))
Это нормально. Объять не объятое.

Следует уяснить две вещи. Разработка программы носит циклический характер. Всегда найдётся, что надобно улучшить или переделать. Это нормально.
Второе программы они многогранные. UML насчитывает порядка 18 видов схем. https://ru.wikipedia.org/wiki/UML
Все их рисовать не нужно, хотя и возможно.

Выписывайте задачи которые хотите сделать, что-бы не забыть. В верху самые крупные внизу самые мелкие.
Цитата:
Сделать структуру программы.
Выбрать контейнер.
Написать функцию свёртки.
Вначале нарисуйте схему деления вашей программы и функциональную схему и придерживайтесь их. Что-бы нарисовать схему деления разделяйте сложную задачу на простые до тех пор пока вы не будете знать их решения.
Что-бы нарисовать функциональную схему следует использовать паттерн MCV - разделите вашу программу на три части основной код, ввод данных и вывод данных.
Далее у вас будут объекты используйте метафору. Подберите правильное название для объекта и его функций. Тут возможно придётся почитать литературу поискать в интернете.

Заготовте тесты. Потом наполните вашу программу кодом.
Проведите рефакторинг, как говорят причешите код.
Тут вам помогут правила корпоративной разработки.
И только потом прогоните тесты. Рефакторинг позволит вам на перёд избежать ряда проблем не переписывая функцию по 30 раз что-бы пройти тесты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 16.04.2017, 12:29   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

т.е. вы предлагаете человеку, на С++ использовать "экстримальный" подход ? Давайте не будем? - хватит и веба-сплошного-бага.

Для С++ есть хороший заменитель - static analyze tools + compiler. Есть ключевые слова const/override/final, например, которые автоматически снимают много проблем, решаемых тдд в пхп и прочих js.

Последний раз редактировалось alexzk; 16.04.2017 в 12:32.
alexzk вне форума Ответить с цитированием
Старый 16.04.2017, 12:34   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я ничего не предлагаю, просто прошел мимо и увидел странный абзац )

И XP это ж не только TDD. Например единый стиль кода, рефакторинг, Continuous Integration тоже к нему относятся.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как составить блок-схему к решению задачи ElenaGreen Microsoft Office Excel 1 17.11.2013 13:23
вопросы по литературе, подсказки по решению задачи. kynew Помощь студентам 0 04.11.2012 21:38
Подход к решению kaar Помощь студентам 2 04.04.2010 11:56
помогите по решению задачи Irok Паскаль, Turbo Pascal, PascalABC.NET 2 08.01.2009 00:52
Нужна помощь по решению задачи .(Delphi) Nora Помощь студентам 4 24.05.2008 07:29