Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Float в int // С, Ошибка припереводе дроби в целые. 
V
    Опции темы
Androidxx
Дата 4.3.2018, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.3.2018

Репутация: нет
Всего: нет



Всем привет и доброго времени суток!
И заранее извините за грамматику!

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

Давно хотел начать учить программирование и тут на днях товарищ вдруг сообщает давай вместе учить Си. Ломатся я не стал и дело пошло. Вчера весь день ганяли теорию с разбором практических заданий, сегодня решили погонять только задания и тут началось. С горем по полам я добрался до 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 - 4.3.2018, 22:10
PM MAIL   Вверх
Androidxx
Дата 5.3.2018, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.3.2018

Репутация: нет
Всего: нет



Еще раз здравствуйте! 

В общем я разобрался 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();
}


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

Это сообщение отредактировал(а) Androidxx - 5.3.2018, 08:14
PM MAIL   Вверх
Romikgy
Дата 5.3.2018, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



Код

#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();
}


Это сообщение отредактировал(а) Romikgy - 5.3.2018, 15:25


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Androidxx
Дата 5.3.2018, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.3.2018

Репутация: нет
Всего: нет



Примного благодарен!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.