Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Taschenrechner in C nich in C++

Hallo,
wir sollen für Informatik einen Taschenrechner programmieren.
Dies in C und nicht in C++ !

Ich habe bis jetzt folgenden Code, der nicht funktioniert, woran liegt das



#include <stdio.h>  // Einbindung der STANDARDINPUTOUTPUTLIBRARY
#include <stdlib.h> // Einbindung der STANDARDLIBRARY
// Leere Zeile
// Leere Zeile
// Leere Zeile
float addition (float a, float b) // Funktion zur Addition
{ // Anfang von Auflistung der Anweisungen
      float c ; // Variable für Ergebnis
      c = a + b ; // Definiert 'c'
      return c ; // Gibt das Ergebnis 'c' zurück
} // Ende von Auflistung der Anweisungen
// Leere Zeile
float subtraktion (float a, float b) // Funktion zur Subtraktion
{ // Anfang von Auflistung der Anweisungen
      float c ; // Variable für Ergebnis
      c = a - b ; // Definiert 'c'
      return c ; // Gibt das Ergebnis 'c' zurück
} // Ende von Auflistung der Anweisungen
// Leere Zeile
float multiplikation (float a, float b) // Funktion zur Multiplikation
{ // Anfang von Auflistung der Anweisungen
      float c ; // Variable für Ergebnis
      c = a * b ; // Definiert 'c'
      return c ; // Gibt das Ergebnis 'c' zurück
} // Ende von Auflistung der Anweisungen
// Leere Zeile
float division (float a, float b) // Funktion zur Division
{ // Anfang von Auflistung der Anweisungen
      float c ; // Variable für Ergebnis
      c = a / b ; // Definiert 'c'
      if (b!=0) // Verhindert, dass duch '0' geteilt werden kann
      { // Anfang von Auflistung der Anweisungen
               return c; // Gibt das Ergebnis 'c' zurück
      } // Ende von Auflistung der Anweisungen
      if (b=0) // Verhindert, dass duch '0' geteilt werden kann
      { // Anfang von Auflistung der Anweisungen
              printf ("Hat Dr dein Mathelehrer nicht beigebracht, dass amn nicht durch 0 teilen kann ?!") ; // Gibt Tex auf dem Boödschorm aus
              system ("PAUSE") ; // Bewirkt, dass der Benutzer eine beliebige Taste drücken soll
      } // Ende von Auflistung der Anweisungen
} // Ende von Auflistung der Anweisungen
// Leere Zeile
// Leere Zeile
// Leere Zeile
// Leere Zeile
int main() // Anweisungen der Hauptfunktion
{ // Anfang von Auflistung der Anweisungen
    system("color 4F"); // Verändert Hintergrunds- und Schriftfarbe
    float a ; // Definiert 'a'
    float b ; // Definiert 'b'
    char op ; // Gibt an, dass die Operatorn enzelne Zeichen sind
    float end ; // Ich habe keine Ahnung, was das bedeutet !
// Leere Zeile   
    printf ("Geben Sie hier ihre Rechnung ein   :  "); // Gibt Text auf dem Bildschirm aus
        while (op!='#')
    {
        scanf ("%f %op %f , &a , &op , &b") ; // Liest Benutzereingaben ein
        getchar () ; // Wartt auf Benutzerinteraktion
// Leere Zeile   
        if (op == '+')
        {
              end = addition (a,b) ;
        }
// Leere Zeile   
        if (op == '-')
        {
              end = subtraktion (a,b) ;
        }
// Leere Zeile
        if (op == '*')
        {
              end = multiplikation (a,b) ;
        }
// Leere Zeile
        if (op == '/')
        {
              end = division (a,b) ;
        }
}
// Leere Zeile
        if (op == '#')
        {
               end
        }
        return 0 ;





Danke im Vorraus
Gruß

tb


Antworten zu Taschenrechner in C nich in C++:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Was mir gerade so spontan auffällt:

scanf ("%f %op %f , &a , &op , &b");
Was ist denn das %op? Möchtest du an der Stelle nicht ein Zeichen (char) einlesen: %c
if (op == '#')
{
    end
}
Was möchtest du da machen? Doch eher das Programm beenden oder? dann würde ich das ersetzen durch
// Leere Zeile

Dazu fehl evtl. noch die ein oder andere Klammer...

Achja: Kommentare sollten SINNVOLL sein.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du musst irgendwann noch end ausgeben weil darin dein Ergebnis steckt
also sowas wie printf("Das Ergebnis von %f %c %f = %f",a,op,b,end)

das return 0 sollte auch aus der while schleife raus
und         
if (op == '#')
  {
    break; //steigt dir aus der schleife aus
  }

ich würde auch "void main()" schreiben und dass return weglassen weil du ja so nichts zurückgibst 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
float division (float a, float b) // Funktion zur Division
{ // Anfang von Auflistung der Anweisungen
      float c ; // Variable für Ergebnis
      c = a / b ; // Definiert 'c'
      if (b!=0) // Verhindert, dass duch '0' geteilt werden kann
      { // Anfang von Auflistung der Anweisungen
               return c; // Gibt das Ergebnis 'c' zurück
      } // Ende von Auflistung der Anweisungen
      if (b=0) // Verhindert, dass duch '0' geteilt werden kann
      { // Anfang von Auflistung der Anweisungen
              printf ("Hat Dr dein Mathelehrer nicht beigebracht, dass amn nicht durch 0 teilen kann ?!") ; // Gibt Tex auf dem Boödschorm aus
              system ("PAUSE") ; // Bewirkt, dass der Benutzer eine beliebige Taste drücken soll
      } // Ende von Auflistung der Anweisungen
} // Ende von Auflistung der Anweisungen

Mein Vorschlag:

float division (float a, float b)
{
 if(b==0)
 printf("Hat Dr dein Mathelehrer nicht beigebracht, dass amn nicht durch 0 teilen kann ?!")
else
return a/b;   
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich würde sagen, das geht auch noch einfacher und mit einer Konsolen-GUI:

Bei Dir sind das VIEL zu viele Komments.

z.b. mein C-Rechner:

#include<stdio.h>


float z1,z2;
double sm;
char op;
int death, i;

main()
{
    printf("Zum beenden, beim Operator 'q' eingeben, also z.b. 1q1.\n");
    printf("Moeglichkeiten: +, -, *, /\n\n");
    printf("--------- 1.Rechnung ---------\n\n");
    while(op!='q')
    {
        i=2;
        for (i=2;op!='q';i++)
        {
         sm=0;
         scanf("%f",&z1);
         printf("\n");
         scanf("%c",&op);
         printf("\n");
         scanf("%c",&z2);
         printf("\n");
         if(op=='/' && z2==0)
         {
             death=1;
         }
         if (op=='+')
         {
             sm=z1+z2;
         }
         if (op=='-')
         {
             sm=z1-z2;
         }
         if (op=='*')
         {
             sm=z1*z2;
         }
         if (op=='/')
         {
             sm=z1/z2;
         }
         if(death!=1)
         {
         if(op!='q')
            {
                printf("= %lf \n\n\n --------- %d.Rechnung ---------\n\n\a",sm,i);
            }
         }
         if(death==1)
         {
             printf("error: Division durch 0!\n ---Copyright by Tobias Weiss in Penig---");
         }
         if(op=='q')
         {
             printf("---Copyright by Tobias Weiss in Penig---");
         }
        }
    i++;
    }

}
 

Ich würde sagen, das geht auch noch einfacher und mit einer Konsolen-GUI:

Bei Dir sind das VIEL zu viele Komments.

z.b. mein C-Rechner:

#include<stdio.h>


float z1,z2;
double sm;
char op;
int death, i;

main()
{
    printf("Zum beenden, beim Operator 'q' eingeben, also z.b. 1q1.\n");
    printf("Moeglichkeiten: +, -, *, /\n\n");
    printf("--------- 1.Rechnung ---------\n\n");
    while(op!='q')
    {
        i=2;
        for (i=2;op!='q';i++)
        {
         sm=0;
         scanf("%f",&z1);
         printf("\n");
         scanf("%c",&op);
         printf("\n");
         scanf("%c",&z2);
         printf("\n");
         if(op=='/' && z2==0)
         {
             death=1;
         }
         if (op=='+')
         {
             sm=z1+z2;
         }
         if (op=='-')
         {
             sm=z1-z2;
         }
         if (op=='*')
         {
             sm=z1*z2;
         }
         if (op=='/')
         {
             sm=z1/z2;
         }
         if(death!=1)
         {
         if(op!='q')
            {
                printf("= %lf \n\n\n --------- %d.Rechnung ---------\n\n\a",sm,i);
            }
         }
         if(death==1)
         {
             printf("error: Division durch 0!\n ---Copyright by Tobias Weiss in Penig---");
         }
         if(op=='q')
         {
             printf("---Copyright by Tobias Weiss in Penig---");
         }
        }
    i++;
    }

}
 
Bei dir gibts auch zu meckern ;)
Viel zu viele überprüfungen, sind nicht notwendig.
switch/case oder if else nutzen.
i hat keinen Zweck. -> entfernen.
Sprechende Variablennamen nutzen.
Mehr Kommentare gerade und insbesondere als Anfänger!
"If it was hard to code it should be hard to read" gilt nicht. 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

i hat den Zweck, dass man mehrmals Rechnen kann, und auch die Rechnungsnummer angezeigt bekommt(1. Rechnung , 2. Rechnung, etc.)

Die Überprüfungen machen nicht langsamer oder schlechter, aber ist ja auch 1.0, ich bin grad an der 2.0 ...

Ich denke doch, man kann sich folgendes vorstellen:
z1 = Zahl1
z2 = Zahl2
op = Operator
end = Beenden Variable
death = Beenden-bei-Fehler Variable

Und naja, die Kommentare, siehe oben, 1.0 ...


Und mit selbst definierten Funktionen (division, addition, ...) halte ich nicht viel, da es schlicht mehr Aufwand macht, und das Programm dadurch viel größer wird...

« Letzte Änderung: 11.10.09, 09:49:17 von wolf174 »
i hat den Zweck, dass man mehrmals Rechnen kann, und auch die Rechnungsnummer angezeigt bekommt(1. Rechnung , 2. Rechnung, etc.)

Die Überprüfungen machen nicht langsamer oder schlechter, aber ist ja auch 1.0, ich bin grad an der 2.0 ...

Ich denke doch, man kann sich folgendes vorstellen:
z1 = Zahl1
z2 = Zahl2
op = Operator
end = Beenden Variable
death = Beenden-bei-Fehler Variable

Und naja, die Kommentare, siehe oben, 1.0 ...


Und mit selbst definierten Funktionen (division, addition, ...) halte ich nicht viel, da es schlicht mehr Aufwand macht, und das Programm dadurch viel größer wird...
My bad, die referenz auf i übersehen.

Das Programm wird wird vllt vom Text größer von der Funktionalität nicht, Lesbarkeit sollte auch immer bedacht werden. Stell dir mal vor du schreibst keinen Taschenrechner sondern n Texteditor. Wenn du alles in die Main packst dann biste sehr schnell an nem Status angelangt wo du dein eigenes Programm nicht mehr lesen kannst weil alles drunter und drüber geht. Aber ich vermute das wird dir bei zeiten selbst noch auffallen.
Selbiges bei Variablen, auf dauer würd ich dir ungarische Notation auch noch nahe legen.
Ungarische Notation

Und natürlich machen viele überprüfungen langsamer als eine einzelne wenn wenig ausreichen :) Bei deinem taschenrechner fällt dir das nur noch nicht auf.
GL für 2.0 lass dann mal sehn. 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Mein Rechner 2.0:

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

float zahl1,zahl2,endwert; /*Variablen werden definiert*/
double ergebnis;
char operato;
int zaehlvar=1,div0,end,abfrage;

float add(float wert1,float wert2) {endwert=wert1+wert2;return endwert;} /*Addition wird defiert*/
float sub(float wert1,float wert2) {endwert=wert1-wert2;return endwert;} /*Subtraktion wird definiert*/
float mul(float wert1,float wert2) {endwert=wert1*wert2;return endwert;} /*Multiplikation wird definiert*/
float div(float wert1,float wert2) {endwert=wert1/wert2;return endwert;} /*Division wird definiert*/

main()
{
    printf("Willkommen. Moeglich sind : Addition       : +\n");
    printf("                            Subtraktion    : -\n");
    printf("                            Multiplikation : *\n");
    printf("                            Division       : /\n\n");
    printf("q als Operator zum beenden, also z.b.: 1q1 \n");
    do
    {
        ergebnis=0;
        printf("--------- %d.Rechnung ---------\n\n\n",zaehlvar);
        scanf("%f",&zahl1);scanf("%c",&operato);scanf("%f",&zahl2); /*Werte werden eingelesen*/
        if(operato=='+') ergebnis=add(zahl1,zahl2);if(operato=='-') ergebnis=sub(zahl1,zahl2);if(operato=='*') ergebnis=mul(zahl1,zahl2);if(operato=='/') ergebnis=div(zahl1,zahl2);if(operato=='/' && zahl2==0) div0=1;if(operato=='q') end=1; /*Berechnungsregeln werden angewandt*/
        zaehlvar++;
        if(end!=1)
        {
            if(div0!=1)
            {
                printf("\n\n= %f\n",ergebnis);
            }
            else
            {
                printf("\n\nDIVISON DURCH 0!");
            }
        }
    }
    while(end!=1);
    abfrage=getch();
}


