2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4, 5, 6 ... 12  След.
 
 Re: Программирование для математиков: класс Polynomial
Сообщение03.09.2018, 20:17 
Munin в сообщении #1336467 писал(а):
Незнание принципиальной разницы между этими двумя вещами - острый признак, что вам надо не учить программировать, а самому учиться.
Вот ещё один признак, не столь серьёзный, но тоже достаточный чтобы отказаться от попыток учить других (у меня извините глаза на лоб полезли):
VTsalyuk в сообщении #1336448 писал(а):
Подскажите, пожалуйста, что такое "потокобезопасность".

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение03.09.2018, 20:21 
Боюсь, что в учебниках написано только, что по завершении цикла значение индекса цикла не определено. Так было в Pascal, но мы вполне успешно использовали значение индекса цикла для анализа причины выхода из цикла. Потом лафа прекратилась...

-- 03.09.2018, 20:22 --

Dmitriy40
Может, тогда Вы объясните. Люблю точность в понятиях.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение03.09.2018, 20:33 
VTsalyuk в сообщении #1336489 писал(а):
Может, тогда Вы объясните. Люблю точность в понятиях.
Начните отсюда: Потокобезопасность. Хотя бы что это такое и зачем нужно узнаете.

VTsalyuk в сообщении #1336489 писал(а):
Потом лафа прекратилась...
И поэтому Вы упорно тянете читателей обратно в 70-80-е годы? Использованием устаревших конструкций и парадигм. Вам может быть так и удобнее и понятнее, но вот ученикам надо объяснять на современном уровне, а не эту дикую смесь старых идей и нового синтаксиса. Потому использовать сами такие библиотеки Вы конечно можете, но вот рекомендовать другим и тем более учить их такому подходу ... :facepalm:

VTsalyuk в сообщении #1336489 писал(а):
Боюсь, что в учебниках написано только, что по завершении цикла значение индекса цикла не определено.
Боюсь так было в очень старых учебниках (и может даже для других языков), в более новых введено понятие времени жизни переменной. В том числе для блоков и циклов.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение03.09.2018, 20:39 
VTsalyuk в сообщении #1336489 писал(а):
Боюсь, что в учебниках написано только, что по завершении цикла значение индекса цикла не определено.
Учебник учебнику рознь. В другом будет написано про время жизни и область видимости переменной.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение03.09.2018, 21:02 
Аватара пользователя
VTsalyuk в сообщении #1336489 писал(а):
Боюсь, что в учебниках написано только, что по завершении цикла значение индекса цикла не определено. Так было в Pascal, но мы вполне успешно использовали значение индекса цикла для анализа причины выхода из цикла. Потом лафа прекратилась...
В третьем издании "The C++ programming language" (1997 год; ничего сколь-нибудь официального более раннего не нашел) написано, что scope переменной, объявленной в инициализации for - это объявление и тело цикла. После завершения цикла эта переменная уже не объявлена (а не "значение не определено"). В современном стандарте, естественно, написано то же самое.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение03.09.2018, 21:32 
mihaild в сообщении #1336505 писал(а):
В третьем издании "The C++ programming language" (1997 год; ничего сколь-нибудь официального более раннего не нашел) написано, что scope переменной, объявленной в инициализации for - это объявление и тело цикла.
Первоначально в плюсах переменные, объявленные в заголовке for, имели область видимости от этого объявления и до конца блока, объемлющего for. И это иногда использовалось при досрочном выходе из цикла. Потом в какой-то момент это правило видимости изменили.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение04.09.2018, 08:44 
Аватара пользователя
VTsalyuk в сообщении #1336448 писал(а):
"конструктора из FILE* и метода Display" -- по учебникам, это потокоориентированный ввод/вывод. Если Вы имеете в виду символику >> и <<, то она слишком sophisticated для фундаментального представления. При переходе к профессиональной работе в программировании (и даже раньше) читатель легко перейдет к этому стилю. Задачи научить всем вкусным плюшкам языка я не ставил -- для этого существуют учебники.
VTsalyuk в сообщении #1336448 писал(а):
Особенно мне понравилось напихать в контейнер мономы и назвать это полиномом. Давно о таком думал, даже предложил одному студенту реализовать. К сожалению, тот соскочил. Не знаю только, чем это лучше. Зато точно вижу недостаток: такой подход требует от читателя бОльших знаний. Это же касается создания шаблонов.
VTsalyuk в сообщении #1336448 писал(а):
А не сводится ли new Polynomial компилятором к (Polynomial *)malloc? На мой взгляд, второй вариант дает лучшее фундаментальное представление о том, что делается в программе. Читатель легко перейдет самостоятельно к более лаконичному варианту, когда поймет более подробный. Выбор осознанный.

Оператор new, стандартные контейтеры и (в меньшей степени) iostream - это самые базовые основы C++. Без знания стандартных контейнеров и навыка применять их там, где они нужны, студента оставлять нельзя.

VTsalyuk в сообщении #1336472 писал(а):
Замечательно! С удовольствием почитаю учебный проект "Как нам реорганизовать Polynomial". Спорить не буду. Это будет урок номер 2. Кто возьмется? Давайте выкладывать в этой же теме.
Я могу попробовать.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение04.09.2018, 12:02 
Аватара пользователя
Вообще, на мой взгяд "программиста", от "математика" требуется написать "дизайн" и описать алгоритмы (а вовсе не заниматься имплементациями).
Например, чем могут быть коэффициенты? Какие операции и прочие свойства мы от них требуем? Могут ли это быть, например, (неквадратные) матрицы?
Какие есть операции, и что они означают для полиномов? Например, $P(x)+Q(x)$, $kP(x)$, $P(x)P(y)$, $P(x)\ge0$?
Как делить? Как делить на ноль?
Как возводить в степень?
Как мы должны понимать случай когда коэффициенты снова полиномы?
Как мы должны, например, понимать полином с матричными коэффициентами - это матрица полиномов?

Вообще, самостоятельное существование такого класса малоценно - надо либо проектировать библиотеку целиком (хотя бы на уровне перечисления классов и алгоритмов), либо встраивать в конкретную имеющуюся.

P.S. А реализовывать я это буду, вообще, в MatLab'е (в довесок к своим большим целым и дробям) :mrgreen:

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение04.09.2018, 13:57 
Munin в сообщении #1336458 писал(а):
В общем, выглядит ситуация так, будто человек, знакомый с Си с 1990 года, а с C++ с 1992 года - сейчас вышел из анабиоза и решил "показать класс".
В М. Эллис, Б. Строуструп, Справочное руководство по языку программирования C++ с комментариями. 1992 (пока гуглил ссылку нашел ваше упоминание этой книжки на этом форуме) это уже было подробно описано. Тогда ещё не было STL, но вот new/delete уже были. Ну а как же без них?
Так что, нет, не с 1992 года.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение07.09.2018, 14:04 
Итак, тема повторного определения индекса цикла закрыта -- не в пользу старого VC++.

Geen
C удовольствием прочитал Ваш пост. Четко и точно!
К сожалению, хорошие программисты, знающие, шустрые, хорошо понимающие математика и свободные(!!), на каждом углу не валяются. Поэтому профессиональная разработка библиотеки классов получается редко и за деньги (а что, разве чего-то подобного, включающего Polynomial, профессионально не делали?). И если математик берется за любительское программирование своих задач, то это не от хорошей жизни. Мой опыт это подтверждает. И учить его этому надо:
- чтобы мог сам сваять что-то на коленке;
- чтобы в случае взаимодействия с профи-программистом мог его понимать.

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

Dmitriy40
За потокобезопасность спасибо. Оказалось, это штука довольно сложная и предъявляющая жесткие ограничения. Поэтому в учебном курсе этого (пока ?) не будет.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение07.09.2018, 14:16 
Аватара пользователя
VTsalyuk в сообщении #1337233 писал(а):
разве чего-то подобного, включающего Polynomial, профессионально не делали?
В простейшем виде класс многчлена есть даже в бусте https://www.boost.org/doc/libs/1_62_0/l ... mials.html
VTsalyuk в сообщении #1337233 писал(а):
И учить его этому надо

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

