НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ «КПІ»
МЕЖУНІВЕСІТЕТСКІЙ МЕДИКО-ІНЖЕНЕРНИЙ ФАКУЛЬТЕТ
Кафедра медичної кібернетики та телемедицини
Розрахунково-графічна робота
з дисципліни «Основи програмування та алгоритмічні мови»
варіант 21 «Скло»
Аналіз вхідного файлу програми та виведення результатів у вихідний файл
виконав:
студент гр. ІМ-71
Плахтій Артур Миколайович
перевірив:
ст. препод. каф. МКТМ
Зінченко Н.П.
Київ 2009
Зміст
Введення
1. Постановка завдання
1.1 Формат вхідного файлу
1.2 Формат вихідного файлу .............................................. ...................................
1.3 Приклади
2. Метод рішення
3. Алгоритм розв'язання задачі
4. Опис програми та її складових
4.1 Функція обробки даних 8
4.2 Захист від помилок 9
5. Керівництво користувача 10
Висновок
Література 12
Додаток А. Лістинг програми
Додаток Б. Результати роботи програми. 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 Функція обробки даних
Розрахунок результату відбувається в такій послідовності:
Завантаження вхідних даних з файлу.
Заповнення TMemo1 вхідними даними.
Відображення наведених осколків на Image1 за допомогою графічного малюнка.
Висновок координат перший осколка без змін на TMemo2.
Знаходження точки удару і розрахунок різниці координат для паралельного переносу.
Висновок вихідних даних на TMemo2.
Відображення вихідних осколків на Image2 за допомогою графічного малюнка
4.2 Захист від помилок
Захистом від помилок в програмі відбувається в такій послідовності:
Перевірка кількості введених осколків.
Перевірка на наявність осколків з нульовою площею.
Створення координатних осей і перевірка сторін осколків на паралельність.
Знаходження довжин сторін трикутників, паралельних координатним осям.
Знаходження суми площ всіх введених осколків.
Знаходження площі утворився прямокутника, і перевірка його на рівність з сумою площ всіх вхідних осколків.
5. Керівництво користувача
Для початку роботи Вам необхідний вхідний файл. З метою зробити програму максимально універсальною, вхідні дані в ній можна ввести і вручну.
Відкрийте вхідний файл (input.txt і TOSHONADO.txt).
Викличте процедуру розрахунку (команда «Меню-> Виконати» у головному меню або кнопка на панелі інструментів).
Вихід з програми реалізується командою «Меню-> Вихід" у головному меню або кнопка на панелі завдань.
Висновок
У ході виконання даної розрахунково-графічної роботи була реалізована функція зчитування числових даних з файлу, управління (створення, знищення та редагування) візуальними компонентами під час виконання програми.
Література
Т. Рютте, Г. Франкен. Турбо Паскаль 6.0. Торгово-іздательськое бюро BHV. Грифон. - К.: 1992. - 235 с.
Т. П. Караванова. Основи алгорітмізації та програмування. Форум. - К.: 2002. - 286 с.
І. Скляр. Вівчаємо мову программування PASCAL. http://distance.edu.vn.ua/metodic/pascal/
Будникова Н.А. Навчальний комплекс з програмування на мові ПАСКАЛЬ http://petrsu.ru/Chairs/IMO/pascal/
Потопахін В. 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.
Додаток Б. Результати роботи програми.