|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
||||||||||||
Класс вектор. Комментарии к коду.03.06.2011, 15:39. Показов 9029. Ответов 33
Метки class, pas, pascal, vector, вектор, вектора, векторы, класс вектор, класс коллекция, коллекции, коллекция, коллекция векторов (Все метки)
Многое я в этом коде не понимаю, поэтому напишу , что понятно мне. Исправьте меня если я не прав. Спасибо
0
|
||||||||||||
| 03.06.2011, 15:39 | |
|
Ответы с готовыми решениями:
33
Комментарии к коду Комментарии к коду
|
|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
|
| 09.06.2011, 13:18 [ТС] | |
|
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 09.06.2011, 15:54 | |
|
Да, в самом деле - в GetScalarMulty() в качестве параметра надо массив координат вектора передавать. Либо можно переделать метод так, чтобы в качестве параметра передавать ему второй экземпляр TVector, из которого будут взяты координаты.
--- Наверное, лучше так поступим - я вечером напишу реализацию и выложу здесь.
1
|
|
|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
|
| 09.06.2011, 15:58 [ТС] | |
|
Спасибо, жду )
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||||||||||||||
| 09.06.2011, 20:53 | |||||||||||||||||||||
|
Готово.
![]() Модуль, где объявлен класс TVector:
0
|
|||||||||||||||||||||
|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
|
| 09.06.2011, 21:17 [ТС] | |
|
Огромное спасибо ! Но нельзя ли с комментариями ? И в порядке бреда .Просто у меня задание звучит так: Написать класс вектор через массив свойств . То есть по-другому никак ?
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 09.06.2011, 21:21 | |
|
Массив свойств - это и есть свойство Items в классе - то, которое с механизмом доступа по индексу.
--- Комменты напишу чуть позже - мне до дома ещё надо добраться.
0
|
|
|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
||||||
| 09.06.2011, 21:30 [ТС] | ||||||
|
Посмотрите, пожалуйста , что мой одногруппник написал ( у него такое же задание) . У кого из нас ответ отвечает заданию: Написать класс вектор через массив свойств.
0
|
||||||
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||||
| 10.06.2011, 22:41 | |||||||||||
|
Вот следующая версия. В проекте реализован класс TVector - вектор и класс TVectors - коллекция векторов.
Код модуля с определениями классов.
2
|
|||||||||||
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||||||||||||||||||||||||||||||||||||||||
| 11.06.2011, 00:16 | |||||||||||||||||||||||||||||||||||||||||||||||
|
--- Что касается кода с классом TVectorClass, о нём могу сказать следующее. Парень молодец - написал реализацию. Уделил особенное внимание вопросам задания координат вектора при вводе с консоли - в методе VectorRead() анализируется строка с координатами вектора. Все основные действия он реализовал. --- Из недочётов - класс TVectorClass не моделирует объект "вектор". На самом деле, класс TVectorClass представляет не отдельный вектор, а некий векторный процессор. Т. е., он хранит данные не одного вектора, а сразу трёх - двух векторов-операндов и третьего вектора-результата. Т. е., например, чтобы выполнить сложение двух векторов, надо координаты векторов загрузить в такой объект-процессор, затем вызвать метод сложения. - В результате в объекте-процессоре будут сформированы координаты вектора-результата, которые можно затем прочитать. Т. е. класс TVectorClass всё делает внутри себя, новые объекты не порождаются. - Это результат неверного архитектурного подхода. Кроме этого, например, результат расчёта скалярного произведения векторов хранится в поле Multitude. Это поле расположено в разделе public. Это означает, что пользователь класса может сам вписать в это поле какие-то данные. Что может привести к противоречивости данных. Поэтому это поле следует спрятать. И внешний доступ к нему разрешить только на чтение. Ещё опаснее то, что в разделе public расположено поле VectorLong - длина вектора. Если пользователь класса запишет в него значение - это не приведёт к физическому изменению длины вектора. А значит может привести к ошибкам. Это поле тоже следует переместить в раздел private. И внешний доступ к нему тоже должен быть только на чтение. В код метода VectorRead() добавлен совершенно не нужный здесь вызов конструктора родительского класса. ![]()
Например вот:
![]() Далее:
--- Не следует думать, что я придираюсь. Ещё раз повторю - парень молодец, написал реализацию, функциональную часть задачи решил. Но есть проблемы в архитектуре класса, комменты надо подправить и исправить прочие помарки - по крайней мере те, на которые я выше указал.--- О проектировании. Рассмотрим объект вектор. Начнём с данных. Данными вектора являются его координаты. Эти данные должны быть представлены в классе вектора и они должны быть защищены от свободно доступа. Это реализуется с помощью полей в разделе private. Соответственно должны быть определены методы для записи и чтения координат. Основные методы, которые работают с данными раздела private и которые понадобятся в будущем для разработки классов-потомков по возможности следует располагать в разделе protected. Раздел protected, по сути, должен содержать инструментарий для разработчика классов-потомков. В этом разделе могут присутствовать небезопасные методы и свойства, неправильное применение которых может привести к противоречивости данных. В раздел public следует помещать те методы, которые будут доступны программистам - пользователям класса. Кроме этого, многие методы из раздела public проектируются с таким расчётом, чтобы разработчики классов-потомков могли изменять их и усовершенствовать используя инструментарий из раздела protected. Поэтому эти методы вполне обосновано могут работать с данными класса через методы раздела protected, избегая прямого обращения к полям раздела private. Этот момент может быть оспорен, в случае, когда очень важен вопрос быстродействия. Но это уже вопрос конкретной задачи и конкретной реализации. Здесь надо подходить творчески и стараться одновременно решать задачу текущей реализации и думать о будущем - т. е., закладывать фундамент для будущих классов-потомков. --- И так, данные вектора - это его координаты. Если имеем два набора координат - значит имеем два разных объекта. Объект-вектор должен уметь выполнять действия, определённые для векторов - например, скалярное произведение, сложение, вычитание. Причём, перечисленные действия выполняются над парой векторов - значит в этих действиях должны участвовать два объекта-вектора. Скалярное произведение должно возвращать в качестве результата вещественное число. А такие действия как сложение и вычитание векторов приводят к тому что появляется третий вектор - результат этих действий. Значит методы сложения и вычитания классе вектора должны возвращать новый объект-вектор. Во время самой реализации класса вектора следует, по возможности, учитывать то что я написал выше о данных, методах, защищённости и о разделах private, protected, public. Именно такую архитектуру я применил при реализации класса TVector. В классе TVector имеется 4 перегружаемых конструктора для удобства задания вектора в различных ситуациях. Вызовы этих конструкторов продемонстрированы в программе. Данные в TVector весьма надёжно защищены. Небезопасное свойство ArrItems помещено в раздел protected. Это свойство даёт прямой доступ к хранилищу координат вектора. Поэтому оно доступно только для разработчиков классов-потомков - оно им может понадобится. Для пользователей класса это свойство недоступно. Действия над векторами реализованы в виде методв, объявленных в разделе private. Алгоритмы этих методов работают с данными вектора через методы раздела protected. Это гарантирует, что разработчики классов-потомков также смогут в большинстве случаев реализовать нужную им функциональность (данные раздела private для них будут недоступны).Вызовы методов весьма лаконичны:
Кроме этого, в дополнение к классу TVector я реализовал класс TVectors - это коллекция для хранения векторов типа TVector. В коде программы приведён вариант кода для работы с коллекцией. Класс коллекции является самостоятельным. Если он не нужен в проекте - его можно удалить. --- Из критических замечаний к классу TVector, могу заметить, что есть "дыра" - пользователь класса всё-же может получить прямой доступ к хранилищу координат вектора. - Это возможно сделать во время создания вектора через третий вариант конструктора:
Минус этого кода только в том, что его быстродействие ниже, чем у незащищённого варианта. - Из за затрат времени на создание копии данных.
2
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
Заблокирован
|
|
| 11.06.2011, 00:22 | |
|
Не по теме: О_ониасилил --- Mawrat: Материал непростой - здесь класс, вопросы архитектуры, динамические массивы. При изучении ООП надо стараться читать разные материалы, из разных источников и, может быть, разных авторов - постепенно расширяя своё понимание предмета.
0
|
|
|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
||||||
| 17.06.2011, 13:16 [ТС] | ||||||
|
Просто в порядке вопроса. А почему у меня не получается векторное произведени ?
0
|
||||||
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||||||
| 17.06.2011, 13:59 | ||||||||||||||||
|
Сначала замечания по коду.
1
|
||||||||||||||||
|
5 / 5 / 1
Регистрация: 21.11.2009
Сообщений: 110
|
|
| 17.06.2011, 14:08 [ТС] | |
|
А как его вывесив Edit ? Edit4.Text:=FloatToStr(VectorMulty) Так ?
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||
| 17.06.2011, 14:22 | ||||||||||||
|
Вот распечатывать его придётся с помощью перебора всех элементов вектора.
Если взять мой код - там для этого есть специальное свойство у вектора: TVector.AsString. В этом случае распечатка будет выглядеть так:
--- Реализация свойства TVector.AsString:
0
|
||||||||||||
| 17.06.2011, 14:22 | |
|
Написать комментарии к коду Нужны комментарии к коду. Дайте комментарии к коду Нужны комментарии к коду Гаммирование, нужны комментарии к коду Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|