Problem mit Schleifen
-
Wäre das nicht ein besserer Ansatz daufür, damit kann man dann auch 'IV' und ähnliches bearbeiten
char zeichen; int flag=0; do{ scanf("%c",&zeichen); // vielleicht auch getc() switch (zeichen) { case 10: // Zahl fertig eingegeben. flag=1; // beende while break; case 'I': //Bearbeite die röm. Ziffer I case 'i': break; case 'V': //Bearbeite die röm. Ziffer V case 'v': break; //...... default: printf("Ungültiges Zeichen\n"); } } while(0==flag);
-
Das Problem ist glaube ich ein ganz Allgemeines.
Ich habe eine Folge von Zeichen oder Ziffern
Diese sollen einzeln, nacheinander eingelesen werden (per Schleife)
Dann sollen die einzelnen Zeichen/Ziffern in einem Durchgang mit dem Einlesen addiert werden.
Dieser Algorithmus müsste auch zur Berechnung einer Quersumme verwendet werden.do{ scanf("%1c",&zeichen); if(zeichen!=10) { ergebnis=zeichen + zeichen2; //Wo krieg ich das Zeichen aus dem //vorherigen Durchlauf her(zeichen2 ??) //Problem ist ja daß zeichen oder zeichen2 //bei jedem Durchlauf überschrieben werden } }while(zeichen!=10);
Ich hoffe mein Problem ist jetzt etwas klarer geworden.
Übrigens muss ich das Programm mit diesem Ansatz schreiben sonst würde ich deine Lösung nehmen PAD.
-
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 auchcin>>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 = 2003MCMXLII (hrhr nu wirds hart) = 1942
MCML = 1950
MCMIL = 1949siehe 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?! <<< richtigkann 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örtund 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.