Российская Федерация
Тюменская область
ХАНТЫ-МАНСИЙСКИЙ АВТОНОМНЫЙ ОКРУГ – ЮГРА
Департамент образования и науки
Сургутский государственный университет
Ханты-Мансийского автономного округа
Инженерно-физический факультет Кафедра автоматики и компьютерных систем |
Отчет
По лабораторной работе № 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). Аналогично для второй половины условия (там уже рассматривается горизонталь)
|