Ragnarök — Power of Thor

 Рагнарёк

Задача

Есть Тор. А у Тора был источник силы. Больше нет. Тор движется по прямоугольному полю и ему известны его координаты и координаты источника. Наша задача: за наименьшее количество ходов привести Тора к источнику. Допустимые варианты движения приведены на картинке ниже:

Рагнарёк-2

Инициализация

Одна строка, в которой даны четыре целых числа:  LX, LY, TX, TY — соответственно абсцисса и ордината источника, абсцисса и ордината начального положения Тора.

Инициализация

Одна строка, в которой даны четыре целых числа:  LX, LY, TX, TY — соответственно абсцисса и ордината источника, абсцисса и ордината начального положения Тора.

Входные данные для одного игрового хода

Уровень энергии Тора. Нам он не понадобится.

Выходные данные для одного игрового хода

Одна из следующих строк: «N», «NE», «E», «SE», «S», «SW», «W», «NW», указывающая в каком направлении Тору нужно переместиться.

Решение

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

Во-первых, нужно учесть, что ордината растёт в южном, а не в северном направлении, как обычно:

 Рагнарёк-3

Во-вторых, если бы поле не было прямоугольным (или на нём были бы преграды, не позволяющие двигаться в том или ином направлении), то наш метод пришлось бы серьёзно модифицировать.

 

Код на С++

Код на Java

 

Related Images:

A59б

Задача:

