|
Анализ входного файла программы и вывод результатов в выходной файл
Анализ входного файла программы и вывод результатов в выходной файл
31 31 НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ УКРАИНЫ «КПИ» МЕЖУНИВЕСИТЕТСКИЙ МЕДИКО-ИНЖЕНЕРНЫЙ ФАКУЛЬТЕТ Кафедра медицинской кибернетики и телемедицины РАСЧЕТНО-ГРАФИЧЕСКАЯ РАБОТА по дисциплине «Основы программирования и алгоритмические языки» вариант 21«Стекло» Анализ входного файла программы и вывод результатов в выходной файл выполнил: студент гр. ИМ-71 Плахтий Артур Николаевич проверил: ст. препод. каф. МКТМ Зинченко Н.П. Киев 2009 Содержание - Введение 3
- 1. Постановка задачи 4
- 1.1 Формат входного файла 4
- 1.2 Формат выходного файла.................................................................................4
- 1.3 Примеры 4
- 2. Метод решения 5
- 3. Алгоритм решения задачи 6
- 4. Описание программы и ее составляющих 8
- 4.1 Функция обработки данных 8
- 4.2 Защита от ошибок 9
- 5. Руководство пользователя 10
- Вывод 11
- Литература 12
- Приложение А. Листинг программы 13
- Приложение Б. Результаты работы программы. 28
ВведениеНа стандартном .поле 8*8 задано одна белая шашка и произвольное количество черных шашек.Нужно найти самый длинный путь рубки белой шашки, то есть, максимальное количество ходов белой шашки при которых она бьет черные шашки.1. Постановка задачиЗадача ставилась таким образом, чтобы проанализировать входной файл и вывести результат в выходной, изобразив при этом всё графически.1.1 Формат входного файлаВ первой строке входного файла записано число N- количество черных шашек (1 < N < 8).Введём систему координат таким образом, чтобы оси координат были параллельны сторонам стола. Все координаты- целые числа, по модулю не превосходящие 8.1.2 Формат выходного файлаЕсли возможные ходы есть для белой шашки, результат выводится на экран и указываются координаты, по которым был совершен бой, и которые черные шашки были побиты.В случае нескольких решений вывести любое из них.В случае невозможности или отсутствия ходов, вывести сообщение об этом.2. Метод решенияДля реализации поставленной задачи была использована среда разработки Borland Delphi 6.0 update 1.Внутри этой среды было использовано такие методы:для создания удобного та наглядного интерфейса было использовано такие основные элементы:· компонент главного меню(TMainMenu);· компоненты TMemo для отображения, редактирования и программной работы с текстами входных і выходных файлов;· компонент TImage для вывода графических изображений;для реализации технической работы программы было использовано:· функции и методы работы со строчными величчинами;· функции переобразования типов данных;· функции создания у уничтожения визуальных обьектов;· функции компонента TMemo для открытия и сохранения текста;· математические вычисления;· для создания текстовых входных файлов - тестовый редактор Notepad.3. Алгоритм решения задачиРис.1. Блок-схема основной программыРис. 2. Блок-схема функции проверки входных данных4. Описание программы и ее составляющихОсновой проверки входных данных программы являет собой компонент Form Create, который вмещает в себе все функции, которые написаны непосредственно в программе. Он является контейнером для таких действий: N2Click, N4Click, N5Click, Memo.Lines.LoadFromFile . А основой расчёта и вывода выходных данных программы являет собой компонент TForm1.Button1Click , который вмещает в себе все функции, которые написаны непосредственно в программе. Он является контейнером для таких действийОпишем их:· Memo.Lines.LoadFromFile - загружает входной файл в текстовый контейнер Memo1;· N2Click - выход из программы;· Button1Click - выводит выходные данные в текстовый контейнер Memo2;· N4Click - вывести информацию о программе;· N5Click - очистить переменные программы(используется перед открытием входного файла);· FormCreate - собственно обработка данных;Первые пять действий имеют визуальное отображение в главном меню программы, первые четыре - и в главном меню. Последний - используется для внутренней работы и пользователю не показывается.4.1 Функция обработки данныхРасчет результата происходит в такой последовательности:1) Загрузка входных данных с файла.2) Заполнение TMemo1 входными данными.3) Отображение веденных осколков на Image1 с помощью графического рисунка.4) Вывод координат первого осколка без изменений на TMemo2.5) Нахождение точки удара и расчёт разницы координат для параллельного переноса.6) Вывод выходных данных на TMemo2.7) Отображение выходных осколков на Image2 с помощью графического рисунка4.2 Защита от ошибокЗащитой от ошибок в программе происходит в такой последовательности:1) Проверка количества введенных осколков.2) Проверка на наличие осколков с нулевой площадью.3) Создание координатных осей и проверка сторон осколков на параллельность.4) Нахождение длин сторон треугольников, параллельных координатным осям.5) Нахождение суммы площадей всех введенных осколков.6) Нахождение площади образовавшегося прямоугольника, и проверка его на равенство с суммой площадей всех входных осколков.5. Руководство пользователяДля начала работы Вам необходим входной файл. С целью сделать программу максимально универсальной, входные данные в ней можно ввести и вручную.1. Откройте входной файл (input.txt и TOSHONADO.txt).2. Вызовите процедуру расчета (команда «Меню->Выполнить» в главном меню или кнопка на панели инструментов).3. Выход из программы реализуется командой «Меню->Выход» в главном меню или кнопка на панели задач.ВыводВ ходе выполнения данной расчетно-графической работы была реализована функция считывания числовых данных из файла, управление (создание, уничтожение и редактирование) визуальными компонентами во время выполнения программы.Литература1. Т. Рюттен, Г. Франкен. Турбо Паскаль 6.0. Торгово-издательськое бюро BHV. Грифон. - К.: 1992. - 235 с.2. Т. П. Караванова. Основи алгоритмізації та програмування. Форум. - К.: 2002. - 286 с.3. И.Скляр. Вивчаємо мову программування PASCAL. http://distance.edu.vn.ua/metodic/pascal/4. Будникова Н.А. Обучающий комплекс по программированию на языке ПАСКАЛЬ http://petrsu.ru/Chairs/IMO/pascal/5. Потопахин В. Turbo Pascal.Решение сложных задач.БХВ-Петербург. С.-Пб.:2006. - 194 с.Приложение А. Листинг программыunit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Menus, MUNit;typeTForm1 = class(TForm)Vv: TMemo;VV2: TMemo;Button1: TButton;Image1: TImage;Image2: TImage;MainMenu1: TMainMenu;N1: TMenuItem;N2: TMenuItem;N3: TMenuItem;N4: TMenuItem;N5: TMenuItem;Memo: TMemo;procedure Form Create(Sender: TObject);procedure Button1Click(Sender: TObject);procedure N2Click(Sender: TObject);procedure N4Click(Sender: TObject);procedure N5Click(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;N: integer;result: boolean;oskolok: array[1..3] of TPoint;i: integer;s: string;OSX1,OSX2,OSY1,OSY2:integer;sumyglov:extended;razX,razY,OsnX,OsnY,nomervershiny: integer;iosi,xosi,xx: integer;sumploshadi,hh:real;l1,l2:integer;implementationuses Unit2;{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); // Процедура создания формыvarstemp: string;bb:boolean;beginVv.Lines.LoadFromFile('input.txt'); // Загружаем координаты с файлаMemo.Lines.LoadFromFile('TOSHONADO.txt'); // Загружаем координаты с файлаn:= StrToInt(Vv.Lines[0]); //Cчитываем количество треугольниковs:=Vv.Lines[0];Vv.Lines.Delete(0);{Заполняем координаты в TMemo1}For i:=0 to n-1 do beginoskolok[1].X:=StrToInt(Vv.Lines[i*6]);oskolok[1].Y:=StrToInt(Vv.Lines[i*6+1]);oskolok[2].X:=StrToInt(Vv.Lines[i*6+2]);oskolok[2].Y:=StrToInt(Vv.Lines[i*6+3]);oskolok[3].X:=StrToInt(Vv.Lines[i*6+4]);oskolok[3].Y:=StrToInt(Vv.Lines[i*6+5]);{Находим сумму площадей всех введеных треугольников}sumploshadi:=sumploshadi+Abs((1/2)*((oskolok[2].Y-oskolok[1].Y)*oskolok[3].X+(oskolok[1].X-oskolok[2].X)*oskolok[3].Y+(oskolok[2].X-oskolok[1].X)*oskolok[1].Y-(oskolok[2].Y-oskolok[1].Y)*oskolok[1].X));{Рисуем треугольники, которые ввёл пользователь на Image1}Image1.Canvas.Pen.Color:=Random(4000000); // Выбираем цвет линийImage1.Canvas.Pen.Style :=psInsideFrame; // Выбираем стиль линийImage1.Canvas.MoveTo(20+oskolok[1].X,126-oskolok[1].Y); //Движемся к нужной точкеImage1.Canvas.LineTo(20+oskolok[2].X,126-oskolok[2].Y); //Соединяем линией две точкиImage1.Canvas.MoveTo(20+oskolok[2].X,126-oskolok[2].Y); //Движемся к нужной точкеImage1.Canvas.LineTo(20+oskolok[3].X,126-oskolok[3].Y); //Соединяем линией две точкиImage1.Canvas.MoveTo(20+oskolok[3].X,126-oskolok[3].Y); //Движемся к нужной точкеImage1.Canvas.LineTo(20+oskolok[1].X,126-oskolok[1].Y); //Соединяем линией две точки{Проверяем сколько осколков ввёл пользователь(их должно быть не меньше четырёх)}if N<4 then beginresult := false;Application.MessageBox('Простите, но количество треугольников слишком мало'+'(меньше 4)','Ошибка',MB_OK+MB_ICONError); //Выводим сообщение об ошибкеButton1.Enabled:=False; //Блокируем кнопкуexit;end;{Проверяем есть ли среди введеных треугольников, треугольники с нулевой площадью}If oskolok[1].X = oskolok[2].X then beginif oskolok[2].X = oskolok[3].X then beginApplication.MessageBox('Простите, но площадь одного из треугольников равна нулю','Ошибка',MB_OK+MB_ICONError); // Выводим сообщение об ошибкеButton1.Enabled:=False; //Блокируем кнопкуexit;end;end;If oskolok[1].Y = oskolok[2].Y then beginif oskolok[2].Y = oskolok[3].Y then beginApplication.MessageBox('Простите, но площадь одного из треугольников равна нулю','Ошибка',MB_OK+MB_ICONError); // Выводим сообщение об ошибкеButton1.Enabled:=False; //Блокируем кнопкуexit;end;end;{Создаём оси паралельности}{Ось паралельности ОХ1 по левой стороне стола}If (oskolok[1].X = oskolok[2].X) then beginIf (oskolok[3].X>oskolok[1].X) then beginxx:=xx+1;end;end;If (oskolok[2].X = oskolok[3].X) then beginIf (oskolok[1].X>oskolok[1].X) then beginxx:=xx+1;end;end;If (oskolok[1].X = oskolok[3].X) then beginIf (oskolok[2].X>oskolok[1].X) then beginxx:=xx+1;end;end;{Ось паралельности ОХ2 по правой стороне стола}If (oskolok[1].X = oskolok[2].X) then beginIf (oskolok[3].X<oskolok[1].X) then beginxx:=xx+1;end;end;If (oskolok[2].X = oskolok[3].X) then beginIf (oskolok[1].X<oskolok[1].X) then beginxx:=xx+1;end;end;If (oskolok[1].X = oskolok[3].X) then beginIf (oskolok[2].X<oskolok[1].X) then beginxx:=xx+1;end;end;{Ось паралельности ОУ1 по нижней стороне стола}If (oskolok[1].Y = oskolok[2].Y) then beginIf (oskolok[3].Y>oskolok[1].Y) then beginxx:=xx+1;end;end;If (oskolok[2].Y = oskolok[3].Y) then beginIf (oskolok[1].Y>oskolok[1].Y) then beginxx:=xx+1;end;end;If (oskolok[1].Y = oskolok[3].Y) then beginIf (oskolok[2].Y>oskolok[1].Y) then beginxx:=xx+1;end;end;If (oskolok[1].Y = oskolok[2].Y) then beginIf (oskolok[3].Y<oskolok[1].Y) then beginxx:=xx+1;end;end;If (oskolok[2].Y = oskolok[3].Y) then beginIf (oskolok[1].Y<oskolok[1].Y) then beginxx:=xx+1;end;end;If (oskolok[1].Y = oskolok[3].Y) then beginIf (oskolok[2].Y<oskolok[1].Y) then beginxx:=xx+1;end;end;Vv2.Lines.Add(IntToStr(oskolok[1].X) + ' '+IntToStr(oskolok[1].Y)+' ' +IntToStr(oskolok[2].X)+ ' '+IntToStr(oskolok[2].Y)+' ' +IntToStr(oskolok[3].X)+' '+IntToStr(oskolok[3].Y)); //Выводим без изменений координаты осколков на TMemo2end;////////Конец цикла{Выводим сообщения о количестве треугольноков со сторонами с паралельными осям}If xx=n-2 then beginApplication.MessageBox(PCHar('Ощибка - треугольников с параллельными осям сторонами всего лишь:'+INtToStr(Xx+2)),0); // Выводим сообщение об ошибкеButton1.Enabled:=False;end;end;procedure TForm1.Button1Click(Sender: TObject); //Процедура выполнения расчётов и вывода данныхbeginVv2.Lines.Clear; // Очишаем TMemo2Vv2.Lines.Add('Выполняем расчет'); // Начинаем выводить текст на TMemo2{Выводим без изменений координаты первого осколка на TMemo2}oskolok[1].X:=StrToInt(Vv.Lines[0]);oskolok[1].Y:=StrToInt(Vv.Lines[1]);oskolok[2].X:=StrToInt(Vv.Lines[2]);oskolok[2].Y:=StrToInt(Vv.Lines[3]);oskolok[3].X:=StrToInt(Vv.Lines[4]);oskolok[3].Y:=StrToInt(Vv.Lines[5]);Vv2.Lines.Add(IntToStr(oskolok[1].X) + ' '+IntToStr(oskolok[1].Y)+' ' +IntToStr(oskolok[2].X)+ ' '+IntToStr(oskolok[2].Y)+' ' +IntToStr(oskolok[3].X)+' '+IntToStr(oskolok[3].Y));Image2.Canvas.Pen.Color:=clBlue; //Задаём цвет рисунку на Image2{Рисуем первый осколок без изменений}Image2.Canvas.MoveTo(20+oskolok[1].X,126-oskolok[1].Y);Image2.Canvas.LineTo(20+oskolok[2].X,126-oskolok[2].Y);Image2.Canvas.MoveTo(20+oskolok[2].X,126-oskolok[2].Y);Image2.Canvas.LineTo(20+oskolok[3].X,126-oskolok[3].Y);Image2.Canvas.MoveTo(20+oskolok[3].X,126-oskolok[3].Y);Image2.Canvas.LineTo(20+oskolok[1].X,126-oskolok[1].Y);//////////XXX{Находим координаты точки удара}If (oskolok[1].X = oskolok[2].X) then beginnomervershiny:=3;osnX:= oskolok[3].X;osnY:=oskolok[3].Y;l1:=l1+Abs(oskolok[2].Y-oskolok[1].Y);end;If (oskolok[2].X = oskolok[3].X) then beginl1:=l1+Abs(oskolok[3].Y-oskolok[2].Y);nomervershiny:=1;osnX:= oskolok[1].X;osnY:=oskolok[1].Y;end;If (oskolok[1].X = oskolok[3].X) then beginl1:=l1+Abs(oskolok[1].Y-oskolok[3].Y);nomervershiny:=2;osnX:= oskolok[2].X;osnY:=oskolok[2].Y;end;If (oskolok[1].Y = oskolok[2].Y) then beginl2:=l2+Abs(oskolok[1].X-oskolok[2].X);nomervershiny:=3;osnX:= oskolok[3].X;osnY:=oskolok[3].Y;end;If (oskolok[2].Y = oskolok[3].Y) then beginl2:=l2+Abs(oskolok[2].X-oskolok[3].X);nomervershiny:=1;osnX:= oskolok[1].X;osnY:=oskolok[1].Y;end;If (oskolok[1].Y = oskolok[3].Y) then beginl2:=l2+Abs(oskolok[1].X-oskolok[3].X);nomervershiny:=2;osnX:= oskolok[2].X;osnY:=oskolok[2].Y;end;//////////////////////////{Считываем координаты отрезков до изменений}For i:=1 to n-1 do beginoskolok[1].X:=StrToInt(Vv.Lines[i*6]);oskolok[1].Y:=StrToInt(Vv.Lines[i*6+1]);oskolok[2].X:=StrToInt(Vv.Lines[i*6+2]);oskolok[2].Y:=StrToInt(Vv.Lines[i*6+3]);oskolok[3].X:=StrToInt(Vv.Lines[i*6+4]);oskolok[3].Y:=StrToInt(Vv.Lines[i*6+5]);{Находим длины сторон треугольников, которые паралельны осям OX}If (oskolok[1].X = oskolok[2].X) then beginnomervershiny:=3;l1:=l1+Abs(oskolok[1].Y-oskolok[2].Y);end;If (oskolok[2].X = oskolok[3].X) then beginnomervershiny:=1;l1:=l1+Abs(oskolok[2].Y-oskolok[3].Y);end;If (oskolok[1].X = oskolok[3].X) then beginnomervershiny:=2;l1:=l1+Abs(oskolok[1].Y-oskolok[3].Y);end;{Находим длины сторон треугольников, которые паралельны осям OУ}If (oskolok[1].Y = oskolok[2].Y) then beginnomervershiny:=3;l2:=l2+Abs(oskolok[1].X-oskolok[2].X);end;If (oskolok[2].Y = oskolok[3].Y) then beginl2:=l2+Abs(oskolok[2].X-oskolok[3].X);nomervershiny:=1;end;If (oskolok[1].Y = oskolok[3].Y) then beginl2:=l2+Abs(oskolok[1].X-oskolok[3].X);nomervershiny:=2;end;{Находим разницы координат вершин для паралельного переноса}razX:= oskolok[nomervershiny].X-osnX;razY:= oskolok[nomervershiny].Y-osnY;{Расчитываем координаты вершин после переноса}oskolok[1].X:=oskolok[1].X-razX;oskolok[1].Y:=oskolok[1].Y-razY;oskolok[2].X:=oskolok[2].X-razX;oskolok[2].Y:=oskolok[2].Y-razY;oskolok[3].X:=oskolok[3].X-razX;oskolok[3].Y:=oskolok[3].Y-razY;{Выводим координаты осколков после перенесения в точку удара}Vv2.Lines.Add(IntToStr(oskolok[1].X) + ' '+IntToStr(oskolok[1].Y)+' ' +IntToStr(oskolok[2].X)+ ' '+IntToStr(oskolok[2].Y)+' ' +IntToStr(oskolok[3].X)+' '+IntToStr(oskolok[3].Y));{Рисуем треугольники, после перемещения на Image2( они образуют прямоугольник)}Image2.Canvas.MoveTo(20+oskolok[1].X,126-oskolok[1].Y);Image2.Canvas.LineTo(20+oskolok[2].X,126-oskolok[2].Y);Image2.Canvas.MoveTo(20+oskolok[2].X,126-oskolok[2].Y);Image2.Canvas.LineTo(20+oskolok[3].X,126-oskolok[3].Y);Image2.Canvas.MoveTo(20+oskolok[3].X,126-oskolok[3].Y);Image2.Canvas.LineTo(20+oskolok[1].X,126-oskolok[1].Y);end;hh:=(l1/2)*(l2/2); //Находим площадь образовавшегося прямоугольника{Проверяем на равенство сумму площадей треугольников и прямоугольника}If hh<>sumploshadi then beginApplication.MessageBox('Площади НЕ равны','Ошибка',MB_OK); // Выводим сообщение о неравенстве площадейbUTTon1.Enabled := False; // Блокируем кнопкуend;end;{Задаём меню}procedure TForm1.N2Click(Sender: TObject); // "Выход"beginApplication.Terminate;end;procedure TForm1.N4Click(Sender: TObject); // "О программе"beginForm2.Show; // Открываем Form2end;procedure TForm1.N5Click(Sender: TObject); // "Обновить"beginVv2.Lines.Clear; // Очищаем TMemo2end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); // Процедура закрытия TForm1beginApplication.Terminate;end;end.Приложение Б. Результаты работы программы.
|
|