программа, которая возвращает название, цену и количество страниц книги - PullRequest
1 голос
/ 13 апреля 2020

Это просто базовая c программа. Мы введем название книги (1 char name), цена (число с плавающей запятой) и количество страниц (int) и выходные данные должны совпадать с вводом, но это не так.

#include<stdio.h>

int main()
{
    struct book
    {
        char name;
        float price;
        int pages;
    };

    struct book b1,b2,b3;
    printf("Enter names,prices & no. of pages of 3 books\n");
    scanf("%c %f %d",&b1.name,&b1.price,&b1.pages);
    scanf("%c %f %d",&b2.name,&b2.price,&b2.pages);
    scanf("%c %f %d",&b3.name,&b3.price,&b3.pages);
    printf("And this is what you entered\n");
    printf("%c %f %d\n",b1.name,b1.price,b1.pages);
    printf("%c %f %d\n",b2.name,b2.price,b2.pages);
    printf("%c %f %d\n",b3.name,b3.price,b3.pages);
    return 0;
}

enter image description here

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Это то, что вы ввели. С плавающей точкой больше приближений, чем фактических значений. Вот почему, когда вы ввели 123.134, компьютер округлил его до ближайшего возможного значения, 123.124003. Он работает для инженерии, графики c и статистики, где такие незначительные несоответствия округляются до представления людям. Но когда вам нужны точные значения, переменные с плавающей запятой совершенно не подходят.

В финансах мы храним 10 долларов как «1000 центов», в целых. Попытка использовать float или double для денежных значений - это большое нет-нет.

То, что вы хотите, это десятичный тип, но в C.

такого типа нет.
0 голосов
/ 14 апреля 2020

Вы используете вашу программу неправильно.

"%c %f %d" означает: scan 1 character, then a space, then a float, then a space, then an int. Там нет Enter. Я запустил вашу программу, и она работает нормально - , пока я не нажимаю Enter :

Enter names,prices & no. of pages of 3 books                                                                                                                                       
a 123.33 555b 124.44 666c125.555 777                                                                                                                                               
And this is what you entered                                                                                                                                                       
a 123.330002 555                                                                                                                                                                   
b 124.440002 666                                                                                                                                                                   
c 125.555000 777

Вы можете увидеть, как scanf обнаруживает изменение между последним% d и первым% c просто выяснив: «хм,« b »не подходит как другой ди git из« 555 », так что давайте закончим sh %d». а затем запускается следующая строка. Если вы нажмете Enter, то это новая строка (Enter), которая перейдет к названию следующей книги. И когда вы нажимаете «b», он не подходит ни к% f, ни к% d, поэтому они устанавливаются в ноль, и тогда ваш «b» в конце концов становится соответствующим названию третьей книги. Итак, у вас есть 3 книги: a, Enter и b.

Если вы хотите запросить Enter, добавьте «ожидайте Enter»: scanf("%c %f %d\n" Теперь ваша программа работает так:

Enter names,prices & no. of pages of 3 books                                                                                                                                       
a 123.33 555                                                                                                                                                                       
b 124.44 666                                                                                                                                                                       
c 125.55 777                                                                                                                                                                       
And this is what you entered                                                                                                                                                       
a 123.330002 555                                                                                                                                                                   
b 124.440002 666                                                                                                                                                                   
c 125.550003 9  

scanf просто делает точно , как вы говорите.

К сожалению, оба связанных ответа не очень хороши. Проблема не в начале второй строки, а в первой.

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