Задача.
Из градусов в радианы. Угол α задан в градусах, минутах и секундах. Найти его величину в радианах(с максимально возможной точностью).
Тесты.
Ввод | Вывод | ||
градусы(grad) | минуты(min) | Секунды(sec) | радианы(rad) |
0 | 0 | 0 | 0 |
90 | 0 | 0 | 1.570796326794897 |
179 | 59 | 60 | 3.141592653589793 |
-270 | 0 | 0 | -4.7123889803847 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <math.h> #include <float.h> using namespace std; int main() { int grad; int min; int sec; scanf("%d %d %d",&grad,&min,&sec); //вводим число градусов, минут, секунд long double rad; int k=round(grad/360); //Проверяем число градусов больше 360 или нет if (k>=1 && grad>0) grad=grad-360*k; if(grad>=0) rad=grad*M_PI/180+min*M_PI/60/180+sec*M_PI/180/3600; else rad=grad*M_PI/180-min*M_PI/60/180-sec*M_PI/180/3600; printf("%.*Lf",LDBL_DIG,rad); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) { Scanner in=new Scanner(System.in); double grad = in.nextInt(), min = in.nextInt(), sec = in.nextInt(); double rad; double k = Math.floor(grad / 360); if (k >= 1 && grad > 0) grad = grad - 360 * k; if(grad >= 0) rad = (grad * Math.PI + min * Math.PI / 60 + sec * Math.PI / 3600) / 180; else rad = (grad * Math.PI - min * Math.PI / 60 - sec * Math.PI / 3600) / 180; System.out.println(rad); } } |
Решение.
Обозначим через переменные grad, min, sec число градусов, минут, секунд.
1 градус= 60 минут= 3600 секунд.
Сначала проверяем число градусов больше 3600 или нет. Если меньше то ничего не меняем, а если больше то от числа градусов отнимаем 3600 до тех пор пока оно не станет меньше 360. После используем формулы перевода градусов, минут и секунд в радианы:
[latex]\mathit{rad=grad\frac{\pi }{180}}[/latex][latex]\mathit{rad=min\frac{\pi }{180}/60}[/latex]
[latex]\mathit{rad=sec\frac{\pi }{180}/3600}[/latex]
Если число градусов положительно то используем конечную формулу:
[latex]\mathit{rad=grad\frac{\pi }{180}+min\frac{\pi }{180}/60+sec\frac{\pi }{180}/3600}[/latex]Если же оно отрицательно то используем другую формулу:
[latex]\mathit{rad=grad\frac{\pi }{180}-min\frac{\pi }{180}/60-sec\frac{\pi }{180}/3600}[/latex]
В задании написано «с максимально возможной точностью», а используете наименее точный тип float.
Кроме первого теста, остальные сложно проверить в уме. Как считали ответ? На калькуляторе?
Зачем дополнительно объявлять pi, если все равно используете значение M_PI.
В формулах не нужно звездочек, пи должно быть маленькой греческой буквой.
— Тема «Линейные вычисления» не предполагает условных операторов. Точно без них нельзя обойтись?
— Пожалуйста, сделайте такие тесты для положительных и отрицательных углов в которых встречались бы градусы, минуты, секунды. Исправьте тест в котором 60 секунд. Вы наверное в курсе, что такое количество секунд задавать не принято?
— Строки 14-15 это попытка вычисления остатка от деления на 360 причём только для неотрицательных чисел? Замените, пожалуйста, на grad %= 360 или что-то подобное.
— Сделайте симметричные тесты (+361 и -361). Убедитесь, что результат отличается только знаком.
— При задании отрицательных углов знак «-» ставится только перед градусами, но предполагается отрицательным весь угол. Я правильно понял?
Засчитана Java-версия! Жаль только на ideone ссылок нет.