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

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

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

 
 Ответить  Открыть новую тему 
> вставить элемент в I-ю позицию списка, не получается :(
сообщение
Сообщение #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 килобайт ) Кол-во скачиваний: 234
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

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

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


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


Профи
****

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

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


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


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


Гость






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


Новичок
*

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

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


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

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

 





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