[C] Unterbrechen verschachtelter Schleifen/Helper

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
AlexImperator
Beiträge: 23
Registriert: Mi Aug 13, 2014 5:25 pm

[C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von AlexImperator » Do Aug 14, 2014 8:39 pm

Code: Alles auswählen

int helper = 1; // wenn helper != 0, läuft die Schleife
 
int i, j;
for( i = 0; i <= 10 && helper; i++ )  
{
  for( j = 0; j <= 10; j++ )
  {
    if( i + j == 12 )
    {
      helper = 0; // äußere Schleife nicht wiederholen
      break;      //  innere Schleife abbrechen 
    }  
  }  
}
Ich ver stehe nicht ganz wieso das nur funktioniert wenn helper 0 is. also ich glaube zu verstehen wieso es mit null sofort beendet aber was ist wenn ich nur aus irgendeinen grund ein verfrühtes ende haben will wie im nächsten Baispiel

Code: Alles auswählen

#include <stdio.h>

int main()
{
   int i;
   int h=5;

   for(i=1; i<=10 && h; i++)
       printf("test\n");

   return 0;
}
Wieso wird test dort trotzdem 10x ausgegeben? ich galub ich hab das mit den helper nicht ganz verstanden :( Kann mir jmd schnell erklären was ich da falsch mache?

ich habe es so verstanden, dass man mit "&&" eine weitere Zahl in die schleife hinzuzugibt, die bestmmt wann diesen enden soll.

Danke im Voraus :)

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von cloidnerux » Do Aug 14, 2014 8:57 pm

ch habe es so verstanden, dass man mit "&&" eine weitere Zahl in die schleife hinzuzugibt, die bestmmt wann diesen enden soll.
Fast.

Code: Alles auswählen

for( <variablen deklaration>; <Bedingung>; <Inkrement>)
Der mittlere Teil des Schleifenkopfs ist eine Bedingung, solange diese wahr ist, wird die Schleife ausgeführt.
Schauen wir uns die Bedingung aus dem Beispiel an:

Code: Alles auswählen

 i <= 10 && helper
Die Schleife wird Ausgeführt, solange "i" kleiner gleich 10 ist UND helper größer 0(weil alles <= 0 wird als Falsch interpretiert).
Wenn du diese Zeile anpasst, kannst du die Schleife auch beenden wenn helper gleich 1 wird:

Code: Alles auswählen

 i <= 10 && helper == 1
Deswegen bricht auch deine Schleife nicht ab:

Code: Alles auswählen

   int h=5;

   for(i=1; i<=10 && h; i++)
       printf("test\n");
h ist immer > 0, damit immer wahr. i wird von 1 bis 10 hochgezählt. Damit bricht die Schleife erst ab, wenn i > 10 wird.

Die Idee mit dem Helfer ist, dass du selbst bei verschachtelten Schleifen den Ablauf gezielt beeinflussen kannst, z.B abbrechen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

AlexImperator
Beiträge: 23
Registriert: Mi Aug 13, 2014 5:25 pm

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von AlexImperator » Do Aug 14, 2014 9:10 pm

Verstanden

also ist es mit dem helper nicht möglich die schleifenanzahl zu verändern?

außer wenn ich es so mache:

Code: Alles auswählen

#include <stdio.h>

int main()
{
	int i;
	int h=5;
	
	for(i=1; i<=10 && i<=h; i++)
		printf("Bis 10 oder 5?\n");

	return 0;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von cloidnerux » Do Aug 14, 2014 9:48 pm

also ist es mit dem helper nicht möglich die schleifenanzahl zu verändern?
Ich glaube du hältst dein Compiler für Intelligenter als er ist.
for(i=1; i<=10 && i<=h; i++)
printf("Bis 10 oder 5?\n");
Es wird immer nur bis 5 laufen.

Kurz nochmal zur for-schleife:
Dein Programm geht Anweisung für Anweisung durch. Die erste Anweisung ist der Schleifenkopf:

Code: Alles auswählen

for(i=1; i<=10 && i<=h; i++)
Beim ersten Durchlauf wird i der Wert 1 zugewiesen, dann wir die Bedinung evaluiert:
Schleife weiter ausführen wenn i <= 10 UND i <= h
Aufgrund des Postfix-Operators(i++) wird der Inkrement erst am Ende der Schleife ausgeführt.
Danach geht dein Programm in den Schleifenkörper:

Code: Alles auswählen

printf("Bis 10 oder 5?\n");
Es wird also ("Bis 10 oder 5?\n" ausgegeben, da keine weitere Anweisung folgt ist der Schleifenkörper abgearbeitet, i wird inkrementiert und es geht alles von vorne los.

Sobald die Schleife 5 mal lief, ist die Bedingung i <= 10 UND i <= h nicht mehr erfüllt ist, da i jetzt 6 ist und damit größer als h=5.

Die Idee mit dem Helfer ist eigentliche folgende:

Code: Alles auswählen

int i, helper = 1;
for(i = 0; i < 100 && helper; i++)
{
    DoSomehting(i);
    if(SomeCalculation(i) == 1)    //Wir überprüfen ob irgendeine Bedingung erfüllt wurde, die das vorzeitige abbrechen der Schleife erfordert
        helper = 0;    //Helper auf 0 setzten, um schleife beim nächsten Durchlauf abzubrechen. 
}
Du kannst dem helper einen neuen Wert zuweisen, der dann den Ablauf beeinflusst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

AlexImperator
Beiträge: 23
Registriert: Mi Aug 13, 2014 5:25 pm

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von AlexImperator » Do Aug 14, 2014 10:14 pm

ich verstehe aber durch:

Code: Alles auswählen

int i, helper = 10;
for(i=1; i<=10 && i<=h; i++)

{
    DoSomehting(i);
    if(SomeCalculation(i) == 1)   
        helper = 5;  
 }
könnete man die schleifenanzahl nachträglich verändern was ihn dann aber nicht mehr zum helper(im allgemeinen verständnis) macht...ok :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von Xin » Fr Aug 15, 2014 12:52 am

Eine For-Schleife sollte verwendet werden, FÜR ALLE benötigten Elemente.

Wenn Du eine Schleife benötigst, die "SOLANGE" ausdrücken soll, solltest Du eine while-Schleife verwenden.
Grundsätzlich sind for und while gleichwertig.

helper dient im Tutorial nur dazu, in der inneren Schleife mitzuteilen, dass die Äußere auch nicht fortgesetzt werden soll.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von oenone » Fr Aug 15, 2014 9:40 am

cloidnerux hat geschrieben:Aufgrund des Postfix-Operators(i++) wird der Inkrement erst am Ende der Schleife ausgeführt.
Ähm.. Das Inkrement (dritte Anweisung in der for-Klammer) wird immer am Ende der Schleife ausgeführt. Dabei ist es egal, ob Postfix- oder Prefix-Operator (i++ oder ++i). Bei komplexeren Datenstrukturen wird meist ein Prefix-Operator bevorzugt, da dann keine Kopie des alten Werts angelegt wird (die sowieso verworfen wird).

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: [C] Unterbrechen verschachtelter Schleifen/Helper

Beitrag von cloidnerux » Fr Aug 15, 2014 9:57 am

Ähm.. Das Inkrement (dritte Anweisung in der for-Klammer) wird immer am Ende der Schleife ausgeführt. Dabei ist es egal, ob Postfix- oder Prefix-Operator (i++ oder ++i).
Jop, das war falsch von mir. Ich hatte da noch irgendwas anderes im Kopf.
Aber um sicher zu sein nochmal getestet:

Code: Alles auswählen

#include "stdio.h"

int main()
{
	for(int i = 0; i < 10; i++)
		printf("i: %d\n", i);
	printf("Second loop\n");
	for(int i = 0; i < 10; ++i)
		printf("i: %d\n", i);
	
	return 0;
}
Ausgabe:

Code: Alles auswählen

test>gcc main.c -o main -std=c99

test>main
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
Second loop
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
Danke für die Korrektur :D
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten