C :: Aufgabe #21

1 Lösung Lösung öffentlich

Anzahl Freitag, der 13te über bestimmten Zeitraum

Anfänger - C von pocki - 29.12.2012 um 19:56 Uhr
Schreibe ein Programm welches 2 verschiedene Datum einliest und berechne die Anzahl wie oft in diesem Zeitraum der 13te eines Monats auf einen Freitag fiel und gib diese aus.

Konsolenausgabe:


Startdatum: 01.01.2009
Enddatum: 31.12.2009
13.02.2009
13.03.2009
13.11.2009
Summe: 3

Lösungen:

vote_ok
von devnull (8870 Punkte) - 02.03.2014 um 19:40 Uhr
Quellcode ausblenden C-Code
/****************************************
 * fr13.c     13. Freitage ermitteln
 * devnull    02-03-2014
 ****************************************/
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define TMBUF_LEN 20
#define SECONDS_PER_DAY 86400
#define DATE_FORMAT "%d.%m.%Y"

int input_date(char *sdate, struct tm *tmi) 
{
char inbuf[TMBUF_LEN + 1];
char *pe;
	
	printf("%-10s: ", sdate);
    scanf("%s", inbuf);
    inbuf[TMBUF_LEN] = '\0';
    strcat(inbuf, " 00:00:01");
    pe = strptime(inbuf, DATE_FORMAT " %T", tmi);
    if (pe == NULL || *pe != 0) {
		fprintf(stderr, "%11s %10s\n", "Ungueltiges", sdate);
		return 1;
	}
	return 0;
}	

int main(void)
{
time_t t, ts, te;        // Start,Ende UNIX-Zeit
struct tm tms, tme;      // Start,Ende Lokalzeit-Struktur 
struct tm *tml;
char tmbuf[TMBUF_LEN];
int cdays = 0;

    if ((input_date("Startdatum", &tms) != 0) ||
        (input_date("Enddatum",   &tme) != 0))
        return 1;   // Fehler

	ts = mktime(&tms);
	te = mktime(&tme);
	for (t = ts; t <= te; t += SECONDS_PER_DAY) {
		tml = localtime(&t);
		if (tml->tm_mday == 13 && tml->tm_wday == 5) {
			strftime(tmbuf, TMBUF_LEN, DATE_FORMAT, tml);
			printf("%s\n", tmbuf);
			cdays++;
		}
	}
	printf("Summe: %d\n", cdays);
    return 0;
}