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

VPS Starter Arubacloud
0 głosów
158 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,100 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,100 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,100 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,100 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,061 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)
0 głosów
1 odpowiedź 246 wizyt
0 głosów
3 odpowiedzi 222 wizyt
pytanie zadane 27 listopada 2019 w C i C++ przez gallaxxyy Początkujący (270 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...