IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Линейный список, Создать с помщью Randomize
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Женский
Реальное имя: Наталья

Репутация: -  1  +


Здравствуйте!
Помогите пожалуйста далеко не юной зочнице справится с кусовиком.
Как с помощью Randomize создать линейный список из десяти положительных целых чисел?
Заранее благодарю.

Сообщение отредактировано: Madam -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Значит, так... wacko.gif Вот я и пришел с первоначальными результатами оптимизации. Именно первоначальными, ибо до окончательных еще очень далеко, можно еще улучшить программу, и сделать ее гораздо более читаемой.

Смотри, что я сделал:

1. Все циклы вида:
j:=0;
While j<=10 do begin
j:=j+1;
SetFillStyle(SolidFill, White);
Bar(x+(r+l)*(j-1),115,x+(l+r)*(j-1)+l,130);
end;

заменены на циклы:
SetFillStyle(SolidFill, White);
For j := 1 To 11 Do
Bar(x+(r+l)*(j-1),115,x+(l+r)*(j-1)+l,130);

Почему? Потому, что во-первых они проще читаются, следовательно и находить недочеты и неполадки будет проще. Ну, а во-вторых - SetFillStyle делать на каждой итерации совершенно необязательно, достаточно это сделать один раз перед циклом...

2. Однотипные действия, вроде:
if(ch='0') then begin
SetColor(LightRed);
OutTextXY(200,120, 'You input 0. Input another number');
end
выделены в отдельные функции...

3. Немного подправлена сама организация работы с меню: вместо того, чтобы хранить все время текущую Y-позицию, я храню "индекс", т.е. порядковый номер текущего (в смысле, выбранного в данный момент) элемента. Это позволяет мне во-первых, избавиться от совершенно ненужных констант:
const
Y1=40;
Y2=115;
Y3=190;
Y4=265;
Y5=340;
Y6=415;
(зачем нужны 6 констант, если можно вычислить значение в любой момент по текущему индексу и стартовому значению?), и во-вторых, заменить булевские переменные n1, n2, n3 на массив
n: array[1 .. 3] of boolean (ну, что поделать, я привык к структурированным программам smile.gif )

Естественно, я не мог оставить в программе и вот это:
   OutTextXY(10,45,'Create new list');
OutTextXY(10,120,'Paste cell');
OutTextXY(10,195,'Delete cell');
OutTextXY(10,270,'Find cell ');
OutTextXY(10,345,'Move last cell');
OutTextXY(10,420,'Exit');
- строки были записаны в массив и выведены в простом цикле...

4. Блок обработки расширенных клавиш (то, что ты называешь HARD) внесен в основной Case:
Case ReadKey Of
#0:
begin
{ Здесь - расширенные клавиши }
end;
#27: ; { а здесь начинается обработка обычных ... }
End;
Кстати, у тебя была ошибка:
While ch <> '27'do begin
...
end;
это не везде будет компилироваться (зависит от настроек компилятора), ибо некорректно сравнивать символ со строкой...

5. Теперь о главном: у тебя же был список целых? Зачем ты его превратила в список строк? Теперь ты понимаешь, что я имел в виду, когда говорил, что нельзя смешивать интерфейс и логику? Ты изменила базовый тип, потому что он не вписывался в твой интерфейс!!! Не стоит этого делать. Интерфейс должен подстраиваться под логику, а не наоборот. Смотри, что нужно было сделать:

type
pt = ^elem;
elem = record
info: Integer; { <--- Ничего не меняем !!! }
next : pt;
end;

procedure Create_list(var p, first, last, curr:pt); {Creation of new list}
var n, A:byte;
begin
first := nil; last := nil;
for n:=1 to 10 do begin
A:=Random(99)+1;
new(curr);

curr^.info := A;
curr^.next := nil;
ShowListItem(45, n, curr); { <--- Единственное, что добавить !!! }

if first=nil then first:=curr
else last^.next:=curr;

last:=curr;
end;
p:=first;
end;
То, что я добавил - это процедура отрисовки определенного элемента. Понимаешь? Тебя на этапе создания списка вообще не должно волновать, как именно будет отображаться этот элемент. Для этого есть Интерфейс. Ты ему передала все необходимые данные, и все. А как реализовать конкретно отрисовку этого элемента списка - это ты будешь думать уже потом, на этапе реализации интерфейса. Если он будет графическим, то функция ShowListItem, например, может быть такой:
Procedure ShowListItem(yPos, n: integer; p: pt);
var s: string;
begin
str(p^.info, s);

SetColor(Black);
OutTextXY(GetX(n) + 5, yPos, s);
end;
, будет текстовым - процедура будет другой. НО!!! Изменяться будет только эта процедура! Сам принцип формирования списка остается неизменным, и потому - неприкосновенным...

6. Ну, и еще одно... Нежелательно описывать все переменные, как глобальные. Я уже как-то приводил на форуме пример программы, в которой при простом перемещении нескольких переменных ниже по тексту программы (ближе к концу) еще на этапе компиляции (!!!) выявлялась очень трудноуловимая ошибка, так что я еще раз повторяю: переменная должна быть описана как можно ближе к тому блоку, в котором она используется... Вот, например, у тебя в программе, где описаны переменные
var gd, gm: integer;
? А используются где? Только в основном блоке? Вот и описывай их там. Во избежание... Конечно, именно эти переменные ничего не меняют в данном случае, это просто пример, но все же...

Ну, и, наконец, сама подкорректированная программа:
(я не стал добавлять отсутствующие функции, попробуй это сделать сама, если что - обращайся, подскажем как что поправить yes2.gif )


Прикрепленные файлы
Прикрепленный файл  madam.pas ( 8.49 килобайт ) Кол-во скачиваний: 256
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата
я пока только запустила твою программу, еще не разбиралась, но после поиска она выводит на
экран не обновленный список, а новый элемент.
А что она раньше выводила?

А я ведь говорил:
Цитата(volvo @ 7.10.2006 1:55)
я не стал добавлять отсутствующие функции, попробуй это сделать сама


А то, что она ВООБЩЕ что-то выводит - это, как видно, побочный эффект, от которого, кстати, надо избавляться. Побочных эффектов в программе быть не должно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Женский
Реальное имя: Наталья

Репутация: -  1  +


Цитата(volvo @ 7.10.2006 13:20) *

А что она раньше выводила?

А я ведь говорил:
А то, что она ВООБЩЕ что-то выводит - это, как видно, побочный эффект, от которого, кстати, надо избавляться. Побочных эффектов в программе быть не должно...

Там есть процедура Insert,
она-то и должна была выводить обновленный список.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Madam   Линейный список   28.09.2006 17:03
lapp   Наташа, пожалуйста, создавай для новой задачи нову…   28.09.2006 17:34
Madam   Здравствуйте уважаеммый Андрей! Спасибо за отв…   29.09.2006 13:38
lapp   Прошу прощения за ошибки Да какие там ошибки - не…   29.09.2006 17:46
Madam   Андрей, спасибо большое, все получилось. Теперь бу…   3.10.2006 12:46
lapp   Теперь буду полученный список сортировать и т. д.…   3.10.2006 15:21
Madam   Отлично. Если что - говори. И даже если все врод…   5.10.2006 15:01
volvo   Вот простейшая процедура создания списка (все, что…   29.09.2006 13:43
volvo   Потому, что ты сказала ей делать это:Insert(p1); …   5.10.2006 15:10
Madam   Что, собственно, нужно сделать? Вставить новый эле…   5.10.2006 15:16
volvo   P.S. Кстати, программа вообще аварийно заканчивает…   5.10.2006 15:17
Madam   Причина: наличие в программе ГЛОБАЛЬНОЙ переменной…   5.10.2006 15:32
Atos   Я сейчас пытаюсь разобраться в программе... :nea:…   5.10.2006 15:58
Madam   Я сейчас пытаюсь разобраться в программе... :nea…   5.10.2006 16:01
Madam   Я сейчас пытаюсь разобраться в программе... :nea…   5.10.2006 16:20
volvo   :blink: И что? First, которая БЫЛА в Create_List …   5.10.2006 16:06
Madam   :blink: И что? First, которая БЫЛА в Create_List …   5.10.2006 16:16
Atos   В общем, если уж работать с глобальным списком, то…   5.10.2006 16:19
volvo   Смотри, насколько все проще при использовании функ…   5.10.2006 16:21
Atos   Значит, где-то ещё ошибка. Смотри, перед этим ты …   5.10.2006 16:32
Madam   Значит, где-то ещё ошибка. Смотри, перед этим ты …   5.10.2006 16:53
Madam   Володя, Миша спасибо большое с функцией получилось…   6.10.2006 16:07
volvo   А знаешь, почему у тебя это не получается или полу…   6.10.2006 16:40
Madam   А знаешь, почему у тебя это не получается или пол…   6.10.2006 16:45
lapp   Я вот сомневаюсь можно-ли в поиске сравнивать так…   7.10.2006 9:56
volvo   Значит, так... :wacko: Вот я и пришел с первонача…   7.10.2006 6:55
Madam   Володя, ты просто волшебник, а я еще только учусь.…   7.10.2006 14:00
volvo   А что она раньше выводила? А я ведь говорил: я не…   7.10.2006 14:20
Madam   А что она раньше выводила? А я ведь говорил: А т…   7.10.2006 14:52
volvo   Должна была и выводила - это разные вещи. Запусти …   7.10.2006 15:18
Madam   Должна была и выводила - это разные вещи. Запусти…   7.10.2006 15:42
volvo   Подпорть :blum: Я все равно через пару часов вы…   7.10.2006 16:01
volvo   Вот и очередное обновление... Что изменено... 1. …   7.10.2006 18:57
Madam   Нет, Volvo, ты не один, мне очень-очень интересно.…   8.10.2006 10:08
Madam   Volvo, я не поняла, зачем ты делаешь проверку на н…   8.10.2006 13:39
volvo   А проверку на пользователя, НЕ вводящего цифры, а …   8.10.2006 14:24
Madam   А проверку на пользователя, НЕ вводящего цифры, а…   8.10.2006 14:32
Madam   Volvo, я тут умру сейчас совсем. удалить най денны…   8.10.2006 16:22
volvo   Ну, так правильно... Тебе, чтобы вывести только ч…   8.10.2006 16:45
Madam   ...не правда ли? Нет не правда. M это элемент, к…   8.10.2006 16:59
Madam   Вот так исправляем: Все получилось, забыла в мен…   8.10.2006 17:37
Madam   Все получилось, забыла в меню обратно исправить …   8.10.2006 19:04
volvo   Читай следующий пост...   8.10.2006 17:09
Madam   Не поняла, что и где читать?   8.10.2006 17:15
volvo   Читай мой предыдущий ответ, я исправил его...   8.10.2006 17:26


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 11:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name