Для задачи (А.59(б)

Даны действительные числа

Определить, принадлежит ли точка с координатами x, y  заштрихованной области.

X  Y  Ответ
-0.65 -0.75  Yes
-0.95 -0.59 No
700 8 No
0 0 No
0.56 0.75 Yes
1,0011 1,0012 No
0.6 0 Yes

Код программы на С++

Код программы на Java

Поскольку заштрихованная область это круг с «вырезанным кругом» внутри, то для того чтобы определить лежит ли точка в нужной нам области нам достаточно сравнить сумму квадратов координат точек с квадратом радиуса двух окружностей, которые и являются нашими границами.

Если точка лежит на самой окружности, мы считаем что она принадлежит нужной нам области.

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

 

Related Images:

Образец: Принадлежит ли точка треугольнику?

Задача. Даны три попарно не совпадающие и не лежащие на одной прямой точки [latex]A, B[/latex] и [latex]C[/latex], заданные своими координатами. Определить принадлежит ли точка [latex]D(x_d,y_d)[/latex] треугольнику [latex]ABC[/latex].
Сразу заметим, что задача легко обобщается для любого выпуклого многоугольника.

Тесты

В тестах нужно обязательно отразить следующие случаи:

  1. Точка строго вне треугольника
  2. Точка строго внутри треугольника
  3. Точка совпадает с одной из вершин треугольника
  4. Точка лежит на одной из сторон треугольника
  5. Точка лежит на продолжении одной из сторон треугольника
  6. Одна из сторон треугольника параллельна одной из осей координат
  7. Две стороны треугольника параллельны осям координат
xa ya xb yb xc yc xd yd Принадлежит?
-1 -1 1 -1 0 1 2 2 нет
-2 -2 1 -1 0 1 0 0 да
-1 -1 1 -1 0 1 0 1 да
-1 -1 1 -1 0 1 0.5 0 да
-1 -1 1 -1 0 1 1 3 нет
-1 -1 1 -1 0 1 0 0 да
0 0 2 0 0 2 1 1 да
0 0 2 0 0 2 5 5 нет

Плохое решение

В школьных учебниках такие задачи часто рекомендуют решать проверкой условия [latex]S_{ABC}=S_{ABD}+S_{BCD}+S_{CAD}[/latex]. При компьютерной реализации это приводит к необходимости сравнения двух действительных чисел на равенство. Эта крайне неприятная операция может быть проделана только с определённой степенью достоверности. Т.е. придётся проверять не превышает ли некоторого «с потолка» выбранного малого числа абсолютное [latex] \left| S_{ABD}+S_{BCD}+S_{CAD}-S_{ABC} \right| < \varepsilon[/latex] или относительное [latex]\left| 1-\frac{S_{ABD}+S_{BCD}+S_{CAD}}{S_{ABC}} \right| < \varepsilon[/latex] отклонение. Оставим эти вопросы для курса численных методов и методов приближённых вычислений и не будем идти по этому пути.

Неплохое решение

Начнём с простого наблюдения:

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

Запишем уравнение прямой, проходящей, например, через точки [latex]A[/latex] и [latex]B[/latex]. Получим [latex] \left( x-x_A \right) \left( y_B-y_A \right)-\left( y-y_A \right) \left( x_B-x_A \right) = 0[/latex]. Уравнение я записал в такой форме, чтобы не приходилось выполнять деление и переживать о нуле в знаменателе.

Неважно как называть стороны, важно научиться их различать.

Неважно как называть стороны, важно научиться их различать.

Теперь для любой точки [latex] \left( x;y \right)[/latex] мы можем вычислить левую часть приведенного равенства. Для точек, лежащих на прямой мы должны получать ноль. В тоже время прямая разобьёт плоскость на две полуплоскости. Точки лежащие в одной полуплоскости будут давать положительные значения. А точки из другой полуплоскости — отрицательные.
Мы готовы проверить первое условие — принадлежит ли точка [latex]D \left( x_d,y_d \right) [/latex] той же полуплоскости, что и точка [latex]C \left( x_c,y_c \right) [/latex] относительно прямой [latex] \left( AB \right) [/latex]? Для этого подставим обе точки в левую часть приведенного выше уравнения прямой и убедимся, что получены значения одного и того же знака. А если одна из точек даст точно ноль? Это означает, что точка лежит на прямой. По условию задачи это может быть только точка [latex]D[/latex]. Тогда она принадлежит треугольнику независимо от знака выражения, вычисленного для точки [latex]C[/latex].

Обратите внимание, что мы не утверждаем, что для любой точки на прямой наши приближённые вычисления обязаны дать точный ноль. Это было бы неверно. Мы только утверждаем, что если проведенные с доступной нам точностью вычисления всё же дали точный ноль, то мы вынуждены считать данную точку лежащей на данной прямой.

Естественно, что нам придётся записать аналогичные условия для двух оставшихся сторон треугольника (или для всех оставшихся сторон выпуклого многоугольника).

Плохой код

Начнём с того, что объявим переменные и прочитаем их значения. После этого запишем одно очень громоздкое условие, которое и проверяет принадлежность.

Нажмите здесь, чтобы выполнить этот код.

Приведенный код имеет существенные недостатки. Нам пришлось трижды записывать уравнение прямой проходящей через две точки и дважды подставлять в каждое из них координаты, чтобы проверить знак. Это значит, что нам пришлось шесть раз написать некоторую формулу с различными подстановками. При том подходе, что мы использовали имеем две проблемы. Во-первых, условие стало слишком сложным, чтобы его можно было легко воспринять. Во-вторых, и это гораздо хуже, такой код в [latex]\frac { 1-{ \left( 1-p \right) }^{ 6 } }{ p }[/latex] раз увеличивает вероятность совершить ошибку. Забавно, но это означает, что вероятность ошибки начинающего программиста увеличивается вдвое, а у опытного — в шесть раз. Хорошо, что опытные программисты не пишут такой код.

Неплохой код

Воспользуемся тем, что мы уже умеем создавать собственные функции для того, чтобы несколько сократить объём кода и сделать его более лёгким для восприятия.
Запишем условие на языке программирования С++:

Нажмите здесь, чтобы выполнить этот код.
Трудно сказать, стал ли код боле понятным или лаконичным. Однако можно точно сказать, что в нём отсутствуют повторяющиеся алгоритмические блоки. Все участки кода написаны строго по одному разу. Это уменьшает вероятность ошибки.

Чеширский код

Этот код содержит пока не изученные вами конструкции. Из-за этого он может показаться немного загадочным. Но если продолжать грызть гранит науки, то всё легко освоите. Или можно подождать...

Этот код содержит пока не изученные вами конструкции. Из-за этого он может показаться немного загадочным. Но если продолжать грызть гранит науки, то всё легко освоите. Или можно подождать…

Возможно слишком смело называть это хорошим кодом, но мы сделаем ещё один шаг в нужном направлении. В прошлом коде мы избавились от повторов в кодировании алгоритма. Однако остались повторы в кодировании данных. Вы заметили, что у нас четыре пары переменных? Т.е. просматривается структура состоящая из пары координат x и y, которую стоит объединить и назвать «точкой». Такие структуры в программировании на Си описывают с помощью ключевого слова struct. Это полезная промежуточная структура перед переходом к объектно-ориентированному программированию при помощи классов.

Нажмите здесь, чтобы выполнить этот код.
Вы заметили как забавно увеличивается размер программы по мере того, как мы пытаемся сделать его более логичным и наглядным? Это характерно для маленьких программ. Такие дополнительные структуры становятся всё более оправданными для больших и огромных программ.

Related Images:

А54

Задача:

Даны действительные числа [latex]x_{1}[/latex], [latex]x_{2}[/latex], [latex]x_{3}[/latex], [latex]y_{1}[/latex],[latex]y_{2}[/latex], [latex]y_{3}[/latex].

Принадлежит ли начало координат треугольнику с вершинами [latex]\left( x_{1} ; y_{1} \right) [/latex], [latex]\left( x_{2} ; y_{2} \right) [/latex], [latex]\left( x_{3} ; y_{3} \right) [/latex]?

 
  [latex] x_{1} [/latex]   [latex] y_{1} [/latex]   [latex] x_{2} [/latex] [latex] y_{2} [/latex]   [latex] x_{3} [/latex]   [latex] y_{3} [/latex] Предполагаемый результат Вывод
 -400  0  240  1  210  1  Не принадлежит  Тест пройден
 -400  0  240  1  210  -1  Принадлежит  Тест пройден
 0  0  240  -1  2100  -1  Принадлежит  Тест пройден
 -2  -2  5  -2  1  10  Принадлежит  Тест пройден
 3  0  40  0  15  10  Не принадлежит  Тест пройден
 -24  -2  29  -2  29  10  Принадлежит Тест пройден
 -12  -5  14  -5  7  -5  Жаль вас расстраивать… Тест пройден

 

 

Описание:

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

 

Краткий алгоритм:

  1. Объявление переменных, обозначающих координаты вершин  треугольника.
  2. Ввод координат вершин треугольника.
  3. Небольшая проверка  правильности ввода.
  4. С помощью общего уравнения прямой [latex]\frac{y-y_{1}}{y_{2}-y_{1}}=\frac{x-x_{1}}{x_{2}-x_{1}}[/latex], приведенного в вид :[latex]\left(y_{2}-y_{1} \right) \left(x-x_{1}\right)-\left(y-y_{1} \right) \left(x_{2}-x_{1}\right)=0[/latex],- определяем расположение вершин треугольника относительно противоположных им сторон (название переменной показывает, какую вершину проверяют), а также начала координат относительно тех же сторон, после чего следует умножение соответствующих величин. В случае, если произведение больше, либо равно нулю во всех трех случаях, можно сделать вывод о том, что точка находится внутри треугольника.
  5. Вывод вердикта и окончание работы.

Ссылка на Ideone.

Related Images:

А51

Задача: Даны действительные числа [latex] a,b,c (a\neq 0) [/latex] . Полностью исследовать биквадратное уравнение [latex] ax^4+bx^2+c=0 [/latex] т.е если действительных корней нет, то должно быть выдано сообщение об этом, иначе должны быть выданы два или четыре корня.

Я немного усложнил задачу, добавил случай [latex] a=0 [/latex]

a b c x1 x2 x3 x4
0 0 0 R R R R
0 0 1
0 1 0 0 0 0 0
0 2 -8 2 -2
0 2 3
10 2 10
2 2 -6 1.14 -1.14
-5 22 -6 0.24 -0.54 2.09 -2.09
1 4 4
1 -4 4 1.41 -1.41

Решение:

Ссылка на ideone C++: http://ideone.com/By6f3b

Ссылка на ideone Java: http://ideone.com/fsmSvf

 

Если [latex] a\neq 0 [/latex] , то надо рассмотреть только несколько случаев: Дискриминант меньше нуля (корней нет), дискриминант больше нуля, тогда делаем замену, [latex] x^2=t>0 [/latex] и считаем [latex] t [/latex], далее проверяем будет ли [latex] t>0 [/latex]

Если добавить случай с [latex] a=0 [/latex] , то надо рассмотреть ситуации:

[latex] b=0 [/latex] , тогда если [latex] c=0 [/latex] , то корней бесконечно много, в противном случае — корней нет.

[latex] b\neq 0 [/latex] , тогда если [latex] -(c/b)>0 [/latex] , то решение есть, в противном случае под корнем отрицательное число

Related Images:

А59к

Задача.

Даны действительные числа [latex]x[/latex],[latex]y[/latex]. Определить, принадлежит ли точка с координатами [latex](x;y)[/latex] заштрихованной части плоскости.

A59k

Тесты.

Ввод Вывод
[latex](-5.25;1.5)[/latex] Принадлежит
[latex](-3;1)[/latex] Принадлежит
[latex](0.6;0.6)[/latex] Принадлежит
[latex](-0.8;0.9)[/latex] Принадлежит
[latex](0.5;0.4)[/latex] Не принадлежит
[latex](-0.25;-0.3)[/latex] Не принадлежит

Код.

(C++)

Java

Решение.

Решение задачи сводится к поиску условия, при котором точка будет принадлежать данной части плоскости. В данной задаче условие будет такое: точка находиться выше прямой [latex]y=1[/latex], то есть ордината точки [latex]y\geq 1[/latex] (границы включаем) или точка находится выше графика функции [latex]y=\left|x \right|[/latex] на промежутке [latex]x[/latex]∈ [latex]\left[-1;1 \right][/latex], то есть [latex]y\geq \left|x \right|[/latex] , [latex]-1\leq x\leq 1[/latex] (границы включаем).

Для выполнения программы и проверки тестов можно воспользоваться следующей ссылкой(C++)  или другой(Java).

Related Images:

А59г

ЗАДАЧА: Даны действительные числа [latex]{x},{y}[/latex]. Определить принадлежит ли точка с координатами [latex]{x},{y}[/latex] заштрихованной части плоскости.

А59гЗаштрихован  ромб с координатами [latex]{A}(1.0),{B}(0.1),{C}(-1.0),{D}(0.-1)[/latex]

27 41 не принадлежит
0.1 -0.2 принадлежит
-2 -3 не принадлежит
    1. Задали значения через scanf;
    2. Вывели на печать проверку принадлежности точки;
    3. Получили ответ принадлежит ли точка ромбу.
      ссылка на программу http://ideone.com/x1p0Dp

     

     

Related Images:

Ю2.20

Как успеть подешевле? Можно ехать на такси со скоростью [latex]v_{1}[/latex] км/ч и оплатой [latex]p_{1}[/latex] pуб/км либо идти пешком со скоростью [latex]v_{2}[/latex] км/ч бесплатно. Как с наименьшими затратами преодолеть путь [latex]s[/latex] за время [latex]t[/latex], если это возможно? Каковы эти затраты?

v1 v2 s t p1 Результат:
30 5 18 2 4 0
50.44 4 75.7 3 5.5 174.975969
62 5 800 5 7 No time
8 17 60 3 8 0

Код программы:

По условию задачи нужно выяснить, как с наименьшими затратами преодолеть путь [latex]s[/latex] за время [latex]t[/latex], если это возможно. Вводим переменные с типом данных “double”, так как переменные входят в множество действительных чисел. Необходимо рассмотреть несколько случаев.
Первый случай, когда можно успеть добраться пешком, то есть [latex]s/v_{2}<t[/latex], следовательно оплата равна [latex]0[/latex].
Второй случай, когда скорость пешком больше или равна скорости такси. Если при этом пешком успеть нельзя, тогда выводим «No time», если пешком успеем, то оплата равна 0.

Третий случай, когда можно часть пути проехать на такси, а остаток пройти пешком так, чтобы затраты были минимальными. Для этого надо формулу: [latex]s=v_{1} \cdot t_{1}+v_{2} \cdot t_{2}[/latex] преобразовать в вид: [latex]s=t_{1} \cdot v_{1}+t \cdot v_{2}-t_{1} \cdot v2[/latex] и выразить [latex]t_{1}[/latex], введя переменную [latex]T[/latex](минимальное время езды на такси).
[latex]T = (s-t \cdot v_{2}) / (v_{1}-v_{2})[/latex].
В результате получаем формулу:
[latex]p=(T \cdot v_{1}) \cdot p_{1}[/latex] и считаем [latex]p[/latex].
И наконец четвертый случай,  если невозможно успеть вовремя ни на такси, ни пешком.
Для проверки работы программы можно воспользоваться объектом.

 

Код программы на Java:

Ссылка на Java код.

Related Images:

А60в

4

рис.1

Задача. Даны действительные числа [latex]x[/latex] и [latex]y[/latex]. Найти [latex]u[/latex], если
4

где [latex]D[/latex] — заштрихованная область на (рис.1)

[latex]x[/latex] [latex]y[/latex] [latex]u[/latex] Комментарий
5 3 22 Точка не входит в D
0.5 0.5 0 Точка входит в D
0 0 0 Тoчка лежит на границе D

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

Вот те самые вышеупомянутые уравнения:
1)[latex]y=1-{ x }^{ 2 }[/latex]
2)[latex]{ x }^{ 2 }+{ (y-1) }^{ 2 }=1[/latex]

Второе уравнение можно привести к виду:
[latex]y=1\pm\sqrt{1-{x}^{2}} [/latex] Заметим что указанная формула работает только при: [latex]{ x }\le 1[/latex](Важно не забыть упомянуть об этом в местах в участках кода которых мы будем её использовать).
Исходя из выше наведенного графика: нас интересует нижняя часть окружности, тогда на месте [latex]\pm[/latex] нужно поставить [latex]-[/latex]
Также график показывает нам что координата [latex]y[/latex] заданной нам точки должна быть:
[latex]1-\sqrt { 1-{ x }^{ 2 } }<y<1-{ x }^{ 2 }[/latex]

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

Сам код программы: http://ideone.com/SMyaWK

Related Images:

А69

Задача:   Часовая стрелка образует угол [latex]\varphi[/latex] с лучом, проходящим через центр  и через точку, соответствующую  [latex]12[/latex]  часам на циферблате, [latex] 0 < \varphi \leq 2\pi[/latex]. Определить значение угла для минутной стрелки, а также количество часов и полных минут.

Тесты

[latex]\varphi[/latex] Часы Минуты [latex]\alpha[/latex] Комментарий
30 1 0.00 0.00 Пройден
360 12 0.00 0.00 Пройден
1 0 2.00 12.00 Пройден
149.9 4 59.8 358.80 Пройден

Код

 

В условии задачи сказано, что [latex] 0 < \varphi \leq 2\pi[/latex], значит вводимое значение угла [latex]\varphi[/latex] — не может быть отрицательным  и  быть больше 360 градусов. Угол [latex]\alpha[/latex] — угол между минутной стрелкой и лучом. Один час — 30 градусов, что бы узнать количество часов нам следует  поделить введенный угол [latex]\varphi[/latex] на 30 градусов. Но перед этим   важно узнать остаток от этого деления, если такой имеется.  Если остаток равен 0, значит минутная стрелка показывает 0 минут и можно смело вывести значения  часов ( поделив [latex]\varphi[/latex] на 30),  минут и угла [latex]\alpha[/latex]( 0 ). Если  остаток все же не равен 0, нужно отнять его от [latex]\varphi[/latex]   и разделить на 30 градусов.  Так-как в одном часе 60 минут, а остаток не может быть больше 30 градусов, умножаем его на 2 и получаем количество минут. Подобную операцию проводим над углом [latex]\alpha[/latex], но в этот раз умножаем на 12. Выводим значения часов, минут и угла [latex]\alpha[/latex].

Ссылка на Ideone

Код для Java

Ссылка на Ideone

Related Images:

А35а

Задача

Даны действительные числа [latex]x,y,z[/latex] . Вычислить [latex]max\left ( x+y+z,xyz \right )[/latex].

x y z Результат Комментарий
2 5 6 60 пройден
2 2 1 5 пройден
0 1 125 126 пройден
-23 56 7 40 пройден

 

Код:

Поиск максимального из двух чисел [latex]a=x+y+z[/latex] и [latex]b=x\cdot y\cdot z[/latex]

(Если числа одинаковые, то выведется второе, но на результат это не влияет. )

А на Java решение выглядит так:

 

 

Ссылка на код.

Related Images:

А59ж

Задача

Даны действительны числа [latex]x[/latex] , [latex]y[/latex]  . Определить , принадлежит ли точка с координатами  [latex]x[/latex] , [latex]y[/latex] заштрихованной части плоскости .

Безымянный

Тесты:

x y результат комментарий
-1.5 1 outside пройден
-0.5 0.5 inside пройден
0.5 0.5 inside пройден
1.5 1.5 outside пройден
-0.5 -0.5 inside пройден
-1 -1.5 outside пройден
1 -1.5 outside пройден
 

Ссылка на код C++ : http://ideone.com/JKdLjg

Ссылка на код Java : http://ideone.com/kWAdw2

Решение :

Решение задачи сводится к поиску условия, при котором точка будет принадлежать данной части плоскости. Далее вводим оператор условия «if» и ставим ограничения на [latex]x[/latex] и [latex]y[/latex].

