Obsługa tablicy. Początkujący programista

Obsługa tablicy. Początkujący programista
bog dan
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • 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ę.

edytowany 6x, ostatnio: bog dan
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.99429166)
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 10 godzin
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

?


λλλ
edytowany 1x, ostatnio: stivens
bog dan
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:4
0

@stivens: tak, dla 3.14
3
14

stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 10 godzin
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

λλλ
edytowany 2x, ostatnio: stivens
bog dan
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • 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

edytowany 1x, ostatnio: bog dan
stivens
a, faktycznie typy sa rozne
kq
` (na lewo od 1) a nie '
stivens
Ogolnie to tak nie pisz bo Twoje intencje nie byly dla mnie jasne (no i jeszcze miales ifa wewnatrz fora ktory robil dokladnie to samo). Ale pozostaje mi tylko odeslac Cie do skrotowego przeczytania jak dzialaja liczby zmiennopozycyjne
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 10 godzin
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


λλλ
edytowany 3x, ostatnio: stivens
Zobacz pozostałe 23 komentarze
bog dan
heh, a można zapisać kod w ten sposob, aby działalo tak jak ja chciałem dla każdej liczby?
stivens
Wczesniej w komentarzu wstawilem linka do rozwiazania (dziala do 6 miejsc po przecinku)
bog dan
i w tym krótkim kodzie przedstawiłeś to co ja?
bog dan
dobra, wielkie dzięki za pomoc i rozjaśnienie sprawy - czas zabrać się do nauki :)
bog dan
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • 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.