Тексты программы и подпрограмм.
(* Курсовая работа по дисциплине "Информатика" *)
(* Выполнил: студент гр.1 Иванов И.И. *)
(* Дата: 10.04.2017 *)
Program Main_Kursrab;
(* Программа поиска параллельных прямых и наибольшего *)
(* расстояния между ними *)
Uses Crt;
Const
KolPrMax = 20; (* Максимальное количество прямых *)
Type
FileName = String[20]; (* Тип для имен файлов *)
ArrCoef = Array [1..KolPrMax, 1..3] of real; (* Тип для массива
коэффициентов *)
ArrNom = Array [1..KolPrMax, 1..2] of integer; (*Тип для массива
номеров попарно
параллельных прямых *)
Vector = Array [1..KolPrMax] of real; (* Тип для массива расстояний *)
Var
(* Входные данные *)
N: integer; (*Количество исходных прямых *)
ABC: ArrCoef; (*Множество троек коэффициентов А, В, С;
каждая тройка занимает одну строку *)
E: real; (*Погрешность оценки параллельности прямых*)
(* Выходные данные *)
K: integer; (*Счетчик пар параллельных прямых *)
NomPr: ArrNom; (*Пары порядковых (в массиве АВС) номеров
параллельных прямых *)
R: Vector; (*Вектор расстояний между параллельными
прямыми *)
NomMax: integer; (*Порядковый номер в массиве R модуля
наибольшего расстояния между параллельными прямыми *)
RMax: real; (*Модуль наибольшего расстояния между прямыми *)
imax1,
imax2: integer; (*Номера параллельных прямых, расстояние
между которыми наибольшее *)
InFileName: FileName; (*Имя входного файла *)
ResFileName: FileName; (*Имя выходного файла *)
F1: text; (*Файловая переменная для входного файла *)
F2: text; (*Файловая переменная для выходного файла*)
i, j: integer; (* Рабочие *)
i1,i2: integer; (* переменные *)
Ch: char; (* Символ для ввода *)
Procedure POISK(N: integer; ABC: ArrCoef; E: real; var K: integer;
var NomPr: ArrNom; var R: Vector);
(* Подпрограмма поиска параллельных прямых и *)
(* вычисления расстояний между ними *)
(* Входные данные
(* N: integer; - Количество исходных прямых *)
|
(* ABC: ArrCoef; - Множество троек коэффициентов А, В, С *)
(* E: real; - Погрешность оценки *)
(* параллельности прямых *)
(* *)
(* Выходные данные *)
(* K: integer; - Счетчик пар параллельных прямых *)
(* NomPr: ArrNom; - Пары порядковых (в массиве АВС) номеров *)
(* параллельных прямых *)
(* R: Vector; - Вектор расстояний между параллельн. прямыми *)
(* *)
Var
Prisnak: real; (* Признак параллельности прямых *)
i1, i2: integer; (* Рабочие переменные *)
begin
(* Установка начальных значений *)
K:= 0;
(* Проверка попарной параллельности прямых *)
for i1:= 1 to N-1 do (*Номер первой прямой i1 *)
begin
for i2:= i1 + 1 to N do (* Номер второй прямой *)
begin
Prisnak:= abs(ABC[i1,1] * ABC[i2,2] - ABC[i2,1] * ABC[i1,2]);
if (Prisnak < E) (* Проверка условия параллельности *)
then
(*Две прямые параллельны*)
begin
K:= K + 1;
(*Вычисление расстояний между прямыми*)
R(K):= abs((ABC[i1,3] * ABC[i2,1] -
ABC[i2,3] * ABC[i1,1]) /
ABC[i2,1] / sqrt(ABC[i1,1] * ABC[i1,1] +
ABC[i1,2] * ABC[i1,2]));
(*Запись номеров параллельных прямых*)
NomPr[K,1]:= i1;
NomPr[K,2]:= i2
end {if}
end {for_i2}
end {for_i1}
end; {POISK}
Function Nmax(Vec:Vector; Kol: integer): integer;
(* Подпрограмма определения номера наибольшего
элемента в одномерном массиве
Входные данные:
Vector - массив действительных чисел;
Kol - число элементов (размер) массива (от 1 до 190)
Выходные данные:
Nmax - номер в массиве Vec наибольшего элемента.
Пример вызова:
i:= Nmax(R,K); *)
Var
rab: real; (* Рабочие *)
i: integer; (* переменные *)
begin
(* Установка начальных значений *)
rab:= Vec[1];
Nmax:= 1;
(* Начало цикла сравнения элементов *)
for i:= 2 to Kol do
begin
if rab < Vec[i]
then
(* Замена наибольшего элемента *)
begin
rab:= Vec[i];
Nmax:= i
end (*if*)
end (*for*)
end;(*Nmax*)
(*------------- Основной модуль программы-------------------*)
Begin
ClrScr;
WriteLn(' Нажмите любую клавишу для старта... ');
|
Ch:= ReadKey;
ClrScr;
(* Подготовка к чтению файла исходных данных *)
Writeln(' Введите имя файла исходных данных ');
ReadLn(InFileName);
Assign(F1, InFileName);
Reset(F1);
(* Формирование имени и подготовка файла результатов *)
ResFileName:= '';
i:= 1;
while (InFileName[i] <> '.') and
(i <= Length(InFileName)) do
begin
ResFileName:= ResFileName + InFileName[i];
i:= i + 1
end; (*while*)
Assign(F2, ResFileName + '.res');
Rewrite(F2);
(* Ввод и проверка исходных данных *)
ReadLn(F1, N);
if (N>1) and (N <= KolPrMax)
then
begin
ReadLn(F1, E);
if (E>0)
then
begin
(*Ввод коэффициентов прямых *)
for i:= 1 to N do
for j:= 1 to 3 do
read(F1, ABC[i,j]);
(*Обращение к подпрограмме POISK*)
POISK(N, ABC, E, K, NomPr, R);
if K <> 0
then
(*Среди прямых есть К пар параллельных *)
begin
(*Определение номера наибольшего расстояния*)
i:= Nmax(R,K);
Rmax:= R[i];
imax1:= NomPr[i,1];
imax2:= NomPr[i,2]
end {if};
(* ВЫВОД РЕЗУЛЬТАТОВ *)
writeLn(F2,'');
writeLn(F2,' И С Х О Д Н ЫЕ Д А Н Н ЫЕ ');
writeLn(F2,'');
writeLn(F2,' Количество прямых N = ', N:2);
writeLn(F2,' Погрешность E = ', E:10);
writeln(F2,' Номер Коэффициенты прямой');
writeln(F2,' прямой A B C ');
for i:= 1 to N do
begin
write(F2,' ', i:2);
for j:=1 to 3 do
write(F2,' ', ABC[i,j]:8:3);
writeln(F2);
end;
if K <> 0
then
(* Есть пары параллельных прямых *)
begin
writeln(F2);
writeln(F2,' Р Е З У Л Ь Т А Т Ы');
writeln(F2,' Коэффициенты');
writeln(F2,' прямых Расстояния');
writeln(F2, ' A B C ');
for i:= 1 to K do
begin
i1:= NomPr[i,1];
i2:= NomPr[i,2];
for j:= 1 to 3 do
write(F2, ABC[i1,j]:8:3);
writeln(F2,' ', R[i]:8:3);
for j:= 1 to 3 do
write(F2, ABC[i2,j]:8:3);
writeln(F2);
writeln(F2)
end;
writeln(F2);
writeln(F2,' Наибольшее расстояние: ', Max:7:3);
writeln(F2,' между прямыми ', imax1:2,' и ', imax2:2,
' с коэффициентами');
writeln(F2, ' A B C ');
for j:= 1 to 3 do
write(F2, ABC[imax1,j]:8:3);
writeln(F2);
for j:=1 to 3 do
write(F2, ABC[imax2,j]:8:3);
writeln(F2)
end (*then*)
else
(* Нет параллельных прямых *)
writeln(F2,' Параллельных прямых нет')
end {if_K}
else
(*Недопустимое значение Е*)
|
begin
writeLn('Недопустимое значение Е в файле ' + InFileName);
writeLn(' Нажмите любую клавишу для завершения... ');
Ch:= ReadKey;
ClrScr
end
end (*if(E>0)*)
else
(*Недопустимое значение N *)
begin
writeLn('Недопустимое значение N в файле ' + InFileName);
writeLn(' Нажмите любую клавишу для завершения... ');
Ch:= ReadKey;
ClrScr
end;
(* Закрытие файлов ввода и вывода *)
Close(F2);
Close(F1)
end.
Испытания программы
Испытания программы проводятся на контрольных примерах. Первый контрольный пример содержит данные, приведенные в 1. Результаты выполнения программы на заданном наборе исходных данных должны совпадать с аналитическим решением, полученным в 1.
Второй контрольный пример предназначен для проверки работы программы в случае, когда среди заданных прямых нет параллельных.
Пример 1.
Содержимое файла исходных данных:
0.1
1.6 3.2 7.8
11.7 -3.9 1.5
-5.5 7.3 -9.2
4.8 9.6 4.1
-18.3 6.1 -13.4
Содержимое файла результатов:
И С Х О Д Н ЫЕ Д А Н Н ЫЕ
Количество прямых N = 5
Погрешность E = 1.000E-01
Номер Коэффициенты прямой
прямой A B C
1 1.600 3.200 7.800
2 11.700 -3.900 1.500
3 -5.500 7.300 -9.200
4 4.800 9.600 4.100
5 -18.300 6.100 -13.400
Р Е З У Л Ь Т А Т Ы
Коэффициенты
прямых Расстояния
A B C
1.600 3.200 7.800 1.798
4.800 9.600 4.100
11.700 -3.900 1.500 0.573
-18.300 6.100 -13.400
Наибольшее расстояние: 1.798
между прямыми 1 и 4 с коэффициентами
A B C
1.600 3.200 7.800
4.800 9.600 4.100
Пример 2.
Содержимое файла исходных данных:
0.01
2.75 73.2 12.8
11.7 -3.9 1.5
-3.5 17.3 -9.2
-18.3 0.1 -13.4
Содержимое файла результатов:
И С Х О Д Н ЫЕ Д А Н Н ЫЕ
Количество прямых N = 4
Погрешность E = 1.000E-02
Коэффициенты прямых
A B C
2.750 73.200 12.800
11.700 -3.900 1.500
-3.500 17.300 -9.200
-18.300 0.100 -13.400
Параллельных прямых нет