Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование. Процедурное программирование. Учебное пособие
.pdf
Основные возможности процедурного программирования при работе с комбинированными данными…
Multiply(C1, C2, C3);
Print(C3);
Write('Частное чисел:');
Divide(C1, C2, C3);
Print(C3);
Write('Модуль первого числа:');
WriteLn(Modul(C1):6:2);
ReadLn;
end.
Результат работы программы
Вводите через пробел действительную и мнимую части комплексных
чисел.
Введите первое число: 2.3 7
Введите второе число: 1 -3
Сумма чисел: 3.30 + i * 4.00
Разность чисел: 1.30 + i * 10.00
Произведение чисел: 23.30 + i * 0.10
Частное чисел: -1.87 + i * 1.39
Модуль первого числа: 7.37
Контрольные вопросы и задания
1. Для чего нужна и как реализуется обработка исключительных си-
туаций?
Чем полезен модульный подход в программировании?
2.
Опишите структуру модуля в Delphi.
3.
Каков порядок выполнения инициализирующих и финализирую-
4.
щих частей подключенных нескольких модулей?
Опишите структуру модуля, предназначенного для работы с фай-
5.
лами.
81

Глава 3
Глава 3. ТИПОВЫЕ ПРОВЕРОЧНЫЕ РАБОТЫ
3.1. Проверочная работа № 1
Расследуя преступление, инспектор опросил 5 человек, видели ли они
друг друга в тот день. На языке Delphi написать программу, выполняющую следующие пункты задания:
Записать или сгенерировать случайным образом и вывести на эк-
1.
ран результат опроса.
Определить список людей, которых никто не видел.
2.
Рекурсивно найти человека, которого видели наибольшее число
3.
людей.
Листинг 11. Текст программы для проверочной работы № 1
program Exam1;
{$APPTYPE CONSOLE}
uses SysUtils, Windows;
const N = 5;
{ Двумерный массив предназначен для хранения данных опроса. }
type TResponses = array[1..N, 1..N] of Integer;
{ Процедура Init заполняет при помощи датчика случайных чисел
массив A данными опроса:
1) если I-й человек видел J-го, то A[I, J] = 1,
2) если не видел, то A[I, J] = 0,
3) A[I, I] = 0.}
procedure Init(var A: TResponses);
var I, J: Integer;
begin
Randomize; // Инициализируем датчик случайных чисел.
{ В двойном цикле записываем в элементы массива случайные
значения 0 или 1.}
for I := 1 to N do
for J := 1 to N do
A[I, J] := Random(2);
for I := 1 to N do
A[I, I] := 0; // Выставляем нули по диагонали.
end;
{ Процедура Print выводит данные опроса на экран.}
procedure Print(A: TResponses);
var I, J: Integer;
begin
Writeln('Результат опроса:');
for I := 1 to N do // В цикле для каждого I-го
человека
82

Типовые проверочные работы
begin
Write(' ', I, '-й человек видел:');
// выводим список J-х людей, которых он видел.
for J := 1 to N do
if A[I, J] = 1 then Write(' ', J);
Writeln; // Делаем перевод строки.
end;
end;
{ Процедура Search находит и выводит на экран список людей,
которых никто не видел. }
procedure Search(A: TResponses);
var I, J, Sum: Integer;
begin
Write('Список людей, которых никто не видел:');
//Для каждого человека вычисляется количество видевших его
человек
for J := 1 to N do
begin
Sum := 0;
for I := 1 to N do
Sum := Sum + A[I, J];
// Если никто не видел, то выводим его на экран.
if Sum = 0 then Write(J:2);
end;
Writeln;
end;
{ Процедура FindMax рекурсивно находит и выводит на экран
список людей, которых видели максимальное число человек.
На входе в рекурсию (т. е. до рекурсивного вызова) определяется
значение максимума, на выходе (после рекурсивного вызова)
выводится список людей, которые этому максимуму соответствуют.
Параметр J при первом вызове процедуры равен N и понижается
при каждом следующем рекурсивном вызове на 1, условие выхода
из рекурсии J = 0.
Параметр Max при первом вызове равен 0 и обновляется
при обнаружении нового максимума. }
procedure FindMax(A: TResponses; J: Integer; var Max: Integer);
var I, Sum: Integer;
begin
// Для J-го человека вычисляем, сколько человек его видели.
if J > 0 then
begin
Sum := 0;
for I := 1 to N do Sum := Sum + A[I, J];
// Обновляем максимум, если требуется.
if Max < Sum then Max := Sum;
// Выполняем процедуру для оставшихся J - 1 человек.
FindMax(A, J - 1, Max);
83

