Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Программирование в среде Delphi (Часть 1).pdf
Скачиваний:
50
Добавлен:
27.05.2015
Размер:
1.11 Mб
Скачать

min_i := 1; min_j := 1;

for i := 1 to Source_SG.RowCount do for j := 1 to Source_SG.ColCount do

if matr[min_i,min_j]>matr[i,j] then begin

min_i := i; min_j := j;

end;

{Вывод результатов} FindRow_E.Text := IntToStr(min_i); FindCol_E.Text := IntToStr(min_j);

end;

Внешний вид и пример работы программы показаны на рисунке 5.

Рисунок 5 – Внешний вид и пример работы программы, реализующей обработку матриц

2.6 Строки

Задание: Дана строка, состоящая из слов, разделенных пробелом. Сформировать одномерный массив, состоящий из слов данной строки.

Для решения поставленной задачи потребуются компоненты:

Source_E класса TEdit для ввода исходной строки;

Dest_M класса TMemo для вывода полученного массива слов;

Source_L класса TLabel для подписи компонента Source_E;

Dest_L класса TLabel для подписи компонента Dest_M;

Calc_B класса TButton для активизации расчета.

Установим следующие значения свойств компонентов (таблица 9):

20

Таблица 9 – Значения свойств компонентов для примера выполнения задания по работе со строками

Компонент.Свойство

Значение

Source_L.Caption

&Исходная строка

Source_L.FocusControl

Source_E

 

 

Dest_L.Caption

Полученный массив &слов

Dest_L.FocusControl

Dest_M

 

 

Dest_M.ReadOnly

True

Dest_M.ScrollBars

ssVertical

Calc_B.Caption

Рас&чет

Очистим свойство «Text» у компонента Source_E и свойство «Lines» у компонента Dest_M.

Опишем событие OnClick кнопки Calc_B:

procedure TForm1.Calc_BClick(Sender: TObject); var

s : string;

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

begin

{Получение исходной строки} s := Source_E.Text;

{Переменная start указывает на начала обрабатываемого слова.

Если ее значение равно "0", то никакое слово не обрабатывается}

start := 0;

{Установка начального количества слов в "0"} n := 0;

{Организация цикла по перебору символов строки} for i := 1 to Length(s) do

begin

if s[i]=' ' then // Текущий символ пробел begin

if start>0 then // Имеется текущее слово

begin

 

inc(n);

// Увеличение количества найденных слов

mas[n] := Copy(s,start,i-start); // Копирование слова

start := 0;

// Текущих слов нет

end;

 

end

 

else

// Текущий символ не пробел

if start=0 then

// Текущих слов нет

start := i;

// Запоминание позиции текущего слова

end;

 

if start>0 then

// Имеется текущее слово

begin

 

inc(n);

// Увеличение количества найденных слов

mas[n] := Copy(s,start,Length(s)-start+1); // Копирован. слова

21

end;

 

{Вывод массива слов}

 

Dest_M.Clear;

// Очистка компонента вывода

for i := 1 to n do

Dest_M.Lines.Add(mas[i]); // Добавление строк

end;

Внешний вид и пример работы программы показаны на рисунке 6.

Рисунок 6 – Внешний вид и пример работы программы, реализующей обработку строк

2.7 Записи и файлы

Задание: Картотека содержит данные о людях: фамилия, года рождения, количество детей. Составить программы, использующие для хранения данных о человеке тип «запись» и обеспечивающие:

а) ввод данных о людях и запись их в двоичный файл; б) чтение данных из файла, вывод прочитанных данных, а также данных

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

Будем считать, что максимальное количество людей – 100, заданный год лежит в диапазоне 1900÷2010, а начальное значение года – 1980. Примем в качестве имени файла для записи и чтения название «data.dat».

Для решения поставленной задачи потребуются компоненты:

Count_SE класса TSpinEdit для задания количества людей;

PeoplesSave_SG класса TStringGrid для ввода данных о людях;

Year_SE класса TSpinEdit для задания заданного года;

PeoplesLoad_SG класса TStringGrid для вывода считанных из файла

данных о людях;

22

Find_SG класса TStringGrid для вывода данных о найденном человеке;

Count_L класса TLabel для подписи компонента Count_SE;

PeoplesSave_L класса TLabel для подписи компонента

PeoplesSave_SG;

Year_L класса TLabel для подписи компонента Year_SE;

PeoplesLoad_L класса TLabel для подписи компонента

PeoplesLoad_SG;

Find_L класса TLabel для подписи компонента Find_SG;

Save_B класса TButton для активизации записи данных в файл;

Load_B класса TButton для активизации чтения данных из файла и вы-

полнения поиска человека.

Установим следующие значения свойств компонентов (таблица 10):

Таблица 10 – Значения свойств компонентов для примера выполнения задания по работе с записями и файлами

Компонент.Свойство

Значение

Count_L.Caption

Количество &людей

Count_L.FocusControl

Count_SE

 

 

Count_SE.MinValue

1

Count_SE.MaxValue

100

Count_SE.Value

1

PeoplesSave_L.Caption

