C Kommandozeilenrechner
-
Belli schrieb:
Nö.
So wie es aussieht, solltest Du erst mal Grundlagen lernen, und mit was (viel) einfacherem beginnen ...
Außerdem solltest Du auch die Antworten auf Deine Postings lesen.Ich lese jede Antwort. Habe einen Beitrag geschrieben und deswegen die "neuere" Antwort nicht rechtzeitig lesen können.
-
Okay, ich habe Deine Absicht wohl missverstanden. Du willst gar nicht, dass die fehlenden Werte zur Programmlaufzeit eingegeben werden, sondern der Benutzer soll das Programm erneut mit der richtigen Anzahl an Parametern starten ...
Üblich in einem Fehlerfall ist ein return - Wert ungleich 0; wichtig wäre das aber nur dann, wenn der auch vom Aufrufer ausgewertet werden würde, in Deinem Fall also eher nicht.
-
Belli schrieb:
Okay, ich habe Deine Absicht wohl missverstanden. Du willst gar nicht, dass die fehlenden Werte zur Programmlaufzeit eingegeben werden, sondern der Benutzer soll das Programm erneut mit der richtigen Anzahl an Parametern starten ...
Üblich in einem Fehlerfall ist ein return - Wert ungleich 0; wichtig wäre das aber nur dann, wenn der auch vom Aufrufer ausgewertet werden würde, in Deinem Fall also eher nicht.Ich möchte beim Start des Programms alle Werte eingeben können. Also ./rechner 4 - 2 zum Beispiel. Er soll dann erkennen, was der richtige Operand ist und dann mit dieser Info die Parameter zahl1 und zahl2 in die richtige Funktion übergeben.
Danke schonmal an alle, die bisher geholfen haben!
-
Deine Funktionen geben jetzt alle einen Floatwert zurueck.
Ist aber unnoetig, da in der Funktion der Wert ausgegeben und
nicht an main() zurueckgegeben wird.Besser:
void divi(float zahl1, float zahl2) { ... ... kein return; }
Laeuft es jetzt?
-
#include <stdio.h> #include <stdlib.h> void add(float zahl1, float zahl2){ float erg_add; erg_add = zahl1 + zahl2; printf("Berechnung: %f + %f = %f",zahl1, zahl2, erg_add); } void sub(float zahl1, float zahl2){ float erg_sub; erg_sub = zahl1 - zahl2; printf("Berechnung: %f - %f = %f",zahl1, zahl2, erg_sub); } void mult(float zahl1, float zahl2){ float erg_mult; erg_mult = zahl1 * zahl2; printf("Berechnung: %f * %f = %f",zahl1, zahl2, erg_mult); } void divi(float zahl1, float zahl2){ float erg_div; erg_div = zahl1 / zahl2; printf("Berechnung: %f / %f = %f",zahl1, zahl2, erg_div); } int main(int argc,char * argv[]) { float zahl1,zahl2; if (argc!=4){ printf("Bitte geben sie die Rechnung ein"); return 0; } zahl1=atof(argv[1]); zahl2=atof(argv[3]); switch(argv[2][0]) { case '+': add(zahl1,zahl2); break; case '-': sub(zahl1,zahl2); break; case '*': mult(zahl1,zahl2); break; case '/': divi(zahl1,zahl2); break; default: printf("Das hat nicht funktioniert! %f ung�ltig!\n",argv[2][0]); } return 0; }
So siehts im Moment aus, aber laufen will es trotzdem nicht. Kompiliert fehlerfrei, aber beim ausfüren ist nach "printf("Bitte geben sie die Rechnung ein");" Schluss.
Wo liegt der Fehler?Grüße
-
Wie rufst du das Programm denn auf?
Dein argc wird != 4 sein.
Dann kommt das printf und dann das return 0;, welches dein Programm beendet.Sonst gib doch mal argc mit aus:
printf("Zuwenig Parameter (%d / 4). %s Wert1 Operator Wert2 (%d)", argc, argv[0]);
-
Es liegt definitiv an den Parametern.
Ich benutze Cygwin und starte das Programm mit "./rechner 5 +5"
Kann es daran liegen?
Viele Grüße
-
meidi schrieb:
"./rechner 5 +5"
Das sind aber nur 3 Parameter:
`argv[0] : ./rechnerargv[1] : 5
argv[2] : +5
`
Mit Leerzeichen zwischen allen Parametern sollte es klappen.
-
Das war ein Tippfehler.. Geht leider nach wie vor nicht, hmm
gcc -c rechner.c -o rechner
Stimmt doch auch oder? Da muss ich sicherlich irgendwas anderes doofes übersehen haben..
-
Also bei mir laeuft das Programm (Linux und OpenBSD).
Kompiliert mit gcc.Komischerweise funktioniert Multiplikation nur, wenn ich
auf der Kommandozeile '\' eingebe. Bei einfachem '' kommt
nur die Fehlermeldung mit Abbruch.
-
gigg schrieb:
Also bei mir laeuft das Programm (Linux und OpenBSD).
Kompiliert mit gcc.Komischerweise funktioniert Multiplikation nur, wenn ich
auf der Kommandozeile '\' eingebe. Bei einfachem '' kommt
nur die Fehlermeldung mit Abbruch.Der * ist ja auch eine Wildcard/Joker: http://de.wikipedia.org/wiki/Wildcard_%28Informatik%29
Bei Unix-Systemen wird die Wildcardexpansion von der Shell erledigt und nicht von den Programmen.Mach mal **ls *** und du weißt, was da eingefügt wird.
-
Ich werde es mal auf einem "richtigen" Unix-System testen, sollte klappen jetzt
Vielen Dank an alle die geholfen haben!
-
Siehe Kommentar bei printf...
meidi schrieb:
. . . switch(argv[2][0]) { case '+': add(zahl1,zahl2); break; case '-': sub(zahl1,zahl2); break; case '*': mult(zahl1,zahl2); break; case '/': divi(zahl1,zahl2); break; default: printf("Das hat nicht funktioniert! %f ung�ltig!\n",argv[2][0]); // ist %f wirklich das optimale Formatkennzeichen für argv[2][0]? (Rechenoperator...) } return 0; }