Название: Информатика и программирование - Лабораторный практикум (М.Г. Зайцев)

Жанр: Информатика

Просмотров: 1176


Т е м а:  массивы object pascal

 

Цель

 

Сформировать практические навыки описания и применения двумерных массивов Object Pascal для обработки данных; построение однооконных интерфейсов с помощью визуального компонента окно (класс TForm) и визуальных компонентов панели инструментов Standart, Additinal: метка (класс TLabel), редактор (класс TEdit), кнопка (класс TButton), многострочный редактор текста (TMemo), таблица строк (TStringGrid).

 

Задание

 

1. В соответствии с приведенными вариантами заданий и приведенной ниже спецификацией реализуйте приложение под Windows.

2. Разработайте тестовые задания и оттестируйте программу одним из методов тестирования.

 

Спецификация приложения

 

1. В соответствии с приведенными вариантами заданий реализовать приложение под Windows, используя для организации пользовательского интерфейса следующие элементы управления: форму (класс TForm), кнопку (класс TButton), метку (класс TLabel), редактор (класс TEdit), таблицу строк (класс TStringGrid). Ввод элементов массива осуществляйте с помощью компонента управления редактор (класс TEdit). Введенные значения элементов массива отображайте в компоненты таблица строк (класс TStringGrid). Результаты выводите в компоненты редактор (класс TEdit) и таблица строк (класс TStringGrid). Подписи к компонентам интерфейса выполняйте с помощью элементов метка (класс TLabel). Вычисление результата выполняйте с помощью компонента управления кнопка (класс TButton).

2. Организуйте контроль ввода в элемент редактор, так что если вводимая строка не соответствует требованиям, то в окне сообщений выводится сообщение об ошибке, очищается строка редактора. Для этого используйте блок try…finally и процедуру ShowMessage модуля Dialogs.

3. Действия, которые необходимо выполнить над двумерным массивом, оформляйте в виде процедуры или функции.

 

Рекомендации к выполнению

 

1. Для выполнения заданий используйте пример приложения, помещенный ниже. Внимательно прочтите, изучите и повторите этот пример. Используйте разработанное в примере приложение для выполнения заданий лабораторной работы. Для этого предварительно создайте новую папку, куда скопируйте все файлы приложения (для этого используйте в пункте Файл основного меню команду Save Project As). После чего откройте его в Delphi и внесите необходимые изменения.

2. Описания разрабатываемых в работе процедур и функций помещайте в разделе реализации (раздел модуля, который начинается после зарезервированного слова implementation) модуля формы вашего приложения.

3. Для обработки компонентов двумерного массива используйте оператор цикла For.

 

Варианты заданий

 

1. Разработайте приложение, которое обеспечивает:

  ·  ввод   значений   в   два  двумерных  массива  типа  array

     [1..Elmnts, 1..Elmnts]  of Real  с  клавиатуры  терминала и

     отображение на экране компонентов массивов;

    ·  вычитание массивов с отображением результата на экране.

 

2. Разработайте приложение, которое обеспечивает:

    · ввод   значений  в  два   двумерных  массива   типа   array

       [1..Elmnts, 1..Elmnts]  of Real  с  клавиатуры  терминала и

       отображение на экране компонентов массивов;

    · перемножение массивов с отображением результата на

       экране.

3. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  два двумерных  массива

       типа array [1..Elmnts, 1..Elmnts] of Real с клавиатуры тер-

       минала и отображение на экране компонентов массивов;

    · находит и отображает на экране сумму значений  компо-

       нентов массива.

4. Разработайте приложение, которое:

    · обеспечивает ввод  значений  в  двумерный  массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит  и  отображает на экране минимальное значение

       компонентов массива.

5. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  двумерный массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит и отображает на экране максимальное значение

       компонентов массива.

6. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  двумерный массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит минимальное значение среди компонентов  мас-

       сива, лежащих на главной  диагонали,  и  отображает  на

       экране полученный результат.

7. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в двумерный массив  типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит максимальное значение среди компонентов мас-

       сива,  лежащих  на  главной  диагонали, и отображает на

       экране полученный результат.

 

8. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  двумерный массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит минимальное значение среди компонентов мас-

       сива, лежащих на побочной диагонали, и отображает на

       экране полученный результат.

9. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  двумерный массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит максимальное значение среди компонентов мас-

       сива,  лежащих  на побочной диагонали, и отображает на

       экране полученный результат.

 10. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  двумерный массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит сумму компонентов массива, лежащих  на глав-

       ной диагонали,  и отображает  на экране полученный ре-

       зультат.

 11. Разработайте приложение, которое:

    · обеспечивает  ввод  значений  в  двумерный массив типа

       array [1..Elmnts, 1..Elmnts] of Real с клавиатуры термина-

       ла и отображение на экране компонентов массива;

    · находит  сумму  компонентов  массива,  лежащих на по-

       бочной диагонали,  и отображает  на экране полученный

       результат.

 

Пример

 

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

· ввод значений в два двумерных массива с клавиатуры терминала и отображение на экране компонентов массивов;

· ввод значения элемента массива сначала осуществляется в компонент «редактор», затем по нажатию левой кнопки мыши введенное значение переносится в клетку компонента «таблица строк» (StringGrid) на которую направлен указатель мыши;

· сложение массивов с отображением результата на экране.

Для решения этой задачи можно построить приложение, состоящее из одной формы следующего вида:

 

 

Назначение компонентов формы следующее:

· компоненты таблицы строк – StringGrid1, StringGrid1, StringGrid3 используются для отображения содержимого массивов а, в и с (с=а + в);

· компонент редактор «Элемент массива» (Edit1) используется для ввода с клавиатуры значений элементов массивов а и в, записи введенных в массивы значений в компоненты StringGrid1и StringGrid2;

· компоненты радиокнопка «Массив А», радиокнопка «Массив В» используются для переключения ввода значений элементов массива между массивами а и в;

· компонент (Button2) кнопка «Очистить» используется для очистки полей StringGrid1, StringGrid1, StringGrid3 и установки в компоненты массивов а, в, с значений 0;

· компонент (Button3) кнопка «=» используется для вычисления суммы массивов а и в, записи результата в массив с и отображения массива с в компонент StringGrid3;

· компонент (Button4) кнопка «Выход» используется для завершения работы приложения.

Чтобы пользователь не мог вносить изменений в строки компонентов StringGrid1, StringGrid2, StringGrid3 непосредственно с клавиатуры установите свойства Enabled этих компонентов в False в инспекторе объектов.

Предложенной форме соответствует модуль, текст которого приведен ниже.

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, Grids;

 

type

  TForm1 = class(TForm)

    Edit1: TEdit;//ввод значения в массивы А,В

    Label1: TLabel;//добавляет значение в массив и stringGrid

    Button2: TButton;//устанавливает нулевые значения в компоненты

    //массивов А,В,С и StringGrid1,StringGrid2,StringGrid3

    RadioButton1: TRadioButton;//переключает ввод значений в мас-сив А

    RadioButton2: TRadioButton;//переключает ввод значений в мас-сив В

    Button3: TButton;//сложение массивов А и В

    Button4: TButton;//завершение работы приложения

    StringGrid1: TStringGrid;//отображает значения элементов массива А

    StringGrid2: TStringGrid;//отображает значения элементов массива В

    StringGrid3: TStringGrid;//отображает значения элементов массива С

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    procedure Button2Click(Sender: TObject);

    procedure RadioButton1Click(Sender: TObject);

    procedure RadioButton2Click(Sender: TObject);

    procedure Edit1Exit(Sender: TObject);

    procedure FormActivate(Sender: TObject);

    procedure Button3Click(Sender: TObject);

 

    procedure Button4Click(Sender: TObject);

    procedure StringGrid1Click(Sender: TObject);

    procedure StringGrid2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

const

  Rows = 3;//строк в массивах А,В,С

  Columns =3;//столбцов в массивах А,В,С

type

  Matrix = array[1..Rows,1..Columns] of Real;

var

  A: Matrix;

  B: Matrix;

  C: Matrix;

{$R *.DFM}

 

procedure GridClear(a:TStringGrid;var m: Matrix);

//заносит нули в ячейки StringGrid a и в элементы массива m

var i,j: Cardinal;

begin

  for i:= 1 to a.ColCount-1 do

    for j:= 1 to a.RowCount-1 do begin

        a.Cells[i,j]:= '0';

        m[i,j]:= 0;

    end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  StringGrid1.Col:= 1;//выделяется клетка первой строки

  StringGrid1.Row:= 1;//выделяется клетка первого столбца

  StringGrid2.Col:= 1;//выделяется клетка первой строки

  StringGrid2.Row:= 1;//выделяется клетка первого столбца

  GridClear(StringGrid1,a);

  GridClear(StringGrid2,b);

  GridClear(StringGrid3,c);

  Edit1.SetFocus;

end;

 

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

  Edit1.SetFocus;

  StringGrid1.Enabled:= True;//разрешить получение фокуса

  StringGrid2.Enabled:= False;//запретить получение фокуса

end;

 

procedure TForm1.RadioButton2Click(Sender: TObject);

begin

  Edit1.SetFocus;

  StringGrid2.Enabled:= True;//разрешить получение фокуса

  StringGrid1.Enabled:= False;//запретить получение фокуса

end;

 

procedure TForm1.Edit1Exit(Sender: TObject);

//запретить перемещение фокуса, пока не введена строка, изображающая число

var a:Real;

begin

  try

  a:= StrToFloat(Edit1.Text)

  except

    on EConvertError do begin

        ShowMessage('Ошибка ввода');

        Edit1.SetFocus

    end;   

  end;

end;

 

procedure GridCaptions(a:TStringGrid);

//нумерация строк и столбцов StringGrid a

var i,j: Cardinal;

begin

  for i:= 1 to a.ColCount-1 do a.Cells[i,0]:= IntToStr(i);

  for i:= 1 to a.RowCount-1 do a.Cells[0,i]:= IntToStr(i);

end;

 

procedure GridSet(a:TStringGrid;m: Matrix);

//занесение в StringGrid a значений из массива m

var i,j: Cardinal;

begin

  for i:= 1 to a.ColCount-1 do

    for j:= 1 to a.RowCount-1 do a.Cells[i,j]:= FloatToStr(m[j,i]);

end;

 

procedure TForm1.FormActivate(Sender: TObject);

//установка начальных значений перед отображением формы

begin

  RadioButton1.Checked:= True;

  Edit1.Text:='0';

  StringGrid1.ColCount:= Columns + 1;

  StringGrid1.RowCount:= Rows + 1;

  StringGrid2.ColCount:= Columns + 1;

  StringGrid2.RowCount:= Rows + 1;

  StringGrid3.ColCount:= Columns + 1;

  StringGrid3.RowCount:= Rows + 1;

  GridCaptions(StringGrid1);

  GridSet(StringGrid1,a);

  GridCaptions(StringGrid2);

  GridSet(StringGrid2,b);

  GridCaptions(StringGrid3);

  GridSet(StringGrid3,c);

  StringGrid3.Enabled:= False;

  StringGrid2.Enabled:= False;

end;

 

procedure AddMatrixes(a,b: Matrix; c: Matrix; g: TStringGrid);

//сложение матриц а,b с занесением результата в с и отображением

//его в StringGrid g

var i,j: Cardinal;

begin

  for i:= 1 to Rows do

    for j:= 1 to Columns do

      begin

        c[i,j]:= a[i,j]+b[i,j];

        g.Cells[j,i]:= FloatToStr(c[i,j])

      end;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

  AddMatrixes(a,b,c,StringGrid3);//складывает массивы а и b

                                 //и отображает результат в StringGrid3

  RadioButton1.Checked:= True;//ввод значений переключается на массив а

  Edit1.SetFocus;

end;

 

procedure TForm1.Button4Click(Sender: TObject);

//завершение работы приложения

begin

  Application.Terminate

end;

 

procedure SetCells(var a: Matrix; g: TStringGrid);

//заносит в элемент массива а StringGrid g значение из Edit1

begin

  with g,Form1 do begin

    a[Row,Col]:= StrToFloat(Edit1.Text);

    Cells[Col,Row]:= EDit1.Text;

    Edit1.SetFocus;

  end;

end;

procedure TForm1.StringGrid1Click(Sender: TObject);

begin

  SetCells(a,StringGrid1)

end;

 

procedure TForm1.StringGrid2Click(Sender: TObject);

begin

  SetCells(b,StringGrid2)

end;

 

end.

 

Содержание отчета

 

1. Задание.

2. Текст программы на Object Pascal.

3. Тестовые наборы данных для тестирования приложения.

 

Контрольные вопросы

 

1. Для чего предназначен раздел описания констант?

2. Назовите синтаксические правила описания регулярного типа (массива).

3. Какого типа может быть тип компонентов массива?

4. Какого типа может быть тип индексов массива?

5. Как подсчитать количество компонентов массива по его описанию?

6. Как сослаться на компонент массива в тексте программы?

7. Какая операция определена на всем массиве?

8. Какие операции определены на компонентах массива?

9. Что такое размер массива и размерность массива?

 10. Какими должны быть индексные выражения при ссылке на компонент массива?

 11. Для чего используют визуальные компоненты «таблица строк» (класс TStringGrid)?

 12. Что обозначает свойство Cells компонента «таблица строк» (класс TStringGrid)?

 13. Что обозначает свойство Col компонента «таблица строк» (класс TStringGrid)?

 13. Что обозначает свойство Row компонента «таблица строк» (класс TStringGrid)?

 15. Что обозначает свойство Collumns компонента «таблица строк» (класс TStringGrid)?

 16. Что обозначает свойство Rows компонента «таблица строк» (класс TStringGrid)?

 17. Что обозначает свойство ColCount компонента «таблица строк» (класс TStringGrid)?

 18. Что обозначает свойство RowCount компонента «таблица строк» (класс TStringGrid)?

 19. Что обозначает свойство Enabled компонента «таблица строк» (класс TStringGrid)?

 

Лабораторная работа № 8

 

Строки