Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_po_informatike_delphi+++++++.pdf
Скачиваний:
31
Добавлен:
29.02.2016
Размер:
872.19 Кб
Скачать

23

n1 := i;

n2 := j; end;

end;

Res1Edit.Text := IntToStr(n1); Res2Edit.Text := IntToStr(n2);

end;

Пример 3 (формирование одномерного массива из положительных чи-

сел):

procedure TForm1.Button1Click(Sender: TObject); var

A : array[1..10,1..10] of integer; B : array[1..100] of integer; Count,n,m,i,j : integer;

begin

n := AStringGrid.RowCount;

m := AStringGrid.ColCount; for i := 1 to n do

for j := 1 to m do

A[i,j] := StrToInt(AStringGrid.Cells[j-1,i-1]); Count := 0;

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

if A[i,j]>0 then begin

inc(Count); B[Count] := A[i,j];

end;

ResMemo.Clear;

for i := 1 to Count do ResMemo.Lines.Add(IntToStr(B[i]));

end;

2.10 Строки

Строковый тип String можно рассматривать как одномерный массив символов. Поэтому обращение к конкретному символу строки можно осуществлять по его индексу, например, S[12] – обращение к 12-му символу строки S.

Максимальную длину строки можно задать при объявлении переменной,

например, S : string[80].

Для строк допустимо выполнение операции сложения, например,

S := 'Первая '+'строка'.

Так как каждому символу соответствует определенный числовой код, то строки можно сравнивать между собой, например, 'AB'>'A' значение True, т.к. более короткая строка имеет меньший код.

24

Для работы со строками могут применяться стандартные функции и процедуры:

Функция

Описание

Length(S)

Определяет длину строки в символах

Pos(SubS,S)

Поиск подстроки SubS в строке S

Copy(S,i,n)

Копирование n символов из строки S начиная с позиции i

Concat(S1[,S2…])

Объединение строк

Delete(S,i,n)

Удаление n символов из строки S начиная с позиции i

Insert(SubS,S,i)

Вставка подстроки SubS в строку S начиная с позиции i

Str(X[:m:n],S)

Перевод числа X в строку S

Val(S,X,c)

Перевод строки S в число X. с – код результата перевода

Пример (разложение строки на отдельные слова):

procedure TForm1.Button1Click(Sender: TObject); var

S : string;

Mas : array[1..100] of string; i,n : integer;

begin

S := SEdit.Text; n := 0;

repeat

i := Pos(' ',S); if i>0 then begin

inc(n);

Mas[n] := Copy(S,1,i-1); Delete(S,1,i);

end; until i=0;

if Length(S)>0 then begin

inc(n); Mas[n] := S;

end;

WordsMemo.Clear; for i := 1 to n do

WordsMemo.Lines.Add(Mas[i]);

end;

2.11 Записи

В отличии от массива, тип-запись включает ряд компонент, называемых полями, которые могут быть различных типов. Формат описания:

<идентификатор записи> : record <идентификатор поля1> : <тип поля1>;

25

<идентификатор поляN> : <тип поляN>; end;

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

<идентификатор записи>.<идентификатор поля>

Если требуется обращение к нескольким полям записи подряд, то можно для упрощения использовать оператор WITH:

WITH <идентификатор записи> do <оператор>

WITH <идентификатор записи> do begin

<оператор1>

<операторN> end;

Пример (нахождение среднего роста людей старше 50 лет):

procedure TForm1.Button1Click(Sender: TObject); var

People : array[1..100] of record

Name : string; Age : integer; Height : integer;

end; i,CountPeople,SumHeight,CountSelect : integer;

begin

CountPeople := PeoplesSG.RowCount; for i := 1 to CountPeople do begin

People[i].Name := PeoplesSG.Cells[0,i-1]; People[i].Age := StrToInt(PeoplesSG.Cells[1,i-1]); People[i].Height := StrToInt(PeoplesSG.Cells[2,i-1]);

end;

CountSelect := 0;

SumHeight := 0;

for i := 1 to CountPeople do if People[i].Age>50 then begin

inc(CountSelect);

SumHeight := SumHeight+ People[i].Height; end;

if CountSelect>0 then

ResEdit.Text := FloatToStr(SumHeight/CountSelect) else

ResEdit.Text := 'таких людей нет';

end;

26

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

<идентификатор записи> : record

case [<идентификатор поля>:]<тип поля> of

<вариант выбора1> : (<идентификатор поля> : <тип поля>);

<вариант выбораN> : (<идентификатор поля> : <тип поля>); end;

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

Пример (нахождение площади фигур):

procedure TForm1.Button1Click(Sender: TObject); var

Figures : array[1..100] of record X,Y : real;

Vid : integer; case integer of

0: (Side : real); {квадрат}

1: (Side1,Side2 : real){прямоугольник};

2: (Radius : real); {круг}

end;

Count,i : integer; begin

Count := FiguresSG.RowCount; for i := 1 to Count do

with Figures[i] do begin

Vid := StrToInt(FiguresSG.Cells[0,i-1]);

X := StrToInt(FiguresSG.Cells[1,i-1]);

Y := StrToInt(FiguresSG.Cells[2,i-1]); case Vid of

0 : Side := StrToInt(FiguresSG.Cells[3,i-1]);

1 : begin

Side1 := StrToInt(FiguresSG.Cells[3,i-1]);

Side2 := StrToInt(FiguresSG.Cells[4,i-1]); end;

2 : Radius := StrToInt(FiguresSG.Cells[3,i-1]) end;

end;

ResMemo.Clear;

for i := 1 to Count do with Figures[i] do

case Vid of

0 : ResMemo.Lines.Add(IntToStr(i)+' - квадрат, S='+ FloatToStr(sqr(Side)));

1 : ResMemo.Lines.Add(IntToStr(i)+' - прямоугольник, S='+ FloatToStr(Side1*Side2));

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