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.