Задача 27) Заданы координаты короля, слона и ладьи на шахматной доске. Определить, бьют ли ладья короля ,находится ли король под защитой слона.




Российская Федерация

Тюменская область

ХАНТЫ-МАНСИЙСКИЙ АВТОНОМНЫЙ ОКРУГ – ЮГРА

Департамент образования и науки

Сургутский государственный университет

Ханты-Мансийского автономного округа

 

 

  Инженерно-физический факультет Кафедра автоматики и компьютерных систем

 

 

Отчет

По лабораторной работе № 2

По дисциплине «Структурное программирование»

 

 

Выполнил: студент группы 12-11б

Чернаков Е.С.

Проверил: ассистент

Щербаков А.М.

 

Сургут

2012 г.

Задача 12) Заданы координаты вершин прямоугольника и некоторой точки. Определить, лежит ли точка внутри прямоугольника, на его стороне или вне его.

1) Для решения данной задачи нам понадобятся исходные данные: координаты левой верхней и правой нижней вершин прямоугольника, а также координаты самой точки.

Точка лежит вне прямоугольника если, хотя бы одна из координат точки больше(точка выше и/или правее) или меньше(ниже и/или левее) соответствующих координат вершин прямоугольника.

Точка лежит внутри прямоугольника, если все координаты меньше и больше соответствующих.

Во всех остальных случаях точка лежит на его стороне

 

2) Блок-схема:

Нет
Да
Нет
Да
xt<x1 или xt>x2 или yt>y1 или yt<y2  
“Точка лежит вне прямоугольника”
xt>x1 и xt<x2 и yt<y1 и yt>y2  
“Точка лежит внутри прямоугольника”
Конец
“Точка лежит на стороне прямоугольника”
Запрос и получение исходных данных
Начало

 

 


3) Основная часть программы на языке C++:

#include "stdafx.h"

#include <math.h>

int _tmain(int argc, _TCHAR* argv[])

{

int x1,y1,x2,y2,xt,yt;

printf("Vvedite x and y verhney levoy vershini ");

scanf("%d %d",&x1,&y1);

printf("Vvedite x and y nizhney pravoy vershini ");

scanf("%d %d",&x2,&y2);

printf("Vvedite x and y to4ki ");

scanf("%d %d",&xt,&yt);

 

if (xt<x1 || xt>x2 || yt>y1 || yt<y2)

printf("to4ka lezhit vne pr9Imougolnika\n");

else

if (xt>x1 && xt<x2 && yt<y1 && yt>y2)

printf("vnutri pr9Imougolnika\n");

else

printf("na storone pr9Imougolnika\n");

 

return 0;

}

4) Обоснование выбора условных операторов:

Конструкция для проверки на то что точка вне прямоугольника:

if (xt<x1 || xt>x2 || yt>y1 || yt<y2)

Если хотя бы одна из координат точки выходит за пределы координат треугольника:

1. х точки меньше х левой верхней вершины прямоугольника

2. х точки больше х правой нижней вершины прямоугольника

3. у точки больше у левой верхней вершины прямоугольника

4. у точки меньше у правой нижней вершины прямоугольника

То точка лежит вне прямоугольника

Конструкция если предыдущее высказывание ложно:

if (xt>x1 && xt<x2 && yt<y1 && yt>y2)

printf("vnutri pr9Imougolnika\n");

else

printf("na storone pr9Imougolnika\n");

В этой конструкции рассматривается лежит ли точка во внутренних границах прямоугольника и если данное условие не выполняется то остается только вариант, что точка лежит на стороне прямоугольника(которое было бы относительно сложным для реализации, если бы мы сделали 3 отдельных условия).

 

Задача 27) Заданы координаты короля, слона и ладьи на шахматной доске. Определить, бьют ли ладья короля,находится ли король под защитой слона.

1) Для решения задачи нам понадобятся исходные данные: положения фигур на доске.

Ладья бьет короля если они находятся на одной полосе и между ними нет слона, во всех остальных случаях слон защищает короля

2) Блок-схема:

Да
Нет
Начало
Запрос и получение исходных данных
kx==lx && (sx!=lx ||!((sy<ly && sy>ky) || (sy>ly && sy<ky))) || (ky==ly && (sy!=ly ||!((sx<lx && sx>kx) || (sx>lx && sx<kx))))  
“Ладья рубит короля”
Конец
“Король под защитой слона”

 

 


3) Основная часть программы на языке C++:

 

#include "stdafx.h"

#include <math.h>

int _tmain(int argc, _TCHAR* argv[])

{

int kx,ky,sx,sy,lx,ly;

printf("Vvedite koordinati korol9I");

scanf("%d %d",&kx, &ky);

printf("Vvedite koordinati slona");

scanf("%d %d",&sx, &sy);

printf("Vvedite koordinati ladyi");

scanf("%d %d",&lx, &ly);

 

if ((kx==lx && ky==ly) || (sx==lx && sy==ly) || (kx==sx && ky==sy))

printf("Kogoto uzhe sozhrali");

else

 

if (kx==lx && (sx!=lx ||!((sy<ly && sy>ky) || (sy>ly && sy<ky))) ||

(ky==ly &&(sy!=ly ||!((sx<lx && sx>kx) || (sx>lx && sx<kx)))))

 

printf("ladya rubit korolya");

else

printf("korol pod zashitoy slona");

 

 

return 0;

}

1) Обоснование выбора условных операторов:

Для проверки того что все фигуры целы(никто никого еще не съел) используется конструкция

if ((kx==lx && ky==ly) || (sx==lx && sy==ly) || (kx==sx && ky==sy))

printf("Kogoto uzhe sozhrali");

в случае невыполнения которой выполняется главная часть программы.

 

В данной задаче используется одна большая(относительно) конструкция для проверку рубит ли ладья короля:

if (kx==lx && (sx!=lx ||!((sy<ly && sy>ky) || (sy>ly && sy<ky))) ||

(ky==ly && (sy!=ly ||!((sx<lx && sx>kx) || (sx>lx && sx<kx)))))

 

Рассмотрим первую половину условия:

Для того чтобы ладья смогла срубить короля они должны быть на одной линии(для первой половины это вертикаль)

(kx==lx) и между ними не было слона, для этого было взято отрицание того что слон стоит между ними и мешает(!((sy<ly && sy>ky) || (sy>ly && sy<ky))) или случай когда слон вообще не стоит на одной с ними линии(sx!=lx). Аналогично для второй половины условия (там уже рассматривается горизонталь)

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: