Obsługa tablicy. Początkujący programista

0

Cześć, dopiero uczę się programować w c++ i ostatnio zacząłem bawić się tablicami. Mam jednak problem ponieważ gdy chcę obliczyć ilość elementów w tablicy raz wychodzi mi dobry wynik a czasami zły . Program ma za zadanie wydrukowac liczbe zmienno przecinkowo w taki sposob, że cyfry przed przecinkiem będą linie wyzej niz te po przecinku. Tutuaj umieszczam kod:

#include <iostream>

using namespace std;

int ile(double k,unsigned long long liczba)
{
    int N=0;

    while(k>=1)
    {
        k/=10;
    }

    for(long long m=1; liczba != k*m;)
    {
        m*=10;
        liczba=k*m;
        N++;
cout << m;
        if(liczba==k*m)
            return N;
    }
    return N;
}

int main()
{
    double k=675.56;
    unsigned long long liczba=0;
    int N;
    N=ile(k,liczba);
    cout<<"Wielkosc tablicy : "<<N<<endl<<endl;
    int i=N-1,licznik=0;
    int cyfry[N]= {};




    for(int m=1; liczba!= k*m;)
    {
        m*=10;
        liczba=k*m;
        licznik++;
    }


    while(liczba > 0)
    {
        cyfry[i]= liczba %10;
        liczba /= 10;
        i--;
    }

    for(int j=0; j<N; j++)
    {
        cout<<cyfry[j]<<" ";

        if(j==N-1-licznik)
            cout << "\n";

    }

    cout <<"\n\nMiejsca po przecinku : " <<licznik ;


    return 0;
} 

""
Błędny fragment :
""


 int ile(double k,unsigned long long liczba)
{
    int N=0;

    while(k>=1)
    {
        k/=10;
    }

    for(long long m=1; liczba != k*m;)
    {
        m*=10;
        liczba=k*m;
        N++;
        if(liczba==k*m)
            return N;
    }
    return N;
}

""
który nie dziala dla np. k= 675.31, a działa dla np k=675.56 nie wiem dlaczego tak jest, gdyż wydaje mi się, że napisałem dobrze? Proszę o pomoc z góry dziękuję.

0

Program ma za zadanie wydrukowac liczbe zmienno przecinkowo w taki sposob, że cyfry przed przecinkiem będą linie wyzej niz te po przecinku. Tutuaj umieszczam kod

W sensie

>_: 3.14

3
   14

?

0

@stivens: tak, dla 3.14
3
14

0

Masz tyle bledow ze nie wiem od czego zaczac.
Zalozmy ze w IEEE754 (https://en.wikipedia.org/wiki/IEEE_754) w ogole jest poprawne to co Ty probujesz zrobic. (mam co do tego watpliwosci ale to musialbym glebiej to przeanalizowac)

Po pierwsze ten for to sie po jednym obiegu powinien zakonczyc bo warunek zakonczenia petli jest zapewniony przez jej cialo.

for(long long m=1; liczba != k*m;)
{
    liczba=k*m;

A teraz wrocmy do zalozenia bo w trakcie pisania to przemyslalem.
Patrz:

x = 675.31;
675.31
x /= 10;
67.53099999999999
0

ja rozumiem tą pętle w ten sposób

for(long long m=1; liczba != k*m;)
{
    liczba=k*m;

k jest typu zmiennoprzecinkowego, natomiast liczba jest typu całkowitego więc założmy, że km = 3.14 to w tym przypadku liczba =3 i pętla ma działać do tąd, aż km=314 i liczba bedzie wynosić 314

1
>> let k = 675.31
>> while(k>=1)
    {
        k/=10;
    }
>> k
0.6753099999999999


>> let m = 1;
>> let  liczba = 0;
>> let n = 0;

>> while (liczba != k * m) { n++; m *= 10; liczba = parseInt(k * m); console.log(liczba, k*m, n); }

6 6.753099999999998 1
67 67.53099999999999 2 
675 675.3099999999998 3 
6753 6753.0999999999985 4
67530 67530.99999999999 5
675309 675309.9999999999 6
6753099 6753099.999999998 7 
67530999 67530999.99999999 8 
675309999 675309999.9999999 9 
6753099999 6753099999.999998 10
67530999999 67530999999.999985 11 
675309999999 675309999999.9999 12 
6753099999999 6753099999999.999 13
67530999999999 67530999999999.984 14
675309999999999 675309999999999.9 15
6753099999999999 6753099999999999 16

0
#include <iostream>

using namespace std;

int ile(double k,unsigned long long liczba)
{
    int N=0;

    while(k>=1)
    {
        k/=10;
    }

    for(long long m=1; liczba != k*m;)
    {
        m*=10;
        liczba=k*m;
        N++;
    }
    return N;
}

int main()
{
    double k=675.565332434;
    unsigned long long liczba=0;
    int N;
    N=ile(k,liczba);
    int i=N-1,licznik=0;
    int cyfry[N]= {};




    for(int m=1; liczba!= k*m;)
    {
        m*=10;
        liczba=k*m;
        licznik++;
    }


    while(liczba > 0)
    {
        cyfry[i]= liczba %10;
        liczba /= 10;
        i--;
    }

    for(int j=0; j<N; j++)
    {
        cout<<cyfry[j]<<" ";

        if(j==N-1-licznik)
            cout << "\n";

    }

    cout <<"\n\nMiejsca po przecinku : " <<licznik ;


    return 0;
}

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