Я пишу код, который, если вы введете дату вашего дня рождения и любую другую дату, будет возвращать общее количество лет, месяцев и дней, когда вы живы.
Обс .: в том числе (високосные) биссекстильные годы.
Obs.2: для недопустимых дат выходными данными должны быть «данные инвалидов» (недопустимая дата на португальском языке).
Обс .: Формат даты в бразильском стандарте, день / месяц / год.
8 // первый вход — это количество входов, которые вы будете тестировать.
Вход 1: 29/02/2000
Вход 2: 01/03/2001
Выход: 1 0 1
Вход 1: 29/02/2000
Вход 2: 28/02/2001
Выход: 1 0 0
Вход 1: 29/12/2012
Вход 2: 13/01/2013
Выход: 0 0 15
Вход 1: 27/05/2012
Вход 2: 27/05/2013
Выход: 1 0 0
Вход 1: 01.01.2012
Вход 2: 01.05.2013
Выход: 1 0 4
Вход 1: 13/05/1966
Вход 2: 05.02.2015
Выход: 48 8 23
Вход 1: 29/02/2003
Вход 2: 4/05/2012
Вывод: данные инвалида
Вход 1: 14/13/1995
Вход 2: 7/8/1996
Вывод: данные инвалида
Код:
#include <iostream>
#include <cstdio>
using namespace std;
int verificar(int ano)
{
if (((ano % 4 == 0) && (ano % 100 != 0)) || (ano % 400 == 0))
return 1;
else
return 0;
}
int checkdia(int dia, int mes, int ano){
if (dia>0)
if (((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12)) && (dia<=31))
return 1;
else{
if (((mes==4)||(mes==6)||(mes==9)||(mes==11)) && (dia<=30))
return 1;
else{
if ((mes==2) && (dia<=28))
return 1;
else{
if ((((verificar(ano))==true)&&(dia<=29))&&(mes==2))
return 1;
else
return 0;
}
}
}
else
return 0;
}
int checkmes(int mes)
{
if ((mes>0) && (mes<=12))
return 1;
else
return 0;
}
int checkano(int ano)
{
if ((ano>0) && (ano<11000))
return 1;
else
return 0;
}
int main(){
int numerodetestes, mes1, mes2, dia1, dia2, ano1, ano2, teste11, teste12, teste13, teste21, teste22, teste23;
cin>>numerodetestes;
for(int c=0;c<=numerodetestes;c++){
scanf("%d/%d/%d", &dia1, &mes1, &ano1);
scanf("%d/%d/%d", &dia2, &mes2, &ano2);
teste11=checkano(ano1);
teste12=checkdia(dia1,mes1,ano1);
teste13=checkmes(mes1);
teste21=checkano(ano2);
teste22=checkdia(dia2,mes2,ano2);
teste23=checkmes(mes2);
if ((dia1==29)&&(mes1==02))
dia1=28;
if ((teste11+teste12+teste13+teste21+teste22+teste23)==6){
total=((365*(ano2-ano1))+sexto);
//... incomplete part ...//
}
else
cout<<"data invalida"<<endl;
}
return 0;
}
dia: day
mes: month
час: год
нумерация: количество тестов
verificar: функция для биссекстиля
check (…): функция для проверки «X»
teste «XX»: переменная int, которая получит 0 или 1 из функции проверки.
ПРОБЛЕМА: Я не могу понять, как рассчитать ее организованно.
Вы должны использовать bool
вместо int
для ваших возвращаемых значений:
bool verificar(int ano)
{
return ((ano % 4 == 0) && (ano % 100 != 0)) || (ano % 400 == 0));
}
Также ваш check
Функции могут быть значительно упрощены:
bool checkmes(int mes) {
return ( (mes > 0) && (mes <= 12) );
}
bool checkano(int ano) {
return ( (ano > 0) && (ano < 11000) );
}
bool checkdia(int dia, int mes, int ano) {
if(dia < 1 || dia > 31) return false;
if(mes%2 == 0 && dia >30) return false;
if(mes == 2 && dia >28) return verificar(ano);
return true;
}
Тогда вы могли бы написать что-то вроде:
bool checkdata(int dia, int mes, int ano) {
return ( checkano(ano) && checkmes(mes) && checkdia(dia, mes, ano) );
}
Что позволит вам написать:
if( !checkdata(dia1,mes1,ano1) || !checkdata(dia2,mes2,ano2) ) {
cout<< "data invalida" <<endl;
}
Теперь о главной проблеме, Вы могли бы легко получить предварительный расчет числа дней между двумя датами, но вы не можете легко получить действительное число, потому что даты не что иное, как логические. Вы должны были бы принять во внимание все изменения календаря в истории.
Для простоты оценки я сначала добавил бы / вычел смещение дат до первого января, а затем добавил разницу в году:
bool isLeap(int year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
int monthLengths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int monthLength(int month, int year) {
int n = monthLengths[month-1];
if(month == 2 && isLeap(year)) n += 1;
return n;
}
int yearLength(int year) {
return isLeap(year) ? 366 : 365;
}int nDay = 0; /* day counter */
/* subtract data1 offset to 01/01 */
nDay -= dia1;
for(int i = mes1; i > 1; --i) {
nDay -= monthLength(i - 1, ano1);
}
/* add data2 offset to 01/01 */
nDay += dia2;
for(int i = mes2; i > 1; --i) {
nDay += monthLength(i - 1, ano2);
}
/* add year offset */
for(int i = ano2; i > ano1; --i) {
nDay += yearLength(i);
}
cout << "Difference = " << nDay << " days" << endl;
Других решений пока нет …