zapętlanie się pętli do while

0

Witam ma problem o w programie nie mogę wyjść z pętli.

/* Program to converter floating number to hexadecimal code */
#include <iostream>
#include <cmath>
#include <vector>

void printfloat(float);

int main()
{
    float number = 0.0;
    int  how_many_step = 0;
    std::cin >> how_many_step;
    while (how_many_step > 0)
    {
        std::cin >> number;
        printfloat( number );
        --how_many_step;
    }
    return 0;
}

void printfloat(float n)
{
    std::string s_intiger_part = {};
    int binary_intiger[8] {};
    int binary_decimal[8] {};
    float intiger_part = 0.0;                   //czesc calkowita
    float decimal_part = 0.0;                   //czesc ulamkowa
    decimal_part = std::modf( n , &intiger_part );
    std::cout <<  "czesc calkowita" << intiger_part << " czesc ulamkowa " << decimal_part << std::endl;
    int intiger_number = intiger_part;

    do
    {
        std::cout << "petla" << std::endl;
        std::cout << "intiger_number " << intiger_number << std::endl;
        if ( intiger_number == 1 )
        {
            std::cout << "dla 1" << std::endl;
            std::cout << "intiger_number " << intiger_number << std::endl;
            s_intiger_part += std::to_string(1);
        }
        else if ( intiger_number == 0 )
        {
            std::cout << "dla 0" << std::endl;
            std::cout << "intiger_number " << intiger_number << std::endl;
            s_intiger_part += std::to_string(0);
        }
        else if( intiger_number % 2 == 0 )
        {
            std::cout << "mod 0" << std::endl;
            s_intiger_part += std::to_string(0);
            intiger_number /= 2;
        }
        else if ( intiger_number % 2 == 1)
        {
            std::cout << "mod 1" << std::endl;
            s_intiger_part += std::to_string(1);
            intiger_number /= 2;
        }
        std::cout << "intiger_number " << intiger_number << std::endl;
    }
    while ( intiger_number  != 1 || intiger_number != 0);
    std::cout << "liczba: " <<  intiger_part << " w binarnym to: " << s_intiger_part << std::endl;
}
4

while ( intiger_number != 1 || intiger_number != 0) ⟵ warunek zawsze prawdziwy.

dla skrócenia zapisu i = intiger_number

i i != 1 i != 0 wynik
0 true false true (`true
1 false true true (`false
reszta true true true (`true

zamień na poniższe (jeśli chcesz wyjść gdy liczba będzie równa 1 lub 0):

while ( intiger_number  != 1 && intiger_number != 0)
                             ^^

PS: integer zapisuje się przez "e"

3

Zauważ, że warunek

while ( intiger_number  != 1 || intiger_number != 0); 

da zawsze true dla każdego integer_number... pewnie chciałeś dac zaprzeczenie, więc zamiast || winno być && (zapewne - nie analizowałem całości, więc nie znam zamiarów, jedynie się domyslam)

0
 int index = 0;
    do
    {
        std::cout << "petla" << std::endl;
        std::cout << "intiger_number " << intiger_number << std::endl;
        if ( intiger_number == 1 )
        {
            std::cout << "dla 1" << std::endl;
            std::cout << "intiger_number " << intiger_number << std::endl;
            s_intiger_part += std::to_string(1);
            ++index;
        }
        else if ( intiger_number == 0 )
        {
            std::cout << "dla 0" << std::endl;
            std::cout << "intiger_number " << intiger_number << std::endl;
            s_intiger_part += std::to_string(0);
            ++index;
        }
        else if( intiger_number % 2 == 0 )
        {
            std::cout << "mod 0" << std::endl;
            s_intiger_part += std::to_string(0);
            intiger_number /= 2;
        }
        else if ( intiger_number % 2 == 1)
        {
            std::cout << "mod 1" << std::endl;
            s_intiger_part += std::to_string(1);
            intiger_number /= 2;
        }

        std::cout << "intiger_number " << intiger_number << std::endl;
    }
    while ( intiger_number  != 1 && intiger_number != 0 && index != 1 );

Trochę zmieniłem, ale mam dalej problem z ostatnim mod a mianowicie kiedy intiger_number == 1 lub 0 to powinien program jeszcze raz dopisać 1 lub 0 ale wychodzi bo warunek w while był spełniony. Wiec chciałem dodać index który by temu zapobiegł ale program wykrzaczył się. Jak podałem liczbę 23 to zamiast 10111 mailem 1110 ale bez odwrócenia czyli po odwróceniu miałem 0111 i tej pierwszej jedynki mi brakuje.

0

Takie błędy w logice szukaj debuggerem.

1

A nie prościej zrobić warunek

 while(index == 0);

?

0

dzieki kaczus

do
    {
        if( intiger_number % 2 == 0 )
        {
            std::cout << "mod 0" << std::endl;
            s_intiger_part += std::to_string(0);
            intiger_number /= 2;
            if ( intiger_number == 1 )
                ++index;
        }
        if ( intiger_number % 2 == 1)
        {
            std::cout << "mod 1" << std::endl;
            s_intiger_part += std::to_string(1);
            intiger_number /= 2;
            if ( intiger_number == 1 )
                ++index;
        }
    }
    while ( index != 1 ); 

1 użytkowników online, w tym zalogowanych: 0, gości: 1