Другие языки программирования и технологии

помогите решить задачки по Pascal

1) Составит программу, создающую список S и выводящую его после некоторой обработки: S - цепочка действительных чисел. Найти MAX и MIN списка и поменять их местами.
2) Написать программу формирующую очередь L, считывая данные из файлов F1 и F2 поочередно.
3) Составить программу, создающую двунаправленный список (дек) D и выводящую его после некоторой обработки. Создание и выводдека оформить в виде процедур. D - список действительных чисел. Найти MAX и MIN списка и поменять их местами.
Работать с указателями гораздо проще, чем кажется на первый взгляд.
К примеру, твоя последняя задача:
1) Создадим двунаправленный список

type Stype = ^rStype;
rStype = record
D : Real; { Действительное число }
Pred, Next : Stype; { Указатели на предыдущий и следующий элементы в цепочке }
end;

2) Нужно объявить глобальную переменную, которая будет ссылаться на начало или конец цепочки (в принципе без разницы)

var First : Stype;

3) В начале программы эта ссылка должна быть обязательно обнулена

First := nil;

4) Теперь тебе нужно организовать цикл по заполнению списка данными.
Для упрощения читаемости кода, операции с добавлением нового элемента в список вынесем в отдельную процедуру.

procedure IncludeS(D : Real);
var Cur : Stype;
begin
New(Cur); { новый элемент }
Cur^.D := D; { занесём в него число }
Cur^.Pred := First; { первый элемент списка - это предыдущий данному элементу }
if First <> nil then { в списке уже были элементы до этого }
First^.Next := Cur; { ...значит следующий - это новый }
First := Cur; { Теперь новый - это первый в списке }
First^.Next := nil; { Перед первым пока ни чего нет }
end;

Для тех, кто не в теме, это кажется аброкодаброй.
Но, если набросать на листочке схемку, то всё становится ясно!

Это схема для случая, когда начальное значение First = nil.
А ниже, когда список уже существует и First ссылается на крайний элемент списка.


(Собственно цикл по вызову процедуры сможешь организовать сам ;-)

5) Ну, наверное, от тебя требуется вывести список на экран.
Для этого снова воспользуемся процедурой:

procedure OutS;
var Cur : Stype;
begin
if First = nil then begin WriteLn('< список пуст >'); Exit; end;
{ First ссылается на последний элемент, который мы заносили в список. }
{ Поэтому установим Cur на другой конец списка }
Cur := First; while Cur^.Pred <> nil do Cur := Cur^.Pred;
{ А теперь будем выводить через пробел }
repeat Write(#32, Cur^.D:0:5); Cur := Cur^.Next; until Cur = nil; WriteLn;
end;

Вот так просто!
Комментариев больше, чем программы!

6) Поиск и обмен максимального и минимального элементов списка - снова процедурка (проделжение в комментарии) :

АК
Александр Крикунов
76 506
Лучший ответ
Александр Крикунов procedure SwapSminSmax;
var Cur, Min, Max, Tmp : Stype;
begin
if First = nil then Exit; { Не чего менять }
Min := First; Max := First; { Предположим, что мин и макс - это элемент списка First }
Cur := First^.Pred; { Курсор на предыдущий элемент списка }
while Cur nil do begin
if Cur^.D < Min^.D then Min := Cur else if Cur^.D > Max^.D then Max := Cur;
Cur := Cur^.Pred;
end;
{ Ну вот! Макс и мин найдены. Теперь обмен! }
Cur := Min^.Next; Tmp := Max^.Next; { Обменяем сначала справа (см. рисунок) }
if Cur = nil then Max^.Next = nil else begin Max^.Next := Cur; Cur^.Pred := Max; end;
if Tmp = nil then Min^.Next = nil else begin Min^.Next := Tmp; Tmp^.Pred := Min; end;
Cur := Min^.Pred; Tmp := Max^.Pred; { Теперь обменяем слева }
if Cur = nil then Max^.Pred := nil else begin Max^.Pred := Cur; Cur^.Next := Max; end;
if Tmp = nil then Min^.Pred := nil else begin Min^.Pred := Tmp; Tmp^.Next := Min; end;
end;

Ну вот и всё.
Обмен свершился!
Мсб- Страхование Конечно, спасибо, полезная информация, но только я методом проб и ошибок умудрился её сделать)
чем помочь? что ты уже сделал? что не получается?
или за тебя написать надо?
СШ
Саша Шатунов
68 014
Мсб- Страхование я написал программу создающую, но вот не знаю как менять местами элементы в цепочке, нигде не нашёл даже теории, не то что разобранного примера. мне написать как поменять 2 элемента в цепочке и деке. Могу скинуть код формирования цепочки и дека, а я потом сам там найду макс и мин и поменяю местами, у меня только загвоздка как нужно сменить связи.
1)

uses crt;
var
s: array[1..100] of integer;
max, min, nmin, nmax: integer;
i, n: byte;
begin
clrscr;
randomize; // заполнение массива рандомное.
writeln('Vvedite n: ');
readln(n);
for i := 1 to n do
begin
s[ i ] := random(71) - 70; // рандомные числа от -70 до 70.
if i = 1 then
begin
max := s[1];
min := s[1];
end;
if s[ i ] > max then
begin
max := s[ i ];
nmax := i;
end;
if s[ i ] < min then
begin
min := s[ i ];
nmin := i;
end;
end;
buf := a[nmin];
a[nmin] := a[nmax];
a[nmax] := buf;
writeln;
for i := 1 to n do
write(a[ i ], ' ');
readln;
end.

2) и 3) Лень. Уж извини.
Esengeldi Suinov
Esengeldi Suinov
3 999
Мсб- Страхование Это массив, а нужна цепочка (т.е. направленный список), я знаю принцип но не могу реализовать, там надо поменять связи (т.е. ссылку указывающую на следующий элемент), но не знаю как это сделать практически, а с массивом это легкая задачка, но она мне не нужна
Мсб- Страхование Мне бы правильно расписать 1 задачку а по ней я сделаю 3, но только у меня не получается поменять указатели связей.