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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Многосвязные списки, Помощь
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Всем привет.Требуется помощь в написании программы с использованием многосвязных список. Тему плохо понял, поэтому требуется помощь.
Задание: Найти короткую строку.
Сам код программы есть, требуется лишь поспотроить МС -)
 VAR
F:TEXT;
I:WORD;
C:CHAR;
N:WORD;
BEGIN
CLRSCR;
ASSIGN(F,'C:\F1.TXT');
RESET(F);
I:=0;
N:=60000;
WHILE NOT EOF(F) DO
BEGIN
IF EOLN(F) THEN
BEGIN
IF I<N THEN N:=I;
I:=0;
READ(F,C);
READ(F,C);
END;
READ(F,C);
I:=I+1;
END;
IF I<N THEN N:=I;
IF N=60000 THEN I:=0 ELSE I:=N;
WRITE('MIN = ');
WRITELN(I);

END.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Что в твоем понимании МС? Двухсвязный список? Мульти-список? Насколько МНОГОсвязным должен быть список?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Цитата(volvo @ 13.04.2009 21:18) *

Что в твоем понимании МС? Двухсвязный список? Мульти-список? Насколько МНОГОсвязным должен быть список?

я как понял мульти-список
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Что ты хочешь делать с мультисписком? Читать в него весь файл что-ли?
(Кстати, я помню, когда-то выкладывал программу, строящую мультисписок, посмотри в поиске.)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Вот что получилось smile.gif :
Код
USES CRT;
CONST
PATH='C:\F1.TXT';
TYPE
DATA=STRING;
LINK=^RS;
RS=RECORD VAL:DATA;
          LNK:LINK;
          END;
TF=TEXT;
VAR
F:TF;
A:LINK;
B:WORD;

PROCEDURE ADD(VAR A:LINK;B:DATA);
BEGIN
     IF A<>NIL THEN ADD(A^.LNK,B) ELSE
     BEGIN
          NEW(A);
          A^.VAL:=B;
          A^.LNK:=NIL;
     END;
END;

PROCEDURE LOAD(VAR F:TF;VAR A:LINK);
VAR
I:DATA;
BEGIN
     ASSIGN(F,PATH);
     RESET(F);
     A:=NIL;
     WHILE NOT EOF(F) DO
     BEGIN
          READLN(F,I);
          ADD(A,I);
     END;
END;

PROCEDURE OUTPUT(A:LINK);
BEGIN
     WHILE A<>NIL DO
     BEGIN
          WRITELN(A^.VAL);
          A:=A^.LNK;
     END;
END;

PROCEDURE MIN(A:LINK;VAR B:WORD);
VAR
I:WORD;
BEGIN
     B:=256;
     WHILE A<>NIL DO
     BEGIN
          IF LENGTH(A^.VAL)<B THEN B:=LENGTH(A^.VAL);
          A:=A^.LNK;
     END;
     IF B=256 THEN B:=0;
END;

BEGIN
     CLRSCR;
     LOAD(F,A);
     OUTPUT(A);
     MIN(A,B);
     WRITELN;
     WRITELN('MIN=',B);
     READLN;
END.

Токо вот нужно без использования STRING, подравьте чуток - smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Помогите исправить процедуру MIN. Список сформирован, необходимо найти длину короткой строки, используя CHAR.
SES CRT;
CONST
PATH='C:\F1.TXT';
TYPE
DATA=CHAR;
LINK=^RS;
RS=RECORD VAL:DATA;
LNK:LINK;
END;
TF=TEXT;
VAR
F:TF;
A:LINK;
B:WORD;

PROCEDURE ADD(VAR A:LINK;B:DATA);
BEGIN
IF A<>NIL THEN ADD(A^.LNK,B) ELSE
BEGIN
NEW(A);
A^.VAL:=B;
A^.LNK:=NIL;
END;
END;

PROCEDURE LOAD(VAR F:TF;VAR A:LINK);
VAR
I:DATA;
BEGIN
ASSIGN(F,PATH);
RESET(F);
A:=NIL;
WHILE NOT EOF(F) DO
BEGIN
READ(F,I);
ADD(A,I);
END;
END;

PROCEDURE OUTPUT(A:LINK);
BEGIN
WHILE A<>NIL DO
BEGIN
WRITE(A^.VAL);
A:=A^.LNK;
END;
END;

PROCEDURE MIN(A:LINK;VAR B:WORD);
VAR
I:WORD;
BEGIN
B:=256;
WHILE A<>NIL DO
BEGIN
IF LENGTH(A^.VAL)<B THEN B:=LENGTH(A^.VAL);
A:=A^.LNK;
END;
IF B=256 THEN B:=0;
END;

BEGIN
CLRSCR;
LOAD(F,A);
OUTPUT(A);
MIN(A,B);
WRITELN;
WRITELN('MIN=',B);
READLN;
END.


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


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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



PROCEDURE MIN(A:LINK;VAR B:WORD);
VAR
I:WORD;
ch:integer;
BEGIN
B:=256;
WHILE A<>NIL DO
BEGIN
WHILE not eol(A^.Val) DO{либо eol либо eoln}
ch:=ch+1;

IF ch<B THEN B:=ch;
A:=A^.LNK
END;
IF B=256 THEN B:=0;
END;


