Code Verbesserung in Rechenprog.

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Code Verbesserung in Rechenprog.

Beitrag von +Fuss+ » Mi Nov 19, 2008 10:10 pm

So
Ich hab mein Rechenprogramm mal ein bisschen übersichtlicher gestaltet! Was könnte ich noch verbessern?

Hier der alte Code mit vielen goto's

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>
#include <math.h>

#define quadrat(a) (a)*(a)

int main ()
{
int rechenart, summand1, summand2, minuend, subtrahend, faktor1, faktor2, zahl, flaeche1, flaeche2, laenge1, laenge2, laenge3;
double dividend, divisor, eingabe, wurzel, prozent, prozentsatz;


ende:
rechenart = 100;
while (rechenart > 9) 
	{
	printf ("\nDer Taschenrechner\n0 = Beenden\n\nWaehlen Sie die Rechenart aus:\n1 = Plus\n2 = Minus\n3 = Mal\n4 = Geteilt\n5 = Quadrieren\n6 = Quadratwurzel ziehen\n7 = Prozentwert berechnen\n8 = Flaecheninhalt berechnen\n9 = Rauminhalt berechnen\n");
	scanf ("%d", &rechenart); //Auswählen der Rechenart
	}

if (rechenart == 0) goto endeende;
if (rechenart == 1) goto plus;
if (rechenart == 2) goto minus;
if (rechenart == 3) goto mal;
if (rechenart == 4) goto geteilt;
if (rechenart == 5) goto quadrieren;
if (rechenart == 6) goto wurzel;
if (rechenart == 7) goto prozent;
if (rechenart == 8) goto inhalt;
if (rechenart == 9) goto inhalt2;

plus:
	{
	printf ("Summanden eingeben: "); //Plus
	scanf ("%d %d", &summand1, &summand2);
	printf ("%d + %d = %d\n", summand1, summand2, summand1+summand2);
	goto ende;
	}


minus:
	{
	printf ("Minuend und Subtrahend eingeben: "); //Minus
	scanf ("%d %d", &minuend, &subtrahend);
	printf ("%d - %d = %d\n", minuend, subtrahend, minuend-subtrahend);
	goto ende;
	}
	

mal:
	{
	printf ("Faktoren eingeben: "); //Mal
	scanf ("%d %d", &faktor1, &faktor2);
	printf ("%d * %d = %d\n", faktor1, faktor2, faktor1 * faktor2);
	goto ende;
	}
	
geteilt:
	{
	printf ("Dividend und Divisor eingeben: "); //Geteilt
	scanf ("%lf %lf", &dividend, &divisor);
	printf ("%.2f / %.2f = %f\n", dividend, divisor, dividend / divisor);
	goto ende;
	}

quadrieren:
	{
	printf ("Geben Sie die Zahl ein die quadriert werden soll: ");
	scanf ("%d", &zahl);                       //Eingabe der Zahl
	printf ("Ergebnis: %d", quadrat(zahl));    //Rechenvorgang + Ausgabe des Ergebnisses
	goto ende;
	}

wurzel:
	{
	printf ("Geben Sie die Zahl ein, deren Wurzel gezogen werden soll: ");
	scanf ("%lf", &eingabe);
	wurzel = sqrt (eingabe);
	printf ("Ergebnis: %f\n", wurzel);
	goto ende;
	}

prozent:
	{
	printf ("Geben Sie den Grundwert und den Prozentsatz ein: ");
	scanf ("%lf %lf", &prozent, &prozentsatz);
	printf ("Prozentwert: %f\n", prozent / 100 * prozentsatz);
	goto ende;
	}

inhalt: //Flächeninhalt
	{
	printf ("Geben Sie die Seitenlaengen an: ");
	scanf ("%d %d", &flaeche1, &flaeche2);
	printf ("Flaecheninhalt: %d", flaeche1 * flaeche2);
	goto ende;
	}

inhalt2: //Rauminhalt
	{
	printf ("Geben Sie Laenge Breite Hoehe an: ");
	scanf("%d %d %d", &laenge1, &laenge2, &laenge3);
	printf ("Rauminhalt: %d", laenge1 * laenge2 * laenge3);
	goto ende;
	}

getch();
endeende:
return 0;
}
und hier der verbesserte Code mit switch

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
int i, rechenart, summand1, summand2, minuend, subtrahend, faktor1, faktor2, quadrat, laenge1, laenge2, laenge, breite, hoehe;
double dividend, divisor, ausgang, wurzel, grundwert, prozentsatz;

