Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_ЛР_Информатика_2.doc
Скачиваний:
0
Добавлен:
01.01.2020
Размер:
419.33 Кб
Скачать

2. Теоретические сведения

Повторить теоретические сведения лабораторной работы №2-6.

Рассмотрим способ вставки и удаления элементов списка по ключу на примере.

Пример.

Составить программу, которая формирует список, добавляет в него произвольное количество компонент, выполняет вставку и удаление компоненты по ключу, а затем читает и выводит весь список на экран дисплея. В качестве данных взять строку символов. Ввод данных – с клавиатуры дисплея, признак конца ввода - строка символов END (Приложение 4).

Для чтения и вставки компоненты по ключу необходимо выполнить поиск компоненты с заданным ключом:

pCKey:=pBegin;

while (pCKey<>NIL) and (Key<>pCKey^.D) DO

pCKey:=pCKey^.pNext;

Здесь Key - ключ, тип которого совпадает с типом данных компоненты. После выполнения этих операторов указатель pСKey будет определять компоненту с заданным ключом или такая компонента не будет найдена.

Пусть pCKey определяет компоненту с заданным ключом. Вставка новой компоненты выполняется процедурой InsComp (Приложение 4).

Для удаления компоненты с заданным ключом необходимо при поиске нужной компоненты помнить адрес предшествующей:

pCKey:=pBegin;

while (pCKey<>NIL) and (Key<>pCKey^.D) do

begin

pPreComp:=pCKey;

pCKey:=pCKey^.pNext

end;

Здесь указатель pCKey определяет компоненту с заданным ключом, указатель pPreComp содержит адрес предыдущей компоненты.

Удаление компоненты с ключом Key выполняется процедурой DelComp (Приложение 4).

4.ОФОРМЛЕНИЕ ОТЧЕТА

Отчет о работе должен содержать номер, название и цель работы, ответы на контрольные вопросы, текст программы и результат выполнения программы.

5.КОНТРОЛЬНЫЕ ВОПРОСЫ

1. type ref:^integer;

var p,q:ref;

Что будет выдано на печать в результате выполнения операторов?

p^:=q^;

if p=q then p:=nil else if p^=q^ then q:=p;

if p=q then q^:=4;writeln(p^);

2. Почему объекты (переменные), создаваемые процедурой new и уничтожаемые процедурой dispose, называют динамическими? Почему им не дают имена?

3. Допустимы ли в языке Паскаль нижеприведенные конструкции? Ответ обосновать.

  1. p^[2]

  2. q^+2

  3. r^^

6. ВАРИАНТЫ ЗАДАНИЙ

№ задания

1

2

3

4

1

2

3

4

№ по журналу

Создать однонаправленный список, элементы списка  целые числа, признак окончания ввода элементов  число 0.

1. Удалить из списка первый отрицательный элемент.

2. Продублировать в списке все числа, равные введенному с клавиатуры числу.

3. Удалить из списка все вхождения введенного с клавиатуры числа.

4. Добавить в список за каждым отрицательным числом его абсолютное значение.

{построение графика функции} Приложение 1.

program groffunc;

uses Graph,Crt;

var

x1,x2:real;{границы изменения аргумента функции}

y1,y2:real;{границы изменения значения функции }

x:real;{аргумент функции }

y:real;{значение функции в точке х}

dx:real;{приращение аргумента }

l,b: integer;{левый нижний угол области вывода графика}

w,h: integer; {ширина и высота области вывода графикa}

mx,my:real;{масштаб по осям Х и Y }

x0, y0: integer; { точка - начало координат }

st: string;{ изображение числа }

grDriver: Integer;

grMode: Integer;

ErrCode: Integer;

Function f(x:real):real;

begin

{f:=2*Sin(x)*exp(x/5) ;}

f:=sin(x);

end;

BEGIN

grDriver := Detect;

InitGraph(grDriver, grMode,'f:\bp\bgi') ;