Глава 3
{ Если найденный максимум совпадает со значением Sum
для текущего (J-го) человека, то выводим его на экран.}
if Max = Sum then Write(J:2);
end;
end;
{ Переменная Responses хранит массив с данными опроса.
Переменная Max используется как параметр в процедуре FindMax
при нахождении максимума.}
var
Responses: TResponses;
Max: Integer;
begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Init(Responses); // Заполняем массив данными опроса.
Print(Responses); // Выводим результат опроса на экран.
// Выполняем поиск людей, которых никто не видел.
Search(Responses);
{ Выполняем поиск людей, которых видели максимальное число
человек.}
Write('Список людей, которых видели максимальное число
человек:');
Max := 0;
FindMax(Responses, N, Max);
ReadLn;
end.
3.2. Проверочная работа № 2
В текстовом файле «города_россии.txt» записаны координаты (се-
верная широта и восточная долгота с точностью до градусов) и названия
городов России. Требуется выполнить следующее:
Найти для заданного города ближайший. Для вычисления расстоя-
1.
ния S между двумя городами можно воспользоваться приближенной формулой
вычисления по которой производят в градусах и где Lat1, Lat2 – широты,
а Lon1, Lon2 – долготы населенных пунктов, между которыми вычисляется
расстояние.
дельный текстовый файл, упорядочив их по названию.
S = 111,2 * ArcCos(Sin(Lat1) * Sin(Lat2) +
+ Cos(Lat1) * Cos(Lat2) * Cos(Lon2 – Lon1)),
Перенести информацию о городах, начинающихся на «К», в от-
2.
84

Типовые проверочные работы
3. Сохранить информацию из текстового файла в типизированном
файле.
Пример файла:
55 37 Москва
56 92 Красноярск
54 20 Калининград
43 131 Владивосток
Листинг 12. Текст программы для проверочной работы № 2
program Exam2;
{$APPTYPE CONSOLE}
uses
SysUtils,Windows, Math;
{ Константа N ограничивает максимальное число городов.}
const N = 100;
{ Определяем типы данных.
Тип данных TCity предназначен для хранения информации об одном
городе(широты Lat, долготы Lon и названия Name).
Тип данных массив TCityArray предназначен для хранения списка
городов. }
type
TCity = record
Lat, Lon: Integer;
Name: string[50];
end;
TCityArray = array[1..N] of TCity;
{ Функция вычисляет примерное расстояние между двумя точками
земной поверхности, заданными своими северной широтой Lat
и восточной долготой Lon. Результат возвращает в километрах.}
function Distance(Lat1, Lon1, Lat2, Lon2: Real): Integer;
var L, R : Real;
begin
Lat1 := Lat1 * PI/180;
Lat2 := Lat2 * PI/180;
L := (Lon2 - Lon1) * PI/180;
R := ArcCos(Sin(Lat1) * Sin(Lat2) + Cos(Lat1) * Cos(Lat2) *
Cos(L));
R := R * 180/PI;
Result := Round(111.2 * R);
end;
{ Процедура для заданного города с именем Name, массива
городов Cities и числа городов в массиве M находит ближайший
город от заданного. }
procedure FindNearCities(Name: string; Cities: TCityArray; M:
Integer);
var I, J, D, Dist, DistI: Integer;
85

Глава 3
begin
J := 0;
// Поиск города Name в списке городов.
for I := 1 to M do
if Cities[I].Name = Name then
begin
J := I; // Город найден, его номер в массиве – J.
break;
end;
// Если город найден,
if J > 0 then
begin
{ то вычисляем начальное минимальное расстояние между ним
и первым либо вторым городом. Номер города, до которого
расстояние минимально, сохраняем в переменной D, само значение
расстояния – в Dist.}
D := 1;
if J = 1 then
D := 2;
Dist := Distance(Cities[D].Lat, Cities[D].Lon, Cities[J].Lat, Cities[J].Lat);
{ Просматриваем массив и находим город с минимальным
расстоянием от заданного.}
for I := 1 to M do
begin
if I = J then
continue;
// Вычисляем расстояние,
DistI := Distance(Cities[I].Lat, Cities[I].Lon, Cities[J].Lat, Cities[J].Lat);
{ сравниваем с уже найденным минимальным расстоянием и,
если новое меньше, то обновляем минимум.}
if DistI < Dist then
begin
Dist := Dist;
D := I;
end;
end;
// Выводим результат.
WriteLn('Ближайший город до ' + Name + ' – ' + Cities[D].Name + '.');
end
else
WriteLn('Города ' + Name + ' нет в списке.');
end;
{ Процедура LoadCities загружает данные о городах из текстового
файла F в массив Cities, число загруженных городов сохраняется
в параметре M.}
86

Типовые проверочные работы
procedure LoadCities(var F: TextFile; var Cities: TCityArray;
var M: Integer);
begin
M := 0;
Reset(F);
while not Eof(f) do
begin
M := M + 1; // Увеличиваем счетчик городов.
// Считываем характеристики города в M-й элемент массива.
ReadLn(F, Cities[M].Lat, Cities[M].Lon, Cities[M].Name);
// Удаляем пробелы в начале и конце строки с названием.
Cities[M].Name := Trim(Cities[M].Name);
end;
end;
{ Процедура Sort упорядочивает массив городов по названию.
Используется метод сортировки выбором. }
procedure Sort(var Cities: TCityArray; M: Integer);
var
I, J, Min_J: Integer;
City: TCity;
begin
for I := 1 to M - 1 do // Для каждой I-й позиции в массиве
begin
{ выполняем поиск подходящего элемента (минимального
из оставшихся). }
Min_J := I;
for J := I + 1 to M do
if Cities[Min_J].Name > Cities[J].Name then
Min_J := J;
{ Если минимальный элемент отличается от текущего
I-го элемента, то обмениваем их местами. }
if Min_J <> I
then
begin
City := Cities[I];
Cities[I] := Cities[Min_J];
Cities[Min_J] := City;
end;
end;
end;
{ Процедура SaveToTextFile выгружает информацию о городах,
начинающихся на "К", из массива Cities в текстовый файл
с именем FileName. }
procedure SaveToTextFile(Cities: TCityArray; M: Integer;
FileName: string);
var
F: TextFile;
I: Integer;
begin
87

Глава 3
{ Назначаем файловой переменной F файл на диске с именем
FileName, с которым будем работать.}
AssignFile(F, FileName);
// Открываем файл на запись.
Rewrite(F);
{ Организуем цикл по городам и распечатываем в файл всю
информацию о текущем городе, если его название начинается
на "К", о каждом городе с новой строки. }
for I := 1 to M do
if Cities[I].Name[1] = 'К' then
Writeln(F, Cities[I].Lat, ' ', Cities[I].Lon, ' ', Cities[I].Name);
CloseFile(f); // Закрываем файл.
end;
{ Процедура SaveToTypedFile выгружает данные обо всех городах
из массива Cities в типизированный файл с именем FileName. }
procedure SaveToTypedFile(Cities: TCityArray; M: Integer;
FileName: string);
var
F: file of TCity; // Типизированный файл записей TCity
I: Integer;
begin
{ Назначаем файловой переменной F файл на диске, с которым
будет производиться работа. }
AssignFile(F, FileName);
Rewrite(F); // Открываем файл на запись.
{ В цикле записываем в файл каждую запись, содержащую
информацию об одном городе.}
for I := 1 to M do
Write(F, Cities[I]);
CloseFile(F); // Закрываем файл.
end;
{ Объявляем переменные.
Файловая переменная F предназначена для работы с текстовым
файлом.Переменная-массив Cities предназначена для хранения
информации о списке городов.В переменной M сохраняется
количество городов.}
var
F: TextFile;
Cities: TCityArray;
M: Integer;
Name: string;
begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
{ Назначаем файловой переменной F имя файла на диске,
с которым будет производиться работа.}
AssignFile(F, 'города_россии.txt');
Reset(f); // Открываем файл на чтение.
88

Типовые проверочные работы
// Загружаем список городов из файла в массив.
LoadCities(F, Cities, M);
CloseFile(F); // Закрываем файл.
// Запрашиваем ввод города для поиска ближайшего.
Write('Введите название города: '); ReadLn(Name);
// Производим поиск ближайшего города.
FindNearCities(Name, Cities, M);
// Упорядочиваем массив городов по названию города.
Sort(Cities, M);
// Выгружаем информацию о городах на "К" в текстовый файл.
SaveToTextFile(Cities, M, 'города_россии_на_к.txt');
// Выводим подтверждающую фразу о завершенной выгрузке.
Writeln('Города на букву «К» сохранены в файле «города_россии_на_к.txt»');
// Выгружаем список городов в типизированный файл.
SaveToTypedFile(Cities, M, 'города_россии.dat');
// Выводим подтверждающий текст.
Writeln('Города сохранены в типизированном файле
«города_россии.dat»');
Readln;
end.
Контрольные вопросы и задания
1. Обоснуйте выбор модели данных в вашей программе.
Дайте общую структуру рекурсивного алгоритма.
2.
Поясните алгоритм сортировки, используемый в вашей программе.
3.
Раскройте смысл понятия «тип данных». Перечислите основные
4.
категории типов данных. Какие типы используются в вашей программе?
Дайте общую схему работы с файлами в Delphi.
5.
89

Библиографический список
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Фаронов, В. Turbo Pascal 7.0. Учебный курс / В. Фаронов – М. :
1.
КноРус, 2013. – 363 с.
Вирт, Н. Алгоритмы и структуры данных. Новая версия для Обе-
2.
рона / Н. Вирт. – М. : ДМК Пресс, 2014. – 272 с.
Немцова, Т. И. Программирование на языке высокого уровня.
3.
Программирование на языке OBJECT PASCAL : учеб. пособие / Т. И. Немцова, С. Ю. Голова, И. В. Абрамов; ред. Л. Г. Гагарина. – М. : ФОРУМ;
ИНФРА-М, 2015. – 495 с.
Миронченко, А. С. Императивное и объектно-ориентированное
4.
программирование на Turbo Pascal и Delphi / А. С. Миронченко. – Одесса :
ВМВ, 2007. – 408 с.
Шпак, Ю. А. Программирование в Turbo Pascal. Переход к Delphi.
5.
/ Ю.А. Шпак; под ред. Ю. С. Ковтанюка. – Киев : МК-Пресс, 2006. – 408 с.
Пестриков, В. М. Delphi на примерах / В. М. Пестриков, А. Н. Мас-
6.
лобоев. – СПб. : БХВ-Петербург, 2005. – 497 с.
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
