2015-03-21 3 views
0

Я ОЧЕНЬ новичок в программировании, и я использую книгу, которая поможет мне написать код, который разрешит ln (1 + x) после ввода пользователем «x». Мой синтаксис - это именно то, как книга имеет его в своем примере, но я продолжаю получать error: expected expression before 'long' в строке 28. Строка 28 - это строка, которая читает long double y = LOG(1+(x));.ожидаемое выражение перед 'long'

#include <stdio.h> 
#include <math.h> 
#define LOG(X) _Generic((X),\ 
    long double: log(1+(x))\ 
) 

int main() 
{ 

    double x; 

    printf("Please enter a number from -1 to +1: "); 
    scanf("%f", &x); 

    long double y = LOG(1+(x)); 

    printf("From C math library: ln(1+x) = %f\n", y); 

} 
+3

Что вы пытаетесь сделать в 'LOG' макроса? – tsnorri

+1

Скомпилированы ли с поддержкой C11? С GCC это будет '-std = c11' или' -std = gnu11' в качестве опции командной строки? –

+0

Я не совсем уверен, как ответить на ваши вопросы, все, что я пытаюсь сделать, - это решить ln (1 + x) с x, заданный пользователем (от -1 до 1), и напечатать ответ. – dontdeimos

ответ

3

Если вы новичок в программировании и пытаетесь сделать пример работы, я бы не использовал макросы на этом этапе, а сосредоточился на функции и типе данных. Начните с double, который является типичным видом работы библиотеки, сопряженной с math.h. В моем примере показано, как вычислить натуральный ln с помощью функции log().

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

Наконец, вы приглашаете номера в диапазоне -1 <= x <= 1, но ln(0) не определено, поэтому я ограничил диапазон ввода, чтобы исключить -1.

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

int main(void) 
{ 
    double x = 0, y; 
    printf("Please enter a number from -1 to +1: "); 
    if (1 != scanf("%lf", &x) || x <= -1 || x > 1) { 
     printf("I need -1 < number <= +1\n"); 
     return 1; 
    } 
    y = log(x + 1); 
    printf("From C math library: ln(1+x) = %f\n", y); 
    return 0; 
} 

Вот несколько примеров выхода:

Please enter a number from -1 to +1: -1 
I need -1 < number <= +1 

Please enter a number from -1 to +1: 0 
From C math library: ln(1+x) = 0.000000 

Please enter a number from -1 to +1: 1 
From C math library: ln(1+x) = 0.693147 
+0

Спасибо! Ваш ответ помог с моей путаницей. Я пытаюсь сделать домашнюю проблему, но используя расширенный пример в книге. У меня только один вопрос: что такое «return 0» или «return 1»? имею в виду? – dontdeimos

+1

Это означает, что вы возвращаете целочисленное значение 0 или 1 из функции, в которой вы находитесь. Поскольку эта функция является специальной функцией 'main', это фактически приводит к завершению вашей программы, и возвращаемое значение может быть замечено извне другими программами, которые запустите свою программу. Для 'main', возвращаемое значение 0 обычно указывает на нормальное завершение, в то время как ненулевое значение указывает на ненормальное завершение. – jschultz410

+0

Еще раз спасибо! Это действительно полезно! – dontdeimos

4

Во-первых, ваш общий макрос написан для long double типа. Вы предоставили аргумент doublex. long double и double - два разных типа. Вы не определили общий ветвь для double, что означает, что ваш макрос не будет компилироваться для аргумента double. Либо измените тип x на long double, либо создайте общую поддержку макросов double аргументов.

Кроме того, это очень странный способ написать макрос LOG. Почему вы явно используете 1 + (x) как аргумент log внутри макроса? Что, если завтра вы захотите рассчитать LOG(2 + y)? Ваш макрос по-прежнему будет настаивать на вычислении log(1 + (x)), что не имеет никакого смысла. Более разумная вещь, чтобы сделать было бы просто передать X в log

#define LOG(X) _Generic((X),\ 
    long double: log(X)\ 
) 

Во-вторых, для того, чтобы scanf в double значение, которое нужно %lf спецификатор формата. %f для float. До printf a long double значение, которое вам нужно %Lf формат.

+0

Я использовал '1 + x', потому что это домашнее задание, которое явно просит разрешить ln (1 + x). Я не думал о долгосрочной перспективе и нуждался в изменении переменных. Я действительно не уверен, что я делаю, но scanf и printf в двойном формате имеют смысл, спасибо. – dontdeimos

+0

@dontdeimos: Откуда у вас появилась идея использовать «_Generic»? – AnT

+0

Из передового примера в моем учебнике. Это смутило меня, и я не должен был его использовать. – dontdeimos

Смежные вопросы