Kommandozeile..Aufgabe



  • Hallo Leute,

    mein Professor hat uns folgende Aufgabe gestellt:

    "Entwickeln Sie ein Programm, mit dem Sie Additionen und Subtraktionen von der
    Kommandozeile durchführen können.
    Das Verhalten des Programms können Sie dem folgenden Screenshot entnehmen.
    Hinweis: Sie können die Funktion atof verwenden, die in stdlib.h deklariert ist."

    Hier der Screenshot: http://www.directupload.net/file/d/4171/rdinzju6_png.htm

    Ich bin mir nicht sicher was er damit meint, wo liegt der Unterschied zwischen Kommandozeile und einem C Programm das ich von der ganz normalen IDE aus starte?

    Und wozu benötige ich die atof() funktion, welche einen String in einen double konvertiert?

    LG


  • Mod

    Kexplx schrieb:

    Ich bin mir nicht sicher was er damit meint, wo liegt der Unterschied zwischen Kommandozeile und einem C Programm das ich von der ganz normalen IDE aus starte?

    Nirgendwo, es ist etwas ungeschickt ausgedrückt. Der Kernpunkt ist, dass das Programm die benötigten Zahlen nicht zur Laufzeit einlesen soll, sondern über seine Kommandozeile übergeben bekommt. Also über die Parameter der main-Funktion. Beispielsweise:

    int main(int argc, char *argv[]);
    

    Dann ist in dieser Notation argc die Anzahl der übergebenen Kommandozeilenargumente und argv ist ein Zeiger auf ein (nullterminiertes) Feld von (nullterminierten) Zeichenfolgen, die eben diese Kommandozeilenargumente enthalten. Achtung: Das erste übergebene Argument ist reserviert, die "richtigen" Argumente kommen danach. Bei den meisten Umgebungen ist das erste Argument der Befehl, mit dem das Programm gestartet wurde.

    Bei dem ersten Beispiel auf dem Bild wäre also argc gleich 4 und argv wäre wie folgt aufgebaut:
    argv[0] zeigt auf "Taschenrechner"
    argv[1] zeigt auf "5"
    argv[2] zeigt auf "+"
    argv[3] zeigt auf "4"
    argv[4] zeigt auf NULL

    Und wozu benötige ich die atof() funktion, welche einen String in einen double konvertiert?

    Ist nicht zwanghaft nötig, ist aber eine einfache Möglichkeit, die Kommandozeilenargumente (die, wie erwähnt, als Zeichenfolgen an main übergeben werden) zu parsen. Schließlich möchtest du damit rechnen. eine (von mehreren) Alternativen wäre die Funktion strtod, welche bessere Möglichkeiten zur Erkennung von Fehleingaben bietet.



  • Hey,

    danke für deine Hilfe, bis jetzt komm ich noch nicht drauf. Hätte noch ein Paar Fragen ich hoffe du kannst mir weiterhelfen:

    1. Ich schaff es nicht einzelne Stringfelder mit der atof(); Funktion in Floats umzuwandeln. Gibts da evtl. andere Funktionen?

    Bis jetzt habe ich es so Probiert.

    num(float Variable)=atof(string[1];

    aber das klappt nicht.

    2. Muss ich den String einlesen lassen? Also mit Funktionen wie gets();

    3. Von wo aus Starte ich das Programm? Ganz normal aus der IDE selbst?

    LG


  • Mod

    Kexplx schrieb:

    Bis jetzt habe ich es so Probiert.

    num(float Variable)=atof(string[1];

    aber das klappt nicht.

    Was heißt klappt nicht? Das kurze Codebeispiel hat mit C keine erkennbare Ähnlichkeit.

    2. Muss ich den String einlesen lassen? Also mit Funktionen wie gets();

    Nein, eben gerade nicht! Das ist es doch, was ich dir erklärt habe und was die Antwort auf die Frage mit der Kommandozeile war.

    3. Von wo aus Starte ich das Programm? Ganz normal aus der IDE selbst?

    Du wirst irgendwie die Kommandozeilenargumente eingeben müssen. Das geht beispielsweise von einer Kommandozeile aus 😉 . Aber auch deine IDE sollte eine entsprechende Option bieten.



  • Hey Sepp,

    kannst du dich evtl. kurz erbarmen und mir das Programm schreiben? Ich weiß es ist nicht dein Job als Admin hier meine Hausaufgaben zu lösen, und ich bin dir echt dankbar für die ganzen Tipps aber um 5 Uhr morgens kannst du ja vielleicht eine Ausnahme machen.

    Wäre dir sehr dankbar.

    LG


  • Mod

    Nein. Es ist aber vorstellbar, das andere dies für dich tun, insbesondere, wenn Geld ins Spiel kommt.



  • Ich hab 20 Cent

    und diesen Code:

    http://www.directupload.net/file/d/4171/qkftvap3_png.htm

    Benutze ich die Atof Funktion richtig?

    Danke Sepp, bist einfach der Beste



  • Du kannst auch in einer Referenz zu atof nachsehen:
    http://www.cplusplus.com/reference/cstdlib/atof/?kw=atof
    oder
    http://en.cppreference.com/w/c/string/byte/atof

    atof erwartet einen Zeiger auf einen C-String. Die Elemente von argv sind Zeiger auf C-Strings.

    Du kannst so aber nicht feststellen, ob in dem C-String eine gültige Fließkommazahl steht.

    Und kurzen Code kannst du direkt posten, dann aber zwischen Code-Tags.
    (je Länger der Code, desto weniger schauen den an)


  • Mod

    Zeilen 16 und 17 können doch niemals compilieren. So ruft man keine Funktionen auf. Ansonsten ist das doch gar nicht so weit von einem korrekten Ergebnis entfernt. Fehlt nur noch eine Analyse des Rechenzeichens.



  • Kexplx schrieb:

    http://www.directupload.net/file/d/4171/rdinzju6_png.htm

    Kexplx schrieb:

    http://www.directupload.net/file/d/4171/qkftvap3_png.htm

    Bitte direkt hier schreiben und keine Links auf externe Seiten.


  • Mod

    Furble Wurble schrieb:

    Bitte direkt hier schreiben und keine Links auf externe Seiten.

    Hey! Jetzt sehe ich, dass ihm das schon mehrmals gesagt wurde. Dann ist es wohl Zeit, seine Beiträge zu ignorieren, bis er es endlich lernt.



  • Ok habs hinbekommen.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    
    {
        double x,y,z;
    
        if(argc<4)
        {
            printf("Zu wenig Parameter");
    
        }
    
        x=atof(argv[1]);
        y=atof(argv[3]);
    
    switch(argv[2][0]){
    case '+':
        z=x+y;
        break;
    case '-':
        z=x-y;
        break;
    
    default:
        printf("\n Falsche Operationszeichen!");
        break;
    
    }
    
    printf("%s %s %s = %.2f",argv[1],argv[2],argv[3],z);
    
    }
    

    Als erstes möchte ich meiner Mutter danken die mich die ganzen Jahre unterstützt hat und natürlich SeppJ, der wie ein Bruder für mich da war. In guten sowie in schlechten Zeiten. 🙂


  • Mod

    Sieht solide aus.



  • Ahhh. Endlich kein verlinktes png mehr... 🙂

    Wenn Du das Programm verlassen willst, z.B. weil nicht genügend Kommandozeilenargumente übergeben wurde, kannste natürlich schon vorher ein return einbauen.

    if(argc<4)
        {
            puts("Zu wenig Parameter"); // puts() ist wie printf("%s\n", ...); nur kuerzer
            return -1;
        }
    

    Werte !=0 (hier -1) bedeuten üblicherweise "Fehler".



  • Negative Werte als main-Return sind Nonsens.

    main return


Log in to reply