Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.03.2012, 15:43

Modulo Listening 3.13

Huhu.
Ich habe mal eine Frage bei folgendem Code.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// C++ für Spieleprogrammierer
// Listing 3.12
// Fehlerquelltext
//
#include <iostream>

using namespace std;

// Hauptprogramm
//
int main ()
{
    // Variablen
    //
    int Breite, Hoehe;

    // Breite und Hoehe des Rechtecks abfragen
    // und testen, ob es sich um ungerade Werte handelt
    do
    {
        cout << "Breite: ";
        cin >> Breite;

        cout << "Hoehe: ";
        cin >> Hoehe;

    } while ((Breite % 2 == 0) || (Hoehe % 2 == 0));

    // Rechteck zeichnen
    for (int i=0; i<Hoehe; i++)
    {
        for (int j=0; j<Breite; j++)
        {
            // Prüfen, ob es sich um die Mitte handelt
            if ((j == Breite / 2) || (i == Hoehe / 2))
                cout << "-";
            else
                cout << "X";
        }

        cout << endl;

    }

    return 0;
}


C-/C++-Quelltext

1
while ((Breite % 2 == 0) || (Hoehe % 2 == 0));


Angenommen die Breite ist =5 und bildet man den Rest mit % 2, so kommt nach meiner Rechnung eins heraus.
Also wäre dies != 0 und der Code dürfte nicht ausgeführt werden.
In diesem fall hier wird er aber ausgeführ, warum?

Danke für die Hilfe.

2

01.03.2012, 15:58

Es geht in dem Beispiel darum, dass beide Zahlen gerade sein sollen.
Mit dem while überprüfst du, ob die Breite oder die Höhe eine gerade Zahl ist.
Damit die while abgebrochen wird, muss sowohl bei der Höhe, als auch bei der Breite eine gerade Zahl kommen, damit du eine =0 bekommst, da die while schleife erst abgebrochen wird, wenn der gesammte Ausdruck 0 ist.

Wenn nun also entweder deine Höhe oder deine Breite eine ungerade Zahl ist, kommt dir für eines der beiden eine 1 heraus, und dadurch wird dein gesammter while Ausdruck eine 1 ;)

Edit: Der Ausdruck im while muss = 0 sein, damit der Code nicht mehr ausgeführt wird

m3xx

Alter Hase

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

3

01.03.2012, 16:18

for und while schleifen haben einen kleinen aber feinen Unterschied ;)
lernste in ner kurzen Zeit ;)

4

01.03.2012, 16:21

Danke. Jetzt habe ich es verstanden.
Die while Schleife wird abgebrochen, wenn die Breiten und die Höhe nicht mehr den Wert null haben :-)

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

01.03.2012, 16:24

die While-Schleife (bzw. Do...While-Schleife) wird fortgesetzt, sofern das Ergebnis des Modulos der Breite oder Höhe mit 2 0 ist und in jedem anderem Fall abgebrochen
anders formuliert: die Schleife wird solange fortgesetzt, wie Breite oder Höhe eine gerade (durch 2 restlos teilbare) Zahl ist und erst beendet, wenn beide ungerade sind
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

6

01.03.2012, 16:27

Naja ... genau genommen ist es so, dass du 2 rechnungen durchführst ...

C-/C++-Quelltext

1
while ((Breite % 2 == 0) || (Hoehe % 2 == 0));

mit dem == schaust du, ob der linke ausdruck gleich 0 ist ...
also überprüfst du , ob die Breite%2, oder die Höhe%2 gleich 0 IST.
Wenn das der fall ist, sind beide zahlen gerade (da bei einer geraden zahl, die du durch 2 dividierst, kein rest übrig bleibt, was die modulo funktion liefert).
das "||" ist ein bitweises oder, wodurch du schaust, ob bei einen von beiden Modulo Funktionen eine 1 rausgekommen ist. Wenn bei einem der beiden eine 1 ist, ist der gesammte ausdruck eine 1 und der code wird erneut ausgeführt. Kommt bei beiden Modulo Funktionen 0 raus, ist der gesammte Ausdruck 0, wodurch der Code nicht mehr ausgeführt wird.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

01.03.2012, 16:45

das "||" ist ein bitweises oder

Dem muss ich widersprechen. Es ist ein "logisches oder". Das ist jetzt nicht klugscheisserei oder so, es ist ein wichtiger Unterschied!
Z.B. Liefert ein logisches oder "||" garantiert 0(für false) oder 1(für true). Ein bitweises oder "|" garantiert das nicht!
Ausserdem hört das "logische oder" auf, wenn der linke Teil true ist. Weil der gesammte Ausdruck dann sowieso true ist, egal ob der rechte Teil true oder false ist.
Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int i = 1;
if(i || ++i)
{
std::cout << i; // würde 1 ausgeben.
}
i = 1;
if(i | ++i)
{
std::cout << i; // würde 2 ausgeben.
}


Das "bitweise oder" sollte nur in Ausnahmefällen für Bedingungen genutzt (z.B. wenn es einen ERHEBLICHEN Geschwindigkeitsvorteil bringt) und speziell gekenntzeichnet werden.
Eigentlich ist es ja auch für etwas anderes gedacht...

Das logische oder "&&" hört übrigens auf wenn der linke Ausdruck false ist. Weil es dann sowieso nicht mehr true werden kann.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

01.03.2012, 16:55


[...]
Ausserdem hört das "logische oder" auf, wenn der linke Teil true ist. Weil der gesammte Ausdruck dann sowieso true ist, egal ob der rechte Teil true oder false ist.


Das klingt irgendwie niedlich. Das nennt sich Lazy Evaluation.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

01.03.2012, 17:01

Es ist nunmal nicht jeder Informatikstudent und lernt son scheiss auswendig du arsch!

xD eigentlich haben wir uns lieb! :love:

ps. ein hoch auf die Fachbegriffe :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

01.03.2012, 17:54


Dem muss ich widersprechen. Es ist ein "logisches oder". Das ist jetzt nicht klugscheisserei oder so, es ist ein wichtiger Unterschied!


Da geb ich dir Recht, das war mein Fehler.
Ich hab die beiden Begriffe in der schnelle verwechselt, natürlich ist es ein Logisches, kein Bitweises Oder.
Ich hoffe, dass ich den Rest richtig erklärt habe ... Ich hab mich nur in dem Namen geirrt ;)

"&&" ist ein logisches und, du hast aus versehen ein oder draus gemacht ;)

Werbeanzeige