Problem mit Schleifen



  • einfach das letzte zeichen in einer variable speichern, bevor ein neues eingelesen wird.

    char zeichen = 0;
    
    do{ 
       char zeichen2 = zeichen;
       scanf("%1c",&zeichen); 
       //jetzt hast du das neue zeichen in "zeichen" und das alte in "zeichen2"
    }while(zeichen!=10);
    


  • (eine gute tat für heute und mal eine frage aus dem grundlagen-forum beantworten :p)

    du kannst das problem so nicht effizient und fehlerfrei lösen!

    wenn du immer nur 1 Zeichen einliest kannst du IV nicht von VI unterscheiden. dieses problem abzufangen ist die mühe nicht wert. lies doch einfach einen string ein und lass den dann in der whileschleife auswerten.

    wenn du immer nur 1 zeichen einliest hast du ständig '\n'-zeichen im tastaturpuffer weil du nach der eingabe des zeichens enter drücke musst. die laufen dann unnötig durch deine schleife... mach statt "%c" einfach "%c%*c" in dein scanf rein und die '\n'-chars werden automatisch entfernt.

    statt while(zeichen != 10) kannst du auch while(zeichen != '\n') schreiben.

    gruß



  • davie schrieb:

    einfach das letzte zeichen in einer variable speichern, bevor ein neues eingelesen wird.

    char zeichen = 0;
    
    do{ 
       char zeichen2 = zeichen;
       scanf("%1c",&zeichen); 
       //jetzt hast du das neue zeichen in "zeichen" und das alte in "zeichen2"
    }while(zeichen!=10);
    

    lol 🙂 is ja süß...



  • Yoth schrieb:

    wenn du immer nur 1 zeichen einliest hast du ständig '\n'-zeichen im tastaturpuffer weil du nach der eingabe des zeichens enter drücke musst.

    wenn du immer nur ein zeichen aus dem tastaturpuffer nimmst, bleiben die anderen noch drinnen, d.h. wenn ich als wurscht eingebe:
    abcdefg
    wird bei scanf("%1c",&a); scanf("%1c",&b); a ein 'a' und b ein 'b' zugewiesen.
    nix mit <enter> zwischen den einzelnen zeichen.
    aber eigentlich sollte es im c++ Forum ja auch

    cin>>x;
    //bzw.
    cin.get(x); //wenn man das '\n' miteinlesen will
    

    heißen, statt scanf 😉

    #include <iostream>
    using namespace std;
    
    int main () {
    	char c = 0;
    	do {
    		char last = c;
    		cin.get(c);
    		cout << "This: " << c << "\nLast: " << last << '\n';
    	} while (c != '\n');
    }
    

    probier das mal aus, wenn du nicht glauben magst.



  • Also ich hab jetzt diesen code:

    #include <vcl.h>
    #include <stdio.h>
    #include <conio.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    int I=1, V=5, X=10, L=50, C=100, D=500, M=1000, ergebnis;
    char zeichen, zeichen2;
    int main(int argc, char* argv[])
    
    {
            printf("\n\n Roemische Zahlen ==> Dezimalzahlen");
            printf("\n Geben Sie eine roemische Zahl mit Hilfe der Symbole I,V,X,"
            "L,C,D,M ein");
            printf("\n ==> ");
            zeichen=0;
            do{
                    zeichen2=zeichen;
                    scanf("%1c",&zeichen);
                    if(zeichen!=10)
                    {
                    ergebnis=zeichen+zeichen2;
                    }
                    else{}
            }
            while(zeichen!=10);
            printf("\n\n Die Dezimalzahl lautet: %i",ergebnis);
    
            getch();
            return 0;
    }
    //---------------------------------------------------------------------------
    

    Aber da kommt immer nur quatsch raus (bei VI 159, bei VII 146)!! 😕



  • also, etwas kritik 😉

    der code von dir ist C. In C++ hättest du die Möglichkeit, über cin nachzusehen, welches zeichen als nächstes im buffer liegt, und das dann auch wieder zurückzutun, falls du es nicht brauchst.
    und ich denk mal, die römischen zahlen, sind etwas komplizierter (nicht viel, aber etwas) als dein ergebni=zeichen+zeichen2;
    in zeichen und zeichen2 sind lediglich die werte von 'I','C',etc. als ASCII gespeichert. und außerdem nimmst du bei jedem schleifendurchlauf nur die letzten beiden werte.

    vielleicht solltest du dir mal einen guten c++ kurs zu gemüte führen, zb den von Shade: (sry, ich liefer den link nach)
    denn wenn ich dir jetzt eine (Komplett)lösung in C++ geben würde, würdest du wahrscheinlich nicht durchblicken. wenn die aufgabe allerdings in C zu lösen ist, hättest du das von anfang an dazusagen sollen.



  • davie schrieb:

    wenn du immer nur ein zeichen aus dem tastaturpuffer nimmst, bleiben die anderen noch drinnen, d.h. wenn ich als wurscht eingebe:
    abcdefg
    wird bei scanf("%1c",&a); scanf("%1c",&b); a ein 'a' und b ein 'b' zugewiesen.
    nix mit <enter> zwischen den einzelnen zeichen.

    nagut in dem fall hast du recht... aber warum dann nicht gleich einen string einlesen?! egal... zurück zum thema:

    du müsstest schon ein paar abfragen einbauen um zu prüfen welche chars nun eingegeben wurden...

    Beispiele:
    VII = 7
    CXC = 190
    LV = 55
    LVIII = 58
    MMIII = 2003

    MCMXLII (hrhr nu wirds hart) = 1942
    MCML = 1950
    MCMIL = 1949

    siehe der höchste kommt immer zuerst und wenn nicht dann weil der zu der zahl dazu gehört... musst du prüfen und vom größeren aus subtrahieren... mach dir am besten ersmal n plan aufm papier (PAP oder so) das wirste so ausm stehgreif ned einwandfrei hinbekommen... das wird glaub ich saukomplex...

    nun muss man auch unterscheiden:
    IXLCM = 841?! <<< falsch
    DCCCXLI = 841?! <<< richtig

    kann man rechnen ala:

    DCCCXLI

    erstmal so DCCC = ((+500) + (+100) + (+100) + (+100))
    weil die CC kleiner M sind und deshalb zum M gehören...

    dann XL = ((-10) + (+50))
    weil das X zum L gehört

    und zum schluss I = (+1)

    demnach:
    ((+500) + (+100) + (+100) + (+100)) + ((-10) + (+50)) + (+1)

    ein klammergewusel...

    die zahlen zu verifizieren ist ja beinahe unmöglich... deshalb sag ich einfach mal scheiss drauf: der user muss wissen was er eingibt 😉

    vielleicht kann man ja ne rekursive funktion dafür einsetzen oder sowas in der art...

    gruß



  • Sorry Leute,

    Ich glaub ich hab hier ein paar Informationen vergessen 😞

    Also: 1. Ich wusste den Unterschied von C zu C++ nicht. Also der ganze Kram soll in C geschrieben werden.
    2. Wir haben Strings, Arrays, structs und Zeiger noch gar nicht durchgenommen.



  • dann hau deinem ausbilder mal kräftig auf die finger... mit den mitteln die dir "gegeben" sind kannst du das dann nicht lösen... deshalb hab ich damals den c-kurs immer gehasst... du kennst dich aus, willst nen string benutzen aber darfst ned und musst da wild "bruteforcen"....

    als wenn man sagt: "grabe den garten um", aber anstatt eines baggers oder eines spatens bekommste nur ein buttermesser ;P



  • Danke Yoth !! Sehr motivierend. 😉

    Klasse Vergleich. Hätte nicht gedacht daß das so kompliziert werden würde.
    Ich werd euch auch jetzt nicht mehr im c++ Forum mit so was belasten.


Anmelden zum Antworten