Понимаеш char это одна буква,по сути ты находиш длинну, считывая строку побуквенно,зачем это делать я хз,но суть того, что я написал, мы берем строку и до тех пор пока не конец накручиваем счетчик ch, потом берем следующую опять накручиваем и сравниваем,меньшее записывает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Цитата(Krjuger @ 27.05.2009 18:28) *


PROCEDURE MIN(A:LINK;VAR B:WORD);
VAR
I:WORD;
ch:integer;
BEGIN
B:=256;
WHILE A<>NIL DO
BEGIN
WHILE not eol(A^.Val) DO{либо eol либо eoln}
ch:=ch+1;

IF ch<B THEN B:=ch;
A:=A^.LNK
END;
IF B=256 THEN B:=0;
END;


Понимаеш char это одна буква,по сути ты находиш длинну, считывая строку побуквенно,зачем это делать я хз,но суть того, что я написал, мы берем строку и до тех пор пока не конец накручиваем счетчик ch, потом берем следующую опять накручиваем и сравниваем,меньшее записывает.

то что char это 1 символ прекрасно понимаю smile.gif
Ну вот задали так...
Но ведь Eoln это ведь только для файловой переменной. а тут список...
Как быть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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


Ну у меня то eoln не для списка,а только для A^.Val,а это string часть,для нее должно работать.а вообще подожди щас проверю.
мда действительно нельзя,извиняюсь.Тогда сделай так.

cch:char;
...........
WHILE A<>NIL DO
BEGIN
read(A^.Val,cch);
WHILE cch<>#13 DO{13-это enter}
begin
read(A^.Val,cch);
.................


так должно работать.

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


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Немного не понял, а почему именно 'enter'?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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


Ну а что ты нажимаеш,когда хочеш перейти на новую строку?Я вроде нажимаю enter.Поэтому логично,что если элемент char равен enter,то ты автоматически попадаеш на новую строку.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


эх, что-то не работает...
пробывал по всякому, но что-то не получается (
Кто сможет сделать за небольшое вознаграждение?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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


За вознаграждение,это уже немного в другую тему.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Krjuger, я понимаю, что
Цитата
Не ругайте сильно,я только учусь.
- но почему ты заставляешь других учиться на твоих ошибках? Еще раз: проверяй свои творения перед публикацией! И учи матчасть.. smile.gif

D1ma, мне как-то странно, что у тебя данные имеют тип char, а не string (как в начале). Можешь пояснить? Ты понимаешь, что LENGTH(A^.VAL) всегда будет давать 1 в этом случае?

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



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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


Действительно,зачем ты тип данных в списке сменил???ведь у тебя теперь в дате всего 1 элемент,мой кусочек тоже рабоать так не станет..Кстати скинь заново весь код с исправления внесенными тобой...а то
"пробывал по всякому, но что-то не получается (" очень мало о чем гворит,ты же не сказал,что изменил

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


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Цитата(Lapp @ 1.06.2009 9:10) *

Krjuger, я понимаю, что - но почему ты заставляешь других учиться на твоих ошибках? Еще раз: проверяй свои творения перед публикацией! И учи матчасть.. smile.gif

D1ma, мне как-то странно, что у тебя данные имеют тип char, а не string (как в начале). Можешь пояснить? Ты понимаешь, что LENGTH(A^.VAL) всегда будет давать 1 в этом случае?

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

Первый вариант рабочий, но как оказалось нельзя использовать STRING, а только CHAR.( до сих пор не пойму почему)
Далее string поменял на char,чуток подправил,посимвольный ввод работает.
Но вот как изменить процедуру min, я так и не додумался...

p.s. Вариант, предложенный Krjuger не работает.
read(A^.Val,cch); это допустимо только же для файлов? а тут список.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(D1ma @ 1.06.2009 15:19) *
read(A^.Val,cch); это допустимо только же для файлов? а тут список.
Да, конечно.
То есть, ты имеешь в виду, что в каждом элементе списка только один символ?
Будь добр, подтверди (а лучше опровергни)), ибо мне все равно не верится в такое диво.
Может, переспросишь препа? или кого-нить еще..

В принципе, ничего особо трудного, ибо концы строк ты тоже заносишь в список.. но странно)).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Дима

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


Цитата(Lapp @ 1.06.2009 15:30) *

Да, конечно.
То есть, ты имеешь в виду, что в каждом элементе списка только один символ?
Будь добр, подтверди (а лучше опровергни)), ибо мне все равно не верится в такое диво.
Может, переспросишь препа? или кого-нить еще..

В принципе, ничего особо трудного, ибо концы строк ты тоже заносишь в список.. но странно)).


Ну получается что только один символ, т.к. char, получается что подтверждаю smile.gif)

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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


В общем я сделал для типа строка,но сразу говорю сделано довольнотаки кустарно,но работает,если надо то могу скинуть,но там я создаю буферный файл в который каждый раз перезаписываю строку,чтоб через чар посчитать его длинну...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(D1ma @ 1.06.2009 17:04) *
Ну получается что только один символ, т.к. char, получается что подтверждаю smile.gif)
Сдается мне, что ты и не пытался уточнить.. Ладно, твое дело, в конце концов.
Лови.
PROCEDURE MIN(A:LINK;VAR B:WORD);
VAR
I:WORD;
BEGIN
B:=256;
i:=0;
WHILE A<>NIL DO begin
case A^.VAL of
#13: ;
#10: begin
if i<b then b:=i;
i:=0
end
else Inc(i)
end;
A:=A^.LNK;
END
END;



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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