Анализируем условие , при каких значениях [latex]x[/latex] и [latex]y[/latex] точка будет принадлежать условию , а при каких нет.Если вошла точка по координатам во все области -> точка принадлежит треугольнику или же наоборот .

 

Related Images:

А58а

Задача. Дано действительное число [latex]a[/latex]. Для функции [latex]f\left(x \right)[/latex], график которой изображен, вычислить [latex]f\left(a \right)[/latex].

58a

a [latex]f\left(a \right)[/latex] Комментарий
7 -49 Пройден
0 0 Пройден
 -2  2 Пройден

 

Для решения данной задачи требуется лишь проверка знака числа [latex]a[/latex]. Если [latex]a> 0[/latex], то [latex]f\left(a \right)[/latex] вычисляется как [latex]-a^{2}[/latex], а если [latex]a< 0[/latex], то [latex]f\left(a \right)[/latex] равна  [latex]-a[/latex]. При [latex]a=0[/latex], [latex]f\left(a \right)=0[/latex]. Для проверки выполнения программы можно воспользоваться ссылкой.

Решение на Java:

Ссылка на решение.

Related Images:

Ю2.7

Задача.

Треугольник и круги.

Лежит ли заданный  на плоскости треугольник АВС в области пересечения заданных кругов:

[latex](x-a1)^2+(y-b1)^2<r1^2[/latex] , и [latex](x-a2)^2+(y-b2)^2<r2^2[/latex]  ?
Ссылка на программу на С++: http://ideone.com/NYTAWN

Код программы на Java:

Ссылка на программу на Java:http: //ideone.com/QZ7RB1

Решение:

Поскольку все фигуры выпуклые достаточно проверить вершины треугольника. Подставляем координаты всех трёх вершин в оба неравенства. Если все условия удовлетворены, то лежит. Если хоть одно условие не выполняется, то не лежит.

Тест

a1 b1 r1 a2 b2 r2 ax bx cx ay by cy Принадлежит?
1 2 3 3 4 5 6 7 8 6 7 4 нет
1 2 15 3 4 12 6 7 8 6 7 4 да
7 5 10 4 6 16 6 7 3 5 6 7 да
7 5 5 4 6 3 6 7 3 5 6 7 нет

 

Related Images:

Ю2.1

Задача. Заданы три числа: [latex]a[/latex], [latex]b[/latex], [latex]c[/latex]. Определить, могут ли они быть сторонами треугольника, и если да, то определить его тип: равносторонний, равнобедренный, разносторонний. Замечание. Условие существования треугольника: [latex]a\leq b+c[/latex];  [latex]b\leq a+c[/latex];  [latex]c\leq a+b[/latex]. Нельзя исключать экстремальных случаев, когда одна (или несколько) сторон равны нулю либо когда одно из неравенств переходит в равенство (треугольник нулевой площади).

a b c Тип треугольника Комментарий
0 3 7 Не треугольник
-2 5 4 Не треугольник
1 3 4 Треугольник нулевой площади Пройден
7 7 7 Равносторонний Пройден
15 9 15 Равнобедренный Пройден
3 4 5 Разносторонний Пройден
После ввода чисел [latex]a [/latex], [latex]b [/latex], [latex]c [/latex] проверяем, есть ли равные нулю или есть ли сторона, равная сумме двух других сторон, если такие числа или такая сторона есть, то такой треугольник с нулевой площадью. Далее проверяем условие существования треугольника. Если в треугольнике все стороны равны, то он является равносторонним, если равны только две стороны-равнобедренным, а если нет равных между собой сторон, то треугольник разносторонний. Также мы проверяем, есть ли числа меньше нуля (если такие числа есть, то треугольника со сторонами [latex]a [/latex], [latex]b [/latex], [latex]c [/latex] не существует).

