zwei zahlen in einer Zeile einlesen



  • sorry für die blöde frage aber ich schaffs nicht 😞

    bis jetzt:
    les ein char ein (Rechenoperation zb. +,-,/,etc)

    problem:
    will nachdem ich die Operation ausgewählt hab zwei Zahlen einlesen
    will sie aber in einer Zeile stehen haben.

    damit das ganze vielleicht mal so ausieht:
    + 12,5 16,5 = 29

    hab überlegt:
    ne while schleife und mit getch() abfragen ob ein leerzeichen daherkommt aber da müsst ich bei einer dreistelligen zahl drei mal einlesen (wegen dem while)

    würd mich über lösungsansätze rießig freun

    danke im voruas
    peace



  • guck mal im "the c programming language, second edition". da gibts einen code fuer einen RPN rechner, der ziemlich gut auf dein problem passt.



  • ok mach ich danke



  • Also wenn es immer nur 2 Zahlen sind, dann geht das mit scanf()/sscanf() recht leicht.



  • TactX schrieb:

    Also wenn es immer nur 2 Zahlen sind, dann geht das mit scanf()/sscanf() recht leicht.

    bei sscanf() bin ich mir nicht sicher den befehl kenn ich nicht
    aber scanf() möcht ich nicht verwenden weil er die zahlen erst mit dem return einliest und automatisch in die nächste zeile springt deshalt ist die ganz sache ja so umständlich
    außerdem wenn ich einfach:

    scanf("%f %f",&fZahl1,&fZahl2);
    

    einlese bekomm ich immer irgendwelche werte rein



  • http://www-ccs.ucsd.edu/c/

    und sag nicht noch einmal, dass scanf "irgendwelche werte einliest" oder dass du sscanf nicht kennst.



  • ok ich hab mir das sscanf angeschaut aber blick da nicht ganz durch

    ...
    char cPuffer[] = "15";
    ...
    sscanf(cPuffer,"%c%f%F",&cOperant,&fZahl1,&fZahl2);
    if(cOperant == 'h')
     {
        ...
     }
    else
     {
       ...
     }
    

    mir ist klar das else genommen wird da ja cPuffer standartmäßig "15" zugewiesen worden ist. aber wiso lässt er nciht mal einen eingabe zu??
    ich starte das probramm und das else wird ausgeführt
    warum???
    wiso wartet das sscanf nicht auf einen eingabe des benutzers?

    //edit: ' vergessn



  • du hast dir den link nicht angeschaut, den ich dir gegeben hab!
    in zukunft tue das bitte. ich hab keinen bock, alles mehrmals zu sagen.

    sscanf liest nicht von der standardeingabe, sondern aus einem string.



  • sorry
    aber ich hab mir den link wirklich angeschaut
    und die msdn auch
    aber hab wahrscheinlich zuviel probleme mit englisch und deswegen nicht verstanden



  • Also dieses kleine Progrämmchen läuft einwandfrei. Und hör auf c.rackwitz: Du musst lesen, versuchen zu verstehen, weiterlesen... sonst wird das nix.

    #include <stdio.h>
    #include <string.h>
    
    int main(void){
            char buffer[100];
            char operand;
            float zahl1,zahl2;
    
            fgets(buffer,sizeof(buffer),stdin); // Text einlesen
    
            sscanf(buffer,"%c %f %f", &operand , &zahl1, &zahl2); // "Parsen"
    
            // Berechnen
            if(operand=='+') printf("Ergebnis = %f\n",zahl1+zahl2);
            if(operand=='-') printf("Ergebnis = %f\n",zahl1-zahl2);
            if(operand=='*') printf("Ergebnis = %f\n",zahl1*zahl2);
            if(operand=='/') printf("Ergebnis = %f\n",zahl1/zahl2);
    
            return 0;
    }
    


  • Ich wuerde es ein wenig optimieren. Die if-Abfrage wird auch gelesen, wenn absolut klar, dass sie ein fals-Ergebnis produzieren wird. Also besser:

    char   *szErgebnissTxt = "Ergebnis = %f\n";
    
    /*erspart unnoetiges Copy and Paste! */
    
    switch (operand)
    {
        case '+': printf (szErgebnissTxt, zahl1-zahl2);
                  break;
        case '-': printf (szErgebnissTxt, zahl1+zahl2);
                  break;
        case '*': printf (szErgebnissTxt, zahl1*zahl2);
                  break;
        case '/': /*hier sollte eine Anfrage herein, 
                  ob zahl2 wirklich ungleich 0 ist!*/
                  printf (szErgebnissTxt, zahl1/zahl2); 
                  break;
        default   printf ("Unbekannter Operator <%c>\n", operant);
                  break; /*eigentlich unnoetig, sieht aber besser aus */ 
    }
    


  • wie waers mit einer if-else if-else kette?
    switch ist hier aber immernoch besser.



  • Ich glaube, dass das hier scheissegal ist 😉



  • ok danke nochmal für die hilfe

    jup werd das nächste mal mehr, genauer und wenn nötig mit einem wörterbuch im anschlag lesen 😃
    + noch mehr herumprobieren
    (such funktion verwend ich bereits)

    naja das gröste problem für einen anfänger ist trotzen noch immer das lesen der hilfe, da blickt man oft gar nicht durch
    aber gut ich werd mich hüten nochmal überfrüht jemanden anders fragen



  • TactX schrieb:

    Ich glaube, dass das hier scheissegal ist 😉

    Dachte ich auch, bis ich mir die switch-Construction und die if-else im Dis-Aassembler anschaute. Die if-else Konstruktion hat ein paar Abfragen und Spruenge nach dem Zero-Flag mehr, muesste also geringfuegig langsamer sein (ist dafuer flexibler):

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-119321.html



  • MBCS-CITP schrieb:

    TactX schrieb:

    Ich glaube, dass das hier scheissegal ist 😉

    Dachte ich auch, bis ich mir die switch-Construction und die if-else im Dis-Aassembler anschaute. Die if-else Konstruktion hat ein paar Abfragen und Spruenge nach dem Zero-Flag mehr, muesste also geringfuegig langsamer sein (ist dafuer flexibler):

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-119321.html

    Das "scheissegal" bezog sich eher darauf, dass es hier für mein Beispiel relativ egal ist, da der Code eh nur zur Veranschaulichung für das eigentliche Problem gedacht ist. Normalerweise hätte ich hier natürlich auch kein if if if if gemacht. Es war einfach übersichtlicher.

    Außerdem könnte ich mir vorstellen, dass es Compiler gibt die für alle drei Varianten gleichen Code erzeugen. Aber das ist hier nicht das Thema 😉


Anmelden zum Antworten