2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5 ... 11  След.
 
 Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 18:36 


24/08/18
29
Уважаемые учащиеся-математики! Вашему вниманию предлагается более или менее полное
описание опыта разработки содержательного класса объектов математического характера. Содержится в архиве
Polynomial.zip. Начинать чтение надо с файла Polynomial.pdf.

Всего лишь 5% этого архива представляют собой программный код. Остальное --
PDF файлы с проектной документацией, документацией пользователя, комментариями к коду и т.д.

Проект носит учебный характер и поэтому реализовывался минимально необходимыми средствами. (Можно заподозрить, что только эти средства и знакомы автору :-) Так оно и есть! Я знаю только то, что мне было необходимо узнать.)

Важно отметить, что это ни в коей мере не учебник и никак его не заменяет. Это описание попытки разработать полновесный класс, в отличие от учебных примеров, которые приводятся в учебниках (объект x класса X:-)).

Есть два способа использования этого:

1. Если вы учащийся и хотите получить фундаментальные представления о классах объектов, почитали учебники, но не очень хорошо представляете, с чего начать, то предлагаю вам читать документацию, поглядывая в текст программного кода.

2. Можно просто взять готовые коды (предварительно устранив в нем ошибки, о которых мне обещают написать на форуме :-))
и всего лишь один из файлов документации и использовать полученный класс в своих расчетах.

Цитата из рецензии Pphantom:
Цитата:
с одной стороны, ничего криминального там нет... С другой -- на мой взгляд, ни для непосредственного использования, ни для образца для подражания это не годится (более того, во многом оно скорее годится в качестве образца, как это делать не надо).

В общем, если хочется, то можно опубликовать ссылку в разделе "Программирование" (но шишки будут, это можно сказать наверняка).


Следующий учебный проект, который я хочу опубликовать на этом форуме -- разработка оконного класса, предназначенного для показа/редактирования/ввода значения переменной типа double. Это опять преимущественно для математиков! Но сначала хотелось бы получить конструктивную критику здесь. Мешок для шишек подготовил.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 20:10 
Заслуженный участник


06/07/11
5357
кран.набрать.грамота
Цитата из PDF файла:
Цитата:
А зачем изучать С++? Конечно, ради объектно-ориентированного программирования. Но ООП, с моей точки зрения, это не проектирование интерфейса пользователя вышиванием по канве, а разработка, и затем использование, классов объектов.
Фраза построена таким образом, как будто вы где-то встретили утверждение "ООП - это проектирование интерфейса пользователя вышиванием по канве", и теперь его опровергаете. Просто интересно, где можно было найти такой бред и как можно было воспринимать его всерьез.

-- 29.08.2018, 21:21 --

Кхм. После такого
Цитата:
Иногда случается, что попытка вычисления достаточно сложных выражений с многочленами вызывает ошибки на стадии компиляции. Диагностика этих ошибок иногда, хм, непонятная. Например инструкции
double A[3] = {1, 1, 2};
double B[2] = {-1, 1};
Polynomial Z(0.0);
Z += Polynomial(2, A) * Polynomial(1, B);
вызывают ошибку
Error! E189: overloaded function cannot be selected for arguments used in call
По видимому, проблема в том, что компилятор не справляется с сохранением и дальнейшим использованием промежуточных результатов вычисления.
Я могу только сказать: "Садись, два."
Не суметь скопировать в гугл текст ошибки и понять по поисковой выдаче, что делать дальше, - это отдельный талант. Я уже не говорю о том, чтобы использовать перегрузку функций, не зная, что это и зачем это.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 20:22 
Заслуженный участник


31/12/05
1074
Не буду подробно останавливаться на том, что в C++ не принято использовать malloc, на ужасном хранении остатка от деления (вместо этого можно было бы спокойно вернуть pair из операции деления), на том, что конструктор по умолчанию создает объект с нарушенным инвариантом, приводящий к ошибкам при почти любых действиях с ним. Но не могу пройти мимо двухстраничной борьбы в Examples.pdf с забытым const в operator*, в результате которой сделаны выводы космического масштаба и космической же глупости. Бедные студенты, которым предстоит это читать...

-- Ср авг 29, 2018 20:25:28 --

rockclimber в сообщении #1335364 писал(а):
Не суметь скопировать в гугл текст ошибки и понять по поисковой выдаче, что делать дальше, - это отдельный талант.
Не уверен, что это помогло бы в данном случае. Правильная работа с модификатором const - непростое дело. Стоило бы для начала почитать какую-нибудь книжку про это, а потом уже начинать писать тексты самому.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 20:34 
Заслуженный участник


06/07/11
5357
кран.набрать.грамота
tolstopuz
Извините, я совершенно не знаю С++. В тех языках, которые знаю, при получении подобной ошибки как правило совершенно несложно догадаться, как это исправить.

-- 29.08.2018, 21:38 --

tolstopuz в сообщении #1335370 писал(а):
Не уверен, что это помогло бы в данном случае.
Догадаться, что дело не в компиляторе, который не справляется с хранением промежуточных вычислений, - можно. (Компилятор хранит промежуточные вычисления? Чудная штука ваш С++)

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 20:46 
Заслуженный участник
Аватара пользователя


