Quellcode kürzen

Hallo!

Ich würde den Code auf jeden Fall erst einmal länger machen und Variablenamen wie sjahr, pl und n durch aussagerkräftigere Bezeichner ersetzen. Dazu würden ein paar Kommentare nicht schaden.

"sjahr" bedeutet vermutlich Schaltjahr, oder? Das wird übrigens nicht immer richtig initialisiert, sondern nur auf 1 gesetzt, wenn es sich um ein Schaltjahr handelt. Ansonsten ist sein Wert undefiniert! Falls es geht, sowieso besser ein bool verwenden anstelle des int, da dies eine Wahr/Falsch-Aussage wie hier besser ausdrückt.

"pl"? Da bin ich nicht hintergekommen. Aber jedenfalls definierst (initialisierst es aber nicht) du ein Array der Länge 2, was gültige Indizes von 0 bis einschliesslich 1 erlaubt. Du greifst allerdings auf pl[2] zu. Das erzwingt nichtdefiniertes Verhalten, weil du dabei 1. keinen definierten Wert hast und 2. möglicherweise irgendeine wichtige Speicherstelle überschreibst, wo du es nicht solltest. Man nennt das auch Bufferüberlauf. Aua!

Zur Funktionalität kann ich ansonsten nicht viel sagen, weil es mir aufgrund der knappen Bezeichner und fehlenden Kommentare zu mühselig ist, alles nachzuvollziehen. Ich habe auch leider nicht so viel Zeit.

Nimm das bitte nicht als bösgemeintes Rumnörgeln, sondern so, wie es gemeint ist: Als ernstgemeinten Vorschlag, wie du deinen Stil verbessern kannst.
 
Hi!

Ich lerne auch erst seit kurzem C und hab mich (trotz wenig Wissen) mal dran versucht.

Rausgekommen ist ein nicht wirklich kürzerer, aber meiner Meinung nach verständlicherer Quelltext.

Code:
#include <stdio.h>

bool bjahr(int); //Jahr checken
int bmonat(int); //Monat checken und max. Tage rückgeben
bool schaltjahr; //globale Variable ob Schaltjahr

void main()
{
    int jahr, monat, tag;

    printf("Bitte geben Sie das Datum ein:\n");

	do
	{
		printf("Jahr: ");
        scanf("%i",&jahr);
	}
	while( bjahr(jahr)!=true );   //abfragen solange jahr nicht richtig ist

	do
	{
		printf("Monat: ");
        scanf("%i",&monat);
	}
	while( !(bmonat(monat)) ); //abfragen solange monat nicht grösser 0

	do
	{
		printf("Tag: ");
        scanf("%i",&tag);
	}
	while(tag<1 || (tag >bmonat(monat))); //solange Tag kleiner 1 oder grösser Rückgabewert aus monats-funktion
	
    printf("\nIhr Datum: %i.%i.%i ist in Ordnung\n\n",tag,monat,jahr); //Ausgabe
}

bool bjahr(int jahr) //Checkt das Jahr, Schaltjahr?, Rückgabe ob Jahr OK
{
	if(jahr>=1 && jahr<=9999 )
	{
		if( !(jahr%4) ) //Überprüfung ob Schaltjahr
		{
			printf("Dies ist ein Schaltjahr!\n");
			schaltjahr=true;
		}
		return true; //Jahr ist korrekt!
	}
	else
	{
		printf(" Bitte geben Sie ein Jahr zwischen 1 und 9999 ein!\n");
		return false; //Jahr ist falsch
	}
}

int bmonat(int monat) //Monat checken und maximale Tage rückgeben
{
	if (monat == 2) //Februar?
	{
		if(schaltjahr) return 28; //Februar + Schaltjahr = max 28 Tage
		else return 29; //Februar ohne Schaltjahr = 29 Tage
	}
	else if(monat == 4 || monat == 6 || monat == 9 || monat == 11)
		return 30;

	else if (monat == 1 || monat == 3 || monat == 5 || monat == 7 || monat == 8 || 
        monat == 10 || monat == 12)
		return 31;
	
	else return 0; //Monat nicht korrekt
}


Duddle, der seit 2 Monaten in der Schule C lernt

P.S. Mein erster Post im Programming-Teil des Forums ^_^
 
Zurück