НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ УКРАИНЫ «КПИ»
МЕЖУНИВЕСИТЕТСКИЙ МЕДИКО-ИНЖЕНЕРНЫЙ ФАКУЛЬТЕТ
Кафедра медицинской кибернетики и телемедицины
РАСЧЕТНО-ГРАФИЧЕСКАЯ РАБОТА
по дисциплине «Основы программирования и алгоритмические языки»
вариант 21«Стекло»
Анализ входного файла программы и вывод результатов в выходной файл
выполнил:
студент гр. ИМ-71
Плахтий Артур Николаевич
проверил:
ст. препод. каф. МКТМ
Зинченко Н.П.
Киев 200
9
Содержание
Введение........................................................................................................... 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 задано одна белая шашка и произвольное количество черных шашек.
Нужно найти самый длинный путь рубки белой шашки, то есть, максимальное количество ходов белой шашки при которых она бьет черные шашки.
Забиваем Сайты В ТОП КУВАЛДОЙ - Уникальные возможности от SeoHammer
Каждая ссылка анализируется по трем пакетам оценки: SEO, Трафик и SMM.
SeoHammer делает продвижение сайта прозрачным и простым занятием.
Ссылки, вечные ссылки, статьи, упоминания, пресс-релизы - используйте по максимуму потенциал SeoHammer для продвижения вашего сайта.
Что умеет делать SeoHammer
— Продвижение в один клик, интеллектуальный подбор запросов, покупка самых лучших ссылок с высокой степенью качества у лучших бирж ссылок.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз,
а первые результаты появляются уже в течение первых 7 дней.
Зарегистрироваться и Начать продвижение
Задача ставилась таким образом, чтобы проанализировать входной файл и вывести результат в выходной, изобразив при этом всё графически.
1.1 Формат входного файла
В первой строке входного файла записано число N- количество черных шашек (1 < N < 8).
Введём систему координат таким образом, чтобы оси координат были параллельны сторонам стола. Все координаты- целые числа, по модулю не превосходящие 8.
1.2 Формат выходного файла
Если возможные ходы есть для белой шашки, результат выводится на экран и указываются координаты, по которым был совершен бой, и которые черные шашки были побиты.
В случае нескольких решений вывести любое из них.
В случае невозможности или отсутствия ходов, вывести сообщение об этом.
Для реализации поставленной задачи была использована среда разработки Borland Delphi 6.0 update 1.
Внутри этой среды было использовано такие методы:
для создания удобного та наглядного интерфейса было использовано такие основные элементы:
· компонент главного меню(TMainMenu);
· компоненты TMemo для отображения, редактирования и программной работы с текстами входных і выходных файлов;
· компонент TImage для вывода графических изображений;
для реализации технической работы программы было использовано:
· функции и методы работы со строчными величчинами;
· функции переобразования типов данных;
· функции создания у уничтожения визуальных обьектов;
· функции компонента TMemo для открытия и сохранения текста;
· математические вычисления;
· для создания текстовых входных файлов – тестовый редактор Notepad.
Рис.1. Блок-схема основной программы

Рис. 2. Блок-схема функции проверки входных данных
Основой проверки входных данных программы являет собой компонент Form Create, который вмещает в себе все функции, которые написаны непосредственно в программе. Он является контейнером для таких действий: N2Click, N4Click, N5Click, Memo.Lines.LoadFromFile . А основой расчёта и вывода выходных данных программы являет собой компонент TForm1.Button1Click , который вмещает в себе все функции, которые написаны непосредственно в программе. Он является контейнером для таких действий
Опишем их:
· Memo.Lines.LoadFromFile – загружает входной файл в текстовый контейнер Memo1;
· N2Click – выход из программы;
· Button1Click – выводит выходные данные в текстовый контейнер Memo2;
· N4Click – вывести информацию о программе;
· N5Click – очистить переменные программы(используется перед открытием входного файла);
Сервис онлайн-записи на собственном Telegram-боте
Попробуйте сервис онлайн-записи VisitTime на основе вашего собственного Telegram-бота:
— Разгрузит мастера, специалиста или компанию;
— Позволит гибко управлять расписанием и загрузкой;
— Разошлет оповещения о новых услугах или акциях;
— Позволит принять оплату на карту/кошелек/счет;
— Позволит записываться на групповые и персональные посещения;
— Поможет получить от клиента отзывы о визите к вам;
— Включает в себя сервис чаевых.
Для новых пользователей первый месяц бесплатно.
Зарегистрироваться в сервисе
· FormCreate – собственно обработка данных;
Первые пять действий имеют визуальное отображение в главном меню программы, первые четыре – и в главном меню. Последний – используется для внутренней работы и пользователю не показывается.
4.1 Функция обработки данных
Расчет результата происходит в такой последовательности:
1) Загрузка входных данных с файла.
2) Заполнение TMemo1 входными данными.
3) Отображение веденных осколков на Image1 с помощью графического рисунка.
4) Вывод координат первого осколка без изменений на TMemo2.
5) Нахождение точки удара и расчёт разницы координат для параллельного переноса.
6) Вывод выходных данных на TMemo2.
7) Отображение выходных осколков на Image2 с помощью графического рисунка
4.2 Защита от ошибок
Защитой от ошибок в программе происходит в такой последовательности:
1) Проверка количества введенных осколков.
2) Проверка на наличие осколков с нулевой площадью.
3) Создание координатных осей и проверка сторон осколков на параллельность.
4) Нахождение длин сторон треугольников, параллельных координатным осям.
5) Нахождение суммы площадей всех введенных осколков.
6) Нахождение площади образовавшегося прямоугольника, и проверка его на равенство с суммой площадей всех входных осколков.
Для начала работы Вам необходим входной файл. С целью сделать программу максимально универсальной, входные данные в ней можно ввести и вручную.
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;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus, MUNit;
type
TForm1 = 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;
var
Form1: 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;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); // Процедурасозданияформы
var
stemp: string;
bb:boolean;
begin
Vv.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 begin
oskolok[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 begin
result := false;
Application.MessageBox('Простите, но количество треугольников слишком мало'+
'(меньше 4)','Ошибка',MB_OK+MB_ICONError); //Выводим сообщение об ошибке
Button1.Enabled:=False; //Блокируемкнопку
exit;
end;
{Проверяем есть ли среди введеных треугольников, треугольники с нулевой площадью}
If oskolok[1].X = oskolok[2].X then begin
if oskolok[2].X = oskolok[3].X then begin
Application.MessageBox('Простите, но площадь одного из треугольников равна нулю'
,'Ошибка',MB_OK+MB_ICONError); // Выводим сообщение об ошибке
Button1.Enabled:=False; //Блокируемкнопку
exit;
end;
end;
If oskolok[1].Y = oskolok[2].Y then begin
if oskolok[2].Y = oskolok[3].Y then begin
Application.MessageBox('Простите, но площадь одного из треугольников равна нулю'
,'Ошибка',MB_OK+MB_ICONError); // Выводим сообщение об ошибке
Button1.Enabled:=False; //Блокируемкнопку
exit;
end;
end;
{Создаём оси паралельности}
{Ось паралельности ОХ1 по левой стороне стола}
If (oskolok[1].X = oskolok[2].X) then begin
If (oskolok[3].X>oskolok[1].X) then begin
xx:=xx+1;
end;
end;
If (oskolok[2].X = oskolok[3].X) then begin
If (oskolok[1].X>oskolok[1].X) then begin
xx:=xx+1;
end;
end;
If (oskolok[1].X = oskolok[3].X) then begin
If (oskolok[2].X>oskolok[1].X) then begin
xx:=xx+1;
end;
end;
{Ось паралельности ОХ2 по правой стороне стола}
If (oskolok[1].X = oskolok[2].X) then begin
If (oskolok[3].X<oskolok[1].X) then begin
xx:=xx+1;
end;
end;
If (oskolok[2].X = oskolok[3].X) then begin
If (oskolok[1].X<oskolok[1].X) then begin
xx:=xx+1;
end;
end;
If (oskolok[1].X = oskolok[3].X) then begin
If (oskolok[2].X<oskolok[1].X) then begin
xx:=xx+1;
end;
end;
{Ось паралельности ОУ1 по нижней стороне стола}
If (oskolok[1].Y = oskolok[2].Y) then begin
If (oskolok[3].Y>oskolok[1].Y) then begin
xx:=xx+1;
end;
end;
If (oskolok[2].Y = oskolok[3].Y) then begin
If (oskolok[1].Y>oskolok[1].Y) then begin
xx:=xx+1;
end;
end;
If (oskolok[1].Y = oskolok[3].Y) then begin
If (oskolok[2].Y>oskolok[1].Y) then begin
xx:=xx+1;
end;
end;
If (oskolok[1].Y = oskolok[2].Y) then begin
If (oskolok[3].Y<oskolok[1].Y) then begin
xx:=xx+1;
end;
end;
If (oskolok[2].Y = oskolok[3].Y) then begin
If (oskolok[1].Y<oskolok[1].Y) then begin
xx:=xx+1;
end;
end;
If (oskolok[1].Y = oskolok[3].Y) then begin
If (oskolok[2].Y<oskolok[1].Y) then begin
xx:=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)); //Выводимбезизмененийкоординатыосколковна TMemo2
end;
////////Конец цикла
{Выводим сообщения о количестве треугольноков со сторонами с паралельными осям}
If xx=n-2 then begin
Application.MessageBox(PCHar('Ощибка - треугольников с параллельными осям сторонами всего лишь:'+INtToStr(Xx+2)),0); // Выводим сообщение об ошибке
Button1.Enabled:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); //Процедуравыполнениярасчётовивыводаданных
begin
Vv2.Lines.Clear; // Очишаем TMemo2
Vv2.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 begin
nomervershiny:=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 begin
l1:=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 begin
l1:=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 begin
l2:=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 begin
l2:=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 begin
l2:=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 begin
oskolok[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 begin
nomervershiny:=3;
l1:=l1+Abs(oskolok[1].Y-oskolok[2].Y);
end;
If (oskolok[2].X = oskolok[3].X) then begin
nomervershiny:=1;
l1:=l1+Abs(oskolok[2].Y-oskolok[3].Y);
end;
If (oskolok[1].X = oskolok[3].X) then begin
nomervershiny:=2;
l1:=l1+Abs(oskolok[1].Y-oskolok[3].Y);
end;
{Находим длины сторон треугольников, которые паралельны осям OУ}
If (oskolok[1].Y = oskolok[2].Y) then begin
nomervershiny:=3;
l2:=l2+Abs(oskolok[1].X-oskolok[2].X);
end;
If (oskolok[2].Y = oskolok[3].Y) then begin
l2:=l2+Abs(oskolok[2].X-oskolok[3].X);
nomervershiny:=1;
end;
If (oskolok[1].Y = oskolok[3].Y) then begin
l2:=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 begin
Application.MessageBox('Площади НЕ равны','Ошибка',MB_OK); // Выводим сообщение о неравенстве площадей
bUTTon1.Enabled := False; // Блокируемкнопку
end;
end;
{Задаёмменю}
procedure TForm1.N2Click(Sender: TObject); // "Выход"
begin
Application.Terminate;
end;
procedure TForm1.N4Click(Sender: TObject); // "Опрограмме"
begin
Form2.Show; // Открываем Form2
end;
procedure TForm1.N5Click(Sender: TObject); // "Обновить"
begin
Vv2.Lines.Clear; // Очищаем TMemo2
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); // Процедуразакрытия TForm1
begin
Application.Terminate;
end;
end.








|