[C] Taschenrechner

hasch

Lt. Commander
Registriert
Sep. 2004
Beiträge
1.067
Mache mich seit gestern Abend mit C vertraut. Habe mir gerade eine kleine Übung überlegt, die ich bewerkstelligen will, weil mir die Übungen aus dem Änfängerbuh zu langatmig sind :D

Folgender Code:
Code:
#include <stdio.h>
#include <conio.h>
#include <math.h>

#define quadrat(a) a*a

int main()
{
    // Variablendeklaration
    float z2,
          summe;
    int   wert,
          zaehler = 1,
          error = 0;
    char  op;

    // Taschenrechner
    printf("Mit diesem Taschenrechner koennen Sie jede Grundrechenart, Quadrieren und Wurzelziehen!");
    printf("\n");
    printf("\nAnleitung");
    printf("Bitte geben Sie an, wieviele Termglieder Sie Angeben!");
    printf("\nGlieder: ");
    scanf("%d", wert);
    
    while(zaehler<=wert && error != 1)
    {
     printf("Zahl %d: ", zaehler);
     scanf("%f", summe);
     printf("\nRechenoperation: ");
     scanf("%c", op);
     printf("\nZahl %d: ", zaehler++);
     scanf("%f", z2);
    
                switch(op)
                {
                          case '+': summe+=z2;
                          case '-': summe-=z2;
                          case '/': summe/=z2;
                          case '*': summe*=z2; 
                          default:  error=1;         
                }
    
     zaehler++;        
    }
    
    //Ausgabe der Summe oder ein Fehler
    if(error != 1)
             printf("Summe: %f", summe);
    else
             printf("Es ist ein Fehler beim Operationszeichen '%d' aufgetreten.", op);

    
    getch();
    return 0;
}

Leider bricht mir die Konsolenanwendung nach der Eingabe der 1. Zahl sofort ab. Hat jemand eine Idee wieso? (Der Rechner ist noch nicht fertig, sollte nur erstmal eine Testphase sein...)
 
Hi!
Du musst bei scanf als zweites Argument keine Variable sondern einen Zeiger (adresse) übergeben.
Code:
scanf("%d", &wert);
also einfach vor den Variablennamen ein & schreiben
und schreib am besten vor jedes scanf ein
Code:
fflush(stdin);
damit der Buffer geelert wird und keine Zeichen eingelesen werden die noch im Buffer stehen.

MfG STefan
 
Zuletzt bearbeitet:
Danke, hatte ich nicht dran gedacht, danke...
Jetzt läufts zwar noch mit Fehlern, aber es läuft :D , sollte ich die Fehler nicht beseitigen können, werde ich versuchen eure Hilfe noch mal in Anspruch zu nehmen. :)

EDIT: So Taschenrechner läuft toll ;)
 
Zuletzt bearbeitet:
Hallo hasch,

für den Anfang sieht Dein Programm ganz gut aus. Man findet fast nichts zum meckern :-).
Nur noch zwei Anmerkungen:

- Kommentare mit // sind C++, ein reiner C Compiler wird sich daran stören.
- Variablen sollten prinzipiell immer initialisiert werden.

Code:
    float    z2        = 0.0;
    float    summe    = 0.0;
    int    wert    = 0,
    int    zaehler    = 1,
    int    error    = 0;
    char    op    = 0;

MfG

Arnd
 
Benji schrieb:
schreib am besten vor jedes scanf ein
Code:
fflush(stdin);

Am besten gleich wieder verdrängen, das ist ungültiger Code. Einen Eingabestrom kann man nicht flushen. fflush ist für auf Ausgabeströme (z.B. stdout) definiert. Selbst wenn fflush genauso auf einen Eingabestrom funktionieren würde, wäre sein Sinn sehr fragwürde, denn man wüsste nie, ob nicht sinnvolle Eingaben vom Anwender wieder weggeworfen werden (geschweige dessen was passiert, wenn der Input einfach nur an das Programm gepipet wird).
 
Zuletzt bearbeitet:
Arnd schrieb:
Hallo hasch,

für den Anfang sieht Dein Programm ganz gut aus. Man findet fast nichts zum meckern :-).
Ich muss auch sagen, dass ich mir den "Umstieg" von PHP auf C viel schwerer vorgestellt habe. Schleifen, ... sind genauso aufgebaut wie in PHP.
Werde demnächst meine Variabeln immer initialisieren. Wie kann ich denn Kommentare sonst einfügen ohne //?