Ist kürzer, hab Funktionen, weniger Abfragen, Sprechende Variablennamen, etc...

Zufrieden? ;)

nach ; zeilenumbruch wär zu empfehlen :)
 

Zitat
if(operato=='+') ergebnis=add(zahl1,zahl2);if(operato=='-') ergebnis=sub(zahl1,zahl2);

das ist das gleiche wie vorher. Merke: Was du in eine zeile schreibst wird noch lang nicht gleichzeitig bearbeitet ;) du kannst auch deinen gesamten code (in c) in eine zeile packen.
Zitat
if(operato=='+') ergebnis=add(zahl1,zahl2);
else if(operato=='-') ergebnis=sub(zahl1,zahl2);
halte ich persönlich bspw. für ratsamer.
Ansonsten hab ich atm nichts zu meckern ;P

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Gut, 2.5 mit ifelse und 3.0 mit switch...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Version 2.5 mit if-else:

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

float zahl1,zahl2,endwert; /*Variablen werden definiert*/
double ergebnis;
char operato;
int zaehlvar=1,div0,end,abfrage;

float add(float wert1,float wert2) {endwert=wert1+wert2;return endwert;} /*Addition wird defiert*/
float sub(float wert1,float wert2) {endwert=wert1-wert2;return endwert;} /*Subtraktion wird definiert*/
float mul(float wert1,float wert2) {endwert=wert1*wert2;return endwert;} /*Multiplikation wird definiert*/
float div(float wert1,float wert2) {endwert=wert1/wert2;return endwert;} /*Division wird definiert*/

