C in Dev-C++ break; fehler ?

Eddie0150

Cadet 2nd Year
Registriert
Feb. 2014
Beiträge
29
Hey ich hab mal ne fragen, ich hab grade begonnen mit nem Buch zu arbeiten, C/C++ Umfassendes Lehrbuch von Ulrich Kaiser usw. 4. Auflage. Bin nun beim ersten Programm und verstehe nicht wieso hier ein fehler sein soll ?

wieso ist das falsch.jpg

Liegt es evtl daran das ich ne C Datei aufgemacht habe und das vlt nur bei C++ geht ?

Danke schonmal für Lösungsvorschläge.
 
Du machst ein break außerhalb einer Schleife. Warum das break außerhalb der for ist, lasse ich dich selber rausfinden ;)
 
Das Semikolon am Ende des for-Ausdrucks ist falsch.
 
omg... was für ein dummer fehler xD sorry... seh grade hatte unten sogar noch n Schreibfehler drinne :)
 
Gut, ich habe versucht es dich selber herausfinden zu lassen.... :rolleyes:. Dass hier immer sofort die ganze Lösung gepostet wird....

Übrigens immer die Fehlermeldungen vom Compiler genau lesen, dann kommt man schnell auf solche Fehler drauf!
 
Hm Nun läuft es Theoretisch, nur wieso gibts kein Ergebniss ?

