Последний раз редактировалось photon 17.11.2018, 06:47, всего редактировалось 6 раз(а).
Добрался до кода. Это хороший пример, как писать не стоит. Часть была озвучена выше, возможно, я что-то продублирую, часть, видимо, будет новой добавкой, бОльшая часть, скорее всего, при первом прочтении не будет озвучена вовсе.
1) В коде масса граблей, на которые рано или поздно предстоит наступить, а можно было бы их не раскладывать: а) наличие неконстантных указателей на неконстантные данные там, где это, очевидно, не нужно, может поломать данные, которые менять вы не планировали; б) Потенциально бесконечные циклы (типа while(1) - можно же условие выхода записать тут, а не вставлять брейки. Кстати об eps там: а почему это static переменная, а не аргумент ф-ции Cut()? - неужели не может быть, что в одной и той же задаче для одних многочленов eps следует задать одним, а для других - другим? - каждый раз дергать eps - не лучшее решение. в) шастание указателями по памяти там, где это не дает прироста производительности, и без которого можно обойтись. г) отсутствие фигурных скобок у однострочных циклов и if-ов - не ошибка, но частый источник, порой сложнозамечаемых багов д) не ошибочные, но странные мелочи, типа проверки на равенство unsigned int и даблового нуля. e) ошибки компиляции, которые вы получили при многократном включении заголовочных файлов, - за это линейкой по пальцам надо. Это же стандартные вещи и решать их надо не заметанием под ковер, а цивилизованными методами, типа использования #pragma once или, хуже, но тоже допустимо, оборачивания в #ifndef 2) Эффективность. a) Вы навязываете использование double, даже если пользователю хватит целых чисел или float. Проблема решается темплейтными классами. б) Наличие переменных и операций, без которых можно обойтись (например i в циклах, где оно непосредственно в вычислениях не участвует, а только инкрементится) в) Сравнение плохого кода на С с отвратительным на Maple - не показатель. Используйте готовые функции в Maple, типа taylor(), а не то, что вы себе там придумали. Языки типа Matlab, Maple действительно будут в десятки, а в худшем случае и в десятки тысяч раз медленнее, если вы будете их использовать криво, однако базовые операции реализованы на том же самом С и зашиты в ядро, и тут-то, конечно, тоже переплюнуть их можно по быстродействию, но придется повозиться. 3) Стиль. Его просто нет: с большой буквы, с маленькой, кэмелкейс, снейккейс - все вперемешку. Похожим образом могут называться классы, функции, типы, переменные... 4) Это не С++. Откройте для себя стандартные контейнеры типа std::vector и операции с ним, такие как std::transform(), std::for_each() и др. и замените бОльшую часть циклов однострочными гораздо более безопасными командами. Забудьте про alloc() - free() (да и new - delete вам в этом классе не нужны). Отговорки, что сначала изучим базу для понимания, а потом уже перейдем к С++, не принимаются. Это плохой путь сначала учить плохому и даже опасному (чего стоит только ваш конструктор Polynomial(unsigned n, double * p) вместо, скажем, Polynomial(std::vector<double> const& p), а потом якобы сложному, но более надежному. Вообще говоря, С и С++ - разные языки и, если вы учите С++, то учите С++, а не (плохому) С с жалкими вкраплениями плюсов.
|