расчет в программе на С всегда приводит к 0 - PullRequest
0 голосов
/ 17 января 2019

Это всегда приводит к 0 для меня, и я не знаю, почему ... Другие примеры в Интернете обычно вызывают разделение.

в Codeblocks тот же самый код приводит к нормальному результату, но в Atom у меня есть эта проблема.пожалуйста помоги.

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

#define PI 3.14
int main() {
    float r,a,c;
    printf("enter radius: \n");
    scanf("%.2f",&r);
    c = r * PI * 2;
    a = r * r * PI;
    printf("area:%.2f circumference:%.2f \n",c,a );
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 17 января 2019

C11 7.21.6.2p3 говорит следующее из fscanf et al:

3 [...] Каждая спецификация преобразования представлена персонажем %. После % в последовательности появляется следующее:

  • Необязательный символ подавления присваивания *.
  • Необязательное десятичное целое число, большее нуля, которое задает максимальную ширину поля (в символах).
  • Необязательный модификатор длины, который определяет размер принимающего объекта.
  • Символ спецификатора преобразования, указывающий тип применяемого преобразования.

Модификатор длины означает дополнительные буквы, такие как l в %lf, что означает double. Обратите внимание, что хотя %2f будет допустимым и будет означать, что можно использовать только до 2 символов ввода, нигде не сказано, что вы можете написать %.2f, т. Е. %.2f является недопустимой спецификацией преобразования, и, следовательно, поведение undefined ( C11 7.2.6.2p13 ).

0 голосов
/ 17 января 2019

Если нет причин использовать% .2f для сканирования, просто используйте% f

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

#define PI 3.14
int main() {
    float r,a,c;
    printf("enter radius: \n");
    scanf("%f",&r);
    c = r * PI * 2;
    a = r * r * PI;
    printf("area:%.2f circumference:%.2f \n",c,a );
    return 0;
}

Пример:

daniel@daniel-FX503VM:~/Documents/test$ ./zero 
enter radius: 
1
area:6.28 circumference:3.14 

.2 в printf является спецификатором формата печати и не должен влиять на scanf

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

Если то, что вы на самом деле пытаетесь сделать, это прочитать только 2 символа, вы можете сказать

scanf("%2f", &r);

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

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