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

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

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

 
 Ответить  Открыть новую тему 
> вставить элемент в I-ю позицию списка, не получается :(
Wait
сообщение 17.05.2005 12:42
Сообщение #1


Новичок
*

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

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


Здравствуйте, у меня тут прога со списком с ООП...
Не получается вставить в процедуре obj.insert со второго по шестой элемент...
Надо ввести номер позиции для ввода и что вводить...
Получилось ввести только первый элемент...
Проверьте, пожалуйста, а то уже плохо мне от этой проги... :molitva:
Код

program ex1;
uses crt;
type p=^el;
el=record
data:byte;
next:p;
end;
obj=object
root,last,l:p;
id:string[5];
constructor init;
procedure build;
procedure output;
procedure insert;
end;
constructor obj.init;
begin
root:=nil;
last:=nil;
new(l);
end;
procedure obj.build;
var eli:p;i:byte;
begin
randomize;
write('input list id: ');
readln(id);
writeln('list ',id,':');
new(root);
root^.data:=random(10);
eli:=root;
for i:=2 to 5 do begin
new(eli^.next);
eli^.next^.data:=random(10);
eli:=eli^.next
end;
eli^.next:=nil;
end;
procedure obj.output;
var eli:p;
begin
eli:=root;
while eli<>nil do begin
writeln(eli^.data);
eli:=eli^.next;
end;
end;
procedure obj.insert;
var eli,mem:p;d,i,k:byte;
begin
write('input element to insert: ');
readln(d);
write('input the position for inserting of ',d,': ');
readln(i);
if (i=1) then begin
new(eli);
eli^.data:=d;
eli^.next:=root;
if (eli^.next=nil) then eli^.next^.next:=nil;
root:=eli;
end else if (i=2) then begin
mem:=eli^.next;
new(eli^.next);
eli:=eli^.next;
eli^.data:=d;
eli^.next:=mem
end else begin
for i:=3 to 5 do eli:=eli^.next;
mem:=eli^.next;
new(eli^.next);
eli:=eli^.next;
eli^.data:=d;
eli^.next:=mem
end;
end;
var list:obj;
begin
list.build;
list.output;
list.insert;
writeln('---------------');
list.output;
readln
end.


Прикрепленные файлы
Прикрепленный файл  12_10.PAS ( 1.33 килобайт ) Кол-во скачиваний: 131
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 17.05.2005 13:09
Сообщение #2


Профи
****

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

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


В процедуре вставки элемента списка сразу увидел пару оплошностей:

1) при вставке перед первым элементом списка root надо выкинуть бесполезную строку
if (eli^.next=nil) then eli^.next^.next:=nil;
Скорее там должна быть проверка на пустой список, если root=nil (пустой список), то тогда первым элементом будет тот, что вставляем: root:=eli;

2) при вставке после root элемента нужно сместиться на i позиций, поэтому использование цикла
for i:=3 to 5 do eli:=eli^.next;
совершенно бессмысленно, ибо мы теряем значение пременной i.
Нужно взять другую переменную и сместиться i-2 раз. Например:
eli:=root;
for j:=1 to (i-2) do eli:=eli^.next;


Сообщение отредактировано: hiv - 17.05.2005 13:12


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Wait
сообщение 17.05.2005 13:20
Сообщение #3


Новичок
*

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

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


Код

procedure obj.insert;
var eli,mem:p;d,i,k:byte;
begin
write('input element to insert: ');
readln(d);
write('input the position for inserting of ',d,': ');
readln(i);
if (i=1) then begin
new(eli);
eli^.data:=d;
eli^.next:=root;
if (eli^.next=nil) then eli^.next^.next:=nil;
root:=eli;
end else begin
eli:=root;
for k:=1 to k-2 do eli:=eli^.next;
mem:=eli^.next;
new(eli^.next);
eli:=eli^.next;
eli^.data:=d;
eli^.next:=mem
end;
end;


так? не получается все равно... Пожалуйста, напишите, как точно надо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Wait
сообщение 17.05.2005 13:32
Сообщение #4


Новичок
*

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

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


Исправьте, пожалуйста, а то у меня уже голова не варит :molitva: :molitva: :molitva:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 17.05.2005 14:07
Сообщение #5


Профи
****

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

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


Учите матчасть, я уже все разжевал... Учите циклы... А еще лучше отоспитесь и под подушку положите книжку великого писателя Вирта!


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.05.2005 16:24
Сообщение #6


Гость






Wait, вопрос на засыпку: Ты действительно хочешь изобрести велосипед, а не пользоваться готовым решением, которое есть в FAQ-е? (Не то, которое в теме "Все о динамических структурах данных", ибо там без ООП, а то, которое здесь: FAQ: Объектно-ориентированное программирование). Основываясь на этом объекте можно дописать 1 (!) функцию, и он будет работать так, как тебе нужно. Ну, если не хочешь - я просто предложил... rolleyes.gif
 К началу страницы 
+ Ответить 
Wait
сообщение 17.05.2005 17:46
Сообщение #7


Новичок
*

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

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


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

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

 



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