- •Сборник МетодическиХ указаниЙ по выполнению лабораторных работ
- •Информатика
- •Введение. Назначение Delphi и его особенности
- •Начало работы
- •Меню и команды Delphi
- •Полоска кнопок быстрого доступа SpeedBar
- •Локальные меню SpeedMenu
- •Работа с формами
- •Палитра компонентов
- •Система подсказок
- •Навигатор кода
- •Написание кода
- •Справочная система
- •Структура проекта
- •Окончательная настройка приложения
- •Событие и процедура обработки события
- •Запуск программы
- •Предупреждения и подсказки
- •Ошибки времени выполнения
- •Компиляция
- •Отладка программы
- •Файлы, создаваемые системой
- •Репозиторий объектов и его страницы
- •Тула 2014 г.
- •Создание приложения в среде разработки Delphi
- •Первый проект
- •Компоненты
- •Начальные сведения о программах на языке Pascal
- •Комментарии
- •Директивы компилятора
- •Идентификаторы
- •Переменные и типы данных
- •Константы
- •Неименованные константы
- •Нетипизированные константы
- •Типизированные константы
- •Простейшие операторы
- •1. Простейшие арифметические и логические операции
- •2. Линейные программы
- •Тула 2014 г.
- •Сущность задач с ветвлениями
- •Логический тип данных
- •Организация ветвлений
- •Объединение операторов
- •Сложные условия
- •Множественное ветвление
- •Применение оператора-переключателя Case
- •Тула 2014 г.
- •Сущность задач с циклами
- •Цикл с предусловием
- •Вечный цикл
- •Цикл с постусловием
- •Цикл с переменной
- •Дополнительные операторы управления циклами
- •Вложенные циклы
- •Инструкция goto
- •1. Циклические программы
- •2. Задачи, решаемые методом перебора.
- •Тула 2014 г.
- •Статические массивы
- •Многомерные статические массивы
- •Ввод-вывод массивов
- •Считывание массива из файла
- •Поиск максимума и минимума
- •Пример программы
- •Динамические массивы
- •Создание динамических массивов
- •Многомерные динамические массивы
- •1. Одномерные массивы
- •2. Двумерные массивы
- •Тула 2014 г.
- •Процедуры и функции
- •Что такое функция?
- •Функция: туда и обратно
- •Процедуры
- •Передача данных в процедуры
- •Вложенные процедуры и функции
- •Тула 2014 г.
- •Символьный тип
- •Символ-константа и строка-константа Неименованные константы
- •Нетипизированные константы
- •Типизированные константы
- •Действия с символами Операции
- •Стандартные функции и процедуры обработки строк
- •Операции со строками Сравнения
- •Обращение к компонентам строки
- •Конкатенация
- •Удаление символов в строке
- •Определение позиции подстроки
- •Выделение подстроки
- •Множества
- •Описание множеств
- •Множество-константа Неименованная константа
- •Нетипизированная константа
- •Типизированная константа
- •Операции с множествами
- •Представление множеств массивами
- •Представление множеств линейными массивами
- •Представление множеств битовыми массивами
- •1. Строковый тип данных
- •2. Типы данных «множество» и «запись»
- •Тула 2014 г.
- •Введение
- •Что такое файл?
- •Когда нужно использовать файлы
- •Разновидности файлов
- •Описание файлов
- •Текстовые файлы
- •Оперирование файлами
- •Назначение файла
- •Открытие файла
- •Закрытие файла
- •Считывание из файла
- •Запись в файл
- •Пробельные символы
- •Пример использования файлов
- •Изменение реакции на ошибку
- •Бинарные файлы
- •Типизированные файлы
- •Нетипизированные файлы
- •Подпрограммы обработки директорий
- •Применимость подпрограмм обработки файлов
- •Индивидуальные задания
- •Свойства в Delphi
- •Вложенных свойств
- •Управление свойствами визуальных компонент в режиме выполнения
- •Программа shapedem2
- •Тула 2014 г.
- •Графические компоненты
- •Построение графиков с помощью компонентной технологии
- •Тула 2014 г.
- •Создание меню
- •Использование компонента tTimer
- •Тула 2014 г.
- •Работа с компонентом RichEdit
- •Тула 2014 г.
- •Тула 2014 г.
- •Что такое мультимедиа
- •Мультимедиа в Delphi
- •Компонент tMediaPlayer
- •Два вида программ мультимедиа
- •Пример программы с мультимедиа
Считывание массива из файла
Чтобы сто раз не вводить одно и то же, удобно организовать считывание элементов массива из текстового файла. В каждой строчке такого файла записан один элемент массива (рис. 2, а).
Рис. 2. Файлы для хранения массивов.
Считывание делается примерно следующим образом:
TYPE TA=ARRAY[1..10] OF REAL;
VAR a:TA; f:TEXTFILE; i:BYTE;
BEGIN
ASSIGNFILE(f,'1.txt');
RESET(f);
FOR i:=1 TO 10 DO
READLN(f,a[i]);
CLOSEFILE(f);
…
Преобразование типов (из файла считывается текстовая строка, а в массив оно заносится как вещественное число) выполняется автоматически процедурой READLN.
Если массив двумерный, то удобно в каждой строчке файла располагать несколько его элементов, разделяя их пробелами. Давайте считаем массив 33 элемента, показанный на рис. 2, б.
TYPE TA=ARRAY[1..3,1..3] OF REAL;
VAR a:TA; i,j:BYTE; f:TEXTFILE;
BEGIN
ASSIGNFILE(f,'1.txt');
RESET(f);
// Цикл по строкам файла
FOR i:=1 TO 3 DO
BEGIN
// Цикл по числам внутри строки
FOR j:=1 TO 3 DO
READ(f,a[I,j]);
// Считывание символов конца строки
READLN(f)
END;
CLOSEFILE(f);
…
В приведенном фрагменте используется процедура READ, которая считывает не строку целиком, а ее часть до следующего пробела. После считывания всех чисел из строки нужно перейти на следующую строчку, для чего применяется процедура READLN(f). Данных она не считывает, а просто переходит к следующей строке файла.
Поиск максимума и минимума
Допустимые отклонения размеров деталей будут накапливаться
Очень часто встречается задача нахождения минимального или максимального элемента в массиве. Существует много неправильных способов ее решения. А вот как выглядит правильный:
CONST Nmax=10; { число элементов в массиве }
TYPE TA=ARRAY[1..Nmax] OF REAL;
VAR a:TA; i:BYTE; max: REAL;
BEGIN
// заполнение массива
FOR i:=1 TO Nmax DO
a[i]:=RANDOM;
max := a[1];
FOR i:=2 TO Nmax DO
IF a[i]>max THEN
max:=a[i];
Label1.Caption:=
'Максимальный элемент равен '+FloatToStrF(max,ffFixed,10,4);
Суть этого способа в том, что сначала мы принимаем первый элемент массива за максимальный, а потом сравниваем с ним все остальные элементы, начиная со второго. Если очередной элемент окажется больше, мы запоминаем его значение в переменной max.
Пример программы
Следующая программа обрабатывает результаты спортивных соревнований (зимней олимпиады в Нагано, 1998 г.). Исходные данные для обработки представлены в таблице.
Результаты зимней олимпиады в Нагано (Япония, 1998)
Страна
|
Количество медалей
|
||
золотых
|
серебряных
|
бронзовых
|
|
Австрия Германия Италия Канада Нидерланды Норвегия Россия США Финляндия Швейцария Япония
|
3 12 2 6 5 10 9 6 2 2 5 |
5 9 6 5 4 10 6 3 4 2 1 |
2 8 2 4 2 5 3 4 6 3 4
|
Программа должна вычислить общее количество медалей, завоеванное представителями каждой страны, и соответствующее количество очков (баллов), которое вычисляется по следующему правилу: за каждую золотую медаль команда получает семь очков, за серебряную — шесть, за бронзовую — пять очков.
Вид диалогового окна программы приведен на рис.
В форме приложения (рис. 3) появился компонент, который до сих пор в программах книги не использовался, — StringGrid (строковая таблица), значок которого находится на дополнительной (Additional) странице палитры компонентов.
Рис. 3. Форма приложения
Ниже перечислены некоторые свойства компонента StringGrid.
Свойство |
Значение |
Имя компонента. Используется в программе для доступа к свойствам компонента |
Name |
Количество колонок таблицы |
ColCount |
Количество строк таблицы |
RowCount |
Соответствующий таблице двумерный строковый массив. Если строки и столбцы таблицы нумеровать с нуля, то ячейке (Cell) таблицы, находящейся на пересечении i-й колонки и j-й строки соответствует cells [i, j] элемент массива |
Cells |
Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте/ |
FixedCols |
Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте |
FixedRows |
Признак допустимости редактирования содержимого ячеек таблицы |
Options.goEditing |
Ширина колонок таблицы |
DefaultColWidth |
Высота строк таблицы |
DefaultRowHeight |
Ширина линий, ограничивающих ячейки таблицы |
GridLineWidth |
Расстояние от левой границы поля таблицы до левой границы формы |
Left |
Расстояние от верхней границы поля таблицы до верхней границы формы |
Тор |
Высота поля таблицы |
Height |
Ширина поля таблицы |
Width |
Шрифт, используемый для отображения содержимого ячеек таблицы |
Font |
Признак наследования характеристик шрифта формы |
ParentFont |
В следующей таблице приведены значения свойств компонента StringGrid, используемого программой обработки результатов олимпиады для ввода исходных данных и вывода результата.
Свойство |
Значение |
Name |
Tabl |
ColCount |
6 |
RowCount |
12 |
FixedCols |
0 |
FixedRows |
1 |
Options.goEditing |
True |
DefaultColWidth |
65 |
DefaultRowHeight |
14 |
GridLineWidth |
1 |
Ячейки первой, зафиксированной, строки таблицы используются в качестве заголовков колонок таблицы. Во время создания формы приложения установить значения элементов массива cells нельзя, так как элементы массива доступны только во время работы программы. Поэтому значения элементов массива cells, соответствующих первой строке таблицы, устанавливает процедура обработки события onActivate (ее текст приведен ниже), которое происходит во время активизации формы приложения. Кроме того, эта процедура вписывает в первую колонку таблицы названия стран-участниц соревнований.
procedure TFonnl.FormActivate(Sender: TObject) ;
begin
Label1.Caption:='Вычисляет количество медалей, завоеванных спортсменами каждой страны'+#13+
'и количество набранных баллов, Затем список будет отсортирован в соответствии '+#13+
'с количеством баллов';
tabl.Cells[0,0] :='Страна';
tabl.Cells[1,0] :='Золотых';
tabl.Cells[2,0] :='Серебряных';
tabl.Cells[3,0] :='Бронзовых';
tabl.Cells[4,0] :='Всего';
tabl.Cells[5,0] :='Баллов';
tabl.Cells[0,1] :='Австрия';
tabl.Cells[0,2] :='Германия';
tabl.Cells[0,3] :='Италия';
tabl.Cells[0,4] :='Канада';
tabl.Cells[0,5] :='Нидерланды';
tabl.Cells[0,6] :='Норвегия';
tabl.Cells[0,7] :='Россия';
tabl.Cells[0,8] :='США';
tabl.Cells[0,9] :='Финляндия';
tabl.Cells[0,10]:='Швейцария';
tabl.Cells[0,11]:='Япония';
end;
Программа обработки исходной таблицы, текст которой приведен ниже, запускается в результате щелчка на командной кнопке Итоги (Button1).
procedure TForm1.Button1Click(Sender: TObject);
var
c,r:integer; { номер колонки и строки таблицы }
s:integer; { всего медалей у команды }
p:integer; { очков у команды }
m: integer; { номер строки с максимальным количеством очков }
buf:array[0..6] of string; { буфер для обмена строк }
i:integer; { номер строки используется во время сортировки }
begin
for r:=1 to tabl.rowcount do { обработать все строки }
begin s:=0;
{ вычисляем общее кол-во медалей }
for c:=1 to 3 do
if tabl.cells[c,r] <> ''
then s:=s+StrToInt(tabl.cells[c,r])
else tabl.cells[c,r]:='0';
{ вычисляем количество очков }
p:=7*StrToInt(tabl.cells[1,r])+ 6*StrToInt(tabl.cells[2,r])+ 5*StrToInt(tabl.cells[3, r] );
{ вывод результата } tabl.cells[4,r]:=IntToStr(s) ;
tabl.cells[5,r]:=IntToStr(p) ;
end;
{ сортировка таблицы }
for r:=1 to tabl.rowcount-1 do
begin
m:=r; { максимальный элемент - в г-й строке }
for i:=r to tabl.rowcount-1 do
if StrToInt(tabl.cells[5,i])>StrToInt(tabl.cells[5, m])
then m:=i;
if r <> m then
begin { обменяем г-ю и m-ю строки таблицы }
for c:=0 to 5 do begin
buf[c]:=tabl.Cells[c,r];
tabl.Cells[c,r]:=tabl.Cells[c,m] ;
tabl.Cells[c,m]:=buf[c] ;
end;
end;
end;
end;
Сначала для каждой страны программа вычисляет общее количество медалей и соответствующее ему количество очков. Затем, используя метод простого выбора, программа выполняет сортировку таблицы по убыванию количества набранных очков. Во время сортировки для обмена строк таблицы используется строковый массив buf, индекс которого, как и индекс строки таблицы, меняется от нуля до пяти (см. инструкцию объявления массива в тексте программы). Такой прием позволяет наиболее просто выполнить копирование замещаемой строки в буфер и замещение строки содержимым буфера.
На рис. 4 приведен пример результата работы программы.
Рис. 4. Результат работы программы
