Wochentagsformel
-
Hallo!
Vorerst möchte ich erwähnen, dass ich neu bin auf diesem Forum und auch in der C++-Welt.
Meine Absichten sind es, ein Programm zu schreiben, das mithilfe der Wochentagsformel von Gauß den Wochentag eines Datums berechnet (Und ich hoffe, dafür das richtige Forum gefunden zu haben).
Aber um mit der Formel rechnen zu können, werden vier Hilfsgrößen gebraucht.
1. der Tag
2. das Monat
3. die ersten beiden Ziffern des Jahres
4. die letzten beiden Ziffern des Jahres.Nun könnte man nach jeder Größe den Benutzer fragen, aber das wäre zu "amateurhaft".
Toll wäre, wenn der Benutzer das Datum nach dem Format DD.MM.YYYY eingibt und dann den Wochentag erhält, aber jetz kommt meine Frage:Das Datum (DD.MM.YYYY) lasse ich in einen String einlesen. Wie bekomme ich aus diesem Sting Zahlen heraus? Ist es überhaupt möglich?
So sieht es bei mir aus:
char datum[11]; short int day; cin.get(datum,11); day = datum[0]+datum[1]
Ich weiß, dass "day = datum[0]+datum[1]" nicht geht, da das eine ein String ist und das andere eine Zahl, aber kann mir jemand weiterhelfen, Tipps geben oder sonst was?
Danke schon im Vorraus::roachi
-
Die Frage ist im Matheforum falsch, dein Problem besteht ja lediglich daraus, einen String zu zerlegen.
Nehmen wir mal an, Du hast einen Char in der Form '3', den Du in eine Zahl vom Typ int umwandeln willst: int i = c-'0'. Eine Zeichenkette der Form "345" kann man dementsprechend zerlegen, indem man nacheinander str[0], str[1] und str[2] betrachtet (in einer Schleife) und vorgeht wie oben:
[cpp]unsigned str2uns(char const *p) {
unsigned res = 0;
while (*p) res = 10*res + *p++ -'0';
return res;
}
[/quote]In Wirklichkeit gibt es aber genug Funktionen, die dir so eine Arbeit abnehmen, in C++ würden sich zum parsen eines solchen String zB stringstreams oder sowas anbieten, aber es gibt auch primitivere Umwandlungsmethoden von Strings nach ints. MW gibt es dazu sogar einen ganzen Artikel in den FAQs dazu.
-
Wenn du das so machen willst, solltest du deine chars vorher in eine Zahl umrechnen.
Z.B.
int day = 10 * (datum[0] - '0') + (datum[1] - '0');
Btw. das ist eine C++ spezifische Frage.
Caipi
-
Soso..
Ganz hab ich es net verstanden, aber den Gedanken versteh ich!
Danke, ich werds mal versuchen!
::roachi
-
roachi schrieb:
Ganz hab ich es net verstanden, aber den Gedanken versteh ich!
Das versteh ich wiederum nicht
Falls du es noch nicht ganz verstanden haben solltest, versuch ichs nochmal:
Jedes Zeichen auf der Tastatur hat einen bestimmten ASCII-Code. Für die Zahlen lautet dieser 48 (= das Zeichen '0') bis 57 (= das Zeichen '9').
Wenn du nun einen char a = '3' hast, hat dieser ja den ASCII-Code 51. Deswegen schreibst du int zahl = a - '0'. Dies bewirkt, dass von dem ASCII-Code 51 der ASCII-Code 48 abgezogen wird, was letztendlich die Zahl 3 ergibt. Mit ihr lässt sich jetzt "auf gewohnte Weise" rechnen.
Wenn du eine (mehr als einstelligen String s = "333" hast), dann musst du noch ein wenig multiplizieren, da du ja sonst den Wert 9 bekommen würdest.
Daher:std::string s = "333"; int zahl = 100 * (s[0] - '0') + 10 * (s[1] - '0') + (s[2] - '0');
Dies lässt sich natürlich prima mit Schleifen vereinfachen (Wie in Daniel E. Post.)
Caipi
-
BTW: ASCII-Code ist ein 7 Bit Code - ihr mein sicherlich ISO 8859-1 (Latin-1), wobei sich der C/C++ Standard wieder nicht an diese Norm halten muss
-
-
Ah...
Jetz hab ich es geschnallt!
Das -'0' hat mich irritiert, aber jetz verstehe ich es ganz!
Ihr seid echt sehr hilfsbereit! Danke!mfg roachi