kontrolle..



  • Hallo zusammen, dieses Programm das ich unten platziert habe bezieht sich auf diese aufgabenstellung. Die Aufgabe muss ich bis montag abgeben. könnt jemand überprüfen ob alles vollständig ist und sinn gemäß abgearbeitet wurde...

    Ein in der Form: TT.MM.JJJJ einzugebendes Datum soll auf Plausibilität geprüft werden.

    Diese Prüfung soll solange für neu einzugebende Daten wiederholt werden, bis das zuletzt eingegebene Datum plausibel ist.
    Schaltjahre müssen in die Überprüfung mit einbezogen werden.

    Die eigentliche Prüfung übernimmt ein Modul: pruefung.

    Im Ergebnis der Prüfung soll dieses prüfmodul informieren, welches Problem es gab. bsp Monat zu groß. keine 31 im April!

    Die Textausgabe: " Datum ist Plausibel" soll allerdings im Hauptgrogramm erfolgen.

    Das Gesamtprogramm soll auf Wunsch wiederholt werden können.

    Erfüllt der Queltext die Aufgabenstellung?

    Hier ist anbei der Quelltext:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main ()
    
    { // Beginn des Hauptprogramms!
    
    int tag,monat,jahr;
    
    char weiter ='j';
    int schaltjahr; 
    
    //cls
    
    printf("\n \t * ~ * W I L K O M M E N * ~ *\n");
    getch();
    //cls
    while(weiter == 'j' || 'J' || 'y' || 'Y' || 1)  // wird die taste j gedrückt wird der Prozess neugestartet!
    {
    
    do
    { // do while schleife
    
    printf("\n Bitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
    
    scanf( "%2u.%2u.%4u", &tag, &monat, &jahr );
    fflush (stdin);
    
    schaltjahr = (!(jahr%4 && jahr %100 && jahr%400));
    //schaltjahr =(!(jahr%4));
    
    if( (monat ==01 && tag <=31)||   // Solange Bedingungen war wird das Datum ausgegeben!
    (monat ==02 && tag <=28) ||
    (monat ==03 && tag <=31) || 
    (monat ==04 && tag <=30) ||
    (monat ==05 && tag <=31) ||
    (monat ==06 && tag <=30) ||
    (monat ==07 && tag <=31) ||
    (monat ==8 && tag <=31) ||
    (monat ==9 && tag <=30) ||
    (monat ==10 && tag <=31) ||
    (monat ==11 && tag <=30) ||							//(monat ==02 && (!(schaltjahr)))||
    (monat ==12 && tag <=31) ||
    ((monat ==02) && (tag ==29)&& (schaltjahr)))
    
    {
    switch(monat)
    { // beginn switch anweisung
    case 01:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. januar.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 02:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. Februar.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 03:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. März.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 04:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. April.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 05:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. Mai.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 06:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. Juni.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 07:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. Juli.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 8:
    	printf(" %i. August.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 9:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. September.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 10:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. Oktober.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 11:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. November.%iund verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    
    	case 12:
    	printf("\nDatum ist Plausibel!\n");
    	printf(" %i. Dezember.%i und verfuegt: %i Schaltjahr/e!",tag,jahr,schaltjahr);
    	break;
    } // ende switch anweisung!
    
    }
    
    else
    
    {
    	printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr);// Ausgabe Prüfmodul
    
    }
    
    } while( (monat ==01 && tag >31)||   // Prüfmodul! Solange Bedingung wahr, wird der Vorgang wiederholt!
    (monat ==02 && tag >29) || 
    (monat ==02 && tag==29 && (!(schaltjahr)))||
    (monat ==03 && tag >31) || 
    (monat ==04 && tag >30) ||
    (monat ==05 && tag >31) ||
    (monat ==06 && tag >30) ||
    (monat ==07 && tag >31) ||
    (monat ==8 && tag >31) ||
    (monat ==9 && tag >30) ||
    (monat ==10 && tag >31) ||
    
    (monat ==11 && tag >30) ||
    (monat ==12 && tag >31) ||
    (monat > 12));     // do while Schleife
    //(jahr < 1582  && monat <= 12 && tag < 33));     // do while Schleife
    
        printf("\n\nWollen Sie den den Prozess wiederholen \nDann taetigen Sie fuer Ja die Taste j und fuer Nein die Taste \n\n");
    	weiter=getch();
    
    }
    	system("pause");
    
    } // Ende des Hauptprogrammas!
    

    danke.

    gruß hasso



  • Wie viele neue Threads zu diesem Thema willst du eigentlich noch öffnen?



  • Hallo

    ? bitte was spielt das für eine rolle? und was geht dich das an?

    nur zu info das ist ein Forum , da stellt man halt fragen und wieviel und wie oft spielt doch keine rolle solange man sich an die Bedingungen hält!
    Ich glaub du solltest dir die Forum Bedingungen mal durchlesen.

    bzw.

    Forum (lateinisch forum, ursprünglich „Umplankung“, später „Marktplatz“, „Versammlungsort“; Plural: Foren oder Fora) ist:

    in der Antike eine römische Platzanlage, siehe Forum (Platz)
    speziell das Forum Romanum
    von dieser Bedeutung abgeleitet: ein realer oder virtueller Ort, wo Meinungen untereinander ausgetauscht werden können, Fragen gestellt und beantwortet werden können, siehe Forum .

    quelle Wikipedia 😃 nun alles klar.

    gruß hasso



  • Kleiner Hinweis :

    int tag,...
     ...
    (monat ==01 && tag <=31)
    

    Diese Bedingung gilt für sämtliche Ganzzahlen, die kleiner/gleich 31 sind.



  • hasso schrieb:

    Hallo

    ? bitte was spielt das für eine rolle?

    dass man all deine Fragen zu diesem Programm in einem einzigen Thread beantworten kann. Das macht den Helfern nicht einfach, wenn man den Code an 3 verschiedenen Threads lesen muss.



  • Dass nach Deiner Willkommensnachricht eine Taste gedrückt werden muss, ist nicht klar, wenn's nicht da steht.
    getch( ) ist nicht Standard C.

    Hasso schrieb:

    while(weiter == 'j' || 'J' || 'y' || 'Y' || 1)  // wird die taste j gedrückt wird der Prozess neugestartet!
    

    Dein Kommentar passt nicht zur Bedingung. Ergo: Eins von beiden ist Quatsch.

    Hasso schrieb:

    do
    { // do while schleife
    

    Soetwas Kommentiert man nicht.

    Hasso schrieb:

    (!(jahr%4 && jahr %100 && jahr%400));
    

    ist nicht korrekt.

    Hasso schrieb:

    if( (monat ==01 && tag <=31)||   // Solange Bedingungen war wird das Datum ausgegeben!
    (monat ==02 && tag <=28) ||
    (monat ==03 && tag <=31) ||
    (monat ==04 && tag <=30) ||
    (monat ==05 && tag <=31) ||
    (monat ==06 && tag <=30) ||
    (monat ==07 && tag <=31) ||
    (monat ==8 && tag <=31) ||
    (monat ==9 && tag <=30) ||
    (monat ==10 && tag <=31) ||
    (monat ==11 && tag <=30) ||                            //(monat ==02 && (!(schaltjahr)))||
    (monat ==12 && tag <=31) ||
    ((monat ==02) && (tag ==29)&& (schaltjahr)))
    

    für soetwas nimmt man lookup tables.

    Hasso schrieb:

    system("pause");
    

    Funktioniert nur unter DOS und Windows. Dafür gibt es elegantere Lösungen: Automatisches Schließen verhindern

    Hasso schrieb:

    Die eigentliche Prüfung übernimmt ein Modul: pruefung.

    erfüllst Du nicht.

    cheers, Swordfish



  • Hallo Hasso!

    Wärst Du bereit, oder ist es Dir erlaubt, die Header-Datei <time.h> in Dein Programm einzubinden?
    Dann kannst Du z.B. time_t/ struct tm (enthält alle zu einer Kalenderzeit (gregorianische) relevanten Komponenten)
    zur Plausibiltätsprüfung einsetzen - und Dein Programm wird schlank, elegant (+ genial).

    MfG



  • Natürlich bin ich bereit, wobei ich werde mir die kritik zu herzen nehmen und draus lernen werde.

    zu dem Zitat :

    Wärst Du bereit, oder ist es Dir erlaubt, die Header-Datei <time.h> in Dein Programm einzubinden? 
    Dann kannst Du z.B. time_t/ struct tm (enthält alle zu einer Kalenderzeit (gregorianische) relevanten Komponenten) 
    zur Plausibiltätsprüfung einsetzen - und Dein Programm wird schlank, elegant (+ genial).
    

    Natürlich ist es erlaubt hauptsache das Programm muss natürlich ein Prüfmodul entahlten. Könntest du mir dabei helfen kenn die funktion nicht und hab 0 ahnung wie das funktionieren soll...

    Die eigentliche Prüfung übernimmt ein Modul: pruefung.
    

    erfüllst Du nicht.
    Langsam zweifle ich an meiner Intelligenz 🙂 ich dachte meine do while Schhleife ist das Prüfmodul es prüft doch die eingabe oder nicht, wie sollte denn so ein Prüfmodul aussehen ?

    Lg hasso



  • Hasso schrieb:

    Swordfish schrieb:

    Hasso schrieb:

    Die eigentliche Prüfung übernimmt ein Modul: pruefung.

    erfüllst Du nicht.

    Langsam zweifle ich an meiner Intelligenz 🙂 ich dachte meine do while Schhleife ist das Prüfmodul es prüft doch die eingabe oder nicht, wie sollte denn so ein Prüfmodul aussehen ?

    Naja, ein Modul kann man aus einem Ganzen einfach herausnehmen und irgendwo anders verwenden. In C erfüllt diese Bedingung zum Bleistift eine Funktion.

    cheers, Swordfish

    BTW: Lern zitieren!



  • Swordfish schrieb:

    Naja, ein Modul kann man aus einem Ganzen einfach herausnehmen und irgendwo anders verwenden. In C erfüllt diese Bedingung zum Bleistift eine Funktion.
    .

    aha.. wie soll ich dieses prüfmodul dann zusammenbasteln?

    gruß hasso



  • Du entwickelst eine Funktion, der ein Datum übergeben werden kann. Die Funktion führt eine Gültigkeitsprüfung durch und gibt gegebenenfalls einen Fehlercode oder "alles OK" zurück.

    cheers, Swordfish



  • Swordfish schrieb:

    Du entwickelst eine Funktion, der ein Datum übergeben werden kann. Die Funktion führt eine Gültigkeitsprüfung durch und gibt gegebenenfalls einen Fehlercode oder "alles OK" zurück.

    cheers, Swordfish

    Könntest du mir bei der erstellung der funktion behilflich sein . ich versteh nicht die while Schleife kontrolliert doch ob das Datum ausgeben werden darf und falls es nicht eine Fehlermeldung angezeigt wird.

    gruß hasso



  • Deine Programmlogik ist noch fehlerhaft. Dein Programm behauptet zB, der 29.02.2100 wäre ein gültiges Datum. Wo hast Du denn Probleme dabei, eine Funktion zu schreiben?

    cheers, Swordfish



  • Swordfish schrieb:

    Deine Programmlogik ist noch fehlerhaft. Dein Programm behauptet zB, der 29.02.2100 wäre ein gültiges Datum. Wo hast Du denn Probleme dabei, eine Funktion zu schreiben?

    cheers, Swordfish

    Warum ist das Datum denn nicht gültig? 2100 ist ein Sage in schaltjahr und hat 29 tage in Februar.

    Problem 1)
    Sowas noch nicht gemacht.
    Problem 2)
    Was die funktion beinhalten soll bin ich mir nicht bewusst.

    lg hasso 🙂



  • wenn du so lieb bist könntest du mir die funktion aufschreiben damit ich diesen stress endlich los bin...

    das wär nett.

    lg hasso



  • hasso schrieb:

    Warum ist das Datum denn nicht gültig? 2100 ist ein Sage in schaltjahr und hat 29 tage in Februar.

    Alle Jahre, die durch 4 ohne Rest teilbar sind, sind Schaltjahre.
    Alle Jahre, die durch 100 ohne Rest teilbar sind, sind keine Schaltjahre.
    Alle Jahre, die durch 400 ohne Rest teilbar sind, sind wiederum Schaltjahre.

    2100 ist also kein Schaltjahr.

    hasso schrieb:

    wenn du so lieb bist könntest du mir die funktion aufschreiben damit ich diesen stress endlich los bin...

    Können: ja. Tun: nein. Du sollst etwas lernen.

    Wenn Du natürlich ein akzeptables Angebot machst, bekommst Du das gesamte Programm (113 Zeilen 100% BugFree ™ Standard C) natürlich gerne. 😉

    cheers, Swordfish



  • Swordfish schrieb:

    hasso schrieb:

    Warum ist das Datum denn nicht gültig? 2100 ist ein Sage in schaltjahr und hat 29 tage in Februar.

    Alle Jahre, die durch 4 ohne Rest teilbar sind, sind Schaltjahre.
    Alle Jahre, die durch 100 ohne Rest teilbar sind, sind keine Schaltjahre.
    Alle Jahre, die durch 400 ohne Rest teilbar sind, sind wiederum Schaltjahre.

    2100 ist also kein Schaltjahr.

    hasso schrieb:

    wenn du so lieb bist könntest du mir die funktion aufschreiben damit ich diesen stress endlich los bin...

    Können: ja. Tun: nein. Du sollst etwas lernen.

    Wenn Du natürlich ein akzeptables Angebot machst, bekommst Du das gesamte Programm (113 Zeilen 100% BugFree ™ Standard C) natürlich gerne. 😉

    cheers, Swordfish

    so mein freund. ich habs

    schaltjahr =(((jahr%100)%4)&&(jahr%100) || (jahr%100));

    jetzt klappts aucher zeigt schaltjahr 0 an!

    sonst noch fehler?

    ps. ich mach dir ein angebot das du nicht ablehnen kannst 😃 (der pate)

    was bekomm ich dafür ?

    gruß hasso



  • klappt dochnicht ..



  • Prüf mal das:

    #include <stdio.h>
    #include <stdlib.h>
    
    int Schaltjahr(int j)
    {
    	return j%4==0&&j%100||j%400==0;
    }
    
    int korrektesDatum(int t, int m, int j)
    {
    	int tmp[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
    	tmp[1] = Schaltjahr(j) ? 29 : 28;
    	return  m>=1&&m<=12&&j>=1583&&j<=2399/*oder meht*/&&t>=1&&t<=tmp[m-1];
    }
    
    int main() 
    {
        int tag, monat, jahr;
    
        while (1)
        {
    		printf("Bitte gib ein Datum ein!\n");
            printf("Tag : ");
            scanf("%d", &tag);
            printf("Monat : ");
            scanf("%d", &monat);
            printf("Jahr (jjjj) : ");
            scanf("%d", &jahr);
    		if (korrektesDatum(tag, monat, jahr))
    		{
    			printf ("Datum ok!");
    			break;
    		}
    		else
    		   printf ("Ungültiges Datum\n\n");
       }
       return EXIT_SUCCESS;
    } ;)
    


  • Du bist sooo fiies. Dann muss ich auch...

    #include <stdbool.h>
    #include <ctype.h>
    #include <stdio.h>
    
    void flush_stdin( void );
    
    static char *fehlertext[ ] = {
    
    	"Das angegebene Datum ist gueltig.",
    	"Das Jahr ist ungueltig, da es vor der Einführung des Gregorianischen Kalenders liegt.",
    	"Das angegebene Monat ist entweder 0 oder groesser als 12.",
    	"Es wurde der 29. Februar eines Jahres angegeben, das kein Schaltjahr ist.",
    	"Der angegebene Tag ist entweder 0 oder groesser als das angegebene Monat Tage hat."
    };
    
    typedef enum tag_fehlercode {
    
    	ERRDAT_GUELTIG, ERRDAT_UNGJAHR, ERRDAT_MFEHLER, ERRDAT_KSJAHR, ERRDAT_TFEHLER,
    
    } fehlercode_t;
    
    void flush_stdin( void ) {
    
    	setvbuf( stdin, 0, _IONBF, 0 );
    	setvbuf( stdin, 0, _IOFBF, BUFSIZ );
    }
    
    fehlercode_t pruefung( unsigned int tag, unsigned int monat, unsigned int jahr ) {
    
    	static unsigned char monatstage[ ] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    	monatstage[ 1 ] = ( !( jahr % 4 ) && ( ( jahr % 100 ) || !( jahr % 400 ) ) ) ? 29 : 28;
    	return ( jahr < 1582 ) ? ERRDAT_UNGJAHR : ( ( ( monat < 1 ) || ( 12 < monat ) ) ? ERRDAT_MFEHLER : ( ( tag < 1 ) || ( monatstage[ monat - 1 ] < tag ) ? ( tag == 29 ? ERRDAT_KSJAHR : ERRDAT_TFEHLER ) : ERRDAT_GUELTIG ) );
    }
    
    int main( void ) {
    
    	char puffer[ 12 ] = { 0 };
    	char eingabe = 0;
    	unsigned int tag = 0, monat = 0, jahr = 0;
    
    	do {
    		printf( "Bitte geben Sie ein Datum der Form TT.MM.JJJJ ein: " );
    
    		do {
    			flush_stdin( );
    			fgets( puffer, 11, stdin );
    
    			if( sscanf( puffer, "%u.%u.%u", &tag, &monat, &jahr ) == 3 ) {
    
    				break;
    			}
    
    			printf( "Ihre Eingabe entspricht nicht dem verlangen Format!\n\nBitte wiederholen Sie die Eingabe: " );
    
    		} while( true );
    
    		printf( "%s\n\n", fehlertext[ pruefung( tag, monat, jahr ) ] );
    
    		do {
    			printf( "Soll das Programm wiederholt werden (j/n)?" );
    
    			flush_stdin( );
    			eingabe = tolower( getchar( ) );
    
    		} while( ( eingabe != 'j' ) && ( eingabe != 'n' ) );
    
    		putchar( '\n' );
    
    	} while( eingabe == 'j' );
    }
    

    cheers, Swordfish


Anmelden zum Antworten