For-Schleife auf if-bedingung herausholen

Gast #3481554
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
Gast #3481572
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?
Gast #3481577
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
  }}
#3481585
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.
#3481593
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

}
Gast #3481598
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
Gast #3481599
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
Gast #3481606
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.
Gast #3481607
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?
Gast #3481618
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;
Gast #3481624
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
  }
#3481627
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;
}
#3481629
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.
Gast #3481630
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?
#3481640
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren