Datum abfrage und Zeichenausgabe



  • Guten Abend,

    ich hänge schon seit heute mittag an dieser Aufgabe und komme einfach nicht weiter.
    Ich muss ein Programm mit 3 Menüpunkten : Datum,Geometrie,Ende schreiben.
    Leider habe ich so meine Schwierigkeiten bei Datum und Geometrie.

    Ich krieg es nicht hin das bei Geometrie das Zeichen mehrmals ausgegeben wird.
    Bei Datum hab ich die Schwierigkeit das ich kein string benutzen darf. Daher weiß ich nicht wie ich die Zeichenkette abfragen soll.
    Die Aufgabenstellung ist als Kommentar hinterlegt.

    Mein Code:

    #include <iostream>
    using namespace std;
    
    void Datum();
    void Geometrie();
    void Ende();
    
    void Ende()
    {
    	cout << "Das Programm wird nun beendet" << endl; // Argument 
    }
    
    void Geometrie()
    /*Bei der Auswahl von „Geometrie“ kann der Benutzer eine positive ganze Zahl n eingeben. Es
    wird dann ein Karo aus 2n-1 Zeilen ausgegeben. Für n==4 ergibt sich z.B. folgende Ausgabe:
        *
       ***
      *****
     *******
      *****
       ***
        *
    */
    {
    	int i;
    	int n = 1;
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> i;
    	for ( int i = 2*n-1; n<=i;n++)
    	{
    
    		cout << '*' << endl;
    	}
    
    }
    
    void Datum()
    /*Unter dem Menüpunkt „Datum“ kann der Benutzer ein beliebiges Datum in der Form
    „32.13.1581“ eingeben und bekommt dann gesagt, ob das Datum korrekt ist, d. h. zu einem
    Tag passt.
    Der gregorianische Kalender gilt seit dem 15. Oktober 1582. Die Schaltjahrregelung wurde
    seitdem auch geändert: In allen Jahren, die nach Division durch vier eine natürliche Zahl
    ergeben, wird der 29. Februar als Schalttag eingefügt. Ausgenommen sind volle Jahrhunderte,
    die nicht glatt durch 400 teilbar sind.*/
    {
    	int tag = 0;
    	int monat = 0;
    	int jahr = 0;
    	cout << " Bitte geben Sie ein Datum in der Form [TT.MM.JJJJ] ein " << endl;
    	cin >> tag;
    	cin >> monat;
    	cin >> jahr;
    
    	if (tag >= 15 && monat >= 10 && jahr <= 1582)
    	{
    		cout << "Datum korrekt" << endl;
    	}
    	else
    	{
    		cout << "Falsches Datum" << endl;
    	}
    }
    
    int main()
    {
    	char eingabe = '\0';
    	while (true){
    		cout << "Sie sind im Menue.\nUm in die Unterpunkte zu gelangen geben Sie bitte \nD fuer Datum,G fuer Geometrie oder E fuer Ende ein:" << endl;
    		cin >> eingabe;
    		cout << "Es wurde:" << "[" << eingabe << "]" << "eingegeben" << endl;
    
    		if (eingabe == 'e')
    		{
    			Ende();
    			break;
    		}
    		if (eingabe == 'g')
    		{
    			Geometrie();
    			continue;
    		}
    		if (eingabe == 'd')
    		{
    			Datum();
    			continue;
    		}
    		cout << "Falsche Eingabe" << endl; // Eingaben außerhalb d,e,g
    	}
    
    		system("pause");
    		return 0;
    }
    

    Mit freundlichen Grüßen


  • Mod

    mc52 schrieb:

    Ich krieg es nicht hin das bei Geometrie das Zeichen mehrmals ausgegeben wird.

    Mit einer Schleife? Man darf auch Schleifen in Schleifen haben. Man muss auch nicht jede Ausgabe mit endl abschließen. (Und überhaupt ist endl fast immer falsch und man meint eigentlich nur einen Zeilenumbruch, '\n' .)

    Bei Datum hab ich die Schwierigkeit das ich kein string benutzen darf. Daher weiß ich nicht wie ich die Zeichenkette abfragen soll.

    Dann frag eben keine Zeichenkette ab 🙂
    Vorschlag: Ganzzahl, Buchstabe, Ganzzahl, Buchstabe, Ganzzahl. Dann Prüfung auf den passenden Bereich der Zahlen und Prüfung, ob die Buchstaben '.' sind.

    Bei deinen Lösungen fehlt übrigens noch viel mehr als nur die Eingabe/Ausgabe, das ist dir klar, oder?



  • Ist mein Ansatz bei Geometrie zumindest richtig ?

    Bei Datum hab ich leider keinen richtigen Plan wie ich an die Sache vorangehen sollte.

    Hoffe ihr könnt mir da helfen

    Mfg


  • Mod

    mc52 schrieb:

    Ist mein Ansatz bei Geometrie zumindest richtig ?

    Bis jetzt sehe ich da nicht wirklich einen Ansatz, außer "Sterne ausgeben". Das ist natürlich ein Teil der Lösung, diese beinhaltet aber natürlich noch viel mehr.



  • Leider komm ich nicht weiter und hoffe ihr könnt mir da weiterhelfen.



  • Ist der 29.02.2015 richtig?
    Ist der 62.24.2015 richtig?



  • mc52 schrieb:

    Bei Datum hab ich leider keinen richtigen Plan wie ich an die Sache vorangehen sollte.

    Naja, wie machst du es denn wenn dir jmd ein Datum hinschreibt und du prüfen musst ob es gültig ist oder nicht?



  • Ich bin zurzeit mit dem Geomtrieteil beschäftigt und komme einfach nicht weiter. Ich weiß wie die Syntax ablaufen muss aber ich weiß nicht wie ich es umsetzen soll.

    Ich brauche 2 Schleifen. Die 1. Schleife wird solange ausgeführt bis n <= die eingabe ist. Solange dies wahr ist muss er in die zweite Schleife springen.
    In der 2. Schleife habe ich die Formel i=2*n-1. i muss nun mit meiner Laufvariablen x verglichen werden. Das heißt solange x kleiner als i ist muss eine Ausgabe "*" erfolgen.

    Nur leider krieg ich das programmiertechnisch nicht hin. Mein jetziger Code:

    {
    	int j;
    	int x = 0;
    	int n;
    	int i;
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> j; 
    	for (int n = 1; n <= j; n++)
    	{		
    
    		do{ 			
    			i = 2 * n - 1;
    			x += x++;
    			cout << "\t\n*";
    		} while (x<=i);
    
    	}
    }
    


  • Dann mal dir das mal auf einem Zettel (am besten kariert) auf.

    In jeder Zeile mußt du Leerzeichen ausgeben.
    Danach gibst du eine Anzahl * aus.

    Das Ganze machst du einmal für den oberen Teil und dann noch für den unteren.

    Da kommen mehr als zwei Schleifen zusammen.

    Wie hängt dein j mit der Zeilennummer, der Anzahl der Leerzeichen und der Anzahl der * zusammen?
    (In C wird üblicherweise bei 0 mit Zählen angefangen. Muss aber nicht)



  • Wieso meinst du die 2*n-1 Formel kommt in die innere Schleife? Per cout kann man nur Zeilenweise schreiben also sollte die äußere Schleife so häufig durchlaufen werden wie es Zeilen gibt und das sind ja gerade 2*n-1 Zeilen. Pro Durchlauf wird dann genau eine Zeile ausgegeben. Dazu ist dann nochmal eine innere Schleife über jedes Zeichen in dieser Zeile praktisch bei der du nur ein Leerzeichen ausgibst wenn kein Sternchen benötigt wird. Überlege dir außerdem mal eine Formel um zu berechnen wie viele Sterne pro Zeile benötigt werden.



  • Mit dem jetzigen Code kriege ich die obere Hälfte raus.Jedoch alles in einer Zeile.
    Wie kriege ich das mit den Leerzeichen hin.
    Die Anzahl der Leerzeichen müssen bei Zunahme der Sterne verringert werden.

    {
    	int l = 0;
    	int j = 0;
    	int i = 0; 
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> j;
    	for (int n = 1; n <= j; n++) 
    	{
    		i = 2 * n - 1;
    		for(i=1;i<=j;i++)
    		{
    			cout << "*";
    		}
    
    	}
    }
    


  • Dies ist nun der aktuelle Stand.
    Beim 1. Rundgang für Leerzeichen wird geguckt wie viel Zeilen ich habe und dies wird von der Eingabe j abgezogen und dies solange bis l größer oder gleich j ist.

    Jedoch will es nicht funktionieren und mir gehen so langsam die Ideen aus wie ich das Programm zum laufen bringen könnte.

    {
    	int l = 0;
    	int j = 0;
    	int n = 0;
    	int i = 0; // Ausgabe Sterne
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> j;
    	for (int i = 1; i <= j; i++) // n Aufzählung bis Eingabe
    	{
    		n = 2 * i - 1; // n-Zeilen
    		cout << "*";
    		for (l = 0; l<=j; l++) // Ausgabe Leerzeichen
    		{
    			l= j - n;
    			cout << " ";
    		}		
    	}
    


  • Naja irgendwo musst du natürlich noch einen Zeilenumbruch cout << '\n'; einfügen, damit du die Ausgabe auch in mehreren Zeilen stehen hast. Dann kannst du auch besser sehen ob dein ausgebenes Muster der Aufgabenstellung entspricht und wo du noch nacharbeiten musst. Zu deinem jetzigen Stand:

    for (l = 0; l <= j; l++) // Ausgabe Leerzeichen
        {
          l = j - n;
          cout << " ";
        }
    

    Das sieht irgendwie nach einer Endlosschleife aus. Warum setzt du l in der Schleife neu? Und wieso gibst du anfangs immer ein Stern aus ohne irgendeine Bedingung zu testen? Überleg dir einfach wie viele Leerzeichen du am Anfang einer Zeile brauchst, dann wie viele Sterne und dann geb einfach so viele Zeichen aus.



  • Also es scheint nun doch zu funktionieren. Jedoch habe ich ein Problem in der unteren Hälfte
    Mein Problem lag darin das ich nicht wusste mit was ich die Anzahl der Sterne vergleichen musste

    Mein Code

    {
    	int zahl = 0;
    
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> zahl;
    	for (int i = 1; i <= zahl; i++)// Spalte	
    	{
    		{
    			for (int l = zahl - i; l >= 0; l--)
    
    			{
    				cout << " ";
    			}
    
    			for (int s = 1; s <= 2 * i - 1; s++)
    			{
    				cout << "*";
    			}
    			cout << "\n"; 
    		}
    		// Untere Hälfte
    
    		for (int i = zahl - 1; i >= 0; i--)// Spalte	
    		{
    			for (int l = zahl - i; l >= 0; l--)
    			{
    				cout << " ";
    			}
    
    			for (int s = 1; s <= 2 * i - 1; s++)
    			{
    				cout << "*";
    			}
    			cout << "\n";  
    		}
    	}
    }
    


  • Deine Eionrückung passt (was selten ist) zu der Klammerung.

    Und da knn man sofort sehen, dass die Schleife unter // Untere Hälfte innerhalb der ersten Schleife liegt.
    Ich kann mir nicht so recht vorstellen, dass dies so gemeint ist.



  • Also nach langem hin und her läuft das Programm nun endlich. War eine schwere Geburt 😃 .

    Programm:

    {
    	int zahl = 0;
    
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> zahl;
    	for (int i = 1; i <= zahl; i++)// Spalte	
    	{
    		{
    			for (int l = zahl - i; l >= 0; l--)
    			{
    				cout << " ";
    			}
    
    			for (int s = 1; s <= 2 * i - 1; s++)
    			{
    				cout << "*";
    			}
    			cout << "\n"; 
    		}
    	}
    	// Untere Hälfte
    	for (int i = zahl - 1; i>= 0; i--)
    		{		
    				for (int l = zahl - i; l >= 0; l--)
    				{
    					cout << " ";
    				}
    
    				for (int s = 1; s <= 2 * i - 1; s++)
    
    				{
    					cout << "*";
    				}
    			cout << "\n"; 
    		}
    }
    

    Das Programm läuft zwar habe aber eine Frage bezüglich der Veränderung in der for-Schleife

    for (int i = 1; i <= zahl; i++) // Spalte
    	{
    		{
    		for (int l = zahl - i; l >= 0; l--)//Leerzeichen
    

    z.B Zahl = 4
    1.Rundgang: i wird mit 1 initialisiert und aufgezählt solange es kleiner gleich 4 ist.
    Anschließend wird i an die nächste Schleife übergeben => 4-1 = 3 => 3 Leerzeichen werden ausgegeben.
    Nun müsste doch unabhängig vom i Wert im nächsten Rundgang 3 um 1 reduziert werden und wir würden die 2 erhalten.
    Da aber l abhängig von i ist und im nächsten Rundgang i++ = 2 ist, erhalten wir für l ebenfalls 2.

    Was passiert hier mit l-- ?
    Wird dies wegen dem in jedem Rundgang neu initialisiert wert von i einfach ausgelassen, weil "zahl-i" ist im Grunde eigentlich auch ein l--.





  • Falls möglich bitte in ihren Worten wiedergeben 🙂

    Habe mich in der Zeit mit dem Menüpunkt Datum beschäftigt. Ist noch nicht komplett. Jedoch hab ich jetzt schon Fehler im Programm.

    {
    	int tag = 0;
    	int monat = 0;
    	int jahr = 0;
    	char s = '.';
    	int datum = 0;
    	cout << " Bitte geben Sie ein Datum in der Form [TT.MM.JJJJ] ein " << endl;
    	cin >> tag >> s >> monat >> s >> jahr;
    
    	if (tag <= 31)
    	{
    		if (monat = 1, 3, 5, 7, 8, 10, 12)
    		{
    			cout << "Datum ist korrekt";
    		}
    		else
    		{
    			cout << "Datum falsch";
    		}
    	}
    
    	if (tag <= 30)
    	{
    		if (monat = 4, 6, 9, 11)
    		{
    			cout << "Datum ist korrekt";
    		}
    		else
    		{
    			cout << "Datum falsch";
    		}
    	}
    
    	if (tag <= 0 ||tag >= 31 && monat <= 0 || monat > 12 || jahr < 1582)
    			{
    				cout << "Datum falsch";
    			}
    

    Hoffe ihr könnt mir da weiterhelfen.

    Mfg



  • Dein Test auf mehrere Bedingungen gibt es so nicht in C++. Ich schlage vor ein array mit der Anzahl der Tage pro Monat zu verwenden. Und warum ist ein Datum vor dem Jahr 1582 überhaupt ungültig?



  • Wegen der Aufgabenstellung :

    /*Unter dem Menüpunkt „Datum“ kann der Benutzer ein beliebiges Datum in der Form 
    „32.13.1581“ eingeben und bekommt dann gesagt, ob das Datum korrekt ist, d. h. zu einem 
    Tag passt. 
    Der gregorianische Kalender gilt seit dem 15. Oktober 1582. Die Schaltjahrregelung wurde 
    seitdem auch geändert: In allen Jahren, die nach Division durch vier eine natürliche Zahl 
    ergeben, wird der 29. Februar als Schalttag eingefügt. Ausgenommen sind volle Jahrhunderte, 
    die nicht glatt durch 400 teilbar sind.*/
    

    Ich habe das mit dem l-- von der for-Schleife leider immernoch nicht so ganz verstanden.

    mc52 schrieb:

    Das Programm läuft zwar habe aber eine Frage bezüglich der Veränderung in der for-Schleife

    for (int i = 1; i <= zahl; i++) // Spalte
    	{
    		{
    		for (int l = zahl - i; l >= 0; l--)//Leerzeichen
    

    z.B Zahl = 4
    1.Rundgang: i wird mit 1 initialisiert und aufgezählt solange es kleiner gleich 4 ist.
    Anschließend wird i an die nächste Schleife übergeben => 4-1 = 3 => 3 Leerzeichen werden ausgegeben.
    Nun müsste doch unabhängig vom i Wert im nächsten Rundgang 3 um 1 reduziert werden und wir würden die 2 erhalten.
    Da aber l abhängig von i ist und im nächsten Rundgang i++ = 2 ist, erhalten wir für l ebenfalls 2.

    Was passiert hier mit l-- ?
    Wird dies wegen dem in jedem Rundgang neu initialisiert wert von i einfach ausgelassen, weil "zahl-i" ist im Grunde eigentlich auch ein l--.

    Mfg


Anmelden zum Antworten