Taschenrechner Schleifenproblem?

Schnelle objektorientierte, kompilierende Programmiersprache.
dragonfloez
Beiträge: 92
Registriert: Fr Jan 22, 2010 1:49 pm

Re: Taschenrechner Schleifenproblem?

Beitrag von dragonfloez » Di Jan 26, 2010 9:14 pm

Aber wenn break das while beendet. Beendet es dann auch automatisch das Switch? und wiso funktioniert dann noch die default Anweisung? Weil das default steht doch noch im switch, oder nicht??

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: Taschenrechner Schleifenproblem?

Beitrag von stampuhh » Di Jan 26, 2010 9:17 pm

oh hab ich mich vor lauter switch und while vertan :D

Das break beendet in diesem Fall nur die switch-Entscheidung. Mit der while-Schleife hat das hier nichts zu tun.

gruß stampuhh
NachDenkSeiten.de

dragonfloez
Beiträge: 92
Registriert: Fr Jan 22, 2010 1:49 pm

Re: Taschenrechner Schleifenproblem?

Beitrag von dragonfloez » Di Jan 26, 2010 9:21 pm

Ist schon verwirrend :D . Aber wenn das break das switch beendet steht das default nicht mehr im switch??

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: Taschenrechner Schleifenproblem?

Beitrag von stampuhh » Di Jan 26, 2010 9:25 pm

Es steht noch im switch wird aber nicht mehr ausgeführt. Das default soll ja eigentlich nur ausgeführt werden wenn eine Zahl vorkommt die nicht durch die Fälle (case) abgedeckt ist. So wie das else bei der if-Bedingung.

Eigentlich ist eine switch mit break ja auch nichts anderes als eine sehr oft verzweigte if else Abfrage

Code: Alles auswählen

if(i == 1)
{ 
 // entspricht case 1
}
else if(i == 2)
{
 // entspricht case 2
}
else
{
 // entspricht default und wird nur ausgeführt wenn if 1 und if 2 nicht ausgeführt wurden.
}
gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Taschenrechner Schleifenproblem?

Beitrag von Dirty Oerti » Di Jan 26, 2010 9:30 pm

Mal eine Anmerkung zum Code:

"zahl9" und "zahl1" sind keine guten Namen für Variablen. Wenn du dein Programm in einem halben Jahr (oder sagen wir in 3 Tagen) noch einmal anschaust, dann musst du erst einmal wieder verstehen, was diese Variablen eigentlich beinhalten und welchen Zweck sie verfolgen.
Das die Variablen eine Zahl in sich tragen ist klar, deswegen ist es unnütze, das dann auch noch in den Variablennamen zu packen.

Wie wäre es z.B. mit:

"auswahl" / "choice"
"fortfahren" / "run"
o.ä.

Dann nochwas:

Blöcke irgendwelcher Art (while, if, else, einfach nur so {} ) können nur nacheinander oder komplett ineinander verschachtelt gesetzt werden.

Code: Alles auswählen

while
{
        if
        {
        }
        else
        {
                if
                {
                }
        }
}
if
{
        for
        {
                {
                }
        }
}

Das ist ok.

Sowas geht aber !NICHT!:

Code: Alles auswählen

if
{ // if1 start
    if
    { // if2 start
} // if1 ende
    } // if2 ende
Das es nicht gehen kann siehst du schon daran, dass man es mit Klammern (ohne Kommentare) gar nicht demonstrieren kann ;)



Zum switch:

Du musst unterscheiden zwischen die Schleife beenden, wenn das Programm läuft, also ausgeführt wird und die Schleife (syntaktisch) im Programmcode abschließen.

Code: Alles auswählen

switch (integer)
{
    case 1:
            {
                    // 1
                    break; //damit NUR 1 ausgeführt wird und der Code unterhalb dieser Anweisung nicht!
            }
    case 2:
            {
                    // 2
                    // kein break, wird also case 2 ausgeführt, dann wird danach immer der folgende Code (case 3) ausgeführt
            }
    case 3:
            {
                // 3
                break;
            }
    default: // Das ist der defaut-case, das wird ausgeführt, wenn keiner der obigen Fälle (cases) erfüllt ist. Du musst nicht unbedingt einen default case schreiben, du kannst ihn auch weglassen.
            {
                // default
            }
} // Ende des switch im PROGRAMMCODE


Ist nun integer z.B. gleich 1, dann wird der Code im Bereich hinter der Bezeichnung "case 1:" ausgeführt. Würde kein "break;" da stehen, dann würde auch der Code von case 2 ausgeführt werden, denn auch der steht (im Programmcode) hinter der Bezeichnung "case 1:"
Steht nun aber ein break da, dann endet die switch-Anweisung in dem Fall, dass integer == 1 ist am break; am Ende von case 1:
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

dragonfloez
Beiträge: 92
Registriert: Fr Jan 22, 2010 1:49 pm

Re: Taschenrechner Schleifenproblem?

Beitrag von dragonfloez » Di Jan 26, 2010 9:33 pm

Also das Break beendet die Switch Anweisung, das default steht noch im switch (aber fungiert als eine Art else Anweisung). Dann Erfolgt das erste } das zeigt das ende des switch an ( rein vom schreiben des Programms her), obwohl es bei break schon Beendet wurde. Das zweite } zeigt das Ende des while an (rein vom schreiben des Programms).
Beendet wird das while nach der Prüfung des Wertes der in while festgelt wurde und übereinstimmt.

Stimmt das so?

dragonfloez
Beiträge: 92
Registriert: Fr Jan 22, 2010 1:49 pm

Re: Taschenrechner Schleifenproblem?

Beitrag von dragonfloez » Mi Jan 27, 2010 12:03 am

Also nochmal.

Das Switch Case 1-6 fungiert auch als solches. Bis Case 6 ausgewählt wird. Da dort break enthalten ist wird sofort das Switch bendet und ignoriert alles was noch in diesem steht und geht zur nächsten Anweisung nach dem Switch weiter. Da dort nur } das zweite steht, also while Ende ( rein vom schreiben des Programmes her) wird nun geprüft ob der durch Case 6 gegeben wert mit dem im Vorfeld im while fesgelgtem wert übereinstimmt was nur im Case 6 der Fall ist und beendet das proramm da die Schleife aufgelöst wird und die Werte übereinstimmen. Wird nur Case 1- 5 aufgerufen findet keine Übereinstimmung mit dem im while festgelegten wert statt. Daher wird das Programm wiederholt bis Case 6 das aufhebt. In diesem Fall ist die Default Anweisung nicht mehr notwendig und wird durch in Case 6 festgelegtem Break einfach ignoriert. Ist ja ach nicht mehr notwendig da das Programm im Case 6 Fall sofort beendt wird; nach der Print ausgabe.
Stimmt das so??

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: Taschenrechner Schleifenproblem?

Beitrag von stampuhh » Mi Jan 27, 2010 12:49 am

Mhh ja schon. Aber du hast ja nicht nur nach dem case 6 ein break. Jedes andere break in der switch Abfrage funktioniert genauso.

Code: Alles auswählen

int i = 1;
switch(i)
{
    case 1 : printf("bla\n"); //Wird ausgeführt
    break; //BREAK! Programm beendet switch und springt an Position XY
    case 2 : printf("blub\n"); // wird ignoriert
    break; // das hier auch
    default: printf("lala\n"); // und das hier auch
}
// Position XY
// Hier geht es weiter im Programm..egal was!
Am besten zu versuchst das Prinzip der while-Schleife erst einmal ohne die switch zu verstehen ;)

Ich versuche es noch einmal zu erklären

Schritt 1:

Code: Alles auswählen

int i = 1;
while( i < 3) // i ist 1 also kleiner als 3
{
  i++; // i um 1 erhöhen (i = i + 1 ) 
} // Schritt 2 springe wieder an die Bedingung der while-Schleife
Schritt 2:

Code: Alles auswählen

while( i < 3) // i ist 2 also kleiner als 3, da es beim ersten Durchlauf erhöht wurde
{
  i++; // i um 1 erhöhen (i = i + 1 ) 
} // Schritt 3 springe wieder an die Bedingung der while-Schleife
Schritt 3:

Code: Alles auswählen

while( i < 3) // i ist 3 also nicht kleiner als 3 !! Die while-Schleife wird beendet. Springe nach Position XY
{
  i++; // wird nicht mehr ausgeführt
} // Position XY
// Hier geht es jetzt weiter. Das Programm hat die while-Schleife verlassen
Die while-Bedingung kann man wörtlich so sehen: "Mache etwas solange wie die Bedingung wahr ist, beende die Schleife sobald sie falsch wird".
Betrachte die while und die switch Klammerung getrennt. Dirty Oerti hat es oben sehr gut beschrieben ;)
Es bringt auch viel wenn man einfach mal ein bisschen "rum spielt". Zumindest mir hilft es wenn ich etwas nicht ganz verstanden habe, dann probiere ich ein bisschen aus im Code.

gruß stampuhh
NachDenkSeiten.de

dragonfloez
Beiträge: 92
Registriert: Fr Jan 22, 2010 1:49 pm

Re: Taschenrechner Schleifenproblem?

Beitrag von dragonfloez » Mi Jan 27, 2010 7:52 am

Also ist Case 1-5 wahr, Case 6 falsch was die Schleifenbedinungen angeht und Break ignoriert alles weiere unterhalb der Anweisung ( indemfall den Rest des Switch ). da nach dem Switch nichtsmehr folgt ( so while geklammert). So wird bei jedem durchlauf Case 1-6 geprüft ob die while bedinung falsch geworden ist. Im Case 6 Fall trifft das zu was zum sofortgem schleifen Ende nach der Prüfung führt. Würden noch ander Anweisungen im Programm stehen nach dem Switch nicht {while} geklammert sind, würden diese theoretisch ausgeführt werden da die Schleife verlasssen wurde.

Case 6 break ignoriert dann das Default (oder was immmernoch da stehen würde), was noch im Switch steht. Da Break das Switch sofort beendet.

Break beenden indem Sinn immer den Rest was da noch kommen könnte in einer Funktion oder Anweisung und führt so sofort zum nächsten Schritt,
Also unten. Text 1 sieht man, Text 2 sieht man, Text 3 sieht man, Text 4 sieht man wird per Auswahl aktiv und führt dazu das Text 5 nicht erscheint, Text 5 würde man sehen wenn 4 nicht aktiviert würde (dafür sieht man dann Text 4 nicht mehr), Text 6 sieht man.

Text 1
{Text 2
Text 3
Text 4 Break
Text5}

Text 6


Jetzt verstanden?

Nochmal Danke für eure Geduld und Hilfe!!!

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Taschenrechner Schleifenproblem?

Beitrag von Dirty Oerti » Mi Jan 27, 2010 8:36 am

Hm, naja.
Ich denke du verstehst da mit dem switch noch etwas falsch. Schau dir das am besten erst OHNE while Schleife außenrum an. Ob da ein while oder ein if oder auch gar nichts außenrum ist interessiert das Switch (was KEINE Schleife ist) nicht.

Arbeiten wir mit dem folgenden Code: (Am besten du kopierst ihn dir und machst ein einfaches Programm daraus ("int main() {" davor und "return 0; }" danach ) )

Code: Alles auswählen

int var;

var = X;// Gib hier zu Testzwecken am besten mal Zahlen von 0 bis 6 ein. Das X ist mal nur als Platzhalter gedacht.

printf("Das Switch beginnt\n");
switch (var)
{
        case 1:
        {
                printf("Case 1 wird ausgeführt\n");
                break;
        }
        case 2:
        {
                printf("Case 2 wird ausgeführt\n");
        }
        case 3:
        {
                printf("Case 3 wird ausgeführt\n");
                break;
        }
        case 4:
        {
                printf("Case 4 wird ausgeführt\n");
        }
        default:
        {
                printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
        }
}
printf("Das Switch ist zuende\n");


Ok, was passiert nun, wenn die Variable var den Wert 0 hat?
int var;

var = 0;

