Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование. Процедурное программирование. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Основные возможности процедурного программирования при работе с комбинированными данными…
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: Integ­er); 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, Ci­ties[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, Ci­ties[J].Lat, Cities[J].Lat); { сравниваем с уже найденным минимальным расстоянием и, если новое меньше, то обновляем минимум.} if DistI < Dist then begin Dist := Dist; D := I; end; end; // Выводим результат. WriteLn('Ближайший город до ' + Name + ' – ' + Ci­ties[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, ' ', Ci­ties[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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]