Задача жестянщика. Можно ли из круглой заготовки радиусом [latex]r[/latex] вырезать две прямоугольные пластинки с размерами [latex] a[/latex] × [latex] b[/latex] и [latex] c[/latex] × [latex]d[/latex]?
1.6 3 0 3 0 | We can |
1.6 3 1 3 1 | We can’t |
2 3 1 3 1 | We can |
2 5 1 4 1 | We can’t |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iostream> #include <math.h> using namespace std; double sort(double a,double b) //ссортировка сторон прямоугольника на длину и ширину { double q; if (b>a) { q=b; a=b; a=q; } return a,b; } int main() { float r,a,b,c,d,q;//вводим переменные для входных данных float d1,d2;//переменные для определения длинны до центра круга при радиусе r scanf("%f %f %f %f %f", &r , &a , &b , &c , &d ); sort(a,b);sort(c,d); if ((a<r*2) && (c<r*2))//проверка не больше ли стороны ,чем диаметр { d1 = sqrt(r*r-(a/2)*(a/2));//ищем расстояние до центра от середины длины первого прямоугольника d2 = sqrt(r*r-(c/2)*(c/2));//ищем расстояние до центра от середины длины второго прямоугольника if (d < d2+(d1-b))//если ширина второго прямоугольника меньше суммы его длинны до центра круга и разности длинны до центра первого прямоугольник с его шириной(Если ширина первого прямоугольника больше его длинны до центра,то для ширины второго будет меньше места,это понятно) { printf("We can"); } else { printf("We can't"); } } else { printf("We can't!"); } return 0; } |
Рассмотрим как выглядит прямоугольник в круге.
Можно заметить, что [latex] h=d1[/latex] (длина до центра окружности) — это катет прямоугольного треугольника, значит его можно найти по теореме Пифагора , зная радиус круга [latex] R[/latex] и катит [latex] r[/latex] (в нашем случае [latex] a/2[/latex]) [latex] h=\sqrt{R^2-r^2}[/latex]). Вычитая из полученного [latex] h=d1[/latex] ширину [latex] b[/latex] мы получим сколько он места занимает при данной длине и ширине относительно центра круга. (Если у нас [latex] b<d1[/latex], то для второго прямоугольника у нас будет больше места) Тоже самое мы проделываем и для второго прямоугольника и получаем наше [latex] h2=d2[/latex]. Дальше размещаем наши прямоугольники параллельно друг другу и смотрим, хватает ли места второму прямоугольнику места с учетом его ширины (Если по ширине второй прямоугольник не превышает оставшегося места) [latex]d<d2+(d1-b)[/latex].
Реализация на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone{ static void swap(double a, double b){ if(b > a){ double q = a; a = b; b = q; } } public static void main (String[] args) { double d1, d2;//переменные для определения длинны до центра круга при радиусе r Scanner in = new Scanner(System.in); double r = in.nextDouble(); double a = in.nextDouble(); double b = in.nextDouble(); double c = in.nextDouble(); double d = in.nextDouble(); swap(a, b);swap(c, d); if ((a < r*2) && (c < r*2)){ d1 = Math.sqrt(r*r-(a/2)*(a/2));//ищем расстояние до центра от середины длины первого прямоугольника d2 = Math.sqrt(r*r-(c/2)*(c/2));//ищем расстояние до центра от середины длины второго прямоугольника if (d < d2 + (d1 - b)){ System.out.println("We can"); } else{ System.out.println("We can't"); } } else{ System.out.println("We can't!"); } } } |
— Это не метки «Можно ли вырезать два прямоугольника из круга радиусом r».
— Уберите пожалуйста неуместный декор в заголовке и восклицательные знаки.
— Переменные в условии должны быть набраны в laTeX.
— Пожалуйста, не используйте странные транслитерации вроде «Mojno».
— Поставьте пробелы после знаков препинания и перед скобками.
— Прочтите свою единственную фразу в объяснении. Вы что-то в ней поняли?
Анатолий! Вы дурачитесь, а мне полчаса писать Вам замечания?
— Будьте добры, вставьте метки (ключевые слов), которые идентифицируют задачу. Например, если бы вы находили гипотенузу прямоугольного треугольника по теореме Пифагора, то метками были бы «катет», «гипотенуза», «треугольник», «теорема Пифагора» и т.п.
– Поставьте пробелы после знаков препинания и перед скобками.
– Переменные в условии должны быть набраны в laTeX.
— «он свободного месте занимает»
— Никогда не слышал про “обжорство прямоугольника”. Сделайте, пожалуйста ссылку на источник.
— Сделайте ссылку на код программы в ideone или другой облачной среде, где его можно будет запустить.
Готово.
Многое исправлено. Засчитываю на положенные опоздавшим 8 баллов. Одно условие — исправьте недочёты:
— «Два прямоугольника и круг» это две метки — «два прямоугольника», «круг»
— Пожалуйста уберите пробелы перед знаками препинания. Вы реально не можете разобраться где и почему нужно ставить пробелы? Я давал ссылку на статью с правилами, но там всё довольно просто и интуитивно ясно. Может Вам помогут примеры:
Если моя ссылка Вас не убедила, просто поищите в сети информацию о том где и зачем нужно ставить пробелы. Вам может показаться это пустяком. Так оно и есть. Тем легче будет сделать как положено.
Ох и интересная программа у Вас, даже не знаю, засчитать или нет. Напомню, что я не углубляюсь в условие задачи, а оцениваю корректность перевода с C++ на Java.
А ситуация вот в чем: Ваша функция sort, что в C++ версии, что в Java работают почти одинаково. Т.е. вообще не меняют значения переменных, которые передаются — а поэтому бессмыслены. Но C++ версию очень легко изменить — передать параметры по ссылке (&), но в Java этот трюк уже не пройдет! см. http://microsin.net/programming/android/java-passing-parameters-to-method.html
Так что, не могу засчитать работу — вот как переделать? Т.к. функцию swap нормально не напишешь! Разве что обойтись без функции и продублировать код.
Ну как Вам еще объяснить. Не работает Ваш swap: смотрите .
1 балл, т.к. swap нерабочий.