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

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

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

> Динамические структуры, Проверьте, работает некоректно...
Akella
сообщение 31.03.2009 16:35
Сообщение #1


Пионер
**

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

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


Вот условие:
Создать в динамической памяти односвязный линейный список(цепочка) из n элементов. Заполнение информационных полей элементов списка(в моей проге это data) можно провести генератором случ. чисел. Реализировать процедуры: добавления элемента в любую точку списка, удаление, вывода на экран полученной в куче числ. посл-ти.
И еще одна процедура по пребразованию последовательности из x1,x2,x3,...xn надо получить (x1-xn),(x2-xn),...(xn-1 -xn) воть!

Теперь что у меня не работает:
1. выводит на экран на 1 элемент меньше (не знаю почечу)
2. процедура вставки некоректно работает при замене 1-го элемента
3. процедура удаления также не работает при удалении 1-го элемента
4. процедура преобразования отнимает не последний элемент, а какой попадется=(( вот... кто-чем сможет - помогите!!! rolleyes.gif

program lab_12_1;
uses crt;

type
point=^element;
element=record
Data:integer;
Next:point;
end;

var
P,H,PBegin:point;
i,n:integer;
MemBegin:longint;
Simvol:char;

procedure Vivod(P:point);
begin
writeln('Tekushaya posledivatelnost:');
repeat
write(P^.data,' ');
P:=P^.Next;
until
P^.Next=Nil;
end;

procedure Vstavka(var Pred:point; Nomer,Chislo:integer);
var
i:integer;
Vst:point;
begin
if Nomer=1 then begin
New(Vst);
Vst^.Data:=Chislo;
Vst^.Next:=Pred;
Pred:=Vst;
end
else for i:=1 to Nomer-2 do begin
Pred:=Pred^.Next;
end;
New(Vst);
Vst^.Data:=Chislo;
Vst^.Next:=Pred^.Next;
Pred^.Next:=Vst;
end;

procedure Udalenie(var Pred:point; Nomer:integer);
var
i,Chislo:integer;
Ud:point;
begin
if Nomer=1 then begin
Ud:=Pred;
Pred:=Pred^.Next;
Chislo:=Ud^.data;
Dispose(Ud);
end
else for i:=1 to Nomer-2 do begin
Pred:=Pred^.Next;
end;
Ud:=Pred^.Next;
Pred^.Next:=Pred^.Next^.Next;
Chislo:=Ud^.Data;
Dispose(Ud);
end;

procedure NovPosl(var P:point);
var
PBegin:point;
Chislo:integer;
begin
PBegin:=P;
while P^.Next <> Nil do begin
P:=P^.Next
end;
Chislo:=P^.Data;
P:=PBegin;
while P^.Next <> Nil do begin
P^.Data:=P^.Data-Chislo;
P:=P^.Next;
end;
end;



begin {----------------------------}
clrscr;
randomize;

New(P);
PBegin:=P;
MemBegin:=MemAvail;

write('Vvedite kol-vo elementov: '); readln(N);

for i:=1 to n do begin
P^.Data:=random(100);
P^.Next:=Nil;
if i<n then begin
H:=P;
New(P);
H^.Next:=P;
end;
end;
p:=PBegin;
Vivod(PBegin);
N:=0;
writeln;
writeln;

repeat begin
writeln('Najmit:');
writeln('D - udalit element');
writeln('A - dobavit element');
writeln('F - preobrazovanie');
writeln('E - vihod');
Simvol:=readkey;
case Simvol of
'd': begin
write('Vvedite poziciu elementa: ');
read(N);
P:=PBegin;
Udalenie(P,N)
end;
'a': begin
write('Vvedite poziciu novogo elementa: ');
read(n);
P:=PBegin;
Vstavka(P,N,0)
end;
'f': begin
P:=PBegin;
NovPosl(P);
end;
end;
clrscr;
P:=PBegin;
Vivod(P);
end;
until Simvol='e';
end.



если что спрашивайте, постараюсь ответить... однако не так быстро..

Сообщение отредактировано: Akella - 31.03.2009 16:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
volvo
сообщение 31.03.2009 17:06
Сообщение #2


Гость






Цитата
1. выводит на экран на 1 элемент меньше (не знаю почечу)
Потому, что выводишь неправильно. Сравни то, что было у тебя с этим:
procedure Vivod(P:point);
begin
writeln('Tekushaya posledivatelnost:');
while p <> nil do begin
write(P^.data,' ');
P:=P^.Next;
end;
end;

. Внутри NovPosl - то же самое, ты не обрабатываешь последний элемент. Почему тебя все время тянет сделать while p^.next = nil ? А последний (тот, у которого p^.next нулевой) ты обрабатывать не собираешься? Цикл же закончится как только ты с предпоследнего элемента переместишься к последнему, еще ДО обработки data...

Цитата
4. процедура преобразования отнимает не последний элемент, а какой попадется
3 раза запускал, все прекрасно с этим. Это ты просто последнего не видел (выше написано, почему), но он как раз отнимается.

Подозреваю, что и 2, 3 пункты тоже сбоят по схожей причине, проверь все циклы...
 К началу страницы 
+ Ответить 
Akella
сообщение 1.04.2009 1:00
Сообщение #3


Пионер
**

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

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


сеодня на паре подумаю над 2 и 3...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Akella
сообщение 1.04.2009 13:00
Сообщение #4


Пионер
**

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

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


все.... нашел ошибки... в условных операторах не хватало begin'а
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 18.06.2025 14:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"