printf ("--------------------------------------Fuss--------------------------------------");
while (i != 0)
{
rechenart = 10000;
while (rechenart > 9) 
	{
	printf ("\n\nDer Taschenrechner\n0 = Beenden\n\nWaehlen Sie die Rechenart aus:\n1 = Plus\n2 = Minus\n3 = Mal\n4 = Geteilt\n5 = Quadrieren\n6 = Quadratwurzel ziehen\n7 = Prozentwert berechnen\n8 = Flaecheninhalt berechnen\n9 = Rauminhalt berechnen\n");
	scanf ("%d", &rechenart); //Auswählen der Rechenart
	}
	
switch (rechenart)
{
case 0: 
	{
	printf ("--------------------------------------Fuss--------------------------------------");
	i = 0;
	getch();
	break;
	}
case 1:
	{
	printf ("Summanden eingeben: "); //Plus
	scanf ("%d %d", &summand1, &summand2);
	printf ("%d + %d = %d\n", summand1, summand2, summand1 + summand2);
	getch();
	break;
	}
case 2:
	{
	printf ("Minuend und Subtrahend eingeben: "); //Minus
	scanf ("%d %d", &minuend, &subtrahend);
	printf ("%d - %d = %d\n", minuend, subtrahend, minuend - subtrahend);
	getch();
	break;
	}
case 3:
	{
	printf ("Faktoren eingeben: "); //Mal
	scanf ("%d %d", &faktor1, &faktor2);
	printf ("%d * %d = %d\n", faktor1, faktor2, faktor1 * faktor2);
	getch();
	break;
	}
case 4:
	{
	printf ("Dividend und Divisor eingeben: "); //Geteilt
	scanf ("%lf %lf", &dividend, &divisor);
	printf ("%.2f / %.2f = %f\n", dividend, divisor, dividend / divisor);
	getch();
	break;
	}
case 5:
	{
	printf ("Geben Sie die Zahl ein die quadriert werden soll: ");
	scanf ("%d", &quadrat);                       //Eingabe der Zahl
	printf ("Ergebnis: %d", quadrat * quadrat);    //Rechenvorgang + Ausgabe des Ergebnisses
	getch();
	break;
	}
case 6:
	{
	printf ("Geben Sie die Zahl ein, deren Wurzel gezogen werden soll: ");
	scanf ("%lf", &ausgang);
	wurzel = sqrt (ausgang);
	printf ("Ergebnis: %f\n", wurzel);
	getch();
	break;
	}
case 7:
	{
	printf ("Geben Sie den Grundwert und den Prozentsatz ein: ");
	scanf ("%lf %lf", &grundwert, &prozentsatz);
	printf ("Prozentwert: %f\n", grundwert / 100 * prozentsatz);
	getch();
	break;
	}
case 8:
	{
	printf ("Geben Sie die Seitenlaengen an: ");
	scanf ("%d %d", &laenge1, &laenge2);
	printf ("Flaecheninhalt: %d", laenge1 * laenge2);
	getch();
	break;
	}
case 9:
	{
	printf ("Geben Sie Laenge Breite Hoehe an: ");
	scanf("%d %d %d", &laenge, &breite, &hoehe);
	printf ("Rauminhalt: %d", laenge * breite * hoehe);
	getch();
	break;
	}
}
}
return 0;
}
bei weiteren Verbesserungstipps bitte an mich wenden.
Ob das neue Prog. mit Vista funktioniert weiß ich nicht.
MfG +Fuss+

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Code Verbesserung in Rechenprog.

Beitrag von nufan » Mi Nov 19, 2008 10:31 pm

Goto sollte man in einem Programm lieber nicht verwenden, da man damit auch ganz schön Mist bauen kann :)
Gerade in deinem Programm kann man das Problem leicht mit Funktionen umgehen.

Außerdem kannst du dir ein paar Variablen sparen. Für Addition, Subtraktion und Multiplikation hast du insgesamnt 6 Variablen, wobei 2 doch auch reichen würden. Der einzige Unterschied zwischen den Rechenarten ist das Rechenzeichen.
Aber wenn du Funktionen verwendest, wirst du sie wahrscheinlich sowieso dort deklarieren.

Code: Alles auswählen

rechenart = 100;
while (rechenart > 9) 
Ok, das funktioniert, ist aber nicht besonders schön. ;)
Wenn du willst, dass die Schleife mindestens ein Mal durchläuft, kannst du eine do-while-Schleife verwenden. Also in etwa so:

Code: Alles auswählen

do
{
  printf ("\nDer Taschenrechner\n0 = Beenden\n\nWaehlen Sie die Rechenart aus:\n1 = Plus\n2 = Minus\n3 = Mal\n4 = Geteilt\n5 = Quadrieren\n6 = Quadratwurzel ziehen\n7 = Prozentwert berechnen\n8 = Flaecheninhalt berechnen\n9 = Rauminhalt berechnen\n");
  scanf ("%d", &rechenart); //Auswählen der Rechenart
}while (rechenart > 9);

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Code Verbesserung in Rechenprog.

Beitrag von +Fuss+ » Do Nov 20, 2008 3:43 pm

Ja das mit demg goto war auch ein bisschen verwirrend.

das mit dem do {} while wäre ja kein Problem, aber ich möchte ja, dass nach dem berechnen nochmal alles von vorne anfängt, deswegen hab ich die Variable rechenart auf hundert oder so gesetzt, weil sonst immer wieder der selbe Rechenbefehl ausgeführt wird und ich nicht weiß, wie ich eine Variable zurücksetzte.

Am Anfang hatte ich auch nur 3 int variablen, un 2 double, aber als ich gcc drüber laufen lies, kamen mehr als 20 Fehlermeldungen. Nach dem Umschreiben auf mehrere Var. kam keine mehr...

MfG +Fuss+

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Code Verbesserung in Rechenprog.

Beitrag von Dirty Oerti » Do Nov 20, 2008 3:47 pm

Setze die do{}while Schleife einfach um das komplette Programm :)
Variablen zurücksetzen...naja, in deinem Fall wäre das wohl:

Code: Alles auswählen

int variable;
(...)

variable = 0;
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Code Verbesserung in Rechenprog.

Beitrag von +Fuss+ » Do Nov 20, 2008 4:58 pm

ja aber wenn ich die Variable auf Null setze, dann wird das Prog. ja beendet, weil 0 ja auch unter switch zum Beenden aufgeführt ist. Ich würde aber gerne die Var. so zurücksetzen, das sie keinen Wert hat (wie ganz am Anfang des Programms)...

MfG +Fuss+

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Code Verbesserung in Rechenprog.

Beitrag von Dirty Oerti » Do Nov 20, 2008 5:06 pm

Es gibt keinen "kein Wert".
"kein Wert" ist im Endeffekt entweder 0 oder irgendeine zufällige Zahl :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Code Verbesserung in Rechenprog.

Beitrag von +Fuss+ » Do Nov 20, 2008 5:14 pm

Ich hab jetzt ales in die do while schleife reingepackt und die Var. i weggelassen.

Wenn ich der variable rechenart aber 0 zuweise, dann weiß der rechner ja das es eindeutig null ist und beendet dann das Prog.
ganz am Anfang weiß der Rechner ja nicht ob rechenart = 0 ist.
aber wenn ich rechenart = 0 einfüge, dann wird das Prog. bei erreichen diese Schrittes beendet und das will ich ja nicht,

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Code Verbesserung in Rechenprog.

Beitrag von Dirty Oerti » Do Nov 20, 2008 5:24 pm

Dann setz es doch auf 10 oder so? :)
Irgendeinen freien Wert halt :)

Das im Endeffekt kommt:
0 -> Beenden
1-> Rechenart (z.B. Addieren)
2-> z.B. Subtrahieren
3-> z.B. Multiplizieren
etc ...
99-> Nochmal rechnen
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Code Verbesserung in Rechenprog.