Und noch eine frage wieso muss ich beim for ( ??? hier frei lassen bevor das ; kommt ? Hat das n Tiefen Sinn ?

Aktuelles Problem =

warum2.jpg
 
Warum gibt es kein Ergebnis: Tipp, welchen Wert hat n ?

Die erste Stelle in der for-Schleife ermöglicht eine das Platzieren einer Initialisierung. In deinem Fall ist z.B. a bereits durch scanf() initialisiert und muss nicht nochmal initialisiert werden.
 
Zuletzt bearbeitet:
Also in java würde da ein else fehlen. Sowieso würde ich nach dem if und den Statement eine Geschweifte klammer aufmachen.
 
Die for-Schleife wird dort initialisiert.

Beispiel:
for(int i=0;i<10;i++){

Da du jedoch a schon initialisiert hast, ist es nicht mehr notwendig.

Edit: Da war jemand schneller.
 
Eddie0150
Weiteres ein Tipp. Wenn du ein Programm ausprobierst, dann mit so einfachen Eingaben/Werten wie möglich. Dein Programm hat zum Beispiel keine Fehlerbehandlung. Würdest du zum Beispiel durch Null dividieren, würde das Programm wie in deinem Bild abstürzen. Am besten du gibst immer Eingaben ein, die du schon gerechnet hast und nachvollziehen kannst.

Weiteres ist es wichtig welche Datentypen du nimmst. In diesem Beispiel kommt ein Bruch vor. Du verwendest ein Integer, persönlich würde ich aber ein double nehmen falls es zu Brüchen oder ähnliches kommt.

Wichtig wenn du C Programmieren lernen willst musst du extrem genau sein und solltest von Anfang an einen sauberen Stil beibehalten und nicht schlampig einen Code von jemanden runterkopieren.
Lern zuerst mal was es für Datentypen gibt. Dann lern nach scanf und printf wie du mit if() schleifen Fehler wie Division durch Null abfängst.

Also C Programmieren ist schon etwas länger her, also ich werde fix Fehler haben aber :

statt

int z;
int n;
int a;
int X;

kannst du genauso alles aufeinmal initialisieren, obwohl ich selbst es auch so wie du mache und dann mit Kommentare dazuschreibe, was für Werte das sind.

int z, n, a; // Eingaben
und x würde ich als
double x; // Temp
Mir hat der Professor aber sogar auf die Finger gehaut, wenn ich die Werte sogar nicht mit Null imitiert habe, aber das ist kein Muss.

Weiteres
For-schleife

for( hier Startwert ; Abbruchbedingung; Operation )

Also in deinem Fall wird ja schon vor der for schleife der Wert a initialisiert, somit kannst du den ersten Parameter freihalten.
a>0 besagt, die Schleife wird solange nicht abgebrochen , solange a nicht 0 ist, somit solange a positiv ist. In deinem Beispiel wird die Schleife also 16 mal durchlaufen.

Somit wie schaut der erste Durchlauf aus ?

Wichtig ist, das jede Variable übrigens einen ordentlichen Namen bekommt. z für Zahl ist verständlich. Auch könnte man zahl schreiben. Man muss bedenken, wenn man ein Programm schreibt, sollte es man so schreiben, dass man nach Jahren den Code schnell wieder versteht, also am besten viele Kommentare schreiben.

int z, n, a; // Eingaben

Übrigens hast du beim scanf( "&d" , &n); wieder ein Fehler (scanf für den Teiler) und das ist auch der Grund wieso dein Programm abstürzt. Also sauberer arbeiten, das geht leider nur mit Übung.

Es wäre kein Fehler wenn du dir die Funktion printf oder scanf genauer anschaust.
Bsp
%d steht für integer (d eigentlich für eine Dezimalzahl)
& steht für Adressoperator. Wenn du das weißt, tippst du auch weniger falsch.
Denn dann tippst du scanf( und denkst dir, jetzt brauchst du hier den Platzhalter für die Eingabe also "%d" , und jetzt benötigst du einen Ort wo du die Eingabe abspeicherst also &n);

So jetzt zur for schleife zurück.

Bei jedem Durchlauf wird die Zahl z immer wieder abgefragt ob die Zahl Null ist. Das könnte man quasi als Fehlerbehandlung durchgehen lassen, aber in diesem Fall ist es eine Abbruchbedingung, die die Schleife Vorzeitig beenden soll, falls von der oberen Abbruchbedingung eigentlich noch Durchläufe möglich wären.

Jemand hat gesagt, in Java muss man else schreiben. Was ich weiß, musst du das in C nicht machen. Hier sind halt noch Ähnlichkeiten zu Fortran und ältere Programmiersprachen. C ist nun mal eine maschinennähere Programmierung wo man auch genau überlegen sollte wie und wo man was mit welchen Datentyp, Struktur ect abspeichern muss.
Persönlich würde ich auch schreiben

if(Bedingung) {
0Ausfürhung;
}
else {
1Ausführung;
}

Das liegt aber einfach daran dass man dann einen sauberen Stil hat und man sofort erkennt was Sache ist. Ich bin mir nicht sicher, aber eigentlich sollte es bei C auch ohne else auch funktionieren, aber es ist eben nicht übersichtlich.

Somit die for- schleife würde ich so schreiben.

for ( ; a > 0 ; a-- )
{
Z = 10 * ( z - n * x );

if ( z == 0 ){ // Nullabfrage
break ;
}
else {
x = z/n; // Operation
}
}

Also in java würde da ein else fehlen. Sowieso würde ich nach dem if und den Statement eine Geschweifte klammer aufmachen.
Muss eben nicht sein, weil wenn das if nicht ausgelöst wird, wird auch das break; übersprungen.

if(expression) statement;

Somit ist es nicht falsch wie in dem Beispiel zu schrieben

for ( ; a > 0 ; a-- )
{
Z = 10 * ( z - n * x );

if ( z == 0 ){ // Nullabfrage
break ;
}


x = z/n; // Operation

}

Zur Fehlerabfrage noch ein Beispiel
http://de.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturen#Do-While-Schleife

do {
printf( "zu teilende Zahl: ");
scanf("%d" , &z);

Printf("Teiler:");
scanf("%d" , &n);
}
while( z > 0 && n > 0);



Mit der While schleife könntest du jetzt zum Beispiel abfragen, ob die jeweiligen Eingaben größer Null sind (probiere mal aus ob das so stimmt).

Du könntest aber auch einfache if Abfragen machen
printf( "zu teilende Zahl: ");
scanf("%d" , &z);
if( z == 0){
printf("Fehler");
break; // nur wird hier das Programm dann einfach abgebrochen.
}

Sonst du könntest im ganzen Code auch printf("passX"); verteilen damit du falls dein Programm irgendwo ein Crash hat nachvollziehen kannst, wie weit dein Programm überhaupt kommt.

Zum Beispiel

int z;
int n;
int a;
int X;

printf( "zu teilende Zahl: ");
scanf("%d" , &z);

Printf("Teiler:");
scanf("%d" , &n);
.
.
.
printf ("Pass1");

}
while( z > 0 && n > 0)

for ( ; a > 0 ; a-- )
{
Z = 10 * ( z - n * x );

if ( z == 0 ){ // Nullabfrage
printf ("Pass2");
break ;
}


x = z/n; // Operation

}
printf ("Pass3");

du könntest dann einfach mit solchen kurzen printf("bin bei der Funktion bla bla"); ganz einfach mal so nachvollziehen, wieweit dein Programm kommt, bis du zu einem Fehler kommst.

Falls hier Fehler sind, tut es mir übrigens Leid ^^ Wenn man länger nicht mehr programmiert hat, fällt einem auch nicht gleich alles ein ^^ Also man sollte echt die Dinge immer wieder wiederholen und nur durch die Übung fällt einem das Programmieren leichter und verhindert Schreibfehler.
 
Zuletzt bearbeitet:
pipip schrieb:
Muss eben nicht sein, weil wenn das if nicht ausgelöst wird, wird auch das break; übersprungen.

if(expression) statement;

Somit ist es nicht falsch wie in dem Beispiel zu schrieben

Nein, falsch ist es auf keinen fall. Nur ich habe mir mittlerweile angewöhnt die geschweiften Klammern zu setzen. Denn sobald mehrere Statements getroffen werden, kann es zu Problemen kommen.

In dem Beispiel macht das if(z==0) break; sowieso keinen sinn, denn zu dieser Bedingnung kommt es sowies nicht. Denn der TE hat in seinem code vor der schleife schon die Berechnung

PHP:
x = z/n;

Denn sobald er Null eingibt, wird die Schleife nicht erreicht denn das Programm stürzt vorher ab.
 
Hades85 schrieb:
Nein, falsch ist es auf keinen fall. Nur ich habe mir mittlerweile angewöhnt die geschweiften Klammern zu setzen. Denn sobald mehrere Statements getroffen werden, kann es zu Problemen kommen.

In dem Beispiel macht das if(z==0) break; sowieso keinen sinn, denn zu dieser Bedingnung kommt es sowies nicht. Denn der TE hat in seinem code vor der schleife schon die Berechnung

PHP:
x = z/n;

Denn sobald er Null eingibt, wird die Schleife nicht erreicht denn das Programm stürzt vorher ab.

Der Fehler wieso der ganze Spaß nicht Funktioniert hat war übrigens Ausschließlich

"Übrigens hast du beim scanf( "&d" , &n); wieder ein Fehler (scanf für den Teiler) und das ist auch der Grund wieso dein Programm abstürzt. Also sauberer arbeiten, das geht leider nur mit Übung. "

Passe nun wesentlich mehr auf meine Schreibweiße an, muss erstmal mit den ganzen Sonderzeichen \{}[]()?}\ klar kommen die recht schnell zu tippen.

