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

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

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

> простая задача на очереди, я решал но она не работает
AlexSt
сообщение 17.05.2007 5:55
Сообщение #1


Новичок
*

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

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


Даны две непустые очереди; адреса начала и конца первой равны Р1 и Р2, а второй Р3 и Р4. Очереди содержат одинаковое количество элементов. Объединить очереди в одну, в которой элементы исходных очередей чередуются(начиная с первого элемента первой очереди). Вывести указатели Р5 и Р6 на начало и конец полученной очереди. Операции выделения и освобождения памяти не использовать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 8)
Lapp
сообщение 17.05.2007 6:32
Сообщение #2


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

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

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


Покажи, что у тебя получилось. Поправим.


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


Гость






А! вот так:
program ochered_n15;
type och=^elem;
elem=record
data:char;
next:och
end;
var p1,p2,p3,p4,p5,p6:och;
im,i1,i2:char;
j,k:integer;
procedure v(b,e:och;i:char);
var x:och;
begin x^.data:=i;
x^.next:=nil;
if b=nil then b:=x
else e^.next:=x;
e:=x
end;
procedure iz(b,e:och;i:char);
var x:och;
begin if b<>nil then
begin i:=b^.data;
x:=b;
b:=b^.next;
dispose(x)
end;
end;
begin j:=-1; k:=0;
repeat readln(i1);
v(p1,p2,i1);
j:=j+1;
until i1='?';
iz(p1,p2,i1);
repeat readln(i2);
v(p3,p4,i2);
k:=k+1;
until j=k;
repeat

iz(p1,p2,im);
v(p5,p6,im);
writeln(im);
iz(p3,p4,im);
v(p5,p6,im);
writeln(im);
k:=k+1;
until p1=nil;
end.


М
При публикации программного текста, пожалуйста, используй теги: выделить текст блоком и выбрать нужный тип кода в меню CODE над окном ввода.
Лопарь

 К началу страницы 
+ Ответить 
Lapp
сообщение 17.05.2007 10:53
Сообщение #4


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

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

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


Ну что ж, давай разбираться..
Что должна делать процедура V? Вставлять новый элемент в очередь?
Я попробую показать, что она делает
procedure v(b,e:och;i:char);
var
x:och;
begin
x^.data:=i;
x^.next:=nil;
if b=nil then b:=x else e^.next:=x;
e:=x
end;

Ты заводишь локальную переменную х - ссылку, и начинаешь работать с ней, даже не взяв под нее память. Это делать недопустимо - это раз. Два - то, что сама переменная х тебе не нужна. Если тебе передается в процедуру конец списка (списки ты называешь очередями), то с ним и работай.
Еще одна ошибка: для того, чтоб вывести параметры из процедуры, их надо описывать как var...
С процедурой Iz я вообще ничего не понял.
Короче, вот рабочий код - попробуй в нем разобраться. Я пытался писать как можно ближе к твоей программе. Если что неясно - спрашивай..
program ochered_n15;
type
och=^elem;
elem=record
data:char;
next:och
end;
var
p1,p2,p3,p4,p5,p6,q1,q2,t1,t2:och;
im,i:char;
j,k:integer;

procedure v(var p:och; i:char);
begin
New(p);
p^.data:=i;
p^.next:=nil;
end;

procedure Show(p:och);
begin
while p<>nil do begin
Write(p^.data,' ');
p:=p^.next
end;
WriteLn
end;

begin
j:=1;
WriteLn('Введите первый список, "?" в конце:');
ReadLn(i);
V(p1,i);
p2:=p1;
repeat
readln(i);
v(p2^.next,i);
p2:=p2^.next;
j:=j+1;
until i='?';
k:=1;
WriteLn('Введите второй список, ',j,' элементов:');
ReadLn(i);
V(p3,i);
p4:=p3;
for k:=2 to j do begin
readln(i);
v(p4^.next,i);
p4:=p4^.next;
end;
WriteLn('Первый список:');
Show(p1);
WriteLn('Второй список:');
Show(p3);
p5:=p1;
p6:=p4;
q1:=p1;
q2:=p3;
while q1<>nil do begin
t1:=q1^.next;
t2:=q2^.next;
q1^.next:=q2;
q2^.next:=t1;
q1:=t1;
q2:=t2
end;
WriteLn('Результирующий список:');
Show(p5);
WriteLn('Начало: ',Seg(p5),':',Ofs(p5));
WriteLn('Конец: ',Seg(p6),':',Ofs(p6));
ReadLn;
end.



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


Новичок
*

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

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


Смотрите у меня почти такая же задача только элементы каждой из очередей упорядочены по возрастанию (в направлении от начала очереди к концу), Объеденить очереди в одну с сохранением упорядочености элементов а в остальном такое же. Как мне зделать эту упорядоченность?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.05.2007 1:11
Сообщение #6


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

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

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


Цитата(Ilius @ 17.05.2007 23:33) *

Смотрите у меня почти такая же задача только элементы каждой из очередей упорядочены по возрастанию (в направлении от начала очереди к концу), Объеденить очереди в одну с сохранением упорядочености элементов а в остальном такое же. Как мне зделать эту упорядоченность?

Идешь по первому списку, сравнивая его элементы с первым элементом второго. Как только получил инверсию - переключаешь указатели (хвост первого делаешь вторым, а второй ставишь на место хвоста первого).


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


Новичок
*

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

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


ОГРОМНОЕ спасибо! только я не понял что выполняют пеерменные q1, q2, t1 & t2. Ещё нужно избавиться от '?' в конце первой очереди(соответственно элементов во второй на 1 меньше)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ilius
сообщение 20.05.2007 21:29
Сообщение #8


Новичок
*

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

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


Что то я не понимаю что и куда мне надо вставить чтобы элементы каждой из очередей были упорядочены по возрастанию и объеденить очереди в одну с сохранением упорядочености. blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 22.05.2007 11:58
Сообщение #9


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

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

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


AlexSt, а также Ilius, в программировании списов очень хорошо помогают картинки.
Список (очередь, как хотите называйте) изображаем как последовательность прямоугольников, можно каждый поделить на две части: данные и указатель. Из части "указатель" торчит стрелка, которая указывает на следующий элемент этого списка. Нарисовать такую штуку на бумажке очень полезно для понимания.
Вот, например, я делал такой рисунок в теме Циклический сдвиг . Начальное состояние стрелок рисуешь одним цветом, а конечное - другим. После такого наглядного представления все становится проще. Попробуйте. Если все равно будет неясно - приходите..


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

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

 



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