Äquivalente For-Schleife



  • Schreiben sie eine Schleife, die zu der obigen for-Schleife äquivalent ist, und ohne die Operatoren && oder || zu verwenden !

    for(i=0; i<lim-1 && (cgetchar()) != '\n' && c != EOF; ++i)
    s[i]= i;

    Das ist erstmal die Schleife und jetzt muss man da wie gesagt ähnliche Operatoren finden. Könnte man denn einfach & oder | nehmen anstatt die Operatoren && oder || ?



  • nein, weil die einen logisch und die anderen bitweise arbeiten.



  • && ist ein Operator, der 0 liefert, wenn mind. eine der Bedingung falsch ist.
    || ist ein Operator, der 1 liefert, wenn mind. eine der Bedingung wahr ist.

    & ist bitweise AND Verknüpfung, so ist 1 && 2 äquivalent zu 1 und 1 & 2 äquivalent zu 0.

    | ist bitweise OR Verknüpfung, so ist 1 || 2 äquivalent zu 1 und 1 & 2 äquivalent zu 3.

    Mit ein wenig Algebra kann man das lösen 🙂 && und || können als beide Operatoren einer boolsche Algebra gesehen werden X:=(|B, &&, ||, ~), wobei |B={true,false}

    Es gibt einen Isomorphismus zuwischen X und Y:=(|D, *, +, 1-x), wobei |D = {0,1}, * die Multiplikation, + die Addition und 1-x die Negation ist.

    Also kannst du && duch * ersetzen und || durch +



  • supertux schrieb:

    Also kannst du && duch * ersetzen und || durch +

    Dann verliert man aber die Eigenschaft der Short Circuit Evaluation.



  • Ich glaube so kompliziert war das nicht gemeint. In der Schleife if's mit break und schon kannst du dir ein Äquivalent basteln.

    btw:

    supertux schrieb:

    && ist ein Operator, der 0 liefert, wenn mind. eine der Bedingung falsch ist.
    || ist ein Operator, der 1 liefert, wenn mind. eine der Bedingung wahr ist.

    Wie kingruedi schon gesagt hat, sind && und || logische Operatoren, also liefern sie auch logische Ergebnisse, dh false bzw. true. Zu welchen Ganzzahlwerten diese evaluieren, ist eine andere Geschichte.



  • ohne das zu testen auf die schnelle so ins forum gehackt könnte das hier glaube ich gehen

    for( ; (--lim>0) & ((c=getchar())!='\n') & (c!=EOF)  ; )s[lim-1]= lim-1;
    


  • @Windalf: no comment 🙄

    Hier, sieht schon um einiges lesbarer aus:

    while(i < lim - 1)
    {
        char c;
    
        if((c = getchar()) == '\n')
            break;
    
        if(c == EOF)
            break;
    
        s[i] = i;
        ++i;
    }
    

    MfG SideWinder



  • Ich würds so machen:

    Grundgleichung:
    i < lim-1 && (cgetchar()) != '\n' && c != EOF

    && soll durch || ersetzt werden, ab jetzt benutze ich statt
    && ^ und statt || V.

    Um jetzt die logischen ^ (die &&) aus der Gleichung zu entfernen negieren wie das Ding 2x, d.h. wir verändern eigentlich nichts:

    _______________________________________
    _______________________________________
    lim-1 ^ (cgetchar()) != '\n' ^ c != EOF

    C++
    (!(!(lim-1 && (cgetchar()) != '\n' && c != EOF)))

    Jetzt brechen wir die Negierung auf:

    _______________________________________
    _____ ____________________ ________
    lim-1 V (cgetchar()) != '\n' V c != EOF

    Aus den logischen Unds werden nun logische Oder ([b]hier hab ich die aufgabe nochmal gelesen, die sind ja auch verboten :roll: , egal vielleicht interessiert das ja einige).

    und

    _______________________________________
    _____ ____________________ ________
    lim-1 V (cgetchar()) != '\n' V c != EOF

    wäre

    __________________________________________________
    !(lim-1) || !((cgetchar()) != '\n') || !(c != EOF)

    wäre

    (!(!(lim-1) || !((cgetchar()) != '\n') || !(c != EOF)))

    Aber da logische || auch verboten waren verlasse ich den thread lieber mit der erfahrung mal genauer zu lesen grmpf.

    für fehler hafte ich nicht 😃



  • Und es konnte auch noch irgendeine schleife sein na geil 😃 😃



  • @Sidewinder
    😃

    übrigens find ich das meine Lösung der Aufgabenstellung adäquat ist... 😉



  • Hat die Aquivalenz auch etwas mit den Regeln bei der Typumwandlung zu tun.
    Also zum Beispiel, wenn einer der Operanden float ist und der weitere Operand auch in float umgewandelt wird.

    Ist die Aquivalenz abhängig von der Umwandlung oder kann sie auch unabhängig von einandern gesehen ?



  • Ich vermute äuqivalent im Sinne der Aufgabenstellung heisst nur das bei gleichen Eingabewerten die gleichen Ausgabewerte erzeugt werden...


Anmelden zum Antworten