Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Линейный список

Автор: Madam 28.09.2006 17:03

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

Автор: lapp 28.09.2006 17:34

Наташа,
пожалуйста, создавай для новой задачи новую тему - ладно?
А фото лучше поместить в профиле smile.gif

Что касается списков и Randomize - на Форуме уже много раз было. Попробуй воспользоваться http://forum.pascal.net.ru/index.php?act=Search&f=. Задай, например, поиск +линейн* +спис*
Если не найдешь, что нужно, или будет непонятно - спрашивай еще.
Удачи!

Автор: Madam 29.09.2006 13:38



Здравствуйте уважаеммый Андрей!
Спасибо за ответ. Прошу прощения за ошибки - это моя первая попытка общения на форумах.
Я привыкла все делать сама. но изучать программирование самостоятельно довольно трудно, тем более такую
устаревшую китайскую граммоту, как Паскаль. Кого не спросишь - кто не помнит, а кто и не знает. Хотя у нас в
организации программистов больше чем людей. Все пишут на C++ и Java, а Паскаль он и презирают. Досконально перечитала то что выложил Altair о динамических структурах и то что выдал поиск, но конкретно о создании списка Random'ом не нашла. Не соображу как это сделать в цикле и что будет счетчиком цикла?
Кстати, в прикрепленной прграмме Lict.pas у Altair'а не работают процедуры addafter и addbefore, ощущение что ошибка в функции searchel, прошу прощения если ошибаюсь.
Помогите пожалуйста.
Заранее благодарна за любую помощь.

Автор: volvo 29.09.2006 13:43

Вот простейшая процедура создания списка (все, что потребуется - поменять число элементов, и заменить ввод с клавиатуры на Random):
http://forum.pascal.net.ru/index.php?s=&showtopic=10705&view=findpost&p=68300

Автор: lapp 29.09.2006 17:46

Цитата(Madam @ 29.09.2006 10:38) *

Прошу прощения за ошибки

Да какие там ошибки - не нужно никаких извинений smile.gif
Единственная просьба - быть немного попроще, если можно.. Слово "Уважаемый" оставь для служебных записок - тут его могут истолковать противоположным образом.. smile.gif

volvo дал хороший пример. Что касается Randomize, то я подозреваю, что ты имеешь в виду Random (как и пишет volvo). Делается это примерно так..

Вместо строчки
write('item #', i:2, ' = '); readln(X);

вставь, например, вот, что:
X:=Random(1000);

Этот оператор присваивает переменной Х случайное значение в диапазоне 0 - 999 (можешь менять параметр функции Random, чтоб получить желаемый диапазон, но не задавай его больше, чем 65536).

Если ты сделаешь так, числа будут не совсем случайными, они будут одинаковыми при каждом новом запуске программы (хотя друг от друга зависеть как бы не будут). На самом деле это очень удобно на стадии отладки программы. Но если ты хочешь все же получить действительно случайные числа (другие при каждом новом запуске программы), то просто вставь тот самый Randomize до первого вызова Random (например, самым первым оператором программы, то есть сразу после первого begin в теле программы - в данном случае перед вызовом create_list).

Убедись, что тебе понятен смысл каждого значка - иначе в программировании нельзя. Приходи снова с вопросами.
Удачи! smile.gif

Автор: Madam 3.10.2006 12:46

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

Автор: lapp 3.10.2006 15:21

Цитата(Madam @ 3.10.2006 9:46) *

Теперь буду полученный список сортировать и т. д. в графическом режиме.

Отлично. Если что - говори. И даже если все вроде получается - все равно приноси и показывай код. Смеяться над новичками тут не принято, а показать как лучше - это завсегда. smile.gif
Удач!

Автор: Madam 5.10.2006 15:01

Цитата(lapp @ 3.10.2006 14:21) *
Отлично. Если что - говори. И даже если все вроде получается - все равно приноси и показывай код. Смеяться над новичками тут не принято, а показать как лучше - это завсегда. smile.gif
Удач!
Всем привет!
У меня опять вопрос: ошибка в процедуре выбора элемента. Не могу понять, что не так?
Почему программа не проходит весь список, а вставляет элемент после первого?
program CreaChlist;
uses CRT;

type pt = ^elem;
elem = record
info : byte;
next : pt;
end;
var p,p1,q,first:pt;
M:integer;
procedure create_list(var p:pt);
var first,last,curr:pt;
i,X:byte;
begin
first:=nil;
last:=nil;
for i:=1 to 10 do
begin
X:=Random(98)+1;
new(curr);
curr^.info:=X;
curr^.next:=nil;
if first=nil then first:=curr
else last^.next:=curr;
last:=curr;
end;
p:=first;
end;
{___________________________________________________________________________}
procedure Cearch_element(var q:pt); {q -seach element}
var p:pt;
M:integer;
begin
p:=first;
writeln('input element: ');
ReadLn(M);
while ((p^.next<>Nil) and (p^.info<>M))do
p:=p^.next;
if (p^.info<>M) then
q:=Nil
else
q:=p;
end;

{----------------------------------------------------------------------------}
procedure Insert(var q:pt);
var newelem:pt;
X:byte;
begin
New(newelem);
X:=Random(98)+1;
newelem^.info:=X;
newelem^.next:=q^.next;
q^.next:=newelem;
end;
{---------------------------------------------------------------------------}
Begin
clrscr;
Randomize;
create_list(p1);
p:=p1;
while p<>nil do
begin
write(p^.info:4,' ');
p:=p^.next;
end;
writeln;
Cearch_element(q);
Insert(p1);
p:=p1;
while p<>nil do
begin
write(p^.info:4,' ');
p:=p^.next;
end;
ReadKey;
End.

Автор: volvo 5.10.2006 15:10

Цитата
Почему программа не проходит весь список, а вставляет элемент после первого?
Потому, что ты сказала ей делать это:
Insert(p1);


Что, собственно, нужно сделать? Вставить новый элемент после найденного? А если не было найдено ничего?

Автор: Madam 5.10.2006 15:16

Цитата(volvo @ 5.10.2006 14:10)
Что, собственно, нужно сделать? Вставить новый элемент после найденного? А если не было найдено ничего?

Нужно было вставить новый элемент после заданного, заданный считывается но вставляется почемуто после первого. Я не могу сообразить, зациклилась. Подскажите, как, пожалуйста!

Автор: volvo 5.10.2006 15:17

P.S. Кстати, программа вообще аварийно заканчивается (при использовании FPC любые огрехи видны очень четко: чуть что - Segmentation Fault, что в большинстве случаем замалчивается Turbo Pascal-ем, потом выдающим некорректный результат)...

Причина: наличие в программе ГЛОБАЛЬНОЙ переменной First, которая просто НЕ инициализирована... ЛОКАЛЬНАЯ переменная, описанная в Create_List ее перекрывает... Это - ошибка...

Автор: Madam 5.10.2006 15:32

Цитата(volvo @ 5.10.2006 14:17) *
Причина: наличие в программе ГЛОБАЛЬНОЙ переменной First, которая просто НЕ инициализирована... ЛОКАЛЬНАЯ переменная, описанная в Create_List ее перекрывает... Это - ошибка...

Сделала first локальной - результат тот же
Program Seachlst;
uses CRT;

type pt = ^elem;
elem = record
info : byte;
next : pt;
end;
var p,p1,q{,first}:pt;
M:integer;
{----------------------------------------------------------------------------}
procedure create_list(var p:pt);
var first,last,curr:pt;
i,X:byte;
begin
first:=nil;
last:=nil;
for i:=1 to 10 do
begin
X:=Random(98)+1;
new(curr);
curr^.info:=X;
curr^.next:=nil;
if first=nil then first:=curr
else last^.next:=curr;
last:=curr;
end;
p:=first;
end;
{___________________________________________________________________________}
procedure Cearch_element(var q:pt); {q -seach element}
var first,p:pt;
M:integer;
begin
first:=nil;
p:=first;
writeln('input element: ');
ReadLn(M);
while ((p^.next<>Nil) and (p^.info<>M))do
p:=p^.next;

Может дело в последней строчке?

Автор: Atos 5.10.2006 15:58

Я сейчас пытаюсь разобраться в программе... nea.gif похоже, ты не осознаёшь разницы между глобальными и локальными переменными... тебе надо разобраться с областями видимости. В частности, в твоей процедуре, которая должна производить поиск, зачем-то создаёшь новый, незаполненный список, и начинаешь пытаться в нём искать.

Цитата
Сделала first локальной
имхо, надо наоборот - убрать локальную first. и не только её... сейчас разберусь, скажу точнее...


И вот это еще:
Цитата
Insert(p1);


Тогда уж, наверное, логичнее будет Insert(q);

Автор: Madam 5.10.2006 16:01

Цитата(Atos @ 5.10.2006 14:58) *

Я сейчас пытаюсь разобраться в программе... nea.gif похоже, ты не осознаёшь разницы между глобальными и локальными переменными... тебе надо разобраться с областями видимости. В частности, в твоей процедуре, которая должна производить поиск, зачем-то создаёшь новый, незаполненный список, и начинаешь пытаться в нём искать.
имхо, надо наоборот - убрать локальную first. и не только её... сейчас разберусь, скажу точнее...

Совершенно верно, с глобальными и локальными у меня вечная путаница.

Автор: volvo 5.10.2006 16:06

Цитата
Сделала first локальной
blink.gif И что? First, которая БЫЛА в Create_List (да, да, именно была, при выходе из Create_List стек разрушился, и этой переменной больше нет) никак не связана с First, которая существует в Cearch_element (эта переменная вообще содержит случайное значение, т.е. "мусор")...

Выходов два:
1. ЛИБО работать с глобальной переменной (так проще, но я не люблю глобальные переменные, поэтому ...)
2. ЛИБО работать не с процедурами, а с функциями возвращающими результат своей работы в вызывающую часть программы...

Автор: Madam 5.10.2006 16:16

Цитата(volvo @ 5.10.2006 15:06) *

blink.gif И что? First, которая БЫЛА в Create_List (да, да, именно была, при выходе из Create_List стек разрушился, и этой переменной больше нет) никак не связана с First, которая существует в Cearch_element (эта переменная вообще содержит случайное значение, т.е. "мусор")...

Выходов два:
1. ЛИБО работать с глобальной переменной (так проще, но я не люблю глобальные переменные, поэтому ...)
2. ЛИБО работать не с процедурами, а с функциями возвращающими результат своей работы в вызывающую часть программы...

Самое смешное, что я ее совсем убрала из Seach_el, а программа работает как и прежде!

Автор: Atos 5.10.2006 16:19

В общем, если уж работать с глобальным списком, тогда надо внести следующие исправления:
first и last сделать глобальными и убрать их объявления из всех подпрограмм;
p1 убрать нафик, в данном контексте программы эта переменная вообще не нужна, только запутывает.
И всё-таки заменить Insert(p1); на Insert(q);

Автор: Madam 5.10.2006 16:20

Цитата(Atos @ 5.10.2006 14:58) *

Я сейчас пытаюсь разобраться в программе... nea.gif похоже, ты не осознаёшь разницы между глобальными и локальными переменными... тебе надо разобраться с областями видимости. В частности, в твоей процедуре, которая должна производить поиск, зачем-то создаёшь новый, незаполненный список, и начинаешь пытаться в нём искать.
имхо, надо наоборот - убрать локальную first. и не только её... сейчас разберусь, скажу точнее...
И вот это еще:


Тогда уж, наверное, логичнее будет Insert(q);

Ничего подобного! Так она вообще ничего не ищет и не вставляет.

Автор: volvo 5.10.2006 16:21

Смотри, насколько все проще при использовании функций:

function Cearch_element(const first: pt): pt;
var
p: pt;
M:integer;
begin
Cearch_element := nil;

write('input element: '); ReadLn(M);

p := first;
while ((p^.next<>nil) and (p^.info<>M))do p:=p^.next;

if (p^.info = M) then Cearch_element := p;
end;

...

Begin
clrscr;
Randomize;
create_list(p1);

p:=p1;
while p<>nil do begin
write(p^.info:4,' ');
p:=p^.next;
end;
writeln;

q := Cearch_element(p1);
{ Я бы еще добавил проверку, не вернулся ли NIL }
Insert(q);

p:=p1;
while p<>nil do begin
write(p^.info:4,' ');
p:=p^.next;
end;
ReadKey;
End.

Все остальное - без изменений...

Автор: Atos 5.10.2006 16:32

Цитата
Ничего подобного! Так она вообще ничего не ищет и не вставляет.

Значит, где-то ещё ошибка.
Смотри, перед этим ты вызвала Cearch_element(q);
Значит, q должно указывать на нужный тебе элемент, так? И значит вставлять тебе нужно именно после q, а не после непонятного указателя p1, который вообще-то у тебя всегда указывает на начало списка, как и first

Автор: Madam 5.10.2006 16:53

Цитата(Atos @ 5.10.2006 15:32) *

Значит, где-то ещё ошибка.
Смотри, перед этим ты вызвала Cearch_element(q);
Значит, q должно указывать на нужный тебе элемент, так? И значит вставлять тебе нужно именно после q, а не после непонятного указателя p1, который вообще-то у тебя всегда указывает на начало списка, как и first

Володя, Миша спасибо большое с функцией получилось,(как-то все время, а времени то всего один прошедший семестр и предыдущий курсовик, пользовалась процедурами) переменные попробую исправить.
Не прощаюсь насовсем, предполагаю, что будет еще проблемма.
I'll be back!

Автор: Madam 6.10.2006 16:07

Цитата(Madam @ 5.10.2006 15:53) *
Володя, Миша спасибо большое с функцией получилось,(как-то все время, а времени то всего один прошедший семестр и предыдущий курсовик, пользовалась процедурами) переменные попробую исправить.
Не прощаюсь насовсем, предполагаю, что будет еще проблемма.
I'll be back!
Are anybody here?
Привет!
Вот та самая проблемма, которую я вчера предполагала, так сама и не додумалась.
Надо все эти действия со списком (поиск, вставка) проделать в графическом режиме.
С выводом начального списка получилось без проблем, а вот со вставкой не получается.
Не успевают написать маленький пример, вставляю всю программу.

Автор: volvo 6.10.2006 16:40

Цитата
Надо все эти действия со списком (поиск, вставка) проделать в графическом режиме.
А знаешь, почему у тебя это не получается или получается настолько сложно? Потому, что нельзя ни в коем случае перемешивать логику работы программы и ее интерфейс. Это - святой принцип, отступать от которого нельзя никогда.

Представь, что тебе понадобится немного изменить интерфейс. НО он у тебя настолько переплетен с логикой, что ты невольно будешь менять и ее, чего тебе совсем не хотелось бы. Обратное тоже верно... Я попробую покумекать над этой программой, и отделить "мух от котлет", сегодня к вечеру отпишусь, что получилось...

Автор: Madam 6.10.2006 16:45

Цитата(volvo @ 6.10.2006 15:40) *

А знаешь, почему у тебя это не получается или получается настолько сложно? Потому, что нельзя ни в коем случае перемешивать логику работы программы и ее интерфейс. Это - святой принцип, отступать от которого нельзя никогда.

Представь, что тебе понадобится немного изменить интерфейс. НО он у тебя настолько переплетен с логикой, что ты невольно будешь менять и ее, чего тебе совсем не хотелось бы. Обратное тоже верно... Я попробую покумекать над этой программой, и отделить "мух от котлет", сегодня к вечеру отпишусь, что получилось...

Спасибо, Володя.
Но, my time is over!
Прийду на сайт только завтра.
Я вот сомневаюсь можно-ли в поиске сравнивать таким образом переменные типа string?

Автор: volvo 7.10.2006 6:55

Значит, так... 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 килобайт ) Кол-во скачиваний: 151

Автор: lapp 7.10.2006 9:56

Цитата(Madam @ 6.10.2006 13:45) *

Я вот сомневаюсь можно-ли в поиске сравнивать таким образом переменные типа string?

madam, что касается сравнения string'ов, то есть определенные правила. Копирую кусок из руководства к ТР:
Цитата
Операции отношения =, о, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов (см. табл.4.1 и прил.2). Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением СНR(0) .
Следующие операции отношения дадут значение TRUE:
'''' < ' . '
'А' > '1'
'Turbo' <' Turbo Pascal'
'Паскаль' >'Turbo Pascal'

Но кроме того, у меня совет общего характера..
Если у тебя возникает сомнение относительно применения чего-то, то наиболее простой путь - это попробовать. Быстренько варганишь прогу типа такого (в данном случае) :
Код
var
  s1,s2:string;
begin
  s1:='aa'; s2:='bb';
  WriteLn(s1<>s2);
end.

- и прогоняешь ее. Потом уточняешь значения параметров или редактируешь конструкцию, перекомпилируешь - и снова..
Я понимаю, что до этого нетрудно догадаться, но иногда все же не приходит в голову.. smile.gif

Автор: Madam 7.10.2006 14:00

Володя, ты просто волшебник, а я еще только учусь. Но все равно, со стыда чуть не сгорела.
Спасибо большое, теперь можно думать дальше, а то совсем головешку переклинило.
Кстати, я пока только запустила твою программу, еще не разбиралась, но после поиска она выводит на
экран не обновленный список, а новый элемент.

Автор: volvo 7.10.2006 14:20

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

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


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

Автор: Madam 7.10.2006 14:52

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

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

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

Там есть процедура Insert,
она-то и должна была выводить обновленный список.

Автор: volvo 7.10.2006 15:18

Должна была и выводила - это разные вещи. Запусти свой первоначальный вариант, и посмотри, что именно процедура Insert делала...

Автор: Madam 7.10.2006 15:42

Цитата(volvo @ 7.10.2006 14:18) *

Должна была и выводила - это разные вещи. Запусти свой первоначальный вариант, и посмотри, что именно процедура Insert делала...

Да то же ничего хорошего не делала. Или тоже новый элемент или последний элемент списка.
Ладно, как раз сижу и разбираюсь.
Что тебе сказать по поводу твоей программы: - НЕТ ПРЕДЕЛА СОВЕРШЕНСТВУ! wink.gif
В прошлом семестре сдала подобный корявый курсовик, так препод так и не поверила, что я сама
сделала, а такой шикарный и показывать страшно. Может чуть-чуть подпортить? Это шутка юмора такая. wub.gif

Автор: volvo 7.10.2006 16:01

Подпорть blum.gif

Я все равно через пару часов выложу новую версию... rolleyes.gif

Автор: volvo 7.10.2006 18:57

Вот и очередное обновление...

Что изменено...
1. Еще один повторяющийся кусок выделен в отдельную процедуру:

  procedure P(i: integer; Ch: Char);
begin
SetFillStyle(SolidFill, White);
Bar(156, 5 + GetY(i) - 4, 184, 5 + GetY(i) + 9);
SetColor(Black);
OutTextXY(160, 5 + GetY(i), Ch);
SetColor(DarkGray);
SetFillStyle(SolidFill, DarkGray);
Bar(195, 5 + GetY(i) - (10 + (4 - i)*5), GetMaxX-5, 5 + GetY(i) - (10 + (4 - i)*5) + 30);
end;
, что позволило "разгрузить" текст программы...

2. Немного изменен способ обработки вводимых значений: теперь (я пока имею в виду только пункт меню "Paste Cell") для того, чтобы вставить новый элемент списка после заданного, нужно ввести значение заданного элемента (1 или 2 цифры), и нажать Enter.

3. Кстати, теперь вставка нового элемента в список работает как положено yes2.gif (остальные функции еще не реализованы)...

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

Вот программа:
Прикрепленный файл  madam2.pas ( 8.23 килобайт ) Кол-во скачиваний: 356


P.S.
unsure.gif А чего это я один в этой теме? Больше никому не интересно?

Автор: Madam 8.10.2006 10:08

Нет, Volvo, ты не один, мне очень-очень интересно.
Надо же, я тебя вчера всего десять минут не дождалась. Думала ты уже ушел отдыхать. unsure.gif
И сегодня "... Чуть свет уж на ногах - и я у ваших ног."
Вчерашнее толь-только переварила, а ты уже новое накузюкал. Буду разбираться поновой.
Спасибо большое-пребольшое. { Мой личный смайлик: "Бурные аплодисменты, преходящие в продолжительную авацию."}

Автор: Madam 8.10.2006 13:39

Volvo, я не поняла, зачем ты делаешь проверку на ноль значения V,
CheckValueZero? При вводе искомого элемента на ноль проверяет CheckZero,
а генерирует новый элемент Random(98)+1, так что вроде 0 неоткуда взяться, или я туплю?
И еще была переменная для значения нового элемента M, а ты ее задублировал V?

Автор: volvo 8.10.2006 14:24

Цитата
При вводе искомого элемента на ноль проверяет CheckZero
А проверку на пользователя, НЕ вводящего цифры, а сразу пробующего нажать Enter, по-твоему, делать уже не надо? wink.gif

Цитата
И еще была переменная для значения нового элемента M, а ты ее задублировал V?
Посмотри внимательно, ГДЕ описана переменная M, и ГДЕ я проверяю CheckValueZero...

Автор: Madam 8.10.2006 14:32

Цитата(volvo @ 8.10.2006 13:24) *

А проверку на пользователя, НЕ вводящего цифры, а сразу пробующего нажать Enter, по-твоему, делать уже не надо? wink.gif

Посмотри внимательно, ГДЕ описана переменная M, и ГДЕ я проверяю CheckValueZero...

Все понятно.

Автор: Madam 8.10.2006 16:22

Volvo, я тут умру сейчас совсем.
удалить най денный элемент. слава Volvo, получилось. А потом пытаюсь вывести удаленный (4 кнопка), опять выводится всяка дрянь.
А как поменять местами первый и последний элемент совсем не соображу.
Пожаааалуйста, последний рывок, и я от тебя отстану (может быть навряд ли).
Прикрепляю переделанный код. mega_chok.gif

Автор: volvo 8.10.2006 16:45

Цитата
А потом пытаюсь вывести удаленный (4 кнопка), опять выводится всяка дрянь

Ну, так правильно... Тебе, чтобы вывести только что удаленный элемент достаточно сделать так:
           4:
begin

if not CheckValueZero(2, M) then begin
SetFillStyle(SolidFill, White);
Bar(195, 265, 225, 280);
str(M, s); { <--- !!! Этого достаточно !!! }
SetColor(Black);
OutTextXY(200, 270, s);
end
end;
, не правда ли?

P.S.
Стоп, стоп...

Не в этом проблема. Все в самом меню остается как и было, там все верно... Ошибка - здесь:
procedure Delafter(var q:pt;var temp:pt);{Delete cell after number}
var n:byte;

begin
temp:= q^.next; { <-- Ты запомнила значение ? }
q^.next:=q^.next^.next;
temp^.next:= nil;

temp := p1; { <-- И тут же его разрушила ??? }
n := 1;
while temp<>nil do begin

ShowListItem(195, n, temp);
inc(n);

temp:=temp^.next;

end;
end;


Вот так исправляем:
procedure Delafter(var q:pt;var temp:pt);{Delete cell after number}
var T: pt;
n:byte;

begin
temp:= q^.next;
q^.next:=q^.next^.next;
temp^.next:= nil;

T := p1;
n := 1;
while T<>nil do begin

ShowListItem(195, n, T);
inc(n);

T:=T^.next;
end;
end;

Автор: Madam 8.10.2006 16:59

Цитата(volvo @ 8.10.2006 15:45) *

...не правда ли?

Нет не правда. M это элемент, который стоит перед удаленным.
Написано, что пока мы не сделали Dispose, к удаленному элементу сохраняется доступ и поэтому я его и передала по ссылке и обозвала спец-но так: temp? wacko.gif

Автор: volvo 8.10.2006 17:09

Читай следующий пост...

Автор: Madam 8.10.2006 17:15

Не поняла, что и где читать?

Автор: volvo 8.10.2006 17:26

Читай мой предыдущий ответ, я исправил его...

Автор: Madam 8.10.2006 17:37

Цитата(volvo @ 8.10.2006 15:45) *

Вот так исправляем:

Все получилось, забыла в меню обратно исправить

Автор: Madam 8.10.2006 19:04

Цитата(Madam @ 8.10.2006 16:37) *

Все получилось, забыла в меню обратно исправить

Да здравствует Volvo!!! На последнем дыхании все таки справилась с последней процедурой сама!
Но я тебя обманула, что больше приставать не буду. Вы ведь не только с Паскалем помогаете?
С вопросами по Visual Basik приходить можно?
А это лично для Volvo:

I kiss you, severe KISA,
For your help in my teaser!! wub.gif

Прикрепляю оклнчательный вариант: