#c #double #scanf #conversion-specifier
#c #двойной #сканф #спецификатор преобразования
Вопрос:
каждый. МНЕ НУЖНА ПОМОЩЬ! Я пытался представить следующую задачу ХакеррАнка : Задание Учитывая цену еды (базовую стоимость еды), процент чаевых (процент от цены еды, добавляемой в качестве чаевых) и налоговый процент (процент от цены еды, добавляемой в качестве налога) за еду, найдите и распечатайте общую стоимость еды. Округлите результат до ближайшего целого числа.
#include lt;stdio.hgt; #include lt;math.hgt; int main() { int tax,tip; double mealc; scanf("%f",amp;mealc); scanf("d",amp;tip); scanf("%d",amp;tax); mealc = mealc (mealc*tip/100)) (mealc*tax/100); printf ("%d",round(mealc)); return 0; }
После компиляции приведенного выше кода. Я всегда получаю эти ошибки :
Hk2.c:33:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=] Hk2.c:37:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
В чем проблема ?
Комментарии:
1. Почему вы думаете, что
scanf("%f",amp;mealc)
это правильно, и что, по вашему мнению, пытается сказать вам предупреждающее сообщение?2.
%f
форматируетfloat
тип, следовательно, аргументы, которые вам нужно передатьscanf
, должны быть с плавающей точкой3. Просто используйте
%lf
в обоих случаях.4.
scanf("d",amp;tip);
вы забыли о%
5. Вы были правы , что использовали тип
double
; в большинстве случаев это предпочтительнее (чем использоватьfloat
, что часто бывает слишком неточным). Так что одобряйте комментарий Вильяма Перселла и игнорируйте комментарии Rafaelplayerxd и Цацики.
Ответ №1:
Измените питание на плавающее. При втором сканировании вы пропустили %: scanf(«%d»,amp;подсказка);
Ответ №2:
Как говорится в предупреждающем сообщении, спецификатор преобразования %f
предназначен для ввода значений для объектов типа float
, а не типа double
.
Чтобы ввести значение для объекта данного типа double
, вам необходимо использовать спецификатор преобразования %lf
.
scanf("%lf",amp;mealc);
Также у вас есть опечатка в этом вызове
scanf("d",amp;tip);
тебе нужно написать
scanf("%d",amp;tip);
И в этом заявлении
mealc = mealc (mealc*tip/100)) (mealc*tax/100);
существует избыточная закрывающая скобка. Тебе нужно написать
mealc = mealc (mealc*tip/100) (mealc*tax/100);
Комментарии:
1. ` #включают lt;stdio.hgt; #включают lt;math.hgt; int основной() { int и налоговые,чаевые; двойной mealc; то scanf(«%ЛФ»,amp;mealc); то scanf(«%D»может, и подсказка); то scanf(«%D», поamp;налогов); mealc = mealc (mealc совет/100) (mealc налога/100); Е («%F»,которые круглые(mealc)); возвращать 0; } ` Да, он работал нормально, но результат типа float. Когда я меняю тип, я получаю ту же ошибку.
2. Если вас беспокоит последняя распечатка, содержащая десятичную точку , либо используйте
%.0f
, либо, возможно%d
, вместе с(int)round(mealc)
ней .3. Спасибо, это сработало..
4. В чем разница между
"%f"
и"%lf"
?5. @Циклон, используемый с функцией scanf, спецификатор преобразования %f ожидает указатель на объект типа float, в то время как спецификатор преобразования %lf ожидает указатель на объект типа double.