if pos(decimalseparator,Cells[Col,Row])<>0 then

Лабораторная работа 4

Обработка одномерных массивов

 

Цель работы: формирование первичных умений в разработке простых циклических программ с использованием массивов.

 

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

1. Структуру цикла, назначение и порядок следования его отдельных частей.

2. Структуры: цикл-пока и цикл-повторить.

3. Операторы цикла for …to (downto) … do.

4. Описание и использование массивов.

 

Примеры выполнения задания лабораторной работы

Пример 1. Составьте программу нахождения суммы элементов данного массива а, состоящего из n элементов.

Решение. Основная часть цикла – добавление очередного элемента к накапливаемой сумме. Для нахождения суммы всех элементов достаточно повторить цикл, изменяя номер элемента массива от 1 до n с шагом 1 (рис. 4.1).

На данной схеме вывод исходных данных и вывод результата записаны в одном блоке, так как алгоритм вывода элементов массива аналогичен циклу ввода.

 

 

 
 

 

 


Рис. 4.1. Схема алгоритма программы

 

Текст программы

 

program lr4_1_1;

{Сумма элементов массива.}

{$APPTYPE CONSOLE}

Uses

SysUtils;

Const

maxn=100;{Максимальное количество элементов массива}

Var

n,i:integer;

s:real;

a:array[1..maxn] of real;

Begin

write('n= ');

readln(n);{Ввод реального количества элементов массива}

writeln('Vvedite elementi massiva a ');

for i:=1 to n do

Begin

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

readln(a[i]);

end;

s:=0;

for i:=1 to n do

s:=s+a[i];

writeln('Исходный массив a, состоящий из',n:4,' элементов');

for i:=1 to n do

write(a[i]:8:2);

writeln;

writeln('S = ',s:8:2);

readln;

end.

 

Как и в лабораторной работе 3 в данной работе можно считать заданиями повышенной сложности (второго уровня) задания, выполненные с использованием компонентов Delphi.

Для отображения элементов массивов целесообразно использовать компоненты StringGrid. Для ввода элементов массива в ячейки таблицы необходимо свойство Options(goEditing) положить равным true.

Для рассмотренного примера форма приложения может быть как показано на рис. 4.1.

 

Рис. 4.1 Форма приложения примера 4_1

 

Текст Unit-a

 

unit Unit1;

//нахождение суммы элементов массива

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Grids, Buttons;

 

Type

TForm1 = class(TForm)

lbl1: TLabel;

lbledt1: TLabeledEdit;

btn1: TButton;

sd: TStringGrid;

btn2: TBitBtn;

lbl2: TLabel;

procedure lbledt1KeyPress(Sender: TObject; var Key: Char);

procedure btn1Click(Sender: TObject);

procedure sdKeyPress(Sender: TObject; var Key: Char);

Private

{ Private declarations }

Public

{ Public declarations }

end;

Var

Form1: TForm1;

Implementation

{$R *.dfm}

Var

n:Integer;

a:array[0..10] of Real;

s:Real;

procedure TForm1.lbledt1KeyPress(Sender: TObject; var Key: Char);

//Разрешено вводить только цифры и нажимать клавиши

//Backspace и Enter

Var

i:Integer;

Begin

Case Key of

'0'..'9',#8:;

#13:begin

//Задание свойств компонента StringGrid

sd.ColCount:=strtoint(lbledt1.Text);

n:=sd.ColCount;

sd.Options:=sd.Options+[goEditing];

sd.Width:=n*(sd.DefaultColWidth+2);

for i:=0 to n-1 do

sd.Cells[i,0]:='Элемент '+inttostr(i);

sd.SetFocus;

End

Else

key:=#0;

end;

end;

 

procedure TForm1.btn1Click(Sender: TObject);

Var

i:Integer;

Begin

for i:=0 to n-1 do

a[i]:= strtofloat(sd.Cells[i,1]);

s:=0;

for i:=0 to n-1 do

s:=s+a[i];

sd.ColCount:=sd.ColCount+1;

sd.Width:=(n+1)*(sd.DefaultColWidth+2);

sd.Cells[n,0]:='Сумма ';

sd.Cells[n,1]:=FloatToStrF(s,ffFixed,8,3);

end;

 

procedure TForm1.sdKeyPress(Sender: TObject; var Key: Char);

//обработка нажатых клавиш в ячейках StringGrid

Begin

With sd do

Case Key of

'0'..'9',#8:;

'-':begin

if (Cells[Col,Row]='') then

key:='-'

Else

if (Cells[Col,Row]<>'') and ((copy(Cells[Col,Row],length(Cells[Col,Row]),1)='E') or

(copy(Cells[Col,Row],length(Cells[Col,Row]),1)='e'))then

key:='-'

Else

key:=#0;

end;

'+':begin

if (Cells[Col,Row]='') then

key:='+'

Else

if (Cells[Col,Row]<>'') and ((copy(Cells[Col,Row],length(Cells[Col,Row]),1)='E') or

(copy(Cells[Col,Row],length(Cells[Col,Row]),1)='e'))then

key:='+'

Else

key:=#0;

end;

',','.':begin

key:=decimalseparator;

if pos(decimalseparator,Cells[Col,Row])<>0 then

key:=#0

end;

'E','e':begin

key:='E';

if ((pos('E',Cells[Col,Row])<>0) or (pos('e',Cells[Col,Row])<>0))

or ((length(Cells[Col,Row])=1)

and ((copy(Cells[Col,Row],1,1)='-') or

(copy(Cells[Col,Row],1,1)='+'))) or

((length(Cells[Col,Row])=0)

And

((pos('E',Cells[Col,Row])=0) or (pos('e',Cells[Col,Row])=0))) then

key:=#0;

end;

#13: if col<colcount-1 then

col:=col+1;

 

Else

key:=#0;

end;

 

end;

 

end.