Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana nieskończonej pętli for na pętlę while z warunkiem

Ostatnio zmodyfikowano 2014-10-19 11:18
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
Zamiana nieskończonej pętli for na pętlę while z warunkiem
» 2014-10-14 19:03:06
Pisałem dla siebie algorytm Euklidesa wyszukujący
największy wspólny dzielnik dwóch danych liczb...
C/C++
#include <iostream>
int nwd( int l1, int l2 ) {
    for(;; ) {
        l1 > l2 ? l1 %= l2: l2 %= l1;
        if( l1 == 0 || l2 == 0 )
             break;
       
    }
    return l1 == 0 ? l2: l1;
}
int main() {
    using namespace std;
    int a, b;
    cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: ";
    cin >> a;
    cout << "Podaj B: ";
    cin >> b;
    cout << "NWD: " << nwd( a, b );
    return 0;
}

Wszystko działało poprawnie, dopóki nie zechciałem wymienić:

C/C++
int nwd( int l1, int l2 ) {
    for(;; ) {
        l1 > l2 ? l1 %= l2: l2 %= l1;
        if( l1 == 0 || l2 == 0 )
             break;
       
    }
    return l1 == 0 ? l2: l1;
}

na:

C/C++
int nwd( int l1, int l2 ) {
    while( l1 || l2 ) {
        l1 > l2 ? l1 %= l2: l2 %= l1;
    }
    return l1 == 0 ? l2: l1;
}

Chcę zrozumieć gdzie popełniłem błąd podczas wymiany...
P-118468
Memento96
» 2014-10-14 19:18:29
Brzydałby się jakiś break w tej pętli, ale ja się nie znam ;3

C/C++
#include <iostream>
int nwd( int l1, int l2 ) {
    while( l1 || l2 ) {
        l1 > l2 ? l1 %= l2: l2 %= l1;
        if( l1 || l2 == 0 ) break;
       
    }
    return l1 == 0 ? l2: l1;
}
int main() {
    using namespace std;
    int a, b;
    cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: ";
    cin >> a;
    cout << "Podaj B: ";
    cin >> b;
    cout << "NWD: " << nwd( a, b );
    return 0;
}
z ifem  zwraca tego NWD :)
P-118469
pekfos
» 2014-10-14 20:16:42
C/C++
while( l1 || l2 ) {
&&.
P-118474
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-14 20:59:03
Brzydałby się jakiś break w tej pętli,
i był... Tylko że ja przeniosłem te przerwanie do
warunku pętli while i coś z tym nie styka właśnie. :F

z ifem  zwraca tego NWD :)
Żeby nie było ogromnego OFF-Topu:
"IF arytmetyczny"

//w edycjii

@pekfos
*facepalm* Zapomniałem, że w warunku jest kiedy pętla
ma się wykonywać, a nie kiedy zakończyć. :F

Do tego można przytoczyć:
Prawo De Morgana

Jak się nie nauczę sam błędów szukać to kiepski programista ze mnie będzie. :/
P-118482
Memento96
» 2014-10-15 19:51:59
A kto powiedział, że sam się od razu nauczysz tego? ;)

Ja np. dzisiaj chciałem z pustej tablicy przypisać do pełnej zamiast robić na odwrót ;x

btw. po co sobie utrudniać życie i modyfikować program ktory działa prawidłowo? ;3
P-118541
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-15 21:12:41
btw. po co sobie utrudniać życie i modyfikować program ktory działa prawidłowo? ;3
Po prostu lubię zgrabny kod. ^_^
Pekfos mi powiedział, że moje poprawki to
znaczący przerost formy nad treścią.

Hahah... Przypomniało mi się jak Allegro kodem PHP pluło i tam pisało:
// tymczasowo dla pierwszego etapu checkout
... a zostało na zawsze. xD


Ja np. dzisiaj chciałem z pustej tablicy przypisać do pełnej zamiast robić na odwrót ;x
Ja raz nie zainicjowałem tablicy i poprosiłem
o pomoc, którą później "ślepo" przeczytałem. :C
([lekcja 30] Zagnieżdżanie pętli. (zadania))
P-118549
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-18 20:42:55
//WTF? Jakim cudem mój post stał się pusty? O_o

Serdecznie dziękuję za pomoc.
Mój kod ostatecznie wygląda tak:
C/C++
#include <iostream>
int nwd( int l1, int l2 ) {
    bool ujemna = l1 < 0 && l2 < 0 ? true: false;
    l1 > 0 ? l1 =+ l1: l1 =- l1;
    l2 > 0 ? l2 =+ l2: l2 =- l2;
    while( l1 && l2 )
         l1 > l2 ? l1 %= l2
        : l2 %= l1;
   
    return l1 == 0 ?( ujemna ? - l2: l2 )
        :( ujemna ? - l1
        : l1 );
}
int main() {
    using namespace std;
    int a, b;
    cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: ";
    cin >> a;
    cout << "Podaj B: ";
    cin >> b;
    cout << "NWD: " << nwd( a, b );
    return 0;
}

Nie zamierzam zabezpieczyć go przed wpisaniem
błędnych danych, bo ma tylko służyć na pokaz,
a nie do normalnego działania w jakimś programie.
P-118812
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-10-19 11:18:27
Mała poprawka. C:
Największym wspólnym dzielnikiem liczb a, b, nazywa się taką nieujemną liczbę [...]

C/C++
#include <iostream>
int nwd( int l1, int l2 ) {
    l1 > 0 ? l1 =+ l1: l1 =- l1;
    l2 > 0 ? l2 =+ l2: l2 =- l2;
    while( l1 && l2 )
         l1 > l2 ? l1 %= l2
        : l2 %= l1;
   
    return l1 == 0 ? l2: l1;
}
int main() {
    using namespace std;
    int a, b;
    cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: ";
    cin >> a;
    cout << "Podaj B: ";
    cin >> b;
    cout << "NWD: " << nwd( a, b );
    return 0;
}
P-118838
« 1 »
  Strona 1 z 1