ErrCode := GraphResult;

if ErrCode <> grOk then Halt(1);

l:=10;b:=450;h:=400;w:=400;

x1:=0;

x2:=25;

dx:=0.01;

{ найдем максимальное и минимальное значения

функции на отрезке [x1,x2] }

y1:=f(x1); { минимум }

y2:=f(x1); { максимум }

x:=x1;

repeat

y:=f(x);

if y<y1 then y1:=y;

if y>y2 then y2:=y;

x:=x+dx;

until (x>=x2) ;

my:=h/abs(y2-y1) ;

mx:=w/abs(x2-x1) ;

{ оси }

x0:=1;

y0:=b-Abs(Round(y1*my)) ;

Line(1,b,1,b-h) ;

Line(x0,y0,x0+w,y0) ;

Str(y2:5:1,st) ;

OutTextXY(1+5,b-h,st) ;

Str(y1:5:1,st) ;

OutTextXY(1+5,b,st) ;

{ построение графика }

x:=x1;

repeat

y:=f(x);

PutPixel(x0+Round(x*mx),y0-Round(y*my),red) ;

x:=x+dx;

delay(20);

until (x>=x2);

Readln;

CloseGraph;

END.

unit massiv;{объявление массива и его заполнение} Приложение 2.

interface{раздел объявлений}

type matric=array[1..50] of real; {библиотечные типы}

var a,b:array[1..50] of matric;{библиотечные переменные}

n,m,i,j:byte;

implementation {раздел реализации}

END.

Unit load;

interface {раздел объявлений}

uses massiv;{использованные при объявлениях модули}

procedure vvod;{библиотечная процедура}

implementation {раздел реализации}

uses crt;{использованные при реализации модули}

procedure vvod;

begin

writeln('Введите массив.');

writeln('Размерность массива:');

write('число строк n=');readln(n);

write('число столбцов m=');readln(m);

for i:=1 to n do

for j:=1 to m do

begin

write('a(',i,',',j,')=');readln(a[i,j]);

end;

writeln('Массив заполнен.');

end;

BEGIN {блок инициализации}

ClrScr; {очистка экрана}

END.

unit nahodka; {модуль, содержащий процедуры

нахождения наибольшего по модулю эл-та

исходной матрицы и формированию новой

матрицы путем деления эл-тов исходной

матрицы на этот элемент}

interface {раздел объявлений}

uses massiv,load;{использованные при объявлениях модули}

var t:real; {библиотечные переменные}

procedure max; {библиотечная процедура}

procedure delenie;{библиотечная процедура}

implementation {раздел реализации}

procedure max;

begin

for i:=1 to n do

for j:=1 to m do

if abs(a[i,j])>abs(t) then t:=a[i,j];

end;

procedure delenie;

begin

for i:=1 to n do

for j:=1 to m do

b[i,j]:=a[i,j]/t;

end;

END.

program realiz;

uses crt,massiv,load,nahodka;

label 1,2;

BEGIN

vvod;

max;

delenie;

j:=1;

1:for i:=1 to n do begin

write(a[i,j]:5:2,' ');writeln;end;

j:=j+1;

if (j<m) or (j=m) then goto 1;

writeln;

j:=1;

2:for i:=1 to n do begin

write(b[i,j]:5:2,' ');writeln;end;

j:=j+1;

if (j<m) or (j=m) then goto 2;

writeln;

repeat until keypressed;

END.

Приложение 3.

Program Primer;

uses Crt;

type

Alfa= integer;

PComp= ^Comp;

Comp= record

D:Alfa;

pNext:PComp

end;

var

pBegin, pEnd, pAux, pFlag: PComp;

n: Alfa;

{начальное формирование списка}

Procedure CreateLL(var pBegin,pEnd: PComp; var n: Alfa);

begin

New(pBegin);

pBegin^.pNext:=NIL;

pBegin^.D:=n;

pEnd:=pBegin

end;

{добавление компонент в конец списка}

Procedure AddLL(var pEnd: PComp; var n: Alfa);

var pAux: PComp;

begin

New(pAux);

pAux^.pNext:=NIL;

pEnd^.pNext:=pAux;

pEnd:=pAux;

pEnd^.D:=n

end;

BEGIN

ClrScr;

writeln(' ВВЕДИ ЧИСЛО ');

readln(n);

CreateLL(pBegin,pEnd,n);

repeat

writeln('ВВЕДИ ЧИСЛО ');

readln(n);

AddLL(pEnd,n)

until n=0;

ClrScr;

writeln(' ***** ВЫВОД ИСХОДНОГО СПИСКА *****');

pAux:=pBegin;

repeat

writeln(pAux^.D);

pAux:=pAux^.pNext;

until pAux=NIL;

END.

Приложение 4.

Program LISTLINKED;

uses Crt;

type

Alfa= String[10];

PComp= ^Comp;

Comp= record

sD:Alfa;

pNext:PComp

end;

var

pBegin, pEnd, pAux, pCKey, pPreComp: PComp;

sC, sKey: Alfa;

bCond: Boolean;

Procedure CreateLL(var pBegin,pEnd: PComp; var sC: Alfa);

begin

New(pBegin);

pBegin^.pNext:=NIL;

pBegin^.sD:=sC;

pEnd:=pBegin

end;

Procedure AddLL(var pEnd: PComp; var sC: Alfa);

var pAux: PComp;

begin

New(pAux);

pAux^.pNext:=NIL;

pEnd^.pNext:=pAux;

pEnd:=pAux;

pEnd^.sD:=sC

end;

Procedure Find(var sKey: Alfa; var pBegin,pCKey,pPreComp: PComp;

var bCond: Boolean);

begin

pCKey:=pBegin;

while (pCKey <> NIL) and (sKey <> pCKey^.D) do

begin

pPreComp:=pCKey;

pCKey:=pCKey^.pNext

end;

if (pCKey = NIL) and (sKey <> pCKey^.sD) then bCond:=FALSE

else bCond:=TRUE

end;

Procedure InsComp(var sKey,sC: Alfa);

var pAux:PComp;

begin

Find(sKey,pBegin,pCKey,pPreComp,bCond);

New(pAux);

pAux^.sD:=sC;

pAux^.pNext:=pCKey^.pNext;

pCKey^.pNext:=pAux

end;

Procedure DelComp(var sKey: Alfa; var pBegin: PComp);

begin

Find(sKey,pBegin,pCKey,pPreComp,bCond);

pPreComp^.pNext:=pCKey^.pNext

end;

begin

ClrScr;

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

CreateLL(pBegin,pEnd,sC);

repeat

writeln('ВВЕДИ СТРОКУ ');

readln(sC);

AddLL(pEnd,sC)

until sC='END';

writeln(' ***** ВЫВОД ИСХОДНОГО СПИСКА *****');

pAux:=pBegin;

repeat

writeln(pAux^.sD);

pAux:=pAux^.pNext;

until pAux=NIL;

writeln;

writeln('ВВЕДИ КЛЮЧ ДЛЯ ВСТАВКИ СТРОКИ');

readln(sKey);

writeln('ВВЕДИ ВСТАВЛЯЕМУЮ СТРОКУ');

readln(sC);

InsComp(sKey,sC);

writeln;

writeln('ВВЕДИ КЛЮЧ УДАЛЯЕМОЙ СТРОКИ');

readln(sKey);

DelComp(sKey,pBegin);

writeln;

writeln(' ***** ВЫВОД ИЗМЕНЕННОГО СПИСКА *****');

pAux:=pBegin;

repeat

writeln(pAux^.sD);

pAux:=pAux^.pNext;

until pAux=NIL

end.

36

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]