Brauche dringend hilfe?!
-
Also irgendwie finde ich die variablennamen am wenigsten schlimm..
Liegt vllt dran das ichs auch öfter mache ^^Aber ließ dir mal die printf-dinger durch
-
ja für programme die du nie mehr veränderst und in denen keine funktionen verwendet werden welche du in eigene libaries geschrieben hast etc. und vorallem für testzwecke kann man das ohne probleme machen. aber wenn man dann
aber mal an etwas größerem arbeitet und dann 100 mal die variable j in jeglicher
ausführung vorhanden ist (j_, _j, _1j, j_1, j1, j2... etc.) dann kennst du dich
später wenn du was verändern möchtest nüsse aus =b
-
^^ nicht das es falsch verstanden wird. Ich bin nicht der Meinung das man Variablen nicht gut benennen sollte. Ich bin nur der meinung, das es im Beispielcode das am wenigsten gravierende ist
-
Und teile dein Programm in Funktionen auf.
Die Länge einer Funktion sollte eine Seite (Bildschirm oder Papier) nicht überschreiten. Das wären dann 25 - 66 Zeilen.
Das erhöht die Übersichtlichkeit enorm.
Wenn du nicht weißt wie das geht, ist jetzt der Zeitpunkt zum lernen gekommen.
main() ist auch nur eine Funktion.
-
man kann Programme auch in Sinnlose funktionen aufteilen.
Aber es gibt einige stellen wo es Sinnvoll ist. Z.B. Beim berechnen der ganzen Flächen.Mir sieht das für eine Funkion auch nach extrem vielen if-abfragen aus. Genaueres dazu sagen kann man natürlich erst wenn der code lesbar ist.
Und auf meinen Bildschirm gehen 100 zeilen genau...
Hab mal versucht ein bischen quer zu lesen, und irgendwie besteht die ganze funktion fast nur aus ein und ausgaben, welche einzeiler sind. Ob man da irgendiwe sinnvoll andere funktionen draus machen kann.´
Geben wir ihm am besten erstmal die chance etwas an seinem code zu bessern. Er wird grade total mit infos überschüttet und weiß wahrscheinlich nimmer wo vorn und hinten ist...
-
So bin wieder da,
ja wie gesagt absolute laie (deswegen nicht vernünftig eingerückt)
und ist nur ein Übungs Programm das ich wohl mein Lebenlang
nicht mehr anfassen werde (deswegen die vielsagenden variablennamen)habs jetzt mal eingerückt hoffe ist halbwegs vernünftig, hab dabei
auch gleich den Fehler gefunden (Danke auf jedenfall für den tipp)
das hät ich mal von Anfang an machen sollen, gewöhn ich mír mal an.Hatte einfach ne } zuviel
Leider gibs da noch nen Fehler ganz unten im Prog und zwar will ich
abfragen ob noch eine Berechnung gemacht werden soll (wenn variable 'abfrage'=j)
dann an den anfang des Programms springen mit der do while SchleifeDie Frage erscheint auch im Bildschirm, nur findet keine abfrage statt, er überließt also den 'scanf' befehl, weiß mal wieder nicht weiter warum das so ist
, da Dev-C++ keinen Fehler ausgibt
wär nett wenn ihr euch das nochmal angucken könntet
die variable 'abfrage' ist in Zeile 9
und der überlesene 'scanf' befehl in Zeile 335hier das Prog:
[cpp]#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { //Hydraulik Rechner char abfrage; do { printf("\t\t\tHydraulik Rechner V1 by Johann"); printf("\n\nWas ist gegeben? '1' fuer Durchmesser, '2' fuer Flaeche, '3' fuer Mix: "); int z; scanf("%d", &z); if(z > 3) { printf("\n\nNimmst du Drogen??? Oder kannst du nicht lesen??? 1, 2 oder 3!!!\n\n\n"); } else { if(z == 3) { float a, b, c, d, i, j, k, s; printf("\nDurchmesser(d1)(mm) des Geberzylinder: "); scanf("%f", &a); printf("\nDurchmesser(d2)(mm) des Arbeitszylinders: "); scanf("%f", &b); printf("\nGib den gegebenen Weg ein, egal welchen Zylinders (mm): "); scanf("%f", &s); if(a < 0.1) { float o, p; printf("\nWenn nur ein Durchmesser gegeben ist, dann muss noch eine Flaeche gegeben sein!"); printf("\nGib ein wie gross ist diese Flaeche ist in quadrat mm: "); scanf("%f", &o); p=sqrt((o*4)/3.14159265358979323846264338327950); a=p; } else { float o, p; printf("\nWenn nur ein Durchmesser gegeben ist, dann muss noch eine Flaeche gegeben sein!"); printf("\nGib ein wie gross ist diese Flaeche ist in quadrat mm: "); scanf("%f", &o); p=sqrt((o*4)/3.14159265358979323846264338327950); b=p; } //Fläche A1 des Geberzylinders c=(3.14159265358979323846264338327950*(a*a))/4; //Fläche A2 des Arbeitszylinders d=(3.14159265358979323846264338327950*(b*b))/4; printf("\n\nFlaeche des Geberzylinders in quadrat mm betraegt = %.3f\n\n", c); printf("Flaeche des Arbeitszylinders in quadrat mm betraegt = %.3f\n\n", d); if(c < d) { i=d/c; j=s/3; } else { k=c/d; j=s*3; } printf("Der Weg des anderen Zylinders betraegt: %.3f\n\n", j); if(c < d) { printf("Das Verhaeltnis der Zylinder ist 1 zu %.3f\n\n", i); } else { printf("Das Verhaeltnis der Zylinder ist %.3f zu 1\n\n", k); } //Dateizeiger erstellen FILE *fp; //Datei öffnen fp = fopen("werte.txt", "wt"); if(fp == NULL) { printf("\n\nDatei konnte nicht geöffnet werden\n\n"); } else { //Schreibe zahlen in werte.txt fprintf(fp, "Durchmesser(d1) des Geberzylinders = %.3f mm\n\n", a); fprintf(fp, "Durchmesser(d2) des Arbeitszylinders = %.3f mm\n\n", b); fprintf(fp, "Gegebener Weg, egal welchen Zylinders ist = %.3f mm\n\n\n", s); fprintf(fp, "Flaeche des Geberzylinders = %.3f (quadrat)mm\n\n", c); fprintf(fp, "Flaeche des Arbeitszylinders = %.3f (quadrat)mm\n\n", d); if(c < d) { fprintf(fp, "Das Verhaeltnis der Zylinderflaechen ist 1 zu %.3f\n\n", i); } else { fprintf(fp, "Das Verhaeltnis der Zylinderflaechen ist %.3f zu 1\n\n", k); } fprintf(fp, "Der Weg des anderen Zylinders betraegt = %.3f mm\n", j); } // Zeilenumbruch hinzufuegen fputc(10, fp); fputc(10, fp); //Datei Schließen fclose(fp); } else { if(z < 2) { float a, b, c, d, i, j, k, s; printf("\nDurchmesser(d1)(mm) des Geberzylinder: "); scanf("%f", &a); printf("\nDurchmesser(d2)(mm) des Arbeitszylinders: "); scanf("%f", &b); printf("\nGib den gegebenen Weg ein, egal welchen Zylinders (mm): "); scanf("%f", &s); //Fläche A1 des Geberzylinders c=(3.14159265358979323846264338327950*(a*a))/4; //Fläche A2 des Arbeitszylinders d=(3.14159265358979323846264338327950*(b*b))/4; printf("\n\nFlaeche des Geberzylinders in quadrat mm betraegt = %.3f\n\n", c); printf("Flaeche des Arbeitszylinders in quadrat mm betraegt = %.3f\n\n", d); if(c < d) { i=d/c; j=s/3; } else { k=c/d; j=s*3; } printf("Der Weg des anderen Zylinders betraegt: %.3f\n\n", j); if(c < d) { printf("Das Verhaeltnis der Zylinder ist 1 zu %.3f\n\n", i); } else { printf("Das Verhaeltnis der Zylinder ist %.3f zu 1\n\n", k); } //Dateizeiger erstellen FILE *fp; //Datei öffnen fp = fopen("werte.txt", "wt"); if(fp == NULL) { printf("\n\nDatei konnte nicht geöffnet werden\n\n"); } else { //Schreibe zahlen in werte.txt fprintf(fp, "Durchmesser(d1) des Geberzylinders = %.3f mm\n\n", a); fprintf(fp, "Durchmesser(d2) des Arbeitszylinders = %.3f mm\n\n", b); fprintf(fp, "Gegebener Weg, egal welchen Zylinders ist = %.3f mm\n\n\n", s); fprintf(fp, "Flaeche des Geberzylinders = %.3f (quadrat)mm\n\n", c); fprintf(fp, "Flaeche des Arbeitszylinders = %.3f (quadrat)mm\n\n", d); if(c < d) { fprintf(fp, "Das Verhaeltnis der Zylinderflaechen ist 1 zu %.3f\n\n", i); } else { fprintf(fp, "Das Verhaeltnis der Zylinderflaechen ist %.3f zu 1\n\n", k); } fprintf(fp, "Der Weg des anderen Zylinders betraegt = %.3f mm\n", j); } // Zeilenumbruch hinzufuegen fputc(10, fp); fputc(10, fp); //Datei Schließen fclose(fp); //Falls Fläche schon gegeben } else { if(z = 2) { float e, f, g, h, l, m, n, t; printf("\nFlaeche(A1)(quadrat mm) des Geberzylinders: "); scanf("%f", &e); printf("\nFlaeche(A2)(quadrat mm) des Arbeitszylinders: "); scanf("%f", &f); printf("\nGib den gegebenen Weg ein, egal welchen Zylinders (mm): "); scanf("%f", &t); //Durchmesser D1 von Fläche A2 g=sqrt((e*4)/3.14159265358979323846264338327950); //Durchmesser D2 von Fläche A2 h=sqrt ((f*4)/3.14159265358979323846264338327950); printf("\n\nDurchmesser des Geberzylinders in(mm) betraegt = %.3f\n\n", g); printf("Durchmesser des Arbeitszylinders in(mm) betraegt = %.3f\n\n", h); if(e < f) { l=f/e; n=t/3; } else { m=e/f; n=t*3; } printf("Der Weg des anderen Zylinders betraegt: %.3f\n\n", n); if(e < f) { printf("Das Verhaeltnis der Zylinder ist 1 zu %.3f\n\n", l); } else { printf("Das Verhaeltnis der Zylinder ist %.3f zu 1\n\n", m); } //Dateizeiger erstellen FILE *fp; //Datei öffnen fp = fopen("werte.txt", "wt"); if(fp == NULL) { printf("\n\nDatei konnte nicht geöffnet werden\n\n"); } else { //Schreibe zahlen in werte.txt fprintf(fp, "Flaeche(A1) des Geberzylinders = %.3f (quadrat)mm\n\n", e); fprintf(fp, "Flaeche(A2) des Arbeitszylinders = %.3f (quadrat)mm\n\n", f); fprintf(fp, "Gegebener Weg, egal welchen Zylinders ist = %.3f mm\n\n\n", t); fprintf(fp, "Durchmesser des Geberzylinders = %.3f mm\n\n", g); fprintf(fp, "Durchmesser des Arbeitszylinders = %.3f mm\n\n", h); if(e < f) { fprintf(fp, "Das Verhaeltnis der Zylinderflaechen ist 1 zu %.3f\n\n", l); } else { fprintf(fp, "Das Verhaeltnis der Zylinderflaechen ist %.3f zu 1\n\n", m); } fprintf(fp, "Der Weg des anderen Zylinders betraegt = %.3f mm\n", n); } // Zeilenumbruch hinzufuegen fputc(10, fp); fputc(10, fp); //Datei Schließen fclose(fp); } } } } printf("\nWillst du noch eine Berechnung machen? 'j' fuer ja 'n' fuer nein: "); scanf("%c", &abfrage); }while(abfrage == 'j'); //Hinweis printf("\n\nAlles wichtige findest du in werte.txt\n\n"); system("Pause"); system("cls"); printf("\n\n\n\n\t\t\t\tTschau ich bin raus\n\n\n\n\n\n\n"); system("PAUSE"); return 0; }[/cpp]
gruss DeeJayExTasy
-
mit std flush (musst mal googlen) musst den buffer von scanf leer machen... Dann fragt der wieder ab.
Noch als Tipp: Als anfänger ist es besonders wichtig gute Variablennamen zu wählen und richtig einzurücken...
-
Danke für die ganzen tipps
ich werde auf jedenfall versuchen in meinen nächsten Projekten eure tipps
zu beherzigen, alles in funktionen aufzuteilen ist bestimmt ganz sinnvoll,
ich werde versuchen mir das schnellst möglich anzueignen.Ehrlich gesagt hab ich erst vor zwei wochen angefangen mit dem Selbststudium
und da ich nebenbei meinen Techniker mache, habe ich nicht so viel zeit
abends. Ich wollte das Prog halt zur übung nehmen, da ich der Meinung bin
das ich nur vom lesen den Umgang mit ner Programmiersprache nicht in meinen
Kopf bekomm.Aber cool das ihr mich so nett aufgenommen habt und reichlich tipps für mich
in der hinterhand habt.greetz DeeJay|E
-
Guck dir mal an wie lang ich dabei bin. Und guck dir mal an was ich hier damals für sachen geschrieben habe.
Man wächst auf jedenfall an aufgaben. Alles was ich dir jetzt beantworten kann habe ich hier gelernt. Hab viele sachen einfach mal ausprobiert die ich hier gelesen habe.
Hier mitzulesen und versuchen das was man liest zu begreifen und es mal auszuprobieren bringt dir extrem viel mehr als das beste Buch.
Programmieren lernen ist auf jedenfall etwas was nur in der Praxis geht...hab für dich auch mal google angewendet...
such mal nach flush(stdin)... am besten auch mal über die Forensuche. Das scheint der richtige ansatz zu sein. Genau das problem hatte ich auch mal. Finde nur leider den snippet nimmer wieder....
-
Jetzt gehts endlich
danke nochmal für die hilfe,
hab jetzt mit dem Befehl 'fflush(stdin);' vor 'scanf' den Buffer geleert
und jetzt funzt das Prog so wie ich es will.(Notiz für mich, das Prog übersichtlicher machen
)
greetz DeeJay|E
-
^^ mist, ich habs auch grade gefunden...
fflush geht auf stdin und auch auf stdout...Damals habe ich beides gemacht...
Musste da für ne Navigation nen int einlesen...
-
fflush(stdin) kann undefiniertes Verhalten erzeugen, das nur mal am Rande...
-
brauchst dich nicht ärgern Sqwan (wegen ^^mist)
das war bestimmt nicht das letzte mal das ich hilfe brauch
@GPC
was meinst du damit undefiniertes Verhalten? das Prog macht auf jedenfall
das was ich wollte.DeeJay|E
-
deejayextasy schrieb:
@GPC
was meinst du damit undefiniertes Verhalten? das Prog macht auf jedenfall
das was ich wollte.Damit meine ich, dass es sich auch ganz anders verhalten kann... z.B. einfach abstürzen oder müll in den Stream schreiben, etc. Das Verhalten ist eben undefiniert. Das es jetzt bei dir funktioniert ist zwar schön, aber keineswegs garantiert.
Eine sichere Variante wäre:
void safe_flush() { int c; while ((c = getchar()) != '\n' && c != EOF); }
-
GPC schrieb:
fflush(stdin) kann undefiniertes Verhalten erzeugen, das nur mal am Rande...
fflush(stdin) kann nicht undefiniertes Verhalten erzeugen sondern erzeugt undefiniertes Verhalten.
-
Hm... hab ich auch schon gelesen online. Hab aber noch nie fehlverhalten gehabt.
Da GPC aber eine gute version gezeigt hat, benutz einfach diese. Die stört dich ja nicht. Und wenn du nicht immer die Funktino drin haben willst, lager sie in einen Header aus... ^^ Wenn du mal so weit bist...
-
Sqwan schrieb:
}}}}} while(abfrage == 'j');
Es schrieb doch grade jemand: Das while gehöhrt direkt an die klammer nicht 2 zeilen drunter
In C ist es egal, ob du ein Leerzeichen oder 10 leere Zeilen schreibst.