Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Float в int // С


Автор: Androidxx 4.3.2018, 21:50
Всем привет и доброго времени суток!
И заранее извините за грамматику!

Проблема вроде распростроненная и гуглил я по ней достаточно долго, но так ничерта и не понял. Начну с начала!

Давно хотел начать учить программирование и тут на днях товарищ вдруг сообщает давай вместе учить Си. Ломатся я не стал и дело пошло. Вчера весь день ганяли теорию с разбором практических заданий, сегодня решили погонять только задания и тут началось. С горем по полам я добрался до 6-го задания в онлаин задачнке и тут сломался.
Задание звучит так! 

Даны несколько пар чисел. В каждой паре нужно разделить первое на второе и вернуть результат округлённый до ближайшего целого.
В случаях когда дробная часть равна точно 0.5 договоримся округлять вверх (т.е. прибавляя 0.5). Заметьте что для отрицательных чисел "вверх" означает "в сторону нуля".
Во всех дальнейших задачах упоминающих округление нужно использовать именно такой алгоритм (если не сказано иное).

Входные данные - в первой строке указано количество тестов.
В остальных строках сами тесты (пары чисел, которые нужно делить).
Ответ должен содержать результаты округления для каждого теста, разделенные пробелами.

Для простоты использую пример из задачника, на самом деле чиста совсем другие, тестов там было 15, а числа в них примерно такие -7873287 3840767.

Пример:

входные данные:
3
12 8
11 -3
400 5

ответ:
2 -4 80


Написал я программу которая вроде даже что-то считает но вот незадача ответ не сходится.
 
Собственно программа:

Код

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

main()
{
    int a, c, c1, c2, c3;
    float b, b1, b2;
    

    for (a = 1; a <= 3; a++)
    {
        printf("Enter data here: ");
        scanf_s("%f %f", &b, &b1);

        b2 = b / b1;
        printf("b2 = %f\n", rint(b2)); // хотел видеть промежуточный результат чтоб понять что там вообще происходит
        c =(int)b2;  // в этот момент происходит что-то непонятное
        
        if (a == 1) c1 = c; // наверника есть способ выводить это удобнее но пока моих знаний не хвотает ни на что другое, но какрас таки этот момент работает нормально.
        if (a == 2) c2 = c; 
        if (a == 3) c3 = c;
            
        printf("Intermediate data is:%d №%d\n", c, a); // временный вывод значей, опять таки для наглядности
    }
    printf("a=%d Output data=%d %d %d \n", a, c1, c2, c3); // продолжение корявого вывода. думаю предстовляее как это выгледит если у меня 15 или 20 тестов брррр... но работает :)
    getch();
}


Писалось все в Cи без ++ smile

А вот как это выглядит в консоли если задать числа из примера:

Enter data here: 12 8
b2 = 2.000000
Intermediate data is:1 ╣1
Enter data here: 11 -3
b2 = -4.000000
Intermediate data is:-3 ╣2
Enter data here: 400 5
b2 = 80.000000
Intermediate data is:80 ╣3
a=4 output data=1 -3 80


и получается что  мой ответ: 1 -3 80 а правельный 2 -4 80. И как бы вот оно b2 = 2.000000 на следующем шаге -4.000000 и т.д. но при переводе в int получается 1 в место 2 и -3 в место -4. Я бы просто сделал +1 но такое получается не всегда например 80.000000 нормально переводится и получается 80. 

Ну и напрашивается вопрос почему так происходит и как с этим боротся!? ПОМОГИТЕ! smile 

Спасибо за внимание!

Автор: Androidxx 5.3.2018, 08:13
Еще раз здравствуйте! 

В общем я разобрался smile сам дурак smile проблема была в этой строке:

Код

 printf("b2 = %f\n", rint(b2));


rint(b2) делался только для строки вывода и не сохронялся в переменную.

правельный выриант:

Код

b2 = b / b1;
b2 = rint(b2);
printf("b2 = %f\n", b2);
c =(int)b2;


И рас уш я тут может подскажите как правельно вводить и выводить данные в подобных случаях... потому что готовое задание в моем конкретном случае выглядит так:

Код

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

main()
{
    int a, c, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16;
    float b, b1, b2;
    

    for (a = 1; a <= 16; a++)
    {
        printf("Enter data here: ");
        scanf_s("%f %f", &b, &b1);

        b2 = b / b1;
        b2 = rint(b2);
        printf("b2 = %f\n", b2);
        c =(int)b2;
        
        if (a == 1) c1 = c;
        if (a == 2) c2 = c;
        if (a == 3) c3 = c;
        if (a == 4) c4 = c;
        if (a == 5) c5 = c;
        if (a == 6) c6 = c;
        if (a == 7) c7 = c;
        if (a == 8) c8 = c;
        if (a == 9) c9 = c;
        if (a == 10) c10 = c;
        if (a == 11) c11 = c;
        if (a == 12) c12 = c;
        if (a == 13) c13 = c;
        if (a == 14) c14 = c;
        if (a == 15) c15 = c;
        if (a == 16) c16 = c;
            
        printf("Intermediate data is:%d №%d\n", c, a);
    }
    printf("a=%d Output data=%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", a, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16);
    getch();
}


очень много переменных мне кажется так не должно быть. спасибо!

Автор: Romikgy 5.3.2018, 15:18
Код

#include <stdio.h>
#include <math.h>
main()
{
    int a, c, array_c[17];
    float b, b1, b2;
    
    for (a = 1; a <= 16; a++)
    {
        printf("Enter data here: ");
        scanf_s("%f %f", &b, &b1);
        b2 = b / b1;
        b2 = rint(b2);
        printf("b2 = %f\n", b2);
        c =(int)b2;
        
        array_c[a] = c;
        
            
        printf("Intermediate data is:%d №%d\n", c, a);
    }
    printf("a=%d Output data=", a);
    for (a = 1; a <= 16; a++)
    printf("%d ", array_c[a]);    

    printf("\n");
    getch();
}

Автор: Androidxx 5.3.2018, 19:52
Примного благодарен!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)