Brauche dringend hilfe?!



  • Hy Community,

    bin ganz neu hier und muss euch auch gleich erstmal ein Geständnis machen
    und zwar bin ich im C Programmieren noch eine absolute Laie.
    Hab mir das im Selbststudium ein bißchen beigebracht, deswegen werdet ihr
    bestimmt über meine Prog'z lachen 😞 , aber ich hoffe ihr blickt da durch und könnt mir evtl. sogar helfen.

    Ich fang einfach mal an und zwar wollte ich zur Übung
    ein kleines Programm schreiben zum Berechnen verschiedener Sachen, die
    wir im Hydraulik Unterricht brauchen.

    Am Anfang habe ich eine Abfrage geschrieben was gegeben ist
    die möglichkeiten sind:

    Durchmesser des G. Zylinders, A. Zylinders und den zurückgelegten Weg eines der Zylinder = 1

    Fläche des G. Zylinders, A. Zylinders und den zurückgelegten Weg eines der Zylinder = 2

    Mix also wenn ein Durchmesser und eine Fläche gegeben sind + zurückgelegter Weg eines der Zylinder = 3

    Das ist aber nicht mein problem, das funktioniert soweit, nur wollte ich am ende des Programms eine abfrage haben die es ermöglicht zum Anfang des
    Programms zu springen, wenn man eine weitere Aufgabe rechnen möchte.

    Das wollte ich mit einer do while Schleife realisieren, aber seitdem ich die drin habe sagt mir der Compiler (Dev-C++) " Syntax Error before printf " in
    Zeile 282. Ich find einfach den Fehler nicht, bin schon am verzweifeln.

    Hier erstmal das Programm: (Hab Zeile 282 dick geschrieben)

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      //Hydraulik Rechner
    
      char abfrage;
    
      do 
      {
    
      printf("\t\t\tHydraulik Rechner V1");
      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);
    
    }}}}
    
      //Hinweis
     [b] printf("\n\nAlles wichtige findest du in werte.txt\n\n");[/b]
    
      system("Pause");
    
      system("cls");
    
    }
    
      printf("\nWillst du noch eine Berechnung machen? 'j' fuer ja 'n' fuer nein: ");
      scanf("%c", &abfrage);
    
      while(abfrage == 'j');
    
      printf("\n\n\n\n\t\t\t\tTschau ich bin raus\n\n\n\n\n\n\n");
    
      system("PAUSE");	
      return 0;
    }
    

    ich hoffe ihr könnt mir helfen
    danke schonmal

    gruss <<DeeJay||ExTasy>>



  • Bei einer do while schleife musst du die while bedinung unmittelbar hinter dem ende der do schleife schreiben!!
    also:

    do
    {
       //mach was
    }while(Bedinung)
    

    lg



  • Danke für die schnelle antwort, habs ausprobiert
    scheint auch richtig zu sein, aber wenn ich das kompillieren will
    dann gibt er mir den selben fehler einbißchen weiter unten an, in der Zeile

    printf("\nWillst du noch eine Berechnung machen? 'j' fuer ja 'n' fuer nein: ");
    

    so sieht das Prog jetzt aus:

    #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);
    
    }}}} 
    
      while(abfrage == 'j');
    
      //Hinweis
      printf("\n\nAlles wichtige findest du in werte.txt\n\n");
    
      system("Pause");
    
      system("cls");
    
    }
    
      printf("\nWillst du noch eine Berechnung machen? 'j' fuer ja 'n' fuer nein: ");
      scanf("%c", &abfrage);
    
      printf("\n\n\n\n\t\t\t\tTschau ich bin raus\n\n\n\n\n\n\n");
    
      system("PAUSE");	
      return 0;
    }
    

    was genau heißt eigentlich Syntax Error?

    gruss DeeJay|E



  • Ein "Syntax Error" tritt auf wenn eine grammatische Regel verletzt wird.
    Wenn Du deinen Code jetzt noch vernünftig einrücken würdest könnte man ihn auch lesen - und eventuell auch gleich den Fehler finden.

    zB.:

    int main()
    {
      while (x)
      {
        do_bla();
        do_blo();
        if (lol)
          break;
      }
    
      do_asdf();
      return 0;
    }
    


  • rück das mal vernünftig ein und mach cpp tags drum... wer soll denn da druchblicken. 100 schließende } hintereinander...

    In function 'main':
    Line 48: warning: incompatible implicit declaration of built-in function 'sqrt'
    Line 60: warning: incompatible implicit declaration of built-in function 'sqrt'
    Line 220: warning: incompatible implicit declaration of built-in function 'sqrt'
    Line 292: error: expected 'while' before 'printf'

    }  
    
      // Zeilenumbruch hinzufuegen
        fputc(10, fp);
        fputc(10, fp);
    
      //Datei Schließen
      fclose(fp);
    
    }}}} 
    
      while(abfrage == 'j');
    

    Es schrieb doch grade jemand: Das while gehöhrt direkt an die klammer nicht 2 zeilen drunter

    EDIT: Da war jemand schneller.
    Wenn man ganze Fehlermeldungen postet und nicht das was man denkt was dort steht, oder irgendwelche ausschnitte macht es das auch leichter... Denn da steht ja bei was falsch ist.



  • Habe das while jetzt unmittelbar hinter der Klammer, aber es ist immer noch der selbe Fehler, die einzige Fehlermeldung die ich bekomme ist

    Line 292 Auto- Hydraulik\main.c syntax error before "printf"

    sonst scheint alles zu funktionieren, ich muss jetzt leider weg,
    sobald ich das vernünftig eingerückt habe poste ich das hier nochmal.

    danke auf jedenfall für die tipps

    gruss DeeJay|E



  • ich sehe einige fehler auf den ersten blick, einer der schlimmsten:

    innerhalb der äussersten do-while schleife

    do 
      {
    
      printf("\t\t\tHydraulik Rechner V1");
      printf("\n\nWas ist gegeben? '1' fuer Durchmesser, '2' fuer Flaeche, '3' fuer Mix: ");
    
      int z;  // ja nicht =b
    
      scanf("%d", &z);
    

    deklariere die variablen am anfang des programmes... und vergebe sinnvolle variablen-namen... wäre einfacher für andere dann zu lesen =b



  • 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 Schleife

    Die 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 335

    hier 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


Anmelden zum Antworten