EDIT:
Wenn ich jetzt aber das fflush(stdin); weglasse, wird das OP-Zeichen nicht erkannt, d.h. ich kanns nicht eingeben, da ich gleich die Zahl 2 eingeben soll; hier nochmal der neue überarbeitete Code:
Code:
#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
    // Variablendeklaration
    float z1 = 0.0,
          z2 = 0.0,
          summe = 0.0;
    int   wert = 0,
          zaehler = 1,
          dg = 0,
          error = 0;
    char  op;

    // Taschenrechner
    printf("Mit diesem Taschenrechner koennen Sie jede Grundrechenart ausfuehren!");
    printf("\n");
    printf("\nAnleitung:\n");
    printf("Anzahl ... wie oft Rechenoperationen ausgefuehrt werden\nOP ... Rechenoperator (+ - * /)\n\n");
    printf("Bitte geben Sie an, wie oft Sie Rechenoperationen ausfuehren moechten!\n");
    printf("\nAnzahl:  ");
    scanf("%d", &wert);
    printf("\n");
    
    while(zaehler<=wert && error != 1)
    {
     if(dg == 0)
     {
     printf("Zahl %d:  ", zaehler);
     scanf("%f", &z1);
     summe=z1;
     dg=1;
     }

     printf("OP:      ");
     fflush(stdin);
     scanf("%c", &op);
     printf("Zahl %d:  ", zaehler+1);
     scanf("%f", &z2);
    
                switch(op)
                {
                          case '+': summe+=z2;
                                    break;
                          case '-': summe-=z2;
                                    break;
                          case '/': summe/=z2;
                                    break;
                          case '*': summe*=z2;
                                    break;
                          default:  error=1;         
                }
    
     zaehler++;        
    }
    
    // Ausgabe der Summe oder ein Fehler
    if(error == 0)
             printf("\nLoesung: %f\n\n", summe);
    else
             printf("Es ist ein Fehler beim Operationszeichen '%d' aufgetreten.", op);

    printf("\n\n\nZum Beenden bitte beliebige Taste druecken!");
    getch();
    return 0;
}
 
Zuletzt bearbeitet:
hasch schrieb:
Wenn ich jetzt aber das fflush(stdin); weglasse, wird das OP-Zeichen nicht erkannt, d.h. ich kanns nicht eingeben, da ich gleich die Zahl 2 eingeben soll;

Naja, jetzt merkst du den Fehler, den das ungültige fflush(stdin); verschleiert:
Code:
     scanf("%c", &op);

Wenn du in die manpage oder Hilfe zu scanf schaust, wird beim Parameter %c darauf hingewiesen, dass "leading whitespaces" nicht übersprungen werden. D.h. von der vorherigen Eingabe steht vermutlich noch ein #10#13 ö.Ä. im Eingabestrom. Dieses wird dann einfach gelesen und ausgewertet anstatt übersprungen. Für deine Zwecke sollte es ausreichen, wenn du zwischen " und %c ein Leerzeichen einfügst. Die Zeile sieht dann so aus:
Code:
     scanf(" %c", &op);


Noch ein Fehler:
Code:
#define quadrat(a) a*a

Daraus solltest du
Code:
#define quadrat(a) (a)*(a)
machen. Das kann sonst sehr sehr merkwürdige Effekte bei der Substitution ergeben. Außerdem solltest du dir bewusst sein, dass der Präprozessor aus
Code:
int a = 1;
int x = quadrat (a++);
das hier macht:
Code:
int a = 1;
int x = (a++) * (a++);

Das ist eigentlich nie das, was man will - nur so als Vorwarnung :) (ganz davon abgesehen, dass allerletzte Zeile undefiniertes Verhalten hat).


Ansonsten aber großes Lob für so vernünftigen Code von einem C-Einsteiger :daumen:
 
Zuletzt bearbeitet:
7H3 N4C3R schrieb:
Ansonsten aber großes Lob für so vernünftigen Code von einem C-Einsteiger :daumen:
Danke schön :)
Werde mir eure Anregungen zu Herzen nehmen.

Mal eine Frage, wenn ich die Konsolenanwendungen etc. richtig beherrsche (dauert noch ne ganze Weile, gibt ja da so viel), wie kann ich dann GUI's nutzen?
 
statt einem macro solltest du für solche dinge inline funktionen verwenden. damit werde die probleme die 7H3 N4C3R angesprochen hat verhindert ohne das der code dadurch langsamer wird.

generell solltest du den preprocessor so selten wie möglich benutzen. wenn sich ein problem auch anders lösen lässt ist die andere lösung eigentlich immer die bessere.
 
Hallo hasch,

das kommt darauf an unter welchem OS du entwickelst. Unter Windows macht C und GUI nicht so richtig Spass. Natürlich geht es aber es ist deutlich aufwendiger optisch ansprechende Programme zu entwickeln, als mit C++ in Kombination mit der MFC.

Unter Linux bin ich nicht so auf dem laufenden, wie komfortabel sich Qt und andere Toolkits mit C nutzen lassen.

Aber es ist auf jeden Fall eine Überlegung wert auf C++ umzusteigen. Deine C Kenntnisse sind dabei ja nicht umsonst. Das kannst Du alles weiterverwenden.

C Kommentare werden übrigens so gemacht:

/* Dies ist ein Kommentar */

MfG

Arnd

PS: char op ist noch nicht initialisiert :-).
 
Zuletzt bearbeitet:

Ähnliche Themen

W
  • Gesperrt
  • Frage Frage
2 3
Antworten
45
Aufrufe
3.961
J
  • Gesperrt
Antworten
3
Aufrufe
1.574
Zurück
Oben