алгоритм — C ++ Неполный код о датах, что является лучшим решением?

Я пишу код, который, если вы введете дату вашего дня рождения и любую другую дату, будет возвращать общее количество лет, месяцев и дней, когда вы живы.

Обс .: в том числе (високосные) биссекстильные годы.

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 из функции проверки.

ПРОБЛЕМА: Я не могу понять, как рассчитать ее организованно.

0

Решение

Вы должны использовать 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;
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]