Forum: PC-Programmierung Letzte Verständnisfrag


von Sven (Gast)


Lesenswert?

Welche Ausgabe erzeugt das nebenstehende Programm in seiner
letzten Zeile? Stellen Sie dazu eine Wertetabelle für i und n auf.
      // Wertetabelle: i | n
1
#include <stdio.h>
2
void main()
3
      {
4
      int n=0, i=0;
5
      for(i=0;i<30;i++)
6
      {
7
        if(i>20)break;
8
        n+=100;
9
        if(i<10)continue;
10
        n-=100;
11
     }
12
         printf("%i\n",n);
13
      }
Die Ausgabe in der letzten Zeile ist 1000, bei i=20 und i=21

ich habe eine Wertetabelle erstellt, kann mir aber nicht erklären, wie 
die Werte zustande kommen:
1
    // i      n
2
    //----------------
3
    // 0    0
4
    // 0    100
5
    // 1    200
6
    // 2    300
7
    // 3    400
8
    // .    .
9
    // .    .
10
    // 9    1000
11
    // 10    1100
12
    //----------------
13
    // 1000
14
    // 10    1000
15
    // 11    1100
16
    // 11    1000
17
    // 12    1100
18
    // 12    1000
19
    // .    .
20
    // .    .
21
    // 19    1100
22
    // 19    1000
23
    // 20    1100
24
    // 20    1000
25
    // 21         1000
wieso erhöht sich n, wenn ? Bei i= 9 wird das Maximum erreicht, dann 
greift ja die break funktion ein

: Bearbeitet durch User
von Joe (Gast)


Lesenswert?

Hallo,

ich würde vorschlagen du benutzt einen Debugger um das Programm zu 
verstehen. Da kannst du dir jede Variable zu jedem Schritt anschauen.

Außerdem bitte den Code nächstes mal in code Tags setzen, dann ist das 
etwas leichter lesbar.

Ich weiß nicht so recht zu welchem Zeitpunkt die Wertetabelle angegeben 
werden soll.

i=0 und n=0
1
     
2
for(i=0;i<30;i++)
3
{
4
  if(i>20)break;           // (1)
5
  n+=100;                  // (2)
6
  if(i<10)continue;        // (3)
7
  n-=100;                  // (4)
8
}

Wenn du mit i = 0 und n = 0 startest
(1) wirkungslos, da i nicht größer 20
(2) n wird um 100 erhöht (n=100)
(3) wird aus geführt -> die nächste Runde geht los, Aufgrund von 
continue wird der Rest, hier (4) ignoriert
i++ wird ausgeführt

i = 1 und n = 100
(1) wirkungslos, da i nicht größer 20
(2) n wird um 100 erhöht (n=200)
(3) wird aus geführt -> die nächste Runde geht los, Aufgrund von 
continue wird der Rest, hier (4) ignoriert
i++ wird ausgeführt

usw. usw.

bis
i = 10 und n = 1000
(1) wirkungslos, da i nicht größer 20
(2) n wird um 100 erhöht (n=1100)
(3) wird nicht mehr ausgeführt d.h. kein continue
(4) n wird um 100 erniedrigt (n = 1000)
i++ wird ausgeführt


somit bleibt n auf 1000 ( immer 100 drauf und 100 weg)

usw usw.

i = 20 und n = 1000
wie oben

i = 21
(1) ist erfüllt -> for-Schleife wird abgebrochen
n wird nicht mehr verändert

somit ist am Ende der Schleife i = 21 und n = 1000

von Joe (Gast)


Lesenswert?

Sven schrieb:
> wieso erhöht sich n, wenn ? Bei i= 9 wird das Maximum erreicht, dann
> greift ja die break funktion ein

die break funktion "greift" erst bei i = 21.

die continue funktion wird ab i = 10 nicht mehr ausgeführt
i = 9 also kleiner 10 also sehr wohl noch ....

von Joe (Gast)


Lesenswert?

So zum Spaß habe ich es hier noch mal reinkopiert und die immer 
ausgegeben, wann sich ein Wert ändert -> Wertetabelle ...

cpp.sh/5wss

von Rainer V. (rudi994)


Lesenswert?

Das gleiche Programm mit ein paar printf-Befehlen, wo man in der Ausgabe 
alles genau sehen kann, auch das Maximum n=1100:
1
#include <stdio.h>
2
void main()
3
{
4
    int n = 0, i = 0;
5
    printf("\n* Tabelle: i und n\n");
6
    printf("Werte vor und nach continue.\n\n");
7
    for (i = 0; i < 30; i++)
8
    {
9
        if (i > 20) break;
10
        n += 100;
11
        printf("vorher: i=%3i, n=%5i ", i, n);
12
        if (i < 10) goto cont; // continue;
13
        n -= 100;
14
cont:   printf("--- nachher: i=%3i, n=%5i\n", i, n);
15
    }
16
    printf("\n* Ende: i=%3i, n=%5i\n", i, n);
17
}

@Joe
Du bist heute einfach zu schnell für mich ;)

von Sven (Gast)


Lesenswert?

Vielen Dank, ich habe es jetzt verstanden :)

Mein Problem lag darin:
Ich wusste nicht, dass durch das continue der letzte Teil übersprungen 
wird.
Eigentlich simpel .. :/

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.