Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Конспект лекций (Delphi).pdf
Скачиваний:
63
Добавлен:
27.05.2015
Размер:
1.2 Mб
Скачать

30

type

Mas : array[1..100] of integer; var

X,n : integer; A : Mas;

B : Modul1.Mas; begin

...

InputMas(A,n); {Ошибка} InputMas(B,n); {Нет ошибки}

X := 5; {Иcпользуется переменная основной программы} Modul1.X := 10; {Используется переменная модуля}

...

end.

1.20 Операторы прерывания

В Pascal имеется четыре оператора, позволяющие прервать выполнение текущего блока: continue, break, exit, halt(X). Первый из них позволяет прервать выполнение тела цикла и перейти к следующей итерации, второй – немедленно закончить выполнение цикла, третий – немедленно выйти из текущего блока (если текущим блоком является основная программа, то закончить выполнение программы), четвертый – немедленно выйти из программы, при этом в качестве параметра задается целое значение кода выхода, которое может быть проанализировано внешней программой, запустившей данную.

Пример 1 (найти первое i, при котором

 

 

x

2i

( 1)

i

 

 

 

 

(2i)!

 

 

меньше заданного числа e):

procedure TForm1.Button1Click(Sender: TObject); var

i,j : integer; x,Sum,F,S,R,E : real;

begin

x := ???;

E := ???;

i := 1; Sum := 0; repeat

F := 1;

for j := 2 to 2*i do F := F*j;

if odd(i) then S := -1

else

S := 1;

R := S*exp(2*i*ln(x))/F; if R<E then

Break

31

else

Sum := Sum+R; until False;

SumEdit.Text := FloatToStr(Sum); end;

Пример 2 (найти первый отрицательный элемент в массиве):

procedure TForm1.Button1Click(Sender: TObject); var

i,n,Sum : integer;

A : array[1..100] of integer; s : string;

begin

n := ???;

for i := 1 to n do A[i] := ???;

Sum := 0;

{Выведем сразу ответ для случая, когда отрицательных чисел нет} s := 'Отрицательных чисел нет';

for i := 1 to n do begin

if A[i]>=0 then Continue;

s := 'Первое отрицательное число: '+IntToStr(A[i]); Break;

end; <вывод s>;

end;

1.21 Комментарии

Комментарии вводятся в программу для описания ее блоков или отдельных операторов. Использование комментариев позволяет облегчить разбор исходного текста программы для людей, не являющихся ее разработчиками, а также быстрее вспомнить разработчику идеи, используемые в программе, если он долго к ней не обращался. Также комментарии могут использоваться для временного отключения некоторых фрагментов программ при отладке.

Существует три типа комментариев:

пара {} – при обнаружении в программе символа { компилятор считает комментарием все, что будет расположено до символа };

пара (* *) – при обнаружении в программе комбинации символов (* компилятор считает комментарием все, что будет расположено до комбинации символов *);

пара // – при обнаружении в программе пары символов // компилятор считает комментарием все, что будет расположено далее в этой строке.

32

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

Внутри одного комментария может располагаться комментарий другого типа. При этом, на работу исходного комментария он не оказывает никакого влияния.

1.22 Указатели

При работе со статическими переменными может возникнуть ситуация, когда места, отведенного под хранение данных окажется недостаточно для решаемой задачи (Borland Pascal). Одним из способов увеличения объема доступной памяти может быть разделение программы на модули, каждый из которых имеет свой сегмент данных. Однако наиболее кардинальным решением является использование в программе динамически выделяемой памяти и указателей.

В отличии от статической переменной, в переменной-указателе хранятся не сами данные, а адрес (указание) места, где их можно найти (привести графическую интерпретацию). Указатели бывают нетипизированные и типизированные. Для обозначения первых служит зарезервированный тип pointer, для вторых – значок “^” с указанием типа, например:

Чтобы указать, что переменная-указатель не ссылается на ячейку памяти, используется ключевое слово nil;

var

p : pointer;

pI1, pI2 : ^integer; pD : ^double;

I1, I2 : integer; D : double;

begin

I1 := 5;

I2 := 7;

D := 5.4;

pI1 := addr(I1); pI2 := addr(I2); pD := addr(D);

pI1^ := 10; {I1 = 10} pI2^ := 12; {I2 = 12} pD^ := 6.7 {D = 6.7} pI1 := pI2;

pI1^ := 16; {I2 = 16};

p := pI1; {p ссылается на I2}

pD := p; {pD ссылается на I2, что допустимо, но может привести

кошибке}

pD := pI2; {ошибка, так как указатели типизированные}

p := nil; {указатель p теперь никуда не указывает} end.

Таким образом, использование типизированных указателей может предотвратить ошибки, но снижает гибкость программы.

33

Использование указателей наиболее оправданно при работе со сложными структурами с применением динамического выделения памяти. Для выделения памяти и ее освобождения могут быть использованы пары New Dispose,

GetMem FreeMem с применением SizeOf. procedure New(var p : pounter)

procedure Dispose(var p : pointer)

procedure GetMem(var p : pointer; Size : integer) procedure FreeMem(var p : pointer; Size : integer) function SizeOf(X) : integer

Приведение типов:

type

PInteger = ^integer; var

i : integer; p : pointer;

begin

i := 7;

p := addr(i);

pinteger(p)^ := 12; {i = 12} integer(p^) := 14; {i = 14}

end.

Пример 1 (работа с памятью при обработке одномерных массивов):

type

PMas = ^Mas;

Mas = array[1..10] of integer; var

p1, p2 : PMas; n : integer;

begin New(p1); n := 5;

GetMem(p2, SizeOf(integer)*n);

p2^[3] := 5;

Dispose(p1);

FreeMem(p2, SizeOf(integer)*n); end.

Пример 2 (работа с памятью при обработке многомерных массивов на примере упорядочивания столбцов матрицы, вариант 1):

type

PMas = ^Mas;

Mas : array[1..1] of integer; var

n,m,i,j,Temp : integer; Data : PMas;

begin

n := ???;

34

m := ???;

GetMem(Data,SizeOf(integer)*n*m); for i := 1 to n do

for j := 1 to m do Data^[(i-1)*m+j] := ???;

for j := 1 to m do begin

i := 1; while i<n do

if Data^[(i-1)*m+j]<Data^[i*m+j] then begin

Temp := Data^[(i-1)*m+j]; Data^[(i-1)*m+j] := Data^[i*m+j]; Data^[i*m+j] := Temp;

if i>1 then dec(i)

else inc(i)

end else

inc(i);

end;

for i := 1 to n do for j := 1 to m do

<вывод Data^[(i-1)*m+j]>;

FreeMem(Data,SizeOf(integer)*n*m);

end;

Пример 3 (работа с памятью при обработке многомерных массивов на примере упорядочивания столбцов матрицы, вариант 2):

type

PMas1 = ^Mas1;

Mas1 = array[1..1] of integer; PMas2 = ^Mas2;

Mas2 := array[1..1] pf PMas1; var

Data : PMas2; n,m,i,j,k,MaxI,Temp : integer;

begin

n := ???;

m := ???;

GetMem(Data,SizeOf(PMas1)*n); for i := 1 to n do

GetMem(Data^[i],SizeOf(integer)*m); for i := 1 to n do

for j := 1 to m do Data^[i]^[j] := ???;

for j := 1 to m do begin

for k := 1 to n-1 do begin

MaxI := k;