main()
{
    printf("Willkommen. Moeglich sind : Addition       : +\n"); /*Instruktionen*/
    printf("                            Subtraktion    : -\n");
    printf("                            Multiplikation : *\n");
    printf("                            Division       : /\n\n");
    printf("q als Operator zum beenden, also z.b.: 1q1 \n");
    do
    {
        ergebnis=0;
        printf("--------- %d.Rechnung ---------\n\n\n",zaehlvar);
        scanf("%f",&zahl1);scanf("%c",&operato);scanf("%f",&zahl2); /*Werte werden eingelesen*/

        if(operato=='+') ergebnis=add(zahl1,zahl2); /*Berechnungsregeln werden angewandt*/
        else
            if(operato=='-') ergebnis=sub(zahl1,zahl2);
            else
                if(operato=='*') ergebnis=mul(zahl1,zahl2);
                else
                    if(operato=='/' && zahl2==0) div0=1;
                    else
                        if(operato=='/') ergebnis=div(zahl1,zahl2)
                        else end=1;

        zaehlvar++;
        if(end!=1)
        {
            if(div0!=1)
            {
                printf("\n\n= %f\n",ergebnis);  /*Ausgabe*/
            }
            else
            {
                printf("\n\nDIVISON DURCH 0!");
            }
        }
    }
    while(end!=1);
    abfrage=getch(); /*Beliebiger Tastendruck*/
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Rechner 3.0 mit switch():

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

float zahl1,zahl2,endwert; /*Variablen werden definiert*/
double ergebnis;
char operato;
int zaehlvar=1,div0,end,abfrage;

float add(float wert1,float wert2) {endwert=wert1+wert2;return endwert;} /*Addition wird defiert*/
float sub(float wert1,float wert2) {endwert=wert1-wert2;return endwert;} /*Subtraktion wird definiert*/
float mul(float wert1,float wert2) {endwert=wert1*wert2;return endwert;} /*Multiplikation wird definiert*/
float div(float wert1,float wert2) {endwert=wert1/wert2;return endwert;} /*Division wird definiert*/

main()
{
    printf("Willkommen. Moeglich sind : Addition       : +\n"); /*Instruktionen*/
    printf("                            Subtraktion    : -\n");
    printf("                            Multiplikation : *\n");
    printf("                            Division       : /\n\n");
    printf("q als Operator zum beenden, also z.b.: 1q1 \n");
    do
    {
        ergebnis=0;
        printf("--------- %d.Rechnung ---------\n\n\n",zaehlvar);
        scanf("%f",&zahl1);scanf("%c",&operato);scanf("%f",&zahl2); /*Werte werden eingelesen*/

        switch(operato)
        {
            case '+': ergebnis=add(zahl1,zahl2);
                      break;
            case '-': ergebnis=sub(zahl1,zahl2);
                      break;
            case '*': ergebnis=mul(zahl1,zahl2);
                      break;
            case '/': ergebnis=div(zahl1,zahl2);
                      break;
            default: end=1;
        }

        zaehlvar++;
        if(end!=1)
        {
            if(div0!=1)
            {
                printf("\n\n= %f\n",ergebnis);  /*Ausgabe*/
            }
            else
            {
                printf("\n\nDIVISON DURCH 0!");
            }
        }
    }
    while(end!=1);
    abfrage=getch(); /*Beliebiger Tastendruck*/
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Version 4.0 mit zusätzlich: Modulo, Wurzelziehen und Prozentsatz:

#include<stdio.h> /*Header werden eingebunden*/
#include<math.h>
#include<conio.h>

float zahl1,zahl2,endwert; /*Variablen werden definiert*/
double ergebnis;
char operato;
int zaehlvar=1,div0,end,abfrage;

float add(float wert1,float wert2) {endwert = wert1 + wert2; return endwert;} /*Addition wird defiert*/
float sub(float wert1,float wert2) {endwert = wert1 - wert2; return endwert;} /*Subtraktion wird definiert*/
float mul(float wert1,float wert2) {endwert = wert1 * wert2; return endwert;} /*Multiplikation wird definiert*/
float div(float wert1,float wert2) {endwert = wert1 / wert2; return endwert;} /*Division wird definiert*/
float mod(float wert1,float wert2) {endwert = (int)wert1 % (int)wert2; return endwert;} /*Modulo wird definiert*/
float per(float wert1,float wert2) {if(wert1==0||wert2==0) return 0;else return((fabs(wert1)*100.0) / fabs(wert2));} /*Prozentsatz wird definiert*/
float wur(float wert2) {endwert = sqrt(wert2); return endwert;} /*Wurzelziehen wird definiert*/

main()
{
    printf("Willkommen. Moeglich sind : Addition       : +\n"); /*Instruktionen*/
    printf("                            Subtraktion    : -\n");
    printf("                            Multiplikation : *\n");
    printf("                            Division       : /\n");
    printf("                            Prozentsatz    : p\n");
    printf("                            Modulo         : %%\n");
    printf("                            Sqrt           : 2w\n\n");
    printf("q als Operator zum beenden, also z.b.: 1q1 \n");
    do
    {
        ergebnis=0;
        printf("\n\n--------- %d.Rechnung ---------\n\n\n",zaehlvar);
        scanf("%f",&zahl1);scanf("%c",&operato);scanf("%f",&zahl2); /*Werte werden eingelesen*/

        switch(operato)
        {
            case '+': ergebnis=add(zahl1,zahl2);
                      break;

            case '-': ergebnis=sub(zahl1,zahl2);
                      break;

            case '*': ergebnis=mul(zahl1,zahl2);
                      break;

            case '/': if(zahl2==0)
                      {
                           div0=1;
                      }
                      else ergebnis=div(zahl1,zahl2);
                      break;

            case '%': ergebnis=mod(zahl1,zahl2);
                      break;

            case 'p': ergebnis=per(zahl1,zahl2);
                      break;
            case 'w': ergebnis=wur(zahl2);
                      break;

            default: end=1;
        }

        zaehlvar++;
        if(end!=1)
        {
            if(div0!=1)
            {
                printf("\n\n= %f\n",ergebnis);  /*Ausgabe*/
            }
            else
            {
                printf("\n\nDIVISON DURCH 0!");
            }
        }
    }
    while(end!=1);
    abfrage=getch(); /*Beliebiger Tastendruck*/
}

nu gefällt mir die sache schon besser :) 


« Delphie lernen!4523 BG-Entwickler gesucht »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...