Добавил:
БГУИР ПОИТ Дистанционное Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ч2 ИПР2 В5 / ИПР2

.pas
Скачиваний:
1
Добавлен:
27.09.2021
Размер:
6.97 Кб
Скачать
{Создать однонаправленную очередь с числами в диапазоне от –50 до +50.
После создания очереди выполнить индивидуальное задание. В конце работы
все очереди должны быть удалены.
5. Удалить из очереди каждый второй элемент.}
{Написана в PascalABC.NET
GetMem = new
FreeMem = dispose}

Program IPW_2;
uses crt;
type
Tinf=integer; // тип данных, который будет храниться в элементе очереди
List=^TList; // Указатель на элемент типа TList
TList=record // Наименование нашего типа "запись"
data:TInf; // Данные, хранимые в элементе
next:List; // Указатель на следующий элемент списка
end;

procedure AddElem(var spis1:List;znach1:TInf); // Процедура добавления нового элемента в очередь
var
tmp:List;
begin
if spis1=nil then // Проверяем не пуст ли список
begin
new(spis1);
tmp:=spis1;
end
else
begin
tmp:=spis1;
while tmp^.next<>nil do
tmp:=tmp^.next; // Ставим tmp на последний элемент списка
new(tmp^.next);
tmp:=tmp^.next; // Переносим tmp на новый элемент
end;
tmp^.next:=nil; // Зануляем указатель
tmp^.data:=znach1; // Заносим значение
end;

procedure Print(spis1:List); // Процедура печати очереди
begin
if spis1=nil then // Проверка наличия элементов
begin
writeln('Очередь пуста.');
exit;
end;
while spis1<>nil do // Пока указатель stek1 не станет указывать в пустоту
begin
Write(spis1^.data, ' '); //Вывод элементов
spis1:=spis1^.next // Перенос указателя вглубь
end;
end;

Procedure FreeStek(spis1:List); // Процедура удаления очереди, очистка памяти
var
tmp:List;
begin
while spis1<>nil do
begin
tmp:=spis1; // Указатель tmp на вершину стека
spis1:=spis1^.next; // Вершину стека перенесём на следующий за данной вершиной элемент
dispose(tmp); // Освобождаем память занятую под старую вершину
end;
end;

Procedure DelElem(var spis1:List;tmp:List); // Процедура удаления элемента по позиции
var
tmpi:List;
begin // Удаляемый элемент на на вершине стека!
tmpi:=spis1; // Ставим указатель на вершину стека
while tmpi^.next<>tmp do // Доходим до элемента стоящего "перед" тем, который нам следует удалить
tmpi:=tmpi^.next;
tmpi^.next:=tmp^.next; // Указатель элемента переносим на следующий элемент за удаляемым
dispose(tmp);// Удаляем элемент
end;

Procedure DelElemPos(var spis1:List;posi:integer); // Поиск порядкового номера
var
i:integer;
tmp:List;
begin
i:=1; // Счетчик позиции
tmp:=spis1;
while (tmp<>nil) and (i<>posi) do // Пока tmp не укажет в "пустоту" или мы не найдём искомый элемент
begin
tmp:=tmp^.next; // Переходим на следующий элемент
inc(i) // Увеличиваем значение счётчика
end;
DelElem(spis1,tmp); // Переход к процедуре удаления элемента

end;


var
Spis,spis1,tmpl:List;
znach,i,j,t,N:integer;
ch:char;
begin
Spis:=nil;
repeat
clrscr;
Writeln('Выберите желаемое действие:');
Writeln('1. Добавить в очередь число от -50 до +50.');
Writeln('2. Добавить N рандомных чисел в очередь от -50 до +50.');
Writeln('3. Удалить из очереди каждый второй элемент.');
Writeln('4. Просмотреть очередь.');
Writeln('5. Выход (очистка очереди).');
writeln;
ch:=readkey;
case ch of
'1':begin // Добавление 1 числа
write('Введите значение добавляемого элемента(от -50 до +50): ');
readln(znach);
if (znach<(-50)) or (znach>+50) then
repeat
writeln ('Введенно неправильное значение!');
writeln ('Введите значение от -50 до +50:');
readln(znach);
until (znach>=(-50)) and (znach<=+50);
AddElem(Spis,znach);
end;
'2':begin // Добавление нескольких рандомных числе
randomize;
Writeln ('Введите колличество добавляемых числе N:');
readln(N);
for i:=1 to N do
begin
znach:=random(100)-50;
AddElem(Spis,znach);
end;
write('Значания введены!');
readkey;
end;
'3': begin // Удаление каждого второго элемента
spis1:=spis;
while spis1<>nil do
begin
inc(j); // Счетчик числа элементов в очереди
spis1:=spis1^.next
end;
if j=0 then begin // Проверка наличия элементов
writeln('Очередь пустa.');
readkey;
end;
if j=1 then begin // Если нет 2 элемента
writeln ('Очередь содержит всего 1 элемент');
j:=0;
readkey;
end;
if j>1 then
begin
t:= (j div 2); // Порядковые номера удаляемых элементов
znach:=2;
for i:=1 to t do
begin
DelElemPos(Spis,znach);
inc(znach);
end;
Writeln ('Элемент(ы) удалены!');
readkey;
j:=0;
end;
end;
'4':begin // Просмотр очереди
clrscr;
Print(Spis);
readkey;
end;

end;
until ch='5';
FreeStek(Spis); // Очистка памяти
end.
Соседние файлы в папке Ч2 ИПР2 В5