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.