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 Intelligenzich 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
-
ich komm mir so vor als wenn ich 2 diamanten habe mit denen ich nichts anfangen kann..
die schreibweise geht über meinen bisherigen wissenstand hinaus.
wenn das schon für euch kein problem ist dann könntet ihr meins auch etwas besser machen prüfmodul bzw das alles im hauptprogramm steht.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>int main () { // Beginn des Hauptprogramms! int tag,monat,jahr; char weiter ='j'; int schaltjahr; //cls printf("\n \t \t * ~ * W I L K O M M E N * ~ *\n"); printf("\n\tUm ins Hauptprogramm zu gelangen, druecken Sie eine Beliebige Taste!\n"); getch(); //cls while(weiter == 'j') { do { printf("\n Bitte geben Sie das Datum in der Form TT.MM.JJJJ ein " ); scanf( "%2u.%2u.%4u", &tag, &monat, &jahr ); fflush (stdin); schaltjahr =((jahr%400==0) || (jahr%4==0 && jahr % 100 !=0)); 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)); 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(); } return EXIT_SUCCESS; } // Ende des Hauptprogrammas!