06/10/08
6119
Что сразу бросается в глаза:

  • Нет единого стиля оформления кода: в большинстве мест отступ в два пробела, но в паре мест используется один пробел, в большинстве мест закрывающая фигурная скобка идет на отдельной строке, но иногда впихнута в последнюю, в половине файлов используется очень странный стиль, где функции начинаются с отступом в один пробел.
  • Проект слишком маленький, чтобы делать его некроссплатформенным. У меня с первого раза не скомпилировалось (conio.h и нессответствие регистра в названии файла Polynomial.hpp в архиве)
  • В паре мест стоит точка с запятой после тела функции - будет синтаксическая ошибка на старых компиляторах.
  • Операторы присваивания (=,+=,-=,*=) должны возвращать не void, а Polynomial& (ссылку на полученный после присваивания объект).
  • Вместо конструктора из FILE* и метода Display нужны операторы для работы с потоками ввода-вывода.
  • Дизайн деления с остатком ужасен (как минимум, нет потокобезопасности)
  • Не используются даже базовые средства C++. std::vector здесь будет очень кстати, или хотя бы уж new вместо malloc.
  • В C++ заголовки называются не stdio.h, а cstdio.
  • Почему это вообще не шаблонный класс?

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 21:17 
Заслуженный участник
Аватара пользователя


02/08/11
5494
- using namespace в заголовочном файле
- невиртуальный деструктор в не-final классе

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 21:17 
Заслуженный участник
Аватара пользователя


30/01/06
68765
Xaositect в сообщении #1335381 писал(а):
Операторы присваивания (=,+=,-=,*=) должны возвращать не void, а Polynomial& (ссылку на полученный после присваивания объект).

Всё-таки const Polynomial &.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 21:24 
Заслуженный участник
Аватара пользователя


06/10/08
6119
Munin в сообщении #1335390 писал(а):
Всё-таки const Polynomial &.
Нет.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 21:27 
Заслуженный участник
Аватара пользователя


16/07/14
3019
Москва
Munin в сообщении #1335390 писал(а):
Всё-таки const Polynomial &.
Возвращать Polynomial&. Принимать - const Polynomial&.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 21:36 
Заслуженный участник


28/04/09
1880
Munin в сообщении #1335390 писал(а):
Xaositect в сообщении #1335381 писал(а):
Операторы присваивания (=,+=,-=,*=) должны возвращать не void, а Polynomial& (ссылку на полученный после присваивания объект).

Всё-таки const Polynomial &.
An assignment operator should return T& to enable chaining, not alternatives like const T& which interfere with composability and putting objects in containers.
Лично от себя замечу в противовес процитированному, что этот самый chaining вещь не настолько нужная, насколько потенциально ошибкоёмкая (в особенности при возврате неконстантной ссылки), поэтому возврат void в принципе кажется более разумным (хоть это и противоречит сложившейся практике).

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 22:18 
Супермодератор
Аватара пользователя


09/05/12
17121
Кронштадт
Ну вот, что и ожидалось. :-) Ко всему уже сказанному я бы добавил комментарий чуть более общего характера.

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

Во-вторых, даже учебные задачи стоит подбирать так, чтобы осваиваемый инструмент был адекватен задаче. А писать что-либо подобное на C++ противоестественно. Консерваторы и те, кому необходима скорость, будут использовать Fortran или C; любители быстрой реализации воспользуются Python; пуристы возьмут какой-либо функциональный язык; те, кому нужно разовое решение, просто используют какой-нибудь матпакет. В общем-то математикам (которым номинально адресован пример) именно C++ (да и, по большому счету, ООП в целом) в принципе не нужен, так что даже при идеальном коде основная цель не вполне разумна.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 22:19 
Заслуженный участник


31/12/05
1074
EtCetera в сообщении #1335396 писал(а):
поэтому возврат void в принципе кажется более разумным (хоть это и противоречит сложившейся практике).
К сожалению, стандарт запрещает класть объекты с const T& operator=(const T&) в контейнеры типа vector, потому что они не CopyAssignable. Фактически is_copy_assignable не проверяет тип возврата operator=, но мало ли что изменится в следующей версии стандарта.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 22:24 
Заслуженный участник
Аватара пользователя


16/07/14
3019
Москва
tolstopuz в сообщении #1335404 писал(а):
К сожалению, стандарт запрещает класть объекты с const T& operator=(const T&) в контейнеры типа vector, потому что они не CopyAssignable
vector для просто создания требует только Erasable. И скажем unique_ptr не CopyAssignable, но класть их в контейнер вполне можно.

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 22:37 
Заслуженный участник


28/04/09
1880
tolstopuz
Да, вот это требование CopyAssignable, чтобы возвращаемое значение было неконстантной ссылкой, мне и кажется нездоровым (и продиктовано оно, по-видимому, прежде всего историческими причинами, дабы не ломать горы уже возведённого).

 Профиль  
                  
 
 Re: Программирование для математиков: класс Polynomial
Сообщение29.08.2018, 22:48 
Заслуженный участник
Аватара пользователя


30/01/06
68765
Xaositect
mihaild
tolstopuz
Спасибо. Значит, я устарел.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 161 ]  На страницу 1, 2, 3, 4, 5 ... 11  След.

Модераторы: Karan, PAV, Toucan, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group