Beitrag von +Fuss+ » Do Nov 20, 2008 5:36 pm

Ja hab ich ja:
Ok, das funktioniert, ist aber nicht besonders schön. ;)

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Code Verbesserung in Rechenprog.

Beitrag von nufan » Do Nov 20, 2008 6:07 pm

Ich versteh das Problem nicht ganz... warum liest du nicht jeden Durchgang neu ein?
Ich würde das Programm ungefähr so schreiben:

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>
#include <math.h>

void addieren ();
void subtrahieren ();
void multip ();
void divid ();
void quadrat ();
void wurzel ();
void prozent ();
void flaeche ();
void raum ();

int main ()
{

  int reart;

  do
  {

    clrscr ();

    printf ("\nDer Taschenrechner\nWaehlen Sie die Rechenart aus:\n");
    printf ("1 = Plus\n2 = Minus\n3 = Mal\n4 = Geteilt\n5 = Quadrieren\n6 = Quadratwurzel ziehen\n7 ");
    printf ("= Prozentwert berechnen\n8 = Flaecheninhalt berechnen\n9 = Rauminhalt berechnen\n\n0 = Beenden\n\n");

    scanf ("%d", &reart);


    switch (reart)
    {

      case 1: addieren ();
              break;

      case 2: subtrahieren ();
              break;

      case 3: multip ();
              break;

      case 4: divid ();
              break;

      case 5: quadrat ();
              break;

      case 6: wurzel ();
              break;

      case 7: prozent ();
              break;

      case 8: flaeche ();
              break;

      case 9: raum ();
              break;

      case 0: printf ("\n\nTaste druecken zum Beenden.");
              break;

      default: printf ("\n\nFalsche Eingabe. Taste druecken fuer neue Eingabe.\n");
               break;

    }


    getch ();

  }while (reart != 0);

  return 0;

}


void addieren ()
{

  int z1, z2;

  printf ("\nSummand 1: ");
  scanf ("%d", &z1);

  printf ("Summand 2: ");
  scanf ("%d", &z2);

  printf ("Ergebnis: %d\n", (z1 + z2));

}


void subtrahieren ()
{

  int z1, z2;

  printf ("\nMinuend: ");
  scanf ("%d", &z1);

  printf ("Subtrahent: ");
  scanf ("%d", &z2);

  printf ("Ergebnis: %d\n", (z1 - z2));

}


void multip ()
{

  int z1, z2;

  printf ("\nFaktor 1: ");
  scanf ("%d", &z1);

  printf ("Faktor: ");
  scanf ("%d", &z2);

  printf ("Ergebnis: %d\n", (z1 * z2));

}


void divid ()
{

  double z1, z2;

  printf ("\nDividend 1: ");
  scanf ("%lf", &z1);

  printf ("Divisor 2: ");
  scanf ("%lf", &z2);

  printf ("Ergebnis: %.2lf\n", (z1 / z2));

}


void quadrat ()
{

  int z;

  printf ("\nBasis: ");
  scanf ("%d", &z);

  printf ("Ergebnis: %d\n", (z * z));

}


void wurzel ()
{

  double z;

  printf ("\nRadikant: ");
  scanf ("%lf", &z);

  printf ("Ergebnis: %.2lf\n", sqrt(z));

}


void prozent ()
{

  double g, ps;

  printf ("\nGrundwert: ");
  scanf ("%lf", &g);

  printf ("Prozentsatz: ");
  scanf ("%lf", &ps);

  printf ("Ergebnis: %.2lf", (g / 100 * ps));

}


void flaeche ()
{

  int s1, s2;

  printf ("\nSeite 1: ");
  scanf ("%d", &s1);

  printf ("Seite 2: ");
  scanf ("%d", &s2);

  printf ("Ergebnis: %d", (s1 * s2));

}


void raum ()
{

  int s1, s2, s3;

  printf ("\nSeite 1: ");
  scanf ("%d", &s1);

  printf ("Seite 2: ");
  scanf ("%d", &s2);

  printf ("Seite 3: ");
  scanf ("%d", &s3);

  printf ("Ergebnis: %d", (s1 * s2 * s3));

}

Antworten