2015-07-26 6 views
-1

Я делаю калькулятор, используя формулу по этой ссылке: http://cereference.com/book/surveying-and-transportation-engineering/simple-curves-or-circular-curves#sthash.qrD1VOm6.08csgYq9.dpbsКак использовать sin, tan, cos и sec в программе C?

и

https://www.easycalculation.com/engineering/civil/highways-horizontal-curve.php

EDITED ВОПРОС!

Поэтому я использовал библиотеку math.h, чтобы использовать функции sin, tan, cos и sec, но ответы не соответствуют основанию моей формулы ... Итак, чтобы проверить, скажем, у меня есть угол 36 и радиусом 286 ... так что ответ для касательной (utangent) должен быть равен 92,927. и мой следующий вопрос заключается в том, как использовать функцию sec? Я прокомментировал это, потому что он не будет компилироваться ... Также с загаром, грехом и ценой.

#include<stdio.h> 
#include<conio.h> 
#include<math.h> 


int main(){ 

double length, angle, radius, tangent, chord, midordinate, external, degree; 
double pcurve, pintersection, ptangent; 
double ulength, uangle, uradius, utangent, uchord, umidordinate, uexternal; 
double pi; 
double choice, choice2, given; 

pi = 3.14159; 

printf("Enter radius: "); 
scanf("%lf",&radius); 

printf("Enter angle: "); 
scanf("%lf",&angle); 

utangent = radius * (tan(angle/2)); 
uchord = 2*radius*(sin(angle/2)); 
umidordinate = radius - (radius*(cos(angle/2))); 
//uexternal = radius * (sec(angle/2)) - radius; 

printf("tangent = %lf\n",utangent); 
printf("chord = %lf\n",uchord); 
printf("ordinate = %lf\n",umidordinate); 
//printf("%lf\n",uexternal); 

getch(); 
return 0; 
} 
+1

возможно дубликат (http://stackoverflow.com/questions/840081/what-does-floating- point-error-1-j-mean) – melpomene

+4

Вы используете неправильный спецификатор формата. '% lf' необходимо использовать для сканирования' double'. ('% f' следует использовать для печати, однако). Также проверьте возвращаемое значение scanf для обнаружения ошибок. –

+0

3.14159 далек от двойной точности. используйте 'M_PI' или' boost :: math :: константы :: pi' –

ответ

4

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

sintancos.c:15:13: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat] 
scanf("%f", &angle); 
     ~~ ^~~~~~ 
     %lf 

Это фиксируется путем перезаписи его scanf("%lf", &angle);, как это было предложено предупреждающим сообщением.

Я предполагаю, что вам нужно пересчитать ввод от градусов до радианов, так как вы просите о градусах. И, конечно же, прежде чем вывести его снова, вам нужно изменить его на градусы.

Это часто делается в C с макросами, но я предпочитаю функции.

double to_degrees(double rad) 
{ 
    return rad * 180.0/M_PI; 
} 
double to_radians(double deg) 
{ 
    return deg * M_PI/180.0; 
} 

M_PI почти всегда определяется в math.h с более высокой точностью, чем ваш pi. Вы также должны перенести свой вход и расчет на свои собственные функции, поэтому его легче читать и тестировать.

sec не является стандартной функцией C, поэтому вы должны определить ее самостоятельно. Это будет что-то вроде этого: [.? Что ошибка с плавающей точкой -1 # J означают]

#include<stdio.h> 
#include<math.h> 

double to_degrees(double rad) 
{ 
    return rad * 180.0/M_PI; 
} 

double to_radians(double deg) 
{ 
    return deg * M_PI/180.0; 
} 

double sec(double z_r) 
{ 
    return 1/cos(z_r); 
} 

int main(){ 

    double angle, radius, angle_r; 
    double utangent, uchord, umidordinate, uexternal; 


    //printf("Enter radius: "); 
    //scanf("%lf",&radius); 
    radius = 286; 

    //printf("Enter angle: "); 
    //scanf("%lf",&angle); 
    angle = 36; 

    angle_r = to_radians(angle); 

    utangent = radius * (tan(angle_r/2)); 
    uchord = 2*radius*(sin(angle_r/2)); 
    umidordinate = radius - (radius*(cos(angle_r/2))); 
    uexternal = radius * (sec(angle_r/2)) - radius; 

    printf("\nResults:\n"); 
    printf("tangent = %lf\n",utangent); 
    printf("chord = %lf\n",uchord); 
    printf("ordinate = %lf\n",umidordinate); 
    printf("external %lf\n",uexternal); 

    return 0; 
} 
+0

привет, я отредактировал мой вопрос, чтобы его было проще понять, укоротил и мой код – user3767918