С&писок людей для записи

PeoplesSave_L.FocusControl

PeoplesSave_SG

PeoplesSave_SG.RowCount

2

 

 

PeoplesSave_SG.ColCount

3

 

 

PeoplesSave_SG.FixedCols

0

PeoplesSave_SG.Options.goEditing

True

PeoplesSave_SG.Options.goAlwaysShowEditor

True

Year_L.Caption

Заданный &год

Year_L.FocusControl

Year_SE

Year_SE.MinValue

1900

 

 

Year_SE.MaxValue

2010

 

 

Year_SE.Value

1980

PeoplesLoad_L.Caption

С&читанный список людей

PeoplesLoad_L.FocusControl

PeoplesLoad_SG

PeoplesLoad_SG.RowCount

2

PeoplesLoad_SG.ColCount

3

 

 

PeoplesLoad_SG.FixedCols

0

 

 

Find_L.Caption

На&йденный человек

Find_L.FocusControl

Find_SG

 

 

Find_SG.RowCount

2

Find_SG.ColCount

3

Find_SG.FixedCols

0

 

 

Save_B.Caption

З&аписать

Load_B.Caption

П&рочитать и найти

23

Так как заголовки столбцов таблиц должны быть отображены при запуске программы, но их невозможно задать через свойства компонентов, задание заголовков выполним в событии OnCreate формы:

procedure TMain_F.FormCreate(Sender: TObject); begin

PeoplesSave_SG.Cells[0,0] := 'Фамилия'; PeoplesSave_SG.Cells[1,0] := 'Год рождения'; PeoplesSave_SG.Cells[2,0] := 'К-во детей'; PeoplesLoad_SG.Cells[0,0] := 'Фамилия'; PeoplesLoad_SG.Cells[1,0] := 'Год рождения'; PeoplesLoad_SG.Cells[2,0] := 'К-во детей'; Find_SG.Cells[0,0] := 'Фамилия'; Find_SG.Cells[1,0] := 'Год рождения';

Find_SG.Cells[2,0] := 'К-во детей'; end;

Опишем событие OnChange компонента Count_SE:

procedure TMain_F.Count_SEChange(Sender: TObject); begin

{Количество строк должно быть на одну больше количества

людей, т.к. одна строка используется для заголовков}

PeoplesSave_SG.RowCount := Count_SE.Value+1; end;

Опишем тип данных для хранения информации об одном человеке. Тип данных может быть описан в разделе type секции implementation.

TPeople = record

LastName : ShortString; BirthYear,CountChild : integer;

end;

Опишем событие OnClick кнопки Save_B (программа «а)»):

procedure TMain_F.Save_BClick(Sender: TObject); var

people : TPeople; f : file;

i : integer; begin

{Создание и открытие файла для записи} AssignFile(f,'data.dat'); Rewrite(f,1);

{Запись данных о людях с использованием цикла. Цикл

начинается с "1" а не с "0", т.к. первая строка

содержит заголовки}

for i := 1 to PeoplesSave_SG.RowCount-1 do begin

{Получение данных о i-ом человеке}

24

people.LastName := PeoplesSave_SG.Cells[0,i]; people.BirthYear := StrToInt(PeoplesSave_SG.Cells[1,i]); people.CountChild := StrToInt(PeoplesSave_SG.Cells[2,i]); {Запись данных о i-ом человеке} blockwrite(f,people.LastName,SizeOf(people.LastName)); blockwrite(f,people.BirthYear,SizeOf(people.BirthYear)); blockwrite(f,people.CountChild,SizeOf(people.CountChild));

end;

CloseFile(f); // Закрытие файла end;

Опишем событие OnClick кнопки Load_B (программа «б)»):

procedure TMain_F.Load_BClick(Sender: TObject); var

peoples : array[1..100] of TPeople; f : file;

i,count,min_index : integer; begin

{Задание имени файла и открытие на чтение} AssignFile(f,'data.dat');

Reset(f,1);

{Начальное значение количества считанных данных - 0} count := 0;

{Организация цикла считывания данных.

Считывание осуществляется до конца файла} while not Eof(f) do

begin

{Увеличение количества считанных данных} inc(count);

{Считывание новых данных} blockread(f,peoples[count].LastName,

SizeOf(peoples[count].LastName));

blockread(f,peoples[count].BirthYear,

SizeOf(peoples[count].BirthYear));

blockread(f,peoples[count].CountChild,

SizeOf(peoples[count].CountChild));

end;

CloseFile(f); // Закрытие файла

{Установка количества строк в таблице для считанных данных} PeoplesLoad_SG.RowCount := count+1;

{Вывод считанных данных} for i := 1 to count do begin

PeoplesLoad_SG.Cells[0,i] := peoples[i].LastName; PeoplesLoad_SG.Cells[1,i] :=

IntToStr(peoples[i].BirthYear); PeoplesLoad_SG.Cells[2,i] :=

IntToStr(peoples[i].CountChild);

end;

{Будем считать, что значение min_index либо равно "0",

если ни одного человека не найдено, либо хранит номер

25