Для проверки выполнения программы можно воспользоваться ссылкой.

Решение на Java:

Ссылка на решение.

Related Images:

Ю1.14

Задача. Русские неметрические единицы длинны: 1 верста = 500 саженей; 1 сажень = 3 аршина; 1 аршин = 16 вершков; 1 вершок = 44,45 мм. Длинна некоторого отрезка составляет P метров. Перевести её в русскую неметрическую систему.

Тесты:

P(м) Результат Комментарий
 0  Длинна отрезка P равна нулю.  Пройден
 1  Длинна отрезка P — 1 аршин 6 вершков.  Пройден
 99  Длинна отрезка P — 46 саженей 1 аршин 3 вершка.  Пройден
345999 Длинна отрезка P — 324 вёрст 166 саженей 2 аршина 4 вершка.  Пройден
-9999  Не имеет смысла.  Пройден
Вот код.

 

Идея такой записи пришла мне в голову еще недели 2-3 назад. Я отлично понимаю что есть способы записать все это в более простом виде но…работает(хоть и не очень шустро) и это главное.

Из задачи ясно, что нам нужно перевести некоторый отрезок P из метров в русскую неметрическую систему измерения, в нашем случае как я понял мы должны использовать исключительно 4 меры длинны: верста, сажени, аршины и вершки. Я записал 5 переменных в тип «float» для 5-ти единиц измерения, затем для 4-х из них записал еще 4 переменные в тип «int«, обозначающие соответствующие им, но в виде целого числа переменные. Сделал я это для того чтобы все соответствующие переменные записать в виде целых чисел, а так же для того чтобы выделить разность целого числа и числа с плавающей точкой и перевести её в меньшую единицу измерения, затем сделав тоже самое с последующими переменными до тех пор пока не дойду до наименьшей единицы измерения.

 

Related Images:

А52

Задача. Даны действительный числа [latex]a[/latex], [latex]b[/latex], [latex]c[/latex], [latex]d[/latex], [latex]s[/latex], [latex]t[/latex], [latex]u[/latex]([latex]s[/latex] и [latex]t[/latex] одновременно не равны нулю). Известно, что точки [latex](a, b)[/latex] и [latex](c, d)[/latex] не лежат на прямой [latex]l[/latex], заданной уравнением [latex]sx+ty+u=0[/latex]. Прямая [latex]l[/latex] заданной уравнением [latex]sx+ty+u=0[/latex]. Прямая [latex]l[/latex] разбивает координатную плоскость на две полуплоскости. Выяснить, верно ли, что точки [latex](a, b)[/latex] и [latex](c, d)[/latex] принадлежат разным полуплоскостям.

В этой задаче надо воспользоваться тем, что две точки [latex](a, b)[/latex] и [latex](c, d)[/latex], не лежащие на прямой, определяемой уравнением [latex]sx + ty + u = 0[/latex], принадлежат одной полуплоскости, если [latex]sa + tb + u[/latex] и [latex]sc + td + u[/latex] – числа одного знака. Справедлив и более общий факт: если уравнение [latex]F(x, y) = 0[/latex] определяет прямую или кривую, разбивающую координатную плоскость на две части, то точки [latex](a, b)[/latex] и [latex](c, d)[/latex], не лежащие на этой линии, принадлежат одной и той же части плоскости, если [latex]F(a, b)[/latex] и [latex]F(c, d)[/latex]– числа одного знака.

a b c d s t u Ответ
5 -4 2 9 6 -3 7  Обе точки принадлежат разным полуплоскостям.
-5 -4 -6 -3 2 7 -1 Обе точки принадлежат одной полуплоскости.
 -5 -4 -6 -3 0 0 -1  Условие некорректно:s и t не должны одновременно равняются нулю.
 4 7 2 1 -4 3  -5  Одна, либо обе из точек лежат на прямой, соответственно не принадлежат ни одной из полуплоскостей.

В программу вводятся исходные данные, среди которых координаты точек [latex](a, b)[/latex] и [latex](c, d)[/latex]. Если набор значений будет таким, что выполнится уравнение прямой [latex]sx+ty+u=0[/latex], (где xa и d. А yb и d), то это значит, что одни из точек (или сразу две) принадлежат прямой и следовательно не принадлежат ни одной из полуплоскостей. Если результаты уравнений [latex](s*a)+(t*b)+u[/latex] и [latex](s*c)+(t*d)+u[/latex]- числа одного знака, то точки лежат в одной полуплоскости. Если же эти числа разного знака, то обе точки принадлежат разным полуплоскостям.

Код на C++:

Код на Java:

 

С программой можно ознакомится тут (C++)/тут (Java).

Related Images:

А56

Даны действительные числа  [latex]a,b,c,x,y.[/latex] Выяснить,пройдет ли кирпич с ребрами [latex]a,b,c[/latex] в прямоугольное отверстие со сторонами [latex]x[/latex]и [latex]y[/latex]. Просовывать кирпич в отверстие разрешается только так,чтоб каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.

a b c x y Комментарий
78 1 1 2 2 Yes
-2 15 1 23 63  The task is not correct
 2.123  5.189  1.56  7  5  Yes
 13.213 4815162342  666  7  12  No

Код программы:

Код на Java:

 

Сначала проверим корректность входных данных,потом проверим условие «входимости» каждой из граней. Если условие верно,то выводим «Yes»,если нет- «No».

Условие «входимости» заключается в том ,что мы сравниваем длины сторон прямоугольника и ребер кирпича.
Если кирпич имеет хотя бы одну общую точку с прямоугольником,то он не пройдет,поэтому неравенство строгое.

Запустить код и проверить тесты можно тут.
Запустить код и проверить тесты можно тут.

Related Images:

Ю2.23

Задание: В Алтайском гос университете принято, что старшая цифра трехзначного номера студенческой группы обозначает номер факультета, средняя – последнюю цифру года поступления, младшая – порядковый номер группы. Продолжительность обучения — не более 6 лет (магистратура). Дан номер группы студента АГУ и текущий год. Напечатать в каком году он поступил и на каком факультете учиться. Например гр.432, 1996г. — факультет математический, год поступления 1993.  Для справки приведены номера факультетов:1–исторический, 2 – экономический, 3 – юридический, 4 – математический, 5 – физический, 6 – химический, 7 – биологический, 8 – филологический, 9 – географический, 10-социологический.

Тестирование. Предусмотреть невозможные ситуации. Например гр 521, год 2001.

135 2014 работает
341 2008 работает
005 2014 работает
4995 2014 не работает
521 2009 не работает
10101 2014 не работает
91 2014 не работает
135 2014 Исторический факультет  Год поступления 2013
341 2008 Юридический факультет  Год поступления 2004
005 2014 Социологический факультет  Год поступления 2010

Решение:

Код программы C++:

Ссылка на ideone Java: http://ideone.com/sLff6T

 

Для начала определяем первую цифру группы — a1, вторую цифру группы — a2, последнюю цифру года — b1.

Далее проводим проверку, что бы выяснить, существует ли эта группа (не больше 4х цифр, если первая 10; не меньше 3х цифр; время обучения не больше 6 лет ). Далее проверка существования факультета и проверка времени обучения.

Если все условия выполняются, то выводим название факультета и год поступления.

 

Related Images:

А37

Задача: Даны  действительные числа [latex]a, b, c[/latex]. Удвоить эти числа, если  [latex] a \geq b \geq c[/latex], и заменить их абсолютными значениями, если  это не так.

[latex]a[/latex] [latex]b[/latex] [latex]c[/latex] [latex]a_1[/latex] [latex]b_1[/latex] [latex]c_1[/latex] Комментарий
 26  16        -2          52.00        32.00         -4.00 Пройден
 20  30         0          20.00        30.00           0 Пройден
 -4  -16        -20         -8.00       -32.00         -40.00 Пройден
 2.75  3.56        -1          2.75        3.56           1 Пройден
 2   2         2           4.00        4.00          4.00 Пройден
В задача нужно проделать на введенными числами операции в зависимости от соблюдения неравенств. Если [latex] a \geq b \geq c[/latex], то мы удваиваем все введенные числа. Если же, неравенство [latex] a \geq b \geq c[/latex] не соблюдается, то находим модули каждого из чисел([latex]|a|, |b|, |c| [/latex] ) и выводим полученное как результат.

Ссылка на Ideone.

Код Java

Ссылка на Ideone

Related Images: