Forum: PC-Programmierung For-Schleife auf if-bedingung herausholen


von Frank (Gast)


Lesenswert?

Hallo,
kann ich irgendwie eine for-schleife aus einer if-bedingung herausholen?

also z.B.
1
if(x==1){
2
  for(y=1;y<10;y++){
3
    for(z=1;z<10;z++){
4
} // hier beende ich die if(x==1) schleife
5
else if(x==2){
6
  for(z=1;z<10;z++){
7
    for(y=1;y<10;y++){
8
} // hier beende ich die if(x==2) schleife
9
weiterer Programm

von Lutz H. (luhe)


Lesenswert?

Ja

von Frank (Gast)


Lesenswert?

Und wie?
bei mir kommt die Fehlermeldung: 'else an ungültiger Position' und es 
wird mir die Zeile
1
else if(x==2){
angezeigt

von {} (Gast)


Lesenswert?

zähl mal die klammern

von Simon S. (-schumi-)


Lesenswert?

Kümmer dich erst mal um deine geschwungenen Klammern, die gehen ständig 
auf aber nur 2x zu...

von Frank (Gast)


Lesenswert?

Ja, also in meinem Programm ist es
1
if(x==1){
2
  for(y=1;y<10;y++){
3
    for(z=1;z<10;z++){
4
} // hier beende ich die if(x==1) schleife
5
else if(x==2){
6
  for(z=1;z<10;z++){
7
    for(y=1;y<10;y++){
8
} // hier beende ich die if(x==2) schleife
9
10
weiterer Programm
11
12
    }
13
  }
also zum schluss gehen noch die zwei Klammern von der for-Schleife zu. 
Dann denke ich, dass das Beenden der if Abfrage, die erste for-Schleife 
beendet. Aber ich frage ja nach einem neuen Wert und davor muss die 
Klammer von if ja geschlossen worden sein oder nicht?

von Wilhelm F. (Gast)


Lesenswert?

Tolles Programm, werde ich mir mal merken.

Es braucht viel weniger geschlossene geschweifte Klammern, als offene.

;-)

von Frank (Gast)


Lesenswert?

Aber zwei (entweder die von x=1, oder von x==2) werden doch gar nciht 
benötigt, da das Programm gar nicht dahinspringt.

müsste es dann so sein?
1
if(x==1){
2
  for(y=1;y<10;y++){
3
    for(z=1;z<10;z++){
4
} // hier beende ich die if(x==1) schleife
5
else if(x==2){
6
  for(z=1;z<10;z++){
7
    for(y=1;y<10;y++){
8
} // hier beende ich die if(x==2) schleife
9
10
weiterer Programm
11
12
    }}
13
  }}

von Simon S. (-schumi-)


Lesenswert?

Lerne richtig Einrücken (Bei { einrücken und bei } ausrücken), sonst 
kommt so Mist raus wie bei dir:
1
if(x==1)
2
{
3
  for(y=1;y<10;y++)
4
  {
5
    for(z=1;z<10;z++)
6
    {
7
    
8
    } // hier beende ich die if(x==1) schleife
9
    else if(x==2)
10
    {
11
      for(z=1;z<10;z++)
12
      {
13
        for(y=1;y<10;y++)
14
        {
15
        
16
        } // hier beende ich die if(x==2) schleife
17
18
        weiterer Programm
19
20
      }
21
    }
Wie du siehst totaler quatsch.

von Lutz H. (luhe)


Lesenswert?

Frank schrieb:
> if(x==1){
>   for(y=1;y<10;y++){
>     for(z=1;z<10;z++){
> } // hier beende ich die if(x==1) schleife
////////////////////

}

> else if(x==2){
>   for(z=1;z<10;z++){
>     for(y=1;y<10;y++){
> } // hier beende ich die if(x==2) schleife

}

/////////////////////////////////////////////
Vieleicht so else nicht einsetzen neuer test für x=2:
> if(x==1){
>   for(y=1;y<10;y++){
>     for(z=1;z<10;z++){
> } // hier beende ich die if(x==1) schleife


}

  if(x==2){
>   for(z=1;z<10;z++){
>     for(y=1;y<10;y++){
> } // hier beende ich die if(x==2) schleife

}

dann sind die Tests unabhängig in der Reihenfolge:

     for(z=1;z<10;z++){
> if(x==1){
>   for(y=1;y<10;y++){

> } // hier beende ich die if(x==1) schleife


}

     for(y=1;y<10;y++){
  if(x==2){
>   for(z=1;z<10;z++){

> } // hier beende ich die if(x==2) schleife

}

von Frank (Gast)


Lesenswert?

Ah ja, das könnte (wird es auch) funktionieren. Das Problem ist aber, 
dass x nicht nur eins oder zwei ist, sondern eine variable zwischen 1 
und 8. Dann stelle ich mir diesen weg als sehr schwierig vor. Aber 
trotzdem vielen Dank für den Tip.
Frank

von Typo (Gast)


Lesenswert?

>Aber zwei (entweder die von x=1, oder von x==2) werden doch gar nciht
>benötigt, da das Programm gar nicht dahinspringt.

Das ist eine ungewöhnliche Auffassung der Bedeutung von schliessenden 
Klammern. Obwohl man das versuchen kann, führt sie aber nicht zum Ziel.

Die geschweiften Klammern haben genau einen Sinn: Sie fassen mehrere 
Anweisungen zu einem Block zusammen. Das ist dann nötig wenn mehrere 
Anweisungen in einer Schleife oder abhängig von einer If-Bedingung 
(if-Schleigen gibt es nicht) ausgeführt werden sollen.

Ich demonstriere das hier mal an Deinem Code:
1
if(x==1)
2
{ // hier beginnen die zu einem Block zusammengefassten Anweisungen
3
  for(y=1;y<10;y++)
4
  { // hier beginnen die zu einem Block zusammengefassten Anweisungen
5
    for(z=1;z<10;z++)
6
    { // hier beginnen die zu einem Block zusammengefassten Anweisungen
7
    } // hier enden die zu einem Block zusammengefassten Anweisungen
8
  } // hier enden die zu einem Block zusammengefassten Anweisungen
9
} // hier enden die zu einem Block zusammengefassten Anweisungen
10
else if(x==2)
11
{ // hier beginnen die zu einem Block zusammengefassten Anweisungen
12
  for(z=1;z<10;z++)
13
  { // hier beginnen die zu einem Block zusammengefassten Anweisungen
14
    for(y=1;y<10;y++)
15
    { // hier beginnen die zu einem Block zusammengefassten Anweisungen
16
        
17
    } // hier enden die zu einem Block zusammengefassten Anweisungen
18
  } // hier enden die zu einem Block zusammengefassten Anweisungen
19
} // hier enden die zu einem Block zusammengefassten Anweisungen
20
21
// hier "springt er hin" wenn eine der beiden inneren Schleifen beendet wird

von Switch (Gast)


Lesenswert?


von Typo (Gast)


Lesenswert?

Da aber ein for (genauso wie ein if) nur eine einzelne Anweisung ist, 
kannst Du Dir einen Teil der Klammerungen sparen.
1
if(x==1)
2
  for(y=1;y<10;y++)
3
    for(z=1;z<10;z++)
4
    { // hier beginnen die zu einem Block zusammengefassten Anweisungen
5
    } // hier enden die zu einem Block zusammengefassten Anweisungen
6
else if(x==2)
7
  for(z=1;z<10;z++)
8
    for(y=1;y<10;y++)
9
    { // hier beginnen die zu einem Block zusammengefassten Anweisungen
10
        
11
    } // hier enden die zu einem Block zusammengefassten Anweisungen
12
13
// hier "springt er hin" wenn eine der beiden inneren Schleifen beendet wird

Sieht schon ein bisschen übersichtlicher aus. Die Einrückung muss 
natürlich trotzdem eingehalten werden, sonst wirds wieder kraus.

von Frank (Gast)


Lesenswert?

Ja, gerade das wollte ich vermeiden, da der Code dazwischen sehr lang 
ist. Also um auf meiner ersten Frage (natürlich mit der Erweiterung, 
dass ich 8 möglichkeiten habe (da ja sonst lutz's code funktionieren 
würde)) zurückzukommen, sehe ich es richtig, dass dies nicht möglich 
ist?

von Typo (Gast)


Lesenswert?

>Ja, gerade das wollte ich vermeiden, da der Code dazwischen sehr lang
ist.

Was genau wolltest Du vermeiden? Welcher Code wo zwischen?

Langer Code an sich ist kein Problem. Der Computer ist sehr geduldig.

Ich kann Dir leider nicht ganz folgen was Lutz Code betrifft.

Du kannst if-elseif Ketten beliebig lang machen.
1
if
2
 ...;
3
else if
4
 ...;
5
else if
6
 ...;
7
else if
8
 ...;
9
else if
10
 ...;

Du kannst soetwas auch durch einen switch ersetzen (was es aber nicht 
wirklich übersichtlicher macht.
1
switch 
2
case:
3
 ...;
4
 break;
5
case:
6
 ...;
7
 break;
8
case:
9
 ...;
10
 break;
11
case:
12
 ...;
13
 break;
14
case:
15
 ...;
16
 break;

von Simon S. (-schumi-)


Lesenswert?

Frank schrieb:
> dass ich 8 möglichkeiten habe
was soll denn bei den anderen 6 Möglichkeiten passieren?

von Frank (Gast)


Lesenswert?

Die Anweisungen, die ich bei XXXX hinschreiben müsste, ist sehr lang und 
wenn ihc das ganze 8 mal machen müsste, wäre es mir zu unübersichtlich.
1
  for(y=1;y<10;y++)
2
  { // hier beginnen die zu einem Block zusammengefassten Anweisungen
3
    for(z=1;z<10;z++)
4
    { // hier beginnen die zu einem Block zusammengefassten Anweisungen
5
       XXXX
6
    } // hier enden die zu einem Block zusammengefassten Anweisungen
7
  }

von Lutz H. (luhe)


Lesenswert?

Frank schrieb:
> variable zwischen 1
> und 8

Dann hilft möglicherweise die switch case Anweisung, weil dabei eine 
Anzahl von verschiedenen Werten ausgewertet wird.

int casex = 1;  //  Das ist die variable,die ausgewertet wird
switch (casex)
{
    case 1:
          for(y=1;y<10;y++)
  { // hier beginnen die zu einem Block zusammengefassten Anweisungen
    for(z=1;z<10;z++)
    { // hier beginnen die zu einem Block zusammengefassten Anweisungen
    } // hier enden die zu einem Block zusammengefassten Anweisungen
  } // hier enden die zu einem Block zusammengefassten Anweisungen


 break;   // bis hierher läuft das Programm, wenn casex= 1 ist

    case 2:
        ...

        break;
.
.
.

 case 8:
        ...
        break;
    default:
        ...
        break;
}

von Simon S. (-schumi-)


Lesenswert?

Dann mach ein Unterprogramm dafür:
1
void XXXX (void)
2
{
3
  // Viel Quelltext
4
}

Das kannst du dann immer aufrufen wenn du es ausführen willst: "XXXX();"


Wobei ich mit meiner Frage auf sowas hinauswollte wie, ob du z.B. 
zwischen geraden und ungeraden x unterscheiden möchtest oder sowas, dann 
wäre das ganze noch einfacher zu bewerkstelligen.

von Typo (Gast)


Lesenswert?

Du kannst natürlich so etwas:
1
else if (x == 1)
2
  for (i = 0; ...
3
    for (j = 0; ...
4
       ... ;
5
6
else if (x == 2)
7
  for (i = 0; ...
8
    for (j = 0; ...
9
       ... ;
10
else if (x == 3)
11
  for (i = 0; ...
12
    for (j = 0; ...
13
       ... ;
14
else
15
  for (i = 0; ...
16
    for (j = 0; ...
17
       ... ;

unter gewissen Umständen auch durch sowas

ersetzen
1
  for (i = 0; ...
2
    for (j = 0; ...
3
      if (x == 0)
4
        ... ;
5
      else if (x == 1)
6
        ... ;
7
      else if (x == 3)
8
        ... ;
9
      else
10
        ... ;

ersetzen.

Auch kannst Du lange Anweisungen in eine Funktion schreiben.
Es kommt halt darauf an, wie diese "langen Anweisungen" genau aussehen, 
wie Du im Einzelfall damit umgehen musst. Vielleicht brauchst Du 
Parameter. Was ist denn in den langen Anweisungen gleich und was 
unterscheidet sich je nach dem was x für einen Wert hat?

von Frank (Gast)


Lesenswert?

Wahrscheinlich muss ich ein Unterprogramm dafür machen. Aber in diesem 
Prgramm rufe ich schon einige Unterprogramme auf. Das ist dann egal 
oder?
SChon einmal danke für die Tips.

von Simon S. (-schumi-)


Lesenswert?

Frank schrieb:
> Prgramm rufe ich schon einige Unterprogramme auf. Das ist dann egal
> oder?
Es werden schon Grenzen durch die Hardware gesetzt, aber die wirst du 
auf einem Computer nicht erreichen, höchstens auf kleinen 
PIC-Mikrocontrollern mit lächerlichen Stacktiefen von 8...
-> Ja, ist egal

von Jobst Q. (joquis)


Lesenswert?

Ob du mit weniger for-Schleifen auskommst, hängt davon ab, wie groß die 
Code-Unterschiede bei unterschiedlichem x sind. Wenn sie nur klein sind, 
macht es Sinn, die if-Abfragen in die Schleifen hineinzunehmen.

Bei großen Unterschieden ist die Lösung mit außen if - innen for aber 
auf jeden Fall schneller und zwar besonders bei Doppel- oder 
Mehrfachschleifen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.