Jahreszahleingabe
-
Hallo zusammen,
als erstes muss ich euch sagen, dass ich noch nicht sehr viel Erfahrung in C/C++ habe.
Ich möchte das Datum (in C) eingeben und dann soll Tag, Monat und Jahr einzelt gespeichert werden. Doch leider weiss ich nicht wie ich das anstellen soll.Hier mal mein kleiner Ansatz:
int tag, mon, jahr, richtig; printf("Geben Sie das Datum in der Form TT.MM.JJJ ein: "); scanf("%i,%i,%i",&tag,&mon,&jahr); printf("%i"tag,mon,jahr);
Wie ihr daran sehr, weiss ich nicht wie ich TT in tag, MM in mon usw. gespeichert bekomme. Ich könnte das so machen, dass ich zuerst den Tag eingebe und der dann gespeichert wird, dann der Monat usw. Aber ich möchte, dass das Datum in einem eingegeben wird und in den Variablen gespeichert wird.
Ich hoffe, ihr könnt mir helfen. Also ich möchte nicht die Lösung, sondern nur einen Ansatz. Ich möchte ja auch was dabei lernen!
-
Du musst das ganze, da es ja durch Punkte getrennt wird (Zeichen) als string einlesen.
Dann zerteilst du ihn in drei Teile, jeweils bis zum Punkt und machst aus diesen strings jeweils eine Zahl.
-
Aha ok. Aber wie stelle ich das an?
Muss ich das so machen:char jahr[20]; printf("Geben Sie das Datum in der Form TT.MM.JJJ ein: "); scanf("%c",&jahr);
Und dann kann ich über die Indizes auf die einzelnen Werte zugreifen oder wie meinst du das?
-
std::string values[3]; std::getline (std::cin, values[0], '.'); //bis zum ersten punkt std::getline (std::cin, values[1], '.'); //bis zum zweiten punkt std::getline (std::cin, values[2]); //und den rest... (was hier das jahr darstellen sollte ^^) //überprüfung / toint / ...
so würd ich es wahrscheinlich machen... man kann es auch erst komplett als string einlesen und dann so durchsuchen etc...
std::string eingabe; std::getline (std::cin, eingabe); //hier sollte so gar std::cin >> eingabe; gehen... //T ToInt (std::string) müsstest du dazu noch schreiben... sollte bei nem fehler ne exception werfen... try { unsigned __int8 tag = ToInt <unsigned __int8> (eingabe.substring (....)); //von 1 bis zum linken . unsigned __int8 month = ToInt <unsigned __int8> (eingabe.substring (....)); //vom linken bis zum rechten punkt unsigned __int16 jahr = ToInt <unsigned __int16> (eingabe.substring (...)); //vom rechten punkt bis zum schluss } catch (...) { std::cout << "falsche eingabe...." << std::endl; };
ich würde dafür aber noch nen struct schreiben - da kann man die ganzen fkt übersichtlich reinpacken und könnte später auch mit den tagen rechnen, sie bequem verwalten (std::vector <my_datum>) etc... ^^
Hoffe, dass dir das ein wenig geholfen hat ^^
bye : >
-
erstmal:
Bei c++ gibt es eine schöne Klasse string, die in diesem Fall statt einem char genutzt werden sollte.Ich hätte das so gemacht:
#include <iostream> #include <string> using namespace std; int main() { cout << "Geben Sie das Datum ein: " << "\n"; //Wenn wir schon unter c++ sind nutzen wir doch c++ Funktionen string eingabe; cin >> eingabe; string jahr, tag, monat; tag=""; monat=""; jahr=""; int punkt=0; for (int i=0;i<eingabe.size();++i) { if (eingabe[i]=='.') { ++punkt; continue; } switch (punkt) { case 0: tag+=eingabe[i]; break; case 1: monat+=eingabe[i]; break; case 2: jahr+=eingabe[i]; break; } } cout << "Tag: " << tag << " Monat: " << monat << " Jahr: " << jahr << "\n"; }
-
unskilled schrieb:
std::string values[3]; std::getline (std::cin, values[0], '.'); //bis zum ersten punkt std::getline (std::cin, values[1], '.'); //bis zum zweiten punkt std::getline (std::cin, values[2]); //und den rest... (was hier das jahr darstellen sollte ^^) //überprüfung / toint / ...
so würd ich es wahrscheinlich machen... man kann es auch erst komplett als string einlesen und dann so durchsuchen etc...
std::string eingabe; std::getline (std::cin, eingabe); //hier sollte so gar std::cin >> eingabe; gehen... //T ToInt (std::string) müsstest du dazu noch schreiben... sollte bei nem fehler ne exception werfen... try { unsigned __int8 tag = ToInt <unsigned __int8> (eingabe.substring (....)); //von 1 bis zum linken . unsigned __int8 month = ToInt <unsigned __int8> (eingabe.substring (....)); //vom linken bis zum rechten punkt unsigned __int16 jahr = ToInt <unsigned __int16> (eingabe.substring (...)); //vom rechten punkt bis zum schluss } catch (...) { std::cout << "falsche eingabe...." << std::endl; };
ich würde dafür aber noch nen struct schreiben - da kann man die ganzen fkt übersichtlich reinpacken und könnte später auch mit den tagen rechnen, sie bequem verwalten (std::vector <my_datum>) etc... ^^
Hoffe, dass dir das ein wenig geholfen hat ^^
bye : >
Erstmal vielen Dank für deine Antwort. Doch leider verstehe ich überhaupt nicht wie das genau funktioniert und was die einzelnen Dinge bedeuten.
Was ich aber aus deinem Code verstanden habe ist, dass man bis zum ersten Punkt einliest und das in datum[0], dann bis zum nächsten Punkt einliest und in datum[1] speichert usw.
Wie sieht das in Anfängercode aus mit printf und scanf? Oder womit muss ich das einlesen?
-
printf und scanf
das sind keine anfäger-fkt sondern das ist c... veraltet etc...
Oder womit muss ich das einlesen?
std::getline (/*parameter suchen*/); //oder std::cin >> /*zielvariable*/;
Bye
-
unskilled schrieb:
printf und scanf
das sind keine anfäger-fkt sondern das ist c... veraltet etc...
Oder womit muss ich das einlesen?
std::getline (/*parameter suchen*/); //oder std::cin >> /*zielvariable*/;
Bye
Ja ich weiss, dass das C ist. Ich habe aus Versehen das falsche Forum gewählt. Normal programmiere ich auch in C++, doch "leider" muss ich im Studium am Anfang in C programmieren.
@kaffee:
Der Code von dir sieht verständlich aus. Du speicherst das Datum in dem string eingabe und dann überprüfst du bis zum Ende des Strings, ob ein Punkt vorkommt und wenn der erste Punkt kommt, dann speicherst du das in Tag, Monat und Jahr ab. Doch die switch-Anweisung verstehe ich nicht ganz.Da ich das Programm in C brauche, soll ich da hier weiterposten oder einen neuen Thread im C-Forum aufmachen?
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wirt.-Inf.07 schrieb:
Du speicherst das Datum in dem string eingabe und dann überprüfst du bis zum Ende des Strings, ob ein Punkt vorkommt und wenn der erste Punkt kommt, dann speicherst du das in Tag, Monat und Jahr ab. Doch die switch-Anweisung verstehe ich nicht ganz.
Immer wenn ein Punkt kommt, zähle ich die Variable punkt hoch. Wenn die Variable 0 ist speicher ich es als Tag ab, wenn 1 als Monat. Mit switch schau ich ob die Variable 0, 1 oder 2 ist. Kann man genauso mit if und else if machen.
mfg kaffee
-
Ihr müsst ja net direkt eure größten Geschütze ausfahren. Wie wärs hiermit:
printf("Bitte geben Sie ein Datum ein: "); scanf("%d.%d.%d", &tag, &monat, &jahr);
gruß Markus