Линейный список, Создать с помщью Randomize |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Линейный список, Создать с помщью Randomize |
Madam |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 39 Пол: Женский Реальное имя: Наталья Репутация: 1 |
Здравствуйте!
Помогите пожалуйста далеко не юной зочнице справится с кусовиком. Как с помощью Randomize создать линейный список из десяти положительных целых чисел? Заранее благодарю. Сообщение отредактировано: Madam - |
volvo |
Сообщение
#2
|
Гость |
Значит, так... Вот я и пришел с первоначальными результатами оптимизации. Именно первоначальными, ибо до окончательных еще очень далеко, можно еще улучшить программу, и сделать ее гораздо более читаемой.
Смотри, что я сделал: 1. Все циклы вида: j:=0; заменены на циклы: SetFillStyle(SolidFill, White); Почему? Потому, что во-первых они проще читаются, следовательно и находить недочеты и неполадки будет проще. Ну, а во-вторых - SetFillStyle делать на каждой итерации совершенно необязательно, достаточно это сделать один раз перед циклом... 2. Однотипные действия, вроде: if(ch='0') then beginвыделены в отдельные функции... 3. Немного подправлена сама организация работы с меню: вместо того, чтобы хранить все время текущую Y-позицию, я храню "индекс", т.е. порядковый номер текущего (в смысле, выбранного в данный момент) элемента. Это позволяет мне во-первых, избавиться от совершенно ненужных констант: const(зачем нужны 6 констант, если можно вычислить значение в любой момент по текущему индексу и стартовому значению?), и во-вторых, заменить булевские переменные n1, n2, n3 на массив n: array[1 .. 3] of boolean (ну, что поделать, я привык к структурированным программам ) Естественно, я не мог оставить в программе и вот это: OutTextXY(10,45,'Create new list');- строки были записаны в массив и выведены в простом цикле... 4. Блок обработки расширенных клавиш (то, что ты называешь HARD) внесен в основной Case: Case ReadKey OfКстати, у тебя была ошибка: While ch <> '27'do beginэто не везде будет компилироваться (зависит от настроек компилятора), ибо некорректно сравнивать символ со строкой... 5. Теперь о главном: у тебя же был список целых? Зачем ты его превратила в список строк? Теперь ты понимаешь, что я имел в виду, когда говорил, что нельзя смешивать интерфейс и логику? Ты изменила базовый тип, потому что он не вписывался в твой интерфейс!!! Не стоит этого делать. Интерфейс должен подстраиваться под логику, а не наоборот. Смотри, что нужно было сделать: typeТо, что я добавил - это процедура отрисовки определенного элемента. Понимаешь? Тебя на этапе создания списка вообще не должно волновать, как именно будет отображаться этот элемент. Для этого есть Интерфейс. Ты ему передала все необходимые данные, и все. А как реализовать конкретно отрисовку этого элемента списка - это ты будешь думать уже потом, на этапе реализации интерфейса. Если он будет графическим, то функция ShowListItem, например, может быть такой: Procedure ShowListItem(yPos, n: integer; p: pt);, будет текстовым - процедура будет другой. НО!!! Изменяться будет только эта процедура! Сам принцип формирования списка остается неизменным, и потому - неприкосновенным... 6. Ну, и еще одно... Нежелательно описывать все переменные, как глобальные. Я уже как-то приводил на форуме пример программы, в которой при простом перемещении нескольких переменных ниже по тексту программы (ближе к концу) еще на этапе компиляции (!!!) выявлялась очень трудноуловимая ошибка, так что я еще раз повторяю: переменная должна быть описана как можно ближе к тому блоку, в котором она используется... Вот, например, у тебя в программе, где описаны переменные var gd, gm: integer;? А используются где? Только в основном блоке? Вот и описывай их там. Во избежание... Конечно, именно эти переменные ничего не меняют в данном случае, это просто пример, но все же... Ну, и, наконец, сама подкорректированная программа: (я не стал добавлять отсутствующие функции, попробуй это сделать сама, если что - обращайся, подскажем как что поправить ) Прикрепленные файлы madam.pas ( 8.49 килобайт ) Кол-во скачиваний: 256 |
volvo |
Сообщение
#3
|
Гость |
Цитата я пока только запустила твою программу, еще не разбиралась, но после поиска она выводит на А что она раньше выводила?экран не обновленный список, а новый элемент. А я ведь говорил: Цитата(volvo @ 7.10.2006 1:55) я не стал добавлять отсутствующие функции, попробуй это сделать сама А то, что она ВООБЩЕ что-то выводит - это, как видно, побочный эффект, от которого, кстати, надо избавляться. Побочных эффектов в программе быть не должно... |
Текстовая версия | 20.04.2024 5:38 |