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

К примеру, твоя последняя задача:
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) Поиск и обмен максимального и минимального элементов списка - снова процедурка (проделжение в комментарии) :

чем помочь? что ты уже сделал? что не получается?
или за тебя написать надо?
или за тебя написать надо?
Мсб- Страхование
я написал программу создающую, но вот не знаю как менять местами элементы в цепочке, нигде не нашёл даже теории, не то что разобранного примера. мне написать как поменять 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) Лень. Уж извини.
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) Лень. Уж извини.
Мсб- Страхование
Это массив, а нужна цепочка (т.е. направленный список), я знаю принцип но не могу реализовать, там надо поменять связи (т.е. ссылку указывающую на следующий элемент), но не знаю как это сделать практически, а с массивом это легкая задачка, но она мне не нужна
Мсб- Страхование
Мне бы правильно расписать 1 задачку а по ней я сделаю 3, но только у меня не получается поменять указатели связей.
Похожие вопросы
- Помогите решить задачку на python или pascal
- Помогите решить задачку простенькую.
- Помогите с задачкой на Pascal'e (МАССИВЫ)!
- Друзья, помогите с задачкой на Pascal
- помогите решить задачку, на VBA для Excel
- Кто разбирается в программировании? помогите решить задачку!
- Пожалуйста, помогите решить задачку по информатике...
- Помогите решить задачу в Pascal!
- Помогите решить задачи на Pascal...
- Помогите решить задачу на Pascal!)
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;
Ну вот и всё.
Обмен свершился!