Übrigens pipip - wenn ich double x; mache kommt immer 0 raus, kann natürlich sein das ich dafür noch weitere passagen im Code ändern müsste aber soweit sogut :) hast mir aufjedenfall sehr geholfen.
 
Das war der einzige Syntaxfehler! Generell war aber die Berechnung von x=z/n ohne irgend eine Fehlerabfang nicht wirklich die beste Entscheidung. Auch wenn du erst ein Anfänger bist, musst du dir Gedanken machen, was könnte der "Dümmste anzunehmende User"(DAU) bei deinem Programm alles falsch machen^^

Daher ist die Abfrage mit der Eingabe des Teilers in eine While-Schleife zu setzen, in dem der User gezwungen ist nur Ganzzahlige Zahlen einzugeben die nicht Null sind.
 
Einmal eine andere Frage. Sind deine Formeln eigentlich richtig ? Hast du etwas auf dem Papier vorgerechnet und dann das Ergebnis mit deinem Programm verglichen ?

Wenn ich nämlich
z = 20;
n = 2;
a = 3;
x= 0;
eingebe, bekomme ich auch Null ^^

rechne mal

x = z/n;
z = 10 * (z- n*x);

Ergebnisse bekomme ich nur wenn ich Restbeträge habe.

Für die Zukunft wäre eine Angabe nie schlecht ^^ Aber ja keine Ahnung, habe mich da jetzt nicht soviel mit dem Beispiel beschäftigt.
 
Gut gemeinter Hinweis am Rande: ich habe mir jetzt nicht angeschaut, was dein Prgramm überhaupt tut oder tun soll, aber du solltest dir lieber direkt angewöhnen, deine Variablenbezeichner sprechend zu wählen, auch bei kleinen oder kleinsten Programmen.
 
Hatte es ein zu eins aus dem Buch Abgeschrieben , beim Beispiel ging es darum wie viele Briefe schon fertig sind und wie viele beim nachbarn abgegeben werden und nach wie vielen ich keine Briefmarken mehr hätte :0

hab das auch nur eher schlecht als recht verstanden aber ich bin der starken hoffnung das der AHA effekt bald eintritt.

mental.dIseASe, was genau meinst du :o ? meinst du z x usw ? :0 was würdest du anders machen ?
 
Naja, wenn irgendwo printf("Teiler: "); steht und dann eine Zahl eingelesen wird, dann sollte die nicht "n", sondern "teiler" heissen. ;) Dann sieht man schneller, worum es überhaupt geht.
 
Zurück
Oben