Dni robocze w miesiącu
Kalendarz krok po kroku: święta - Podstawy C++ (C++)
Dzień roboczy to poniedziałek-piątek, który nie jest świętem. workingDays idzie po dniach miesiąca, zwiększając dzień tygodnia o 1, i liczy dni robocze. Program wypisuje je dla każdego miesiąca roku i sumę. Uwaga: za święto w sobotę pracodawca daje inny dzień wolny, a tego program nie odejmuje.
#include <iostream>
using namespace std;
// swieta stale: dzien, miesiac i nazwa (bez polskich liter - konsola)
const int FIXED = 10;
int fixedDay[FIXED] = {1, 6, 1, 3, 15, 1, 11, 24, 25, 26};
int fixedMonth[FIXED] = {1, 1, 5, 5, 8, 11, 11, 12, 12, 12};
char fixedName[FIXED][28] = {"Nowy Rok", "Trzech Kroli", "Swieto Pracy",
"Swieto Konstytucji", "Wniebowziecie NMP",
"Wszystkich Swietych", "Swieto Niepodleglosci",
"Wigilia", "Boze Narodzenie", "Drugi dzien Swiat"};
// data jako 5.04 (miesiac zawsze dwiema cyframi)
void printDate(int d, int m) {
cout << d << "." << (m < 10 ? "0" : "") << m;
}
// numer swieta stalego w tablicy albo -1, gdy to zwykly dzien
int fixedHoliday(int d, int m, int y) {
for (int i = 0; i < FIXED; i++) {
if (fixedDay[i] == d && fixedMonth[i] == m) {
if (i == 7 && y < 2025) {
return -1; // Wigilia jest wolna od 2025 roku
}
return i;
}
}
return -1;
}
bool isLeap(int y) {
return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
}
int daysInMonth(int m, int y) {
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (m == 2 && isLeap(y)) {
return 29;
}
return days[m - 1];
}
// dzien tygodnia: 0 = poniedzialek, ..., 6 = niedziela
// liczymy dni od 1 stycznia 1900 (to byl poniedzialek)
int weekday(int d, int m, int y) {
int total = 0;
for (int year = 1900; year < y; year++) {
total += isLeap(year) ? 366 : 365;
}
for (int month = 1; month < m; month++) {
total += daysInMonth(month, y);
}
total += d - 1;
return total % 7;
}
// algorytm Meeusa: kazdy rok kalendarza gregorianskiego
int easterMeeus(int y) {
int a = y % 19;
int b = y / 100;
int c = y % 100;
int d = b / 4;
int e = b % 4;
int f = (b + 8) / 25;
int g = (b - f + 1) / 3;
int h = (19 * a + b - d - g + 15) % 30;
int i = c / 4;
int k = c % 4;
int l = (32 + 2 * e + 2 * i - h - k) % 7;
int m = (a + 11 * h + 22 * l) / 451;
int month = (h + l - 7 * m + 114) / 31;
int day = (h + l - 7 * m + 114) % 31 + 1;
return month * 100 + day;
}
// numer dnia w roku: 1 = 1 stycznia
int dayOfYear(int d, int m, int y) {
int n = d;
for (int month = 1; month < m; month++) {
n += daysInMonth(month, y);
}
return n;
}
// odwrotnie: numer dnia w roku -> miesiac * 100 + dzien
int dateOfDay(int n, int y) {
int m = 1;
while (n > daysInMonth(m, y)) {
n -= daysInMonth(m, y);
m++;
}
return m * 100 + n;
}
// swieta ruchome: ile dni po Wielkanocy
const int MOVABLE = 4;
int movableShift[MOVABLE] = {0, 1, 49, 60};
char movableName[MOVABLE][28] = {"Wielkanoc", "Poniedzialek Wielkanocny",
"Zielone Swiatki", "Boze Cialo"};
// wszystkie swieta roku: numer dnia w roku i numer nazwy
// (0-9 swieta stale, 10-13 ruchome)
int holidayDay[FIXED + MOVABLE];
int holidayName[FIXED + MOVABLE];
int holidayCount = 0;
void computeHolidays(int y) {
holidayCount = 0;
for (int i = 0; i < FIXED; i++) {
if (fixedHoliday(fixedDay[i], fixedMonth[i], y) == -1) {
continue; // Wigilia przed 2025
}
holidayDay[holidayCount] = dayOfYear(fixedDay[i], fixedMonth[i], y);
holidayName[holidayCount] = i;
holidayCount++;
}
int easter = easterMeeus(y);
int start = dayOfYear(easter % 100, easter / 100, y);
for (int i = 0; i < MOVABLE; i++) {
holidayDay[holidayCount] = start + movableShift[i];
holidayName[holidayCount] = FIXED + i;
holidayCount++;
}
// sortowanie przez wstawianie wedlug numeru dnia
for (int i = 1; i < holidayCount; i++) {
int day = holidayDay[i];
int name = holidayName[i];
int j = i - 1;
while (j >= 0 && holidayDay[j] > day) {
holidayDay[j + 1] = holidayDay[j];
holidayName[j + 1] = holidayName[j];
j--;
}
holidayDay[j + 1] = day;
holidayName[j + 1] = name;
}
}
void printName(int k) {
if (k < FIXED) {
cout << fixedName[k];
} else {
cout << movableName[k - FIXED];
}
}
char dayName[7][3] = {"pn", "wt", "sr", "cz", "pt", "so", "nd"};
bool isHoliday(int n) {
for (int i = 0; i < holidayCount; i++) {
if (holidayDay[i] == n) {
return true;
}
}
return false;
}
char monthName[12][16] = {"Styczen", "Luty", "Marzec", "Kwiecien", "Maj", "Czerwiec",
"Lipiec", "Sierpien", "Wrzesien", "Pazdziernik", "Listopad",
"Grudzien"};
// dni robocze: od poniedzialku do piatku, bez swiat
int workingDays(int m, int y) {
int count = 0;
int w = weekday(1, m, y);
for (int d = 1; d <= daysInMonth(m, y); d++) {
if (w < 5 && !isHoliday(dayOfYear(d, m, y))) {
count++;
}
w = (w + 1) % 7;
}
return count;
}
int main() {
int y = 2026;
computeHolidays(y);
int total = 0;
for (int m = 1; m <= 12; m++) {
int n = workingDays(m, y);
cout << monthName[m - 1] << ": " << n << endl;
total += n;
}
cout << "Razem: " << total << endl;
return 0;
}Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.
Wszystkie lekcje kursu Podstawy C++·Zaloguj się, aby zapisać postęp na koncie.