Obsługa tablicy. Początkujący programista

Obsługa tablicy. Początkujący programista
bog dan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
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:

Kopiuj
#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 :
""

Kopiuj

 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ę.

stivens
  • Rejestracja: dni
  • Ostatnio: dni
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

Kopiuj
>_: 3.14

3
   14

?

bog dan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

@stivens: tak, dla 3.14
3
14

stivens
  • Rejestracja: dni
  • Ostatnio: dni
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.

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

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

Kopiuj
x = 675.31;
675.31
x /= 10;
67.53099999999999
bog dan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

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

Kopiuj
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

stivens
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
>> 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

bog dan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0
Kopiuj
#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;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.