Главная страница
Навигация по странице:

  • Теория Массивы

  • Компонент Memo для ввода и вывода массивов

  • Практика Задача

  • Проект формы 376 Текст модуля

  • Задачи для самостоятельного решения

  • Options.goAlwaysShowEditor

  • Технология создания многооконных проектов

  • Unit2, Unit3

  • Ввод и вывод двумерных массивов c помощью компонента

  • Для ввода двумерного массива

  • Для вывода

  • Проекты форм Для решения данной задачи рекомендуется создать три окна. 393 Текст модуля

  • Тестовый пример

  • Группа Б 400 № 6.11. Дана матрица A

  • Практикум по информатике


    Скачать 7.84 Mb.
    НазваниеПрактикум по информатике
    АнкорPraktikum_2008.pdf
    Дата21.09.2017
    Размер7.84 Mb.
    Формат файлаpdf
    Имя файлаPraktikum_2008.pdf
    ТипКнига
    #8906
    страница18 из 21
    1   ...   13   14   15   16   17   18   19   20   21
    § 5. Использование массивов в программах,
    компонента Memo для ввода данных в массив
    В данном параграфе рассматриваются следующие вопро-
    сы:
    массивы, компонент Memo для ввода и вывода массивов.
    Теория
    Массивы
    Массивом называется упорядоченная индексированная сово- купность однотипных элементов, имеющих общее имя. Элемен- тами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно опре- деляется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обраще- ния к отдельному элементу массива указываются имя этого мас- сива и номер (номера) элемента, заключенный в квадратные скобки, например, arrl[3, 35] или аrr3[7].
    Количество индексных позиций определяет мерность массива
    (одномерный, двумерный и т. д.), при этом мерность массива не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного массива — матрица. Индексы эле- ментов массива должны принадлежать порядковому типу. Разные индексы одного и того же массива могут быть различных типов.
    Наиболее часто типом индекса является целочисленный тип.
    Различают массивы статические и динамические. Статиче-
    ский массив представляет собой массив, границы индексов и со- ответственно размеры которого задаются при объявлении — из- вестны до компиляции программы.
    Формат описания типа статического массива:
    Array [Тип индексов] of <Тип элементов>;
    Пример.
    Объявление статических массивов.
    Type tm = Array[l .. 10, 1 .. 100] of real;
    Var arrl, arr2: tm; arr3: Array[20 .. 100] of char; arr4: Array['a' .. 'z'] of integer;

    374
    Переменные arrl и arr2 являются двумерными массивами по
    1000 элементов — 10 строк и 100 столбцов. Каждый элемент этих массивов представляет собой число типа real. Для объявления массивов arrl и аrr2 введен специальный тип tm. Переменные аrr3 и аrr4 являются одномерными массивами, соответственно на 81 символ и 26 целых чисел.
    Доступ к каждому элементу массива осуществляется по ин- дексу. Например, arr1[2,3] — элемент массива arr1, находящийся во второй строке и третьем столбце; arr3[34] — элемент массива arr3 с индексом 34, но пятнадцатый по порядку; arr4[i] — i-ый элемент массива arr4.
    Компонент Memo для ввода и вывода массивов
    При использовании компонента Memo для ввода массива значение каждого элемента массива следует вводить в отдельной строке и после ввода каждого элемента массива нажимать кла- вишу «ENTER».
    Получить доступ к находящейся в поле Memo строке текста можно при помощи свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с 0).
    Следующий цикл демонстрирует ввод символьного массива из компонента Memo:
    For i:=1 to Size do a[i]:=Memo1.Lines[i];
    Вывод массива в компонент Memo можно осуществить таким образом:
    For i:=0 to N-1
    Memo2.Lines.Add(FloatToStr(massiv[i+1]);
    Практика
    Задача
    Составить программу для сортировки массива действитель- ных чисел: по возрастанию или по убыванию по желанию поль- зователя. Результаты сортировки вывести в окно сообщения.
    Компоненты
    Имя компонента
    Свойства компонента
    Значение
    Назначение
    Form1 Caption Сортировка массива мето- дом прямого выбора
    Заголовок формы
    Label1 Caption Программа предназначена для сортировки массива
    Справочная ин- формация для

    375
    действительных чисел по возрастанию либо по убы- ванию пользователя программы
    Label2 Caption Количество элементов в массиве
    Подсказка поль- зователю
    Edit1 Text …..
    Поле для ввода количества эле- ментов в массиве
    Memo1 Lines
    …..
    Компонент для ввода элементов массива в стол- бик (в одной стро- ке — один эле- мент)
    Button1 Caption Сортировка по возраста- нию
    Кнопка для вы- полнения сорти- ровки по возрас- танию
    Button2 Caption Сортировка по убыванию
    Кнопка для вы- полнения сорти- ровки по убыва- нию
    Button3 Caption Завершение работы
    Кнопка для за- вершения работы программы
    Переменные и массивы
    Обозначение в программе
    Содержание
    Тип
    N
    Количество элементов в массиве действительных чисел
    Целый
    Massiv
    Массив действительных чисел
    Вещественный, расши- ренный
    I
    Текущий индекс элемента массива
    Целый
    J индекс элемента массива, с которо- го начинается поиск минимального либо максимального элемента
    Целый min номер минимального элемента в массиве или части массива
    Целый max номер максимального элемента в массиве или части массива
    Целый buf буфер для обмена местами эле- ментов массива
    Вещественный, расши- ренный st строковое сообщение, содержащее результат
    Строковый
    Проект формы

    376
    Текст модуля
    unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
    Forms, Dialogs, StdCtrls;
    …………
    var
    Form1: TForm1;
    Massiv: array [1..100] of Extended;// массив действительных чисел
    N : Integer;
    implementation
    {$R *.dfm}
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    Form1.Close
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    Var I:Integer;// индекс элемента массива min: Integer; // номер минимального элемента в массиве
    //или части массива j : Integer; // индекс элемента массива,
    //с которого начинается
    // поиск минимального элемента buf: Extended; // буфер для обмена местами
    // элементов массива
    St: String; // строковое сообщение, содержащее результат
    begin

    377
    //ввод количества элементов в массиве
    N:=StrToInt(Edit1.Text);
    //ввод массива действительных чисел
    For I:=1 To N do
    Massiv[I]:=StrToFloat(Memo1.Lines[I-1]);
    // поиск минимального элемента массива методом прямого выбора
    {алгоритм метода прямого выбора можно описать следующими слова- ми. Сначала в качестве минимального элемента берется первый элемент и с ним последовательно сравниваются все следующие элементы массива, если попадается элемент меньше принятого за минимальный, то они ме- няются местами. В результате на первом месте оказывается самый малень- кий элемент массива. Затем берется второй или следующий элемент мас- сива и просматривается с перестановкой оставшаяся часть массива. Эта последовательность шагов повторяется, пока номер минимального элемен- та не достигнет N–1}
    For I:=1 to N-1 do begin min:=I;
    For j:=I+1 to N do if Massiv[j] < Massiv[min] then min:=j; buf:=Massiv[I];
    Massiv[I]:=Massiv[min];
    Massiv[min]:=buf; end;
    // вывод результатов сортировки st:='Отсортированный по возрастанию массив'+#13;
    For I:=1 to N do st:=st+IntToStr(i)+ ' '+FloatToStrF(Massiv[I],Fffixed,10,2)+#13;
    ShowMessage(st);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    Var I:Integer;// индекс элемента массива max: Integer; // максимальный элемент в массиве j : Integer; // индекс элемента массива, с которого
    // начинается поиск максимального элемента buf: Extended; // буфер для обмена местами элементов
    // массива
    St:String;// строковое сообщение, содержащее результат
    begin
    // ввод количества элементов в массиве
    N:=StrToInt(Edit1.Text);
    // ввод массива действительных чисел

    378
    For I:=1 To N do
    Massiv[I]:=StrToFloat(Memo1.Lines[I-1]);
    // поиск максимального элемента массива методом прямого выбора
    // алгоритм аналогичен поиску минимального элемента
    // отличие состоит в знаке сравнения
    For I:=1 to N-1 do begin max:=I;
    For j:=I+1 to N do if Massiv[j] > Massiv[max] then max:=j; buf:=Massiv[I];
    Massiv[I]:=Massiv[max];
    Massiv[max]:=buf; end;
    // вывод результатов сортировки st:='Отсортированный по убыванию массив'+#13;
    For I:=1 to N do st:=st+IntToStr(i)+ ' '+FloatToStrF(Massiv[I],Fffixed,10,2)+#13;
    ShowMessage(st);
    end;
    end.
    Задачи для самостоятельного решения
    Группа А
    № 5.1. Дан массив действительных чисел. Найти сумму элемен- тов массива.
    № 5.2. Дан массив действительных чисел. Найти произведение элементов массива.
    № 5.3. Дан массив действительных чисел. Найти сумму квадратов элементов массива.
    № 5.4. Дан массив действительных чисел. Найти модуль суммы и квадрат произведения элементов массива.
    № 5.5. Дан массив действительных чисел. Найти наибольший элемент массива.
    № 5.6. Дан массив действительных чисел. Найти наименьший элемент массива.
    № 5.7. Дан массив действительных чисел. Найти наибольший элемент массива.
    №5.8. Дан массив действительных чисел. Найти наименьший из элементов массива с четными номерами.

    379
    №5.9. Написать программу для определения среднего роста сту- дентов группы.
    №5.10. Написать программу для вычисления среднего гармони- ческого
    Mn = n / (1/a1+ 1/a2+...+ 1/an), где ai
    ≠0.
    Группа Б
    № 5.11. Написать программу для обработки результатов N- кратного измерения величины L. Программа должна вычислять
    Среднее где L
    i
    — результат i–го измерения.
    Среднюю квадратическую погрешность отдельного измерения
    ,
    1
    )
    )
    (
    (
    2 2


    =
    N
    L
    L
    N
    m
    где

    =
    =
    N
    i
    i
    L
    N
    L
    1 2
    2 1
    Среднюю квадратическую погрешность арифметической се- редины
    / N
    m
    M
    =
    Предельную абсолютную погрешность измерений
    M
    L 3
    =
    Δ
    Количество измерений произвольно в пределах от 2 до 15.
    В программе предусмотреть следующую форму запросов при вводе исходных данных:
    КОЛИЧЕСТВО ИЗМЕРЕНИЙ=
    L1=
    L2= и т. д. для всех измерений.
    В программе предусмотреть также проверку условия N<2.
    Если это условие выполняется, выдавать сообщение «ОДНО
    ИЗМЕРЕНИЕ НЕДОПУСТИМО» и осуществить переход к опе- ратору ввода N.
    Форма выдачи результатов:
    УСРЕДНЕННЫЙ РЕЗУЛЬТАТ=значение
    ,
    1 1

    =
    =
    N
    i
    i
    L
    N
    L

    380
    СКП ОТДЕЛЬНОГО ИЗМЕРЕНИЯ= значение
    СКП СРЕДНЕГО= значение
    ПРЕДЕЛЬНАЯ АБСОЛЮТНАЯ ПОГРЕШНОСТЬ= значение
    № 5.12. Написать программу для определения суммарной площа- ди земельных участков
    N
    S
    S
    S
    S
    +
    +
    +
    =
    2 1
    и вычисления средней квадратической погрешности опреде- ления этой суммы
    2 2
    2 2
    1
    N
    M
    M
    M
    M
    +
    +
    +
    =
    Здесь S
    i
    — площадь i-го участка; M
    i
    — средняя квадратиче- ская погрешность определения этой площади. Общее количество участков произвольно, но не более 255.
    Предусмотреть в программе следующую форму запросов при вводе:
    КОЛИЧЕСТВО УЧАСТКОВ=
    УЧАСТОК 1:
    ПЛОЩАДЬ=
    СКП=
    УЧАСТОК 2:
    ПЛОЩАДЬ=
    СКП= и т.д. для всех участков.
    Форма вывода результатов:
    СУММАРНАЯ ПЛОЩАДЬ=значение S
    СКП=значение M
    № 5.13. Написать программу для вычисления среднего арифме- тического
    ,
    2 1
    N
    X
    X
    X
    P
    N
    +
    +
    +
    =
    среднего геометрического
    ,|
    |
    2 1
    N
    N
    X
    X
    X
    G



    =
    среднего гармонического
    N
    X
    X
    X
    N
    H
    /
    1
    /
    1
    /
    1 2
    1
    +
    +
    +
    =
    и среднего квадратичного

    381
    2 2
    2 2
    1
    N
    X
    X
    X
    B
    +
    +
    +
    =
    для N — чисел. N — произвольное число, но не более 100.
    (Указание
    N
    N
    A
    A
    /
    1
    =
    ).
    В программе предусмотреть следующие запросы при вводе:
    КОЛИЧЕСТВО ЧИСЕЛ=
    X1=
    X2= и т.д. для всех чисел.
    Форма вывода результатов:
    СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ=значение
    СРЕДНЕЕ ГЕОМЕТРИЧЕСКОЕ= значение
    СРЕДНЕЕ ГАРМОНИЧЕСКОЕ= значение
    СРЕДНЕЕ КВАДРАТИЧНОЕ= значение
    № 5.14. Написать программу для вычисления средних арифмети- ческих:


    =
    =
    =
    =
    N
    i
    i
    N
    i
    i
    X
    N
    P
    X
    N
    P
    1 2
    2 1
    ,
    1 1
    1 1
    и средних квадратических отклонений
    ,
    2 2
    2 2
    2 2
    1 2
    1 1
    P
    X
    P
    X

    =

    =
    σ
    σ
    Где


    =
    =
    =
    =
    N
    i
    i
    N
    i
    i
    X
    N
    X
    X
    N
    X
    1 2
    2 2
    2 1
    2 1
    2 1
    1
    ,
    1
    для двух массивов чисел, а также коэффициента корреляции ме- жду этими массивами:
    ,
    2 1
    2 1
    2 1
    σ
    σ
    P
    P
    X
    X
    r

    =
    где

    =
    =
    N
    i
    i
    i
    X
    X
    N
    X
    X
    1 2
    1 2
    1 1
    № 5.15. Написать программу для вычисления суммарной площа- ди четырех прямоугольных участков (рис. 6.5) по заданным зна- чениям их диагоналей L
    i
    (в метрах) и углов между диагоналями и основаниями
    α
    i
    . Формула для определения площади i-го участка:
    i
    i
    i
    i
    L
    S
    α
    α
    cos sin
    2


    =

    382
    α
    4
    L
    1
    L
    4
    α
    1
    α
    3
    α
    2
    L
    2
    L
    3
    Рис. 6.5
    В программе предусмотреть следующую форму запросов при вводе исходных данных:
    1–Й УЧАСТОК:
    ДИАГОНАЛЬ=
    УГОЛ В ГР., МИН., СЕК.=
    2–Й УЧАСТОК:
    ДИАГОНАЛЬ=
    УГОЛ В ГР., МИН., СЕК.=
    3–Й УЧАСТОК:
    ДИАГОНАЛЬ=
    УГОЛ В ГР., МИН., СЕК.=
    4–Й УЧАСТОК:
    ДИАГОНАЛЬ=
    УГОЛ В ГР., МИН., СЕК.=
    Форма вывода результата:
    ОБЩАЯ ПЛОЩАДЬ= значение суммарной площади (в га).
    № 5.16. Написать программу для определения суммы горизон- тальных проложений между точками с указанными координата- ми:
    )
    (
    )
    (
    1 1
    2 1
    1 2
    1 1


    =
    +
    +

    +

    =
    N
    i
    i
    i
    Y
    Y
    X
    X
    S
    Общее количество точек произвольно, но не более 20.
    В программе предусмотреть следующую форму запросов при вводе исходных данных:
    КОЛИЧЕСТВО ТОЧЕК=

    383
    X1=
    X2= и т.д. для всех точек.
    Форма вывода результата:
    CУММА ГОРИЗОНТАЛЬНЫХ ПРОЛОЖЕНИЙ= значение S.
    № 5.17. Написать программу для определения суммарного рас- стояния между точками с заданными координатами и значениями вертикального угла, под которым из данной точки видна сле- дующая точка:


    =
    +
    +

    +

    =
    1 1
    2 1
    2 1
    cos
    )
    (
    )
    (
    N
    i
    i
    i
    i
    i
    i
    Y
    Y
    X
    X
    S
    α
    Общее количество точек произвольно, но не более 25.
    В программе предусмотреть следующую форму запросов при вводе исходных данных:
    КОЛИЧЕСТВО ТОЧЕК=
    КООРДИНАТЫ ТОЧКИ 1: X, Y=
    ВЕРТИК. УГОЛ ИЗ ТОЧКИ 1 НА ТОЧКУ 2: ГР., МИН., СЕК.=
    КООРДИНАТЫ ТОЧКИ 1: X, Y=
    ВЕРТИК. УГОЛ ИЗ ТОЧКИ 1 НА ТОЧКУ 2: ГР., МИН., СЕК.= и т.д. до предпоследней точки.
    КООРДИНАТЫ ТОЧКИ номер последней точки: X, Y=
    Форма вывода результата:
    СУММАРНОЕ РАССТОЯНИЕ=значение S.
    № 5.18. Дана информация о багаже нескольких пассажиров. Ба- гаж каждого пассажира характеризуется двумя числами: количе- ством вещей и общим весом вещей. Выяснить, имеется ли пасса- жир, багаж которого превышает багаж каждого из остальных пассажиров и по числу вещей, и по весу.
    № 5.19. Дана информация о багаже нескольких пассажиров. Ба- гаж каждого пассажира характеризуется двумя числами: количе- ством вещей и общим весом вещей. Определить, имеются ли два пассажира, багажи которых совпадают по числу вещей и разли- чаются по весу не более чем на 0,5 кг.
    № 5.20. Дана информация о багаже нескольких пассажиров. Ба- гаж каждого пассажира характеризуется двумя числами: количе- ством вещей и общим весом вещей. Выяснить, имеется ли пасса- жир, багаж которого состоит из одной вещи весом не менее 30 кг.

    384
    § 6. Разработка многооконных проектов.
    Двумерные массивы. Компонент StringGrid
    В данном параграфе рассматриваются следующие вопро-
    сы:
    компонент StringGrid, технология разработки многооконных проектов, ввод и вывод двумерных массивов с помощью компо- нента StringGrid.
    Теория
    Определение двумерного массива было дано в предыдущем параграфе.
    Компонент StringGrid
    Находится на вкладке Additional.
    TStringGrid — служит для представления текстовых данных в виде таблицы. Очень удобен для ввода и вывода массивов
    (одномерных и двухмерных). Доступ к каждому элементу табли- цы происходит через свойство Cells. Наиболее важными для нас являются следующие свойства компонента StringGrid.
    Свойство
    Назначение
    Name
    Имя компонента
    ColCount
    Количество колонок таблицы
    RowCount
    Количество строк таблицы
    Cells
    Соответствующий таблице двумерный массив. Ячейка таблицы, находящаяся на пе- ресечении столбца номер col и строки номер row определяет- ся элементом cells[col, row]
    FixedCols
    Количество зафиксированных слева колонок таблицы. За- фиксированные колонки вы- деляются цветом и при гори- зонтальной прокрутке оста- ются на месте
    FixedRows
    Количество зафиксированных

    385
    сверху строк таблицы. Зафик- сированные строки выделя- ются цветом и при вертикаль- ной прокрутке таблицы оста- ются на месте
    Options.goEditing
    Признак допустимости редак- тирования содержимого ячеек таблицы.True ― редактирова- ние разрешено. False ― за- прещено
    Options.goTabs
    Разрешает (True) или запре- щает (False) использование клавиши для переме- щения курсора в следующую ячейку таблицы
    Options.goAlwaysShowEditor
    Признак нахождения компо- нента в режиме редактирова- ния. Если значение свойства
    False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу или сделать щелчок мышью
    Технология создания многооконных проектов
    Решение многих задач требует создания многооконных про- ектов. Одной из причин, вызывающей необходимость создания многооконных проектов, может быть разделение ввода исходных данных в программу и вывода результатов счета.
    После загрузки самой среды Delphi на экране уже появляется заготовка проекта, состоящего из одной формы и одного модуля.
    Для добавления новой формы в проект можно воспользоваться кнопкой на панели кнопок быстрого доступа или командой из главного меню
    Добавление новой формы в проект. Можно с помощью команды File
    →New → New Form

    386
    Вывод списка форм проекта
    Вывод списка модулей проекта
    Вместе с формой в проект добавляется связанный с ней мо- дуль. Например, для формы Form2 добавится модуль Unit2.
    Основная программа обычно записывается в главном модуле, связанном с главной формой. К главному модулю нужно под- ключить модули дочерних форм, т. е. в раздел Uses дописать на- звания дочерних модулей. Например, uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls, Grids, Unit2, Unit3;
    Для вывода на экран дочерних форм используется процедура
    Show (показать)
    Например,
    Form2.Show;
    В раздел public дочерних модулей целесообразно включить описание переменных и массивов, передающихся из родитель- ского модуля.
    Если в родительском модуле используются компоненты из дочерних форм, перед их названием пишется имя формы, где они находятся. Например, Form2.StringGrid1.
    Ввод и вывод двумерных массивов c помощью компонента
    StringGrid
    После создания на форме строковой таблицы (компонент
    StringGrid) и задания с помощью Инспектора Объектов ее свойств, в программе нужно записать группу операторов для подписи строк и столбцов таблицы, чтобы пользователю про- граммы было понятно, как вводить данные. Их можно записать в отдельной процедуре, связанной с событием выход (Exit) из ком- понента Edit, где вводится размерность массива, или в процедуре, связанной с событием создания формы (FormCreate).
    {Процедура подготовки таблицы на форме для ввода квадратной матрицы, которая выполняется при выходе из поля ввода размерности матрицы.} procedure TForm1.Edit1Exit(Sender: TObject);
    Var i,j:Integer;// номера строки столбца квадратной матрицы begin
    // порядок матрицы получает свое значение из поля ввода
    N:=StrToInt(Edit1.Text);
    // свойство количество строк компонента StringGrid

    387
    // получает значение: порядок +1
    StringGrid1.RowCount:=N+1;
    // свойство количество столбцов компонента StringGrid
    // получает значение порядок: +1
    StringGrid1.ColCount:=N+1;
    //подпись заголовка таблицы
    For i:=1 to StringGrid1.RowCount do
    StringGrid1.Cells[i,0]:= IntToStr(i);
    // подпись строк таблицы
    For j:=1 to StringGrid1.ColCount do
    StringGrid1.Cells[0,j]:= IntToStr(j);
    // добавление в свойства таблицы признака
    //допустимости редактирования содержимого ячеек таблицы
    StringGrid1.Options:= StringGrid1.Options +[goEditing];
    end;
    Замечание
    Напоминаем, что для создания процедуры, связанной с каким- то событием, произошедшим с компонентом, нужно перейти на вкладку Events (события), найти нужное событие в строке, на- пример OnCreate, и справа вписать название события (в данном примере Create). В модуле автоматически будет создана заготов- ка процедуры создания формы: procedure TForm1.FormCreate(Sender: TObject); begin end;
    Если щелкнуть по компоненту Edit, то автоматически будет создана заготовка процедуры обработки события изменение ком- понента Edit: procedure TForm1.Edit1Change(Sender: TObject); begin end;
    Нужно изменить событие Change (изменить) на событие Exit
    (выход). Для этого обязательно перейти на вкладку события
    (Events) в инспекторе объектов. В строке OnExit раскрыть список, выбрать название Edit1Change и заменить Change на Exit.
    Для ввода двумерного массива
    из StrigGrid необходимо запи- сать операторы, подобные этим:

    388
    For i:=1 to StringGrid1.RowCount-1 do
    For j:=1 to StringGrid1.ColCount-1 do begin
    Massiv[i,j]:=StrToFloat(StringGrid1.Cells[j,i]); end; {в данном случае begin и end можно опустить}
    Для вывода:
    For i:=1 to StringGrid1.ColCount-1 do
    For j:=1 to StringGrid1.RowCount-1 do
    StringGrid1.Cells[j,i]:=FloatToStr(Massiv[i,j]);
    Понятие о классах в Delphi
    В языке объектно-ориентированного программирования
    Delphi дается возможность определять так называемые классы.
    Класс — это сложная структура, включающая помимо описания данных, описание процедур и функций, которые могут быть вы- полнены над представителем класса — объектом.
    Система Delphi всегда сама генерирует свои классы во время проектирования приложения.Описание сформированного класса находится в разделе type интерфейсной части модуля. На- пример, в программе про бак для летнего душа из темы 1 описа- ние класса выглядит так: type
    TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label5: TLabel;
    Label6: TLabel;
    Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject);

    389
    procedure Button4Click(Sender: TObject); private
    { Private declarations } public
    { Public declarations } end;
    Как мы видим, в класс включены компоненты (данные) и методы их обработки (процедуры). В секции private (закрытые) объявляются элементы класса, которые должны быть недоступны в других модулях. В секции public (открытые) помещаются эле- менты, доступные в других модулях.
    Практика
    Задача
    Составить программу для транспонирования квадратной мат- рицы порядка N и определения следа матрицы.
    Транспонированной матрицей к исходной является такая мат- рица, у которой элементы строк исходной матрицы расставлены в столбцы, а элементы столбцов исходной в строки.
    Следом матрицы называется сумма главных диагональных элементов.
    Компоненты
    Имя компонента
    Свойства компонента
    Значение
    Назначение
    Form1 Caption
    Матрица
    Заголовок главной формы
    Label1 Caption
    Программа пред- назначена для преобразования квадратной мат- рицы (количество строк равно коли- честву столбцов)
    Справочная ин- формация для пользователя про- граммы
    Label2 Caption
    Размерность мат- рицы
    Подсказка пользо- вателю
    Edit1 Text ….. Поле для ввода размерности мат- рицы
    Form1.StringGrid1 ColCount
    FixedCol
    5 1
    Количество столб- цов по умолчанию
    Количество фик- сированных слева

    390
    FixedRow
    Options: goFixedVertLine goFixedHorzLine goVertLine goHorzLine goTabs goAlwaysShowE- ditor
    1
    True
    True
    True
    True
    True
    True столбцов
    Количество фик- сированных свер- ху строк
    Опции:
    Разметка зафик- сированных вер- тикальных линий
    Разметка зафик- сированных гори- зонтальных линий
    Разметка верти- кальных линий внутри таблицы
    Разметка горизон- тальных линий внутри таблицы
    Разрешает ис- пользование кла- виши Tab для пе- ремещения в дру- гую ячейку
    Признак нахожде- ния компонента в режиме редакти- рования
    Form1.Button1 Caption
    Транспонирован- ная матрица
    Кнопка для вы- полнения транс- понирования и вывода в новое окно
    Form1.Button2 Caption
    След матрицы
    Кнопка для вычис- ления следа мат- рицы и вывода в новое окно
    Form1.Button3 Caption
    Выход
    Кнопка для за- вершения работы программы
    Form2 Caption
    Транспонирован- ная матрица
    Заголовок формы
    Form2.StringGrid1 ColCount
    5
    Количество столб- цов по умолчанию

    391
    FixedCol
    FixedRow
    Options: goFixedVertLine goFixedHorzLine goVertLine goHorzLine goTabs goAlwaysShowE- ditor
    1 1
    True
    True
    True
    True
    True
    True
    Количество фик- сированных слева столбцов
    Количество фик- сированных свер- ху строк
    Опции:
    Разметка зафик- сированных вер- тикальных линий
    Разметка зафик- сированных гори- зонтальных линий
    Разметка верти- кальных линий внутри таблицы
    Разметка горизон- тальных линий внутри таблицы
    Разрешает ис- пользование кла- виши Tab для пе- ремещения в дру- гую ячейку
    Признак нахожде- ния компонента в режиме редакти- рования
    Form2.Button1 Caption
    Выход
    Кнопка для закры- тия окна “Транс- понированная матрица”
    Form3 Caption
    След матрицы
    Заголовок формы
    Label1 Caption
    Сумма главных диагональных элементов матри- цы называется следом матрицы
    Справочная ин- формация для пользователя про- граммы
    Label2 Caption
    Поле для вывода, рассчитанного программой зна- чения следа мат- рицы

    392
    Form3.Button1 Caption
    Выход
    Кнопка для закры- тия окна “След матрицы”
    Переменные и массивы
    Обозначение в программе
    Содержание
    Тип
    N
    Порядок квадратной матрицы
    Целый
    M
    Квадратная матрица действитель- ных чисел
    Вещественный, расширенный
    I
    Текущий номер строки матрицы или столбца в StringGrid
    Целый
    J
    Текущий номер столбца матрицы или строки в StringGrid
    Целый
    Sled
    След матрицы
    Вещественный, расширенный
    Проекты форм
    Для решения данной задачи рекомендуется создать три окна.

    393
    Текст модуля
    unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls, Grids,Unit2,Unit3;
    // подключаются модули, связанные со второй и третьей формами type
    TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;

    394
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    M :array [1..100,1..100] of Extended; // квадратная матрица
    N:Integer;// порядок матрицы
    Sled: Extended; // след матрицы end;
    var
    Form1: TForm1;
    implementation
    {$R *.dfm}
    // процедура читает из таблицы на главной форме квадратную матрицу
    // транспонирует матрицу и выводит в таблицу StringGrid
    // на вторую форму
    procedure TForm1.Button1Click(Sender: TObject);
    Var i:Integer; // номер строки матрицы/номер столбца StringGrid j:Integer; // номер столбца матрицы/номер строки StringGrid
    begin
    // чтение значений квадратной матрицы из компонента StringGrid
    // главной формы
    For i:=1 to StringGrid1.RowCount-1 do
    For j:=1 to StringGrid1.ColCount-1 do begin
    M[i,j]:=StrToFloat(StringGrid1.Cells[j,i]); end;
    // открывается вторая форма
    Form2.Show;
    // количеству строк и столбцов компонента StringGrid на второй форме
    // присваивается значение порядок: матрицы +1
    Form2.StringGrid1.RowCount:=N+1;
    Form2.StringGrid1.ColCount:=N+1;
    // подписываются заголовок таблицы, и номера строк
    For i:=1 to Form2.StringGrid1.RowCount do

    395
    Form2.StringGrid1.Cells[i,0]:= IntToStr(i);
    For j:=1 to Form2.StringGrid1.ColCount do
    Form2.StringGrid1.Cells[0,j]:= IntToStr(j);
    { вывод в компонент StringGrid на второй форме транспонированной матрицы}
    { Транспонированная матрица не создается. Транспонирование осуще- ствляется путем вывода столбца исходной матрицы в строку компонента
    StringGrid. В StringGrid номер столбца i, номер строки j.}
    For i:=1 to Form2.StringGrid1.ColCount-1 do
    For j:=1 to Form2.StringGrid1.RowCount-1 do
    Form2.StringGrid1.Cells[i,j]:=FloatToStr(M[i,j]); end;
    { Процедура подготовки таблицы на форме для ввода квадратной матрицы, которая выполняется при выходе из поля ввода размерности матрицы.} procedure TForm1.Edit1Exit(Sender: TObject);
    Var i,j:Integer;//номера строки столбца квадратной матрицы begin
    // порядок матрицы получает свое значение из поля ввода
    N:=StrToInt(Edit1.Text);
    // свойство количество строк компонента StringGrid
    // получает значение: порядок +1
    StringGrid1.RowCount:=N+1;
    // свойство количество столбцов компонента StringGrid
    // получает значение порядок: +1
    StringGrid1.ColCount:=N+1;
    //подпись заголовка таблицы
    For i:=1 to StringGrid1.RowCount do
    StringGrid1.Cells[i,0]:= IntToStr(i);
    //подпись строк таблицы
    For j:=1 to StringGrid1.ColCount do
    StringGrid1.Cells[0,j]:= IntToStr(j);
    // добавление в свойства таблицы признака
    // допустимости редактирования содержимого ячеек таблицы
    StringGrid1.Options:= StringGrid1.Options +[goEditing];
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    Form1.Close
    end;
    // процедура вычисляет след матрицы и выводит результат
    // на третью форму
    procedure TForm1.Button2Click(Sender: TObject);
    Var i: Integer;

    396
    begin
    Sled:=0;
    Form3.Show;
    For i:=1 to Form1.StringGrid1.ColCount-1 do
    Sled:= Sled + M[i,i];
    Form3.Label2.Caption:=' След матрицы равен ' + FloatToStr(Sled)
    end;
    end.
    { Модуль, связанный со второй формой}
    unit Unit2;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
    Forms, Dialogs, StdCtrls, Grids;
    type
    TForm2 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form2: TForm2;
    implementation
    {$R *.dfm}
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    Form2.Close
    end;
    end.
    { Модуль, связанный с третьей формой.}
    unit Unit3;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
    type
    TForm3 = class(TForm)
    Label1: TLabel;

    397
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    M :array [1..100,1..100] of Extended;
    N:Integer;
    Sled: Extended;
    end;
    var
    Form3: TForm3;
    implementation
    {$R *.dfm}
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    Form3.Close
    end;
    end.
    Тестовый пример

    398
    Задачи для самостоятельного решения
    Группа А
    № 6.1. Дана действительная матрица размера N х M элементов:

    399
    a
    11
    a
    12
    a
    13
    ... a
    1m а
    21
    a
    22
    a
    23
    ... a
    2m
    .................... … а
    n1
    a n2
    a n3
    ... a nm
    Найти сумму положительных элементов матрицы.
    № 6.2. Дана целочисленная квадратная матрица порядка n. Найти номера строк: а) все элементы которых — нули; б) все элементы которых четны.
    № 6.3. Дана действительная матрица размера N х M элементов, все элементы которой различны. Найти наибольший и наимень- ший элементы матрицы.
    № 6.4. Дана целочисленная квадратная матрица порядка n. Под- считать: а) количество нулей, стоящих на главной диагонали; б) количество единиц в матрице.
    № 6.5. Дана действительная матрица размера N х M элементов, все элементы которой различны. Указать номер строки и столбца, на пересечении которых находится минимальный элемент матри- цы. Подсчитать количество отрицательных элементов.
    № 6.6. Дана целочисленная квадратная матрица порядка n. Найти номера строк: а) все элементы которых положительны; б) все элементы которых нечетны.
    № 6.7. Дана целочисленная квадратная матрица порядка n. Найти номера столбцов: а) все элементы которых отрицательны; б) все элементы которых равны нулю.
    № 6.8. Дана действительная матрица размера N х M элементов: a
    11
    a
    12
    a
    13
    ... a
    1m а
    21
    a
    22
    a
    23
    ... a
    2m
    .................... … а
    n1
    a n2
    a n3
    ... a nm
    Найти номера строк матрицы, где все элементы различны.
    № 6.9. Дана целочисленная квадратная матрица порядка n. Под- считать: а) произведение элементов главной диагонали; б) коли- чество нулей.
    № 6.10. Дана действительная матрица размера N х M элементов, все элементы которой различны. Вывести элементы матрицы, ко- торые меньше среднего арифметического из ее элементов.
    Группа Б

    400
    № 6.11. Дана матрица A размера N х M элементов, содержащая вещественные числа,. Сформировать из нее массив B, состоящий из сумм положительных элементов каждой строки; если таких в строке нет, результат должен быть равен 0.
    № 6.12. Дана матрица A размера N х M элементов, содержащая вещественные числа,. Сформировать из нее массив B, состоящий из произведений положительных элементов каждой строки; если таких в строке нет, результат должен быть равен 0.
    № 6.13. Дана матрица A размера N х M элементов , содержащая вещественные числа. Сформировать из нее массив B, состоящий из сумм отрицательных элементов каждой строки; если таких в строке нет, результат должен быть равен 0.
    № 6.14 Дана матрица A размера N х M элементов, содержащая вещественные числа. Сформировать из нее массив B, состоящий из числа отрицательных элементов каждой строки.
    № 6.15. Дана действительная матрица размера N х M элементов:
    | a11 a12 a13 ... a1m|
    |а21 a22 a23 ... a2m |
    | .................... |
    |аn1 an2 an3 ... anm|
    Получить последовательность b1,..., bn, где bk — произведение квадратов тех элементов k-й строки, модули которых принадле- жат отрезку [1,1.5].
    № 6.16. Даны: натуральное число n, целочисленная квадратная матрица порядка n. Получить последовательность b1,...,bn, где bi
    — сумма элементов, расположенных за первым отрицательным элементом в i-й строке (если все элементы строки неотрицатель- ны, то принять bi= –1).
    № 6.17. Дана действительная матрица размера n x m, в которой не все элементы равны нулю. Получить новую матрицу путем деле- ния всех элементов данной матрицы на ее наибольший по моду- лю элемент.
    № 6.18. Даны натуральное число n, действительное число x, дей- ствительная матрица размера n х 2n. Получить последователь- ность b1,...,bn из нулей и единиц, где bi=1, если элементы i-й строки матрицы не превосходят х, и bi=0 в противном случае.

    401
    № 6.19. Дана целочисленная квадратная матрица a порядка m.
    Строку с номером i матрицы назовем отмеченной, если a ij
    >0, и неотмеченной в противном случае. а) Нужно все элементы, расположенные в неотмеченных строках матрицы, преобразовать по правилу: отрицательные элементы заменить на –1, положительные — на 1, а нулевые оставить без изменения. б) Подсчитать число отрицательных элементов матрицы, распо- ложенных в неотмеченных строках.
    № 6.20. Дана действительная квадратная матрица порядка n. По- лучить x
    1
    x n
    + x
    2
    x n-1
    + ... + x n
    x
    1
    , где x k
    — наибольшее значение элементов k–й строки данной матрицы.
    1   ...   13   14   15   16   17   18   19   20   21


    написать администратору сайта