И почему бы математику вместо С++ не взять matlab, sage, mathematica или еще один из десятков пакетов, где уже реализованы все основные объекты и методы?

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение07.09.2018, 14:26 
tolstopuz в сообщении #1335370 писал(а):
Не буду подробно останавливаться ... на ужасном хранении остатка от деления (вместо этого можно было бы спокойно вернуть pair из операции деления), на том, что конструктор по умолчанию создает объект с нарушенным инвариантом, приводящий к ошибкам при почти любых действиях с ним. Но не могу пройти мимо двухстраничной борьбы в Examples.pdf с забытым const в operator*, в результате которой сделаны выводы космического масштаба и космической же глупости...
Правильная работа с модификатором const - непростое дело. Стоило бы для начала почитать какую-нибудь книжку про это, а потом уже начинать писать тексты самому.

Насчет pair, Вы так и не подсказали мне, как при его использовании реализовать возможность выражения X + Y / Z.

Насчет const в operator*. Это не забывчивость, это была ошибка. Сначала я писал const, но компилятор возражал против использования неконстантного вспомогательного метода MultMonom. Я считал, что смысл const состоит в примитивном отслеживании изменений параметра, и убедившись, что таковых нет, снял модификатор const с параметра... А в operator= это тем более "не нужно". В результате были ошибки компилирования, которые, как правило, легко обходились. Теперь, спасибо за указание, все работает нормально.

Но меня беспокоит то, что я так и не понимаю, почему в отсутствие const компилятор бастовал. Мои предположения о возможных причинах были, очевидно, ошибочными. Но то, с какой легкостью Вы оценили "меру, степень, глубину" моей ошибки, позволяет надеяться, что Вы знаете правильный ответ. Не могли бы Вы растолковать?

Только ответ типа "Потому что правильно делать не так" не пройдет, ибо не снижает степень моего непонимания. Ссылка на стандарт с пруфлинком была бы лучше, но в таком случае остается непонимание, а почему в стандарте решили написать так?

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение07.09.2018, 14:31 
Аватара пользователя
VTsalyuk в сообщении #1337233 писал(а):
- чтобы мог сам сваять что-то на коленке;
- чтобы в случае взаимодействия с профи-программистом мог его понимать.

А вот не надо занижать планку, всем известные программы были написаны в университетах, и были написаны математиками. Математики уделают любого профи-программиста.

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение07.09.2018, 14:41 
mihaild в сообщении #1337235 писал(а):
И почему бы математику вместо С++ не взять matlab, sage, mathematica или еще один из десятков пакетов, где уже реализованы все основные объекты и методы?


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

Я, конечно, далек от мысли, что мой класс сделан высокопрофессионально. И если я предлагаю его для использования, то это имитация в учебных целях. Хотя для моих потребностей, после сделанных поправок, класс вполне достаточен. Главное, мне как пользователю все понятно (как разработчику, увы, нет :-).

Случилось страшное! Я имею еще идею разработки класса матриц (в математическом смысле) на таком же примитивном уровне. С демонстрацией простенького примера наследования (строка и столбец как частные случаи матрицы). Это тоже считаете вредным?

 
 
 
 Re: Программирование для математиков: класс Polynomial
Сообщение07.09.2018, 14:42 
Аватара пользователя
VTsalyuk в сообщении #1337236 писал(а):
смысл const состоит в примитивном отслеживании изменений параметра, и убедившись, что таковых нет, снял модификатор const с параметра...
Смысл const у параметра, являющегося ссылкой - дать возможность передавать туда константные и временные (точнее rvalue) объекты.
VTsalyuk в сообщении #1337236 писал(а):
Но меня беспокоит то, что я так и не понимаю, почему в отсутствие const компилятор бастовал.
Потому что нельзя привязывать неконстантную ссылку к rvalue. По стандарту.
eugensk в сообщении #1337238 писал(а):
А вот не надо занижать планку, всем известные программы были написаны в университетах, и были написаны математиками.
Есть разные математики, и разные программисты, и называть ли авторов этих программ математиками или программистами - вопрос философский.
(а также называть ли программистами авторов большей части кода на гитхабе скажем)

 
 
 [ Сообщений: 168 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 12  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group