• 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 ?!

Aruba Cloud - Virtual Private Server VPS
0 głosów
260 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 Mentor (352,580 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 Mentor (352,580 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 Mentor (352,580 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 Mentor (352,580 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,579 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)
0 głosów
1 odpowiedź 297 wizyt
0 głosów
3 odpowiedzi 279 wizyt
pytanie zadane 27 listopada 2019 w C i C++ przez gallaxxyy Początkujący (270 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...