Program do wyliczania końca urlopu

0

Mam taki program do wykonania:
Napisz program, który służy do wyznaczania daty zakończenia urlopu na podstawie daty rozpoczęcia urlopu i ilości dni trwania urlopu. Dane pobrane od użytkownika: dzień, miesiąc, rok - określają początek urlopu (musisz wczytywać tak długo, aż data będzie poprawna); DniUrlopu - określa ilość dni urlopu (1<= DniUrlopu <=26).
Nie bardzo wiem jak się za to wziąć, prosiłbym o podpowiedź.
Nie wiem czy użyć do tego tablicy 12- elementowej (według miesięcy), i w każdym elemencie wypisywać wszystkie dni? Coś mi świta, że gdzieś widziałem tablice gdzie każdy indeks różnił się ilością elementów, ale nie wiem gdzie. Czy lepiej użyć do tego typu wyliczeniowego enum?

1

o_O ale że co? Jakie znów tablice? Jedyne co ci potrzebne to informacja o tym ile dni ma każdy z miesięcy.
załóżmy że tablica liczba_dni[numer_miesiąca] zawiera informacje o tym ile dni ma dany miesiąc.
Wtedy data zakończenia urlopu to:
dzień -> (dzień_rozpoczęcia + DniUrlopu)%liczba_dni[miesiąc_rozpoczęcia]
miesiąc -> (miesiąc_rozpoczęcia + (dzień_rozpoczęcia + DniUrlopu)/liczba_dni[miesiąc_rozpoczęcia])%12
rok -> rok_rozpoczecia + (miesiąc_rozpoczęcia + (dzień_rozpoczęcia + DniUrlopu)/liczba_dni[miesiąc_rozpoczęcia])/12

Żeby nie liczyć kilka razy tego samego można alternatywnie:
dzień -> (dzień_rozpoczęcia + DniUrlopu)%liczba_dni[miesiąc_rozpoczęcia]
miesiąc -> (miesiąc_rozpoczęcia + (1 jeśli dzień < dzień_rozpoczęcia, 0 w innym przypadku)%12
rok -> rok_rozpoczecia + (1 jeśli miesiąc < miesiąc_rozpoczęcia, 0 w innym przypadku)

0

Musisz pominąć soboty i niedziele, które nie są wliczane do urlopu. Wynika z tego, że musisz określić w jakim dniu tygodnia rozpoczyna się urlop. Dwa dni urlopu rozpoczętego w poniedziałek da inny wynik niż dwa dni urlopu rozpoczętego w piątek.

Musisz też sprawdzić czy urlop wypada w roku przestępnym => luty ma 29 dni.

Wydaje mi się, że najprościej będzie sprawdzać w pętli kolejno czy następny dzień jest poprawnym dniem miesiąca (nie jest np 32 dniem) i czy nie jest dniem wolnym od pracy. Jeżeli jest poprawnym dniem, to zmniejszamy licznik liczby dni urlopu o jeden i sprawdzamy dzień następny aż do wykorzystania wszystkich dni.

0

Dobra. Na razie mam coś takiego.

#include <iostream>
#include<conio.h>
using namespace std;

int main()
{
	int miesiac;
	int data_rozpoczecia;
	int data_zakonczenia;
	int ilosc_dni;
	int rok;
	cout<<"Podaj rok: ";
	cin>>rok;
	cout<<"Podaj miesiac w ktorym chcesz wziasc urlop: ";
	cin>>miesiac;
	cout<<"podaj dzien rozpoczecia urlopu: ";
	cin>>data_rozpoczecia;
	cout<<"ile dni urlopu: ";
	cin>>ilosc_dni;
	if(miesiac==1 || miesiac==3 || miesiac==5 || miesiac==7 || miesiac==8 || miesiac==10 || miesiac==12){
		data_zakonczenia=data_rozpoczecia+ilosc_dni;
		if(data_zakonczenia>31){
			data_zakonczenia-=31;
			if(miesiac==12){
				rok++;
				miesiac=1;
			}
			else{
			miesiac++;
		}
		}
	}
	if(miesiac==4 || miesiac==6 || miesiac==9 || miesiac==11){
		data_zakonczenia=data_rozpoczecia+ilosc_dni;
		if(data_zakonczenia>30){
			data_zakonczenia-=30;
			miesiac++;
		}
	}
	if((rok%4==0 && rok%100!=0) || rok%400==0){
		if(miesiac==2){
			data_zakonczenia=data_rozpoczecia+ilosc_dni;
			if(data_zakonczenia>29){
				data_zakonczenia-=29;
				miesiac++;
			}
		}
	}
	else{
		if(miesiac==2){
			data_zakonczenia=data_rozpoczecia+ilosc_dni;
			if(data_zakonczenia>28){
				data_zakonczenia-=28;
				miesiac++;
			}
		}	
	}
	cout<<"data powrotu do pracy - rok: "<<rok<<", miesiac: "<<miesiac<<", dzien: "<<data_zakonczenia;
	getch();
    return 0;
	}

Grunt, że działa. Spróbuje jeszcze jakoś dodać świeta do wyjątków, ale z dniami tygodnia już chyba nie dam rady tego zrobić.

Sorki za nie używanie funkcji jeżeli to kogoś razi, ale jakoś nie mogę się jeszcze na to przestawić. Czasem użyje funkcji czasem nie, a zapewne dałoby radę utworzyć tutaj jakąś funkcję.

0

Nie no. Ze świętami chyba też nie dam rady wykombinować. Coś namotałem znowu.

1

A zamiast takiego chamskiego copy-paste nie dało się tak:

luty = ((rok%4==0 && rok%100!=0) || rok%400==0) ? 29 : 28;
dniMiesiaca = {31, luty, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

dzien_zakonczenia = (dzien_rozpoczecia+ilosc_dni)%dniMiesiaca[miesiac-1];
miesiac_zakonczenia = (miesiac_rozpoczęcia + (dzien_zakonczenia < dzien_rozpoczecia ? 1 : 0)%12
rok_zakonczenia = rok_rozpoczecia + (miesiac_zakonczenia < miesiac_rozpoczęcia ? 1 : 0)

?

Jeśli chodzi o święta albo weekendy to do tego potrzebowałbyś całego skomplikowanego kalendarza, który uwzględnia ruchome święta i inne cuda na kiju. To już nie jest taka trywialna sprawa.

0

Dzięki Shalom, za propozycję krótszego zapisu, ale przynajmniej się nie pogubiłem w swoim kodzie. A dopóki się nie gubię to jest dobrze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1