printf("Das Switch beginnt\n");
switch (var)
{

case 1:
{
printf("Case 1 wird ausgeführt\n");
break;
}
case 2:
{
printf("Case 2 wird ausgeführt\n");
}
case 3:
{
printf("Case 3 wird ausgeführt\n");
break;
}
case 4:
{
printf("Case 4 wird ausgeführt\n");
}
default:
{
printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
}
}
printf("Das Switch ist zuende\n");
Alles fett markierte wird ausgeführt. Die Ausgabe würde so aussehen:
Das Switch beginnt
Kein Case passt, also wird der (default) Standardfall ausgeführt
Das Switch ist zuende
-----------------------------------------

int var;

var = 1;

printf("Das Switch beginnt\n");
switch (var)
{
case 1:
{
printf("Case 1 wird ausgeführt\n");
break;
// Heißt, "BRICH die Switch-Anweisung JETZT ab und gehe an ihr Ende"
}
case 2:
{
printf("Case 2 wird ausgeführt\n");
}
case 3:
{
printf("Case 3 wird ausgeführt\n");
break;
}
case 4:
{
printf("Case 4 wird ausgeführt\n");
}
default:
{
printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
}
}
printf("Das Switch ist zuende\n");
Die Ausgabe dazu:
Das Switch beginnt
Case 1 wird ausgeführt
Das Switch ist zuende
-----------------------------------------

int var;

var = 2;

printf("Das Switch beginnt\n");
switch (var)
{

case 1:
{
printf("Case 1 wird ausgeführt\n");
break;
}
case 2:
{
printf("Case 2 wird ausgeführt\n");
// hier ist KEIN break!
}
case 3:
{
printf("Case 3 wird ausgeführt\n");
break;

}
case 4:
{
printf("Case 4 wird ausgeführt\n");
}
default:
{
printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
}
}
printf("Das Switch ist zuende\n");
Die Ausgabe wäre hier:
Das Switch beginnt
Case 2 wird ausgeführt
Case 3 wird ausgeführt
Das Switch ist zuende
-----------------------------------------

int var;

var = 3;

printf("Das Switch beginnt\n");
switch (var)
{

case 1:
{
printf("Case 1 wird ausgeführt\n");
break;
}
case 2:
{
printf("Case 2 wird ausgeführt\n");
}
case 3:
{
printf("Case 3 wird ausgeführt\n");
break;

}
case 4:
{
printf("Case 4 wird ausgeführt\n");
}
default:
{
printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
}
}
printf("Das Switch ist zuende\n");
Ausgabe:
Das Switch beginnt
Case 3 wird ausgeführt
Das Switch ist zuende

-----------------------------------------

int var;

var = 4;

printf("Das Switch beginnt\n");
switch (var)
{

case 1:
{
printf("Case 1 wird ausgeführt\n");
break;
}
case 2:
{
printf("Case 2 wird ausgeführt\n");
}
case 3:
{
printf("Case 3 wird ausgeführt\n");
break;
}
case 4:
{
printf("Case 4 wird ausgeführt\n");
// KEIN break, also weiter
}
default:
{
printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
}
}
printf("Das Switch ist zuende\n");
Ausgabe:
Das Switch beginnt
Case 4 wird ausgeführt
Kein Case passt, also wird der (default) Standardfall ausgeführt
Das Switch ist zuende

-----------------------------------------
int var;

var = 5; // Jeder höhere Wert hat nun die selben Auswirkungen

printf("Das Switch beginnt\n");
switch (var)
{

case 1:
{
printf("Case 1 wird ausgeführt\n");
break;
}
case 2:
{
printf("Case 2 wird ausgeführt\n");
}
case 3:
{
printf("Case 3 wird ausgeführt\n");
break;
}
case 4:
{
printf("Case 4 wird ausgeführt\n");
}
default:
{
printf("Kein Case passt, also wird der (default) Standardfall ausgeführt\n");
}
}
printf("Das Switch ist zuende\n");
Ausgabe:
Das Switch beginnt
Kein Case passt, also wird der (default) Standardfall ausgeführt
Das Switch ist zuende
-----------------------------------------

So :) Verständlich?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten