snp-lab-code/P02_Funktionen_Datentyp_enum/README_solution.md

2.5 KiB

Lösungsskizzen

Aufgabe 1

/**
 *  Tage Pro Monat
 *
 *  Das Programm liest einen Monat (1-12) und ein Jahr (1600-2400) ein und
 *  gibt die Anzahl der Tage dieses Monats aus.
 *
 *  @author Gerrit Burkert, Adaptation bazz
 *  @version 15-FEB-2013, 16-OCT-2017, 17-OCT-2019, 16-FEB-2022
 */

#include <stdio.h>
#include <stdlib.h>

#define ERROR_IN_MONTH 1
#define ERROR_IN_YEAR 2

///// Student Code



// Konstante Werte fuer die Monate
// ===============================

enum { JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ };


// Eingabe pruefen (0 ist vom atoi als Fehelcode verwendet und darf nicht verwendet werden) 
// ===============

int gibIntWert(char *name, int von, int bis) {
	
	int wert;
	char wertS[20]; //
	
	do {
    	printf("%s:     ", name);
    	fgets(wertS, 20, stdin);
    	wert = atoi(wertS);
    	if (wert < von || wert > bis) {
        	printf("Der Wert muss zwischen %d und %d sein.\n", von, bis);
    	} else {
    		break; 
		}
	} while(1);
	return wert;
}


// Schaltjahr bestimmen
// ==================== 

int istSchaltjahr(int jahr){
	
	if ( (jahr % 400 == 0) || ( (jahr %100 != 0) && (jahr % 4 ==0) ) )
		return 1;
	else
		return 0;
}


// Berechnung Anzahl Tage pro Monat
// ================================

int tageProMonat(int jahr, int monat) {

	int anzTage;
    
    // Tage pro Monat bestimmen
    switch (monat) {
	   
        // Monate mit 31 Tagen 
        case JAN: case MAR: case MAI: case JUL: case AUG: case OKT: case DEZ:
            anzTage = 31;
            break;
        
        // Monate mit 30 Tagen 
        case APR: case JUN: case SEP: case NOV:
            anzTage = 30;
            break;
        
        // Februar: 28 oder 29 Tage 
        case FEB:
		
            if (istSchaltjahr(jahr)) {
                anzTage = 29;
            } else {
                anzTage = 28;
            }
            break;
    }

	return anzTage;
}

///// END Student Code


int main (int argc, char *argv[]) {
    
    int monat, jahr;
     
    //  Monat einlesen und Bereich ueberpruefen
    monat = gibIntWert("Monat", 1, 12);
    jahr  = gibIntWert("Jahr", 1600, 9999);
	
    //  Ausgabe zum Test
    printf("Monat: %d, Jahr: %d \n", monat, jahr);    
    
    //  Ausgabe zum Test (hier mit dem ternaeren Operator "?:")
    printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein");

	// Ausgabe
	printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat));
   
    return 0;
}

Aufgabe 2

Alter bestehender Boilerplate Code