• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z kodem, najpierw c[0]=2, następnie okazuje się że c[0] = 3 ?!

Object Storage Arubacloud
0 głosów
166 wizyt
pytanie zadane 21 lutego 2019 w C i C++ przez matzar24 Początkujący (250 p.)

Witam, mam bardzo dziwny problem, otóż w pierwszym while wartość c[0] = 2, jednakże bez zmieniania wartości nagle okazuje się że c[0]=3, powie mi ktoś jakim cudem? Dane wejściowe to a=12 oraz b=48.

jest to program do NWD.

Program najpierw rozkłada na czynniki pierwsze te liczby i dla a zapisuje te wartości do kolejnych tablic zmiennej c, a dla b do tablicy zmiennej d. Trzeci while robi to samo jak się chce wyzn. NWD i ma się te dwie liczby rozłożone na czynniki pierwsze, czyli poprostu szuka wspólnych liczb pierwszych wydzielonych z obu liczb. Poza tym myślę że wiecie jak sięwyznacza NWD :) Wykształcenie podst. wystarczy. KONTROLA ozn. że wstawiłem tam cout żeby sprawdzić czy robi się prawidłowo to co się robi.

int j=0,c[j],d[j],s=1,i=2;

    //if(a==1 || b==1) return s;

    while(a!=1){
        if(a%i==0){
            a=a/i;
            j++;
            c[j-1]=i;
            cout<<c[j-1]<<endl;//KONTROLA
        }
        else i++;
    }
    cout<<"-----------------------\n";//KONTROLA
    j=0;
    i=2;
    while(b!=1){
        if(b%i==0){
            b=b/i;
            j++;
            d[j-1]=i;
            cout<<d[j-1]<<endl;//KONTROLA
        }
        else i++;
    }
    cout<<"-----------------------\n";//KONTROLA
    cout<<j<<"\n\n\n";//KONTROLA


    int m=0,n=0;
    while(m<j || n<j){
        cout<<s<<"pierwsze"<<endl;//KONTROLA
        cout<<m<<"- - -"<<n<<endl;//KONTROLA
        cout<<c[0]<<"- [] -"<<d[0]<<endl;//KONTROLA

        if(c[m]==d[n]){
            s=s*c[m];
            m++;n++;}

        else if(c[m+1]==d[n]){
            s=s*c[m+1];m+=2;n++;}

        else if(c[m]==d[n+1]){
            s=s*c[m];n+=2;m++;}
    }

 

komentarz 21 lutego 2019 przez matzar24 Początkujący (250 p.)
Ja to już od 2 godz. próbuję rozwiązać i jedyne co mam to to że w pierwszym while c[0]=2 a w trzecim while wartość c[0]=3?! W c[0] powinno być zawsze równe 2, jednak bez ingerencji w c0 wartość jego magicznie się zmienia.

Jakby ktoś chciał przetestować niech doda sobie jeszcze cin>>a>>b; //a=12,b=48;

1 odpowiedź

+1 głos
odpowiedź 21 lutego 2019 przez adrian17 Ekspert (344,860 p.)
edycja 21 lutego 2019 przez adrian17

int j=0,c[j],d[j],s=1,i=2;

czy to jest... 0-elementowa tablica?

(Rekomenduję włączenie dodatkowych opcji sprawdzających (typu -fsanitize=address w GCC), jeśli możesz - przynajmniej wyłapałyby wyjście poza tablicę za Ciebie.)

(Rekomenduję też nie nazywania zmiennych jedną literą, bo tego się nie da czytać...)

komentarz 21 lutego 2019 przez matzar24 Początkujący (250 p.)

To tablica j-elementowa, a to że j =0 na początku to nie ma znaczenia

w pierwszym whilu jest takie coś :)

while(a!=1){
        if(a%i==0){
            a=a/i;
            j++;  //  <<<<
            c[j-1]=i; // <<<<
            cout<<c[j-1]<<endl;//KONTROLA
        }
        else i++;
    }

J jest równe 1,czyli jest zarezerwowywane jedno miejsce za każdym razem tego if-a, a szufladka ma numer 0

komentarz 21 lutego 2019 przez adrian17 Ekspert (344,860 p.)

To tablica j-elementowa, a to że j =0 na początku to nie ma znaczenia

To wszystko zmienia, bo tablice same nie zmieniają swojego rozmiaru, tylko dlatego że zmieniłeś jakąś inną liczbę. Nie wiem, czemu tak w ogóle myślisz?

komentarz 21 lutego 2019 przez matzar24 Początkujący (250 p.)

Jak to nie zmieniają? 

cout<<c[j-1]<<endl; //KONTROLA

To mi działa dla j=1,2 i 3:)

komentarz 21 lutego 2019 przez adrian17 Ekspert (344,860 p.)

To mi działa dla j=1,2 i 3:)

To, że akurat przez chwilę dzieje się coś, co czego się spodziewałeś, nie oznacza, że w ogólności działa i jest poprawne. Wychodzisz poza tablicę (pomijam fakt że 0-elementowe tablice są niedozwolone) i piszesz/czytasz do śmieciowej pamięci. Może dziać się cokolwiek - na przykład napisanie do innej zmiennej może nadpisać ten kawałek pamięci.

Nie każdy niepoprawny kod zakończy się oczywistym błędem kompilacji lub crashem programu - czasem będzie dawał poprawne wyniki dla jednego wejścia (i będzie wyglądał "poprawnie"), a kompletny bezsens chwilę później.

I powtórzę, z definicji tablice same nie zmieniają swojej wielkości. Po prostu nie ma czegoś takiego. Poszukaj w książce, z której się uczyłeś.

komentarz 21 lutego 2019 przez matzar24 Początkujący (250 p.)

Poprawiłem rezerwację miejsca na 100, w sumie na więcej niż 32 nie ma sensu. I dodałem 2 if-y  w trzecim while.

else if(c[m]>d[n])
            n++;
else if(c[m]<d[n])
            m++;

I teraz działa poprawnie, jednak SPOJ tego nie przyjął. Stwierdziłem, że się poddaje i poszukałem algorytmu na NWD w c++ i okazało się, że ten algorytm ma kilka linii xD. Trochę mi smutno, bo bardzo dużo siedziałem dziś na kompie, żeby te zadanie zrobić. Zmarnowałem 2 h na szukanie błędu. Po czym okazuje się, że algorytm Euklidesa ma kilka linii kodu... Dzięki za podpowiedź z tymi tablicami. Nie wyczytałem tego nigdzie, a sobie wymyśliłem, bo stwierdziłem, raz zadziałało to i pewnie więcej razy zadziała.

komentarz 21 lutego 2019 przez adrian17 Ekspert (344,860 p.)
Mimo że 2 godziny do tyłu, to ważne że czegoś się z tego nauczyłeś :)

Podobne pytania

0 głosów
3 odpowiedzi 2,099 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)
0 głosów
1 odpowiedź 249 wizyt
0 głosów
3 odpowiedzi 226 wizyt
pytanie zadane 27 listopada 2019 w C i C++ przez gallaxxyy Początkujący (270 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...