C Kommandozeilenrechner



  • Und grundsätzlich scheinst Du es beim Rechnen nicht so genau zu nehmen.

    Der Datentyp Integer bildet Ganzzahlen ab. Ein relativ geringer Anteil an Divisionen zweier Ganzzahlen hat auch eine Ganzzahl als Ergebnis.
    Wenn Dein Rechner bei 5 / 2 versagt, solltest Du Dir eventuell mal den Datentyp double ansehen (Fließkommazahl mit doppelter Genauigkeit).



  • argv[2] sollte zahl2 sein..
    %f steht da in der Tat noch total falsch drin, weil ich vorher float anstatt integer benutzt habe. Jedoch hatte ich dann Probleme mit dem atoi Befehl, der meine argv[] in integer umwandeln sollte..



  • meidi schrieb:

    argv[2] sollte zahl2 sein..

    Du fragst für deinen Operator aber auch argv[2] ab.

    meidi schrieb:

    %f steht da in der Tat noch total falsch drin, weil ich vorher float anstatt integer benutzt habe. Jedoch hatte ich dann Probleme mit dem atoi Befehl, der meine argv[] in integer umwandeln sollte..

    Dafür nimmt dann atof, besser noch strtod.



  • Danke schon Mal, aber leider bin ich noch nicht am Ziel..

    Hier der jetztige Stand:

    #include <stdio.h>
    #include <stdlib.h>
    
    float add(float zahl1, float zahl2){  
    	float erg_add;
    	erg_add = zahl1 + zahl2;
    	printf("Berechnung: %f + %f = %f",zahl1, zahl2, erg_add); 
    	return 0;
    }
    
    float sub(float zahl1, float zahl2){  
    	float erg_sub;
    	erg_sub = zahl1 - zahl2;
    	printf("Berechnung: %f - %f = %f",zahl1, zahl2, erg_sub); 
    	return 0;
    }
    
    float mult(float zahl1, float zahl2){  
    	float erg_mult;
    	erg_mult = zahl1 * zahl2;
    	printf("Berechnung: %f * %f = %f",zahl1, zahl2, erg_mult); 
    	return 0;
    }
    
    float divi(float zahl1, float zahl2){ 
    	float erg_div;
    	erg_div = zahl1 / zahl2;
    	printf("Berechnung: %f / %f = %f",zahl1, zahl2, erg_div);  
    	return 0;
    }
    
    int main(int argc,char * argv[])  
    {
    float zahl1,zahl2; 
    if (argc!=3){  
                printf("Bitte geben sie den Operator ein, entweder +, - , / oder *");
                return 0;
                }
        zahl1=atof(argv[1]); 
        zahl2=atof(argv[2]);
    
    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;
    
    }
    

    Wenn ich das Programm starte, dann gibt er mir "Bitte geben sie den Operator ein, entweder +, - , / oder *" aus und bricht daraufhin ab.
    Hat irgendjemand eine Idee an was das liegen könnte?

    Grüße



  • In der switch-Anweisung testest du auf argv[2], muesste aber argv[3] sein, wenn du den Operator ermitteln moechtest.
    argv[2] wird vorher zahl2 zugewiesen.



  • meidi schrieb:

    ...
    
    int main(int argc,char * argv[])  
    {
    float zahl1,zahl2; 
    if (argc!=3){  
                printf("Bitte geben sie den Operator ein, entweder +, - , / oder *");
                return 0;
                }
    
    ...
    

    Wenn ich das Programm starte, dann gibt er mir "Bitte geben sie den Operator ein, entweder +, - , / oder *" aus und bricht daraufhin ab.
    Hat irgendjemand eine Idee an was das liegen könnte?

    An:

    return 0;
    


  • Also, was ich vorhatte: Ich gebe über die Kommandozeile ./programmname 30 + 20 ein. Dann werden die Eingaben für 30 und 20 als zahl1 und zahl2 abgespeichert. In der Switch-Case Anweisung soll durch die Eingabe von -,+,* oder / erkannt werden in welche Rechen-Funktion er die Parameter zahl1 und zahl2 zu übergeben hat.

    Je länger ich mir mein Programm anschaue, desto mehr sehe ich, wie meine main Methode keinen Sinn macht 😞

    Für Tipps, Anregungen oder sogar Lösungsvorschläge wäre ich seeeehr dankbar.

    Viele Grüße



  • argc: 1 - Programm-Name
    argc: 2 - 1.Parameter
    usw...

    argv[0] Programm-Name
    argv[1] 1.Parameter
    usw...

    argc muss also auf 4 getestet werden am Anfang.

    Ich dachte du wolltest erst die beiden Zahlen und dann den arithmetischen
    Operator eingeben.



  • int main(int argc,char * argv[])  
    {
    float zahl1,zahl2; 
    if (argc!=3){ 
                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);
    ...
    

    So müsste es stimmen?!



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



  • meidi schrieb:

    if (argc!=3){ /* hier muss auf ungleich 4 getestet werden */
    


  • meidi schrieb:

    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);
    ...
    

    So müsste es stimmen?!

    Kann leider nichts editieren, sorry für den Spamm 😞
    Habe argc!=4 abgeändert.. Was wäre denn ein sinnvoller Rückgabewert in der main()? Ich wollte ja eigentlich von der switch in eine der oberen Funktionen springen.. die machen dann den Rest 🙂
    Tut mir Leid, dass ich keine Ahnung habe, aber aller Anfang ist eben schwer. Und google.de konnte mir es bisher nicht erklären, leider.

    Grüße



  • 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] : ./rechner

    argv[1] : 5

    argv[2] : +5

    `

    Mit Leerzeichen zwischen allen Parametern sollte es klappen.


Anmelden zum Antworten