KL25Z program that calculates the difference in days, hours, minutes, between two dates. Needs a terminal on the PC side to communicate with the program. Terminal must have local echo on. Terminal Data input needs some improvement.

Dependencies:   mbed

main.cpp

Committer:
lmsousa
Date:
2015-05-22
Revision:
3:add864dd8eab
Parent:
2:1d24f233ac26
Child:
4:b0884b059d7e

File content as of revision 3:add864dd8eab:

/*
Programa que calcula a diferença entre duas datas.
 LESEM ENAUTICA 2014 Luis Sousa aluno 11001
 */

//#include <stdio.h>

#include "mbed.h"
Serial pc(USBTX, USBRX);

int readkbd(void);
int bissexto(int ano);
int dias_do_mes(int ano,int mes);
int dias_do_ano(int ano);
int dias_ate_fim_mes(int ano,int mes,int dia);
int dias_dos_meses_intermedios(int ano,int mes1,int mes2);
int dias_dos_anos_intermedios(int ano1, int ano2);
int dias_ate_fim_ano(int ano,int mes,int dia);
int dias_desde_principio_ano(int ano,int mes,int dia);
long int dif_data(int ano1,int mes1,int dia1,int ano2,int mes2,int dia2);



int main(void)

{
    int limite_ano_min=0,limite_ano_max=2100;//Valores limite para o ano//
    int ano_dt1,ano_dt2,mes_dt1,mes_dt2,dia_dt1,dia_dt2;
    long int score_dt1,score_dt2; //Variaveis que avaliam a data mais alta//
    int hora_dt1,hora_dt2,horas,min_dt1,min_dt2,tmins1,tmins2,minutos,tmp_ano,tmp_mes,tmp_dia,tmp_hora,tmp_min;
    char opcao='N';
    int continuar=1;

    do {
        printf("\r\n");
        printf("%c[2J",27);  //clrscr();

        printf(" ----------------------------------------------------\r\n");
        printf("| Programa que calcula a diferenca entre duas datas. |\r\n");
        printf("|                                                    |\r\n");
        printf("|    LESEM ENAUTICA 2015 Luis Sousa aluno 11001      |\r\n");
        printf(" ----------------------------------------------------\r\n\n");

        printf("\n\nIntroducao da Data 1\r\n");
        do {
            printf("\r\nIntroduza o ano da  Data 1: (%d-%d): ",limite_ano_min,limite_ano_max);
            //scanf("%d",&ano_dt1);
            ano_dt1=readkbd();
            if (!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max)))
                printf("\r\nO ano tem de estar compreendido entre %d e %d ",limite_ano_min,limite_ano_max);
        } while(!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max)));

        do {
            printf("\r\nIntroduza o mes da Data 1: (%d-%d): ",1,12);
            //scanf("%d",&mes_dt1);
            mes_dt1=readkbd();
            if (!((mes_dt1>=1)&&(mes_dt1<=12)))
                printf("\r\nO mes tem de estar compreendido entre %d e %d ",1,12);
        } while(!((mes_dt1>=1)&&(mes_dt1<=12)));

        do {
            printf("\r\nIntroduza o dia da Data 1: (%d-%d): ",1,dias_do_mes(ano_dt1,mes_dt1));
            //scanf("%d",&dia_dt1);
            dia_dt1=readkbd();
            if (!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1))))
                printf("\r\nO dia tem de estar compreendido entre %d e %d ",1,dias_do_mes(ano_dt1,mes_dt1));
        } while(!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1))));

        do {
            printf("\r\nIntroduza a hora da Data 1: (%d-%d): ",0,23);
            //scanf("%d",&hora_dt1);
            hora_dt1=readkbd();
            if (!((hora_dt1>=0) && (hora_dt1 <= 23)))
                printf("\r\nA hora tem de estar compreendida entre %d e %d ",0,23);
        } while(!((hora_dt1>=0) && (hora_dt1 <= 23)));

        do {
            printf("\r\nIntroduza os minutos da Data 1: (%d-%d): ",0,59);
            //scanf("%d",&min_dt1);
            min_dt1=readkbd();
            if (!((min_dt1>=0) && (min_dt1 <= 59)))
                printf("\r\nOs minutos devem estar compreendidos entre %d e %d ",0,59);
        } while(!((min_dt1>=0) && (min_dt1 <= 59)));


        printf("\r\n\nIntroducao da Data 2");
        do {
            printf("\r\nIntroduza o ano da Data 2: (%d-%d): ",limite_ano_min,limite_ano_max);
            //scanf("%d",&ano_dt2);
            ano_dt2=readkbd();
            if (!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max)))
                printf("\r\nO ano tem de estar compreendido entre %d e %d ",limite_ano_min,limite_ano_max);
        } while(!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max)));

        do {
            printf("\r\nIntroduza o mes da Data 2: (%d-%d): ",1,12);
            //scanf("%d",&mes_dt2);
            mes_dt2=readkbd();
            if (!((mes_dt2>=1)&&(mes_dt2<=12)))
                printf("\r\nO mes tem de estar compreendido entre %d e %d ",1,12);
        } while(!((mes_dt2>=1)&&(mes_dt2<=12)));

        do {
            printf("\r\nIntroduza o dia da Data 2: (%d-%d): ",1,dias_do_mes(ano_dt2,mes_dt2));
            //scanf("%d",&dia_dt2);
            dia_dt2=readkbd();
            if (!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2))))
                printf("\r\nO dia tem de estar compreendido entre %d e %d ",1,dias_do_mes(ano_dt2,mes_dt2));
        } while(!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2))));

        do {
            printf("\r\nIntroduza a hora da Data 2: (%d-%d): ",0,23);
            //scanf("%d",&hora_dt2);
            hora_dt2=readkbd();
            if (!((hora_dt2>=0) && (hora_dt2 <= 23)))
                printf("\r\nA hora tem de estar compreendida entre %d e %d ",0,23);
        } while(!((hora_dt2>=0) && (hora_dt2 <= 23)));

        do {
            printf("\r\nIntroduza os minutos da Data 1: (%d-%d): ",0,59);
            //scanf("%d",&min_dt2);
            min_dt2=readkbd();
            if (!((min_dt2>=0) && (min_dt2 <= 59)))
                printf("\r\nOs minutos devem estar compreendidos entre %d e %d ",0,59);
        } while(!((min_dt2>=0) && (min_dt2 <= 59)));

        score_dt1 = dif_data(limite_ano_min,1,1,ano_dt1,mes_dt1,dia_dt1);
        score_dt2 = dif_data(limite_ano_min,1,1,ano_dt2,mes_dt2,dia_dt2);

        tmins1= hora_dt1*60+min_dt1;   //reduz primeira hora a minutos
        tmins2= hora_dt2*60+min_dt2;   //reduz segunda hora a minutos

        if ((score_dt1>score_dt2)||((score_dt1 == score_dt2)&&(tmins1>tmins2)))
            /*
                    Se a primeira data for maior que a segunda
                    troca as datas de forma a ficar data2>data1
                    */
        {
            tmp_ano=ano_dt1;
            tmp_mes=mes_dt1;
            tmp_dia=dia_dt1;
            tmp_hora=hora_dt1;
            tmp_min=min_dt1;

            ano_dt1=ano_dt2;
            mes_dt1=mes_dt2;
            dia_dt1=dia_dt2;
            hora_dt1=hora_dt2;
            min_dt1=min_dt2;

            ano_dt2=tmp_ano;
            mes_dt2=tmp_mes;
            dia_dt2=tmp_dia;
            hora_dt2=tmp_hora;
            min_dt2=tmp_min;

            tmins1= hora_dt1*60+min_dt1;   //Depois da troca recalcula
            tmins2= hora_dt2*60+min_dt2;   //tmins1 e tmins2
        }

        printf("\r\n\nData 1: %d-%d-%d %d horas e %d minutos",dia_dt1,mes_dt1,ano_dt1,hora_dt1,min_dt1);
        printf("\r\nData 2: %d-%d-%d %d horas e %d minutos",dia_dt2,mes_dt2,ano_dt2,hora_dt2,min_dt2);

        if (tmins2>=tmins1) { //Se tmins2>tmins1 contabiliza dias completos mais algumas horas
            horas=(tmins2-tmins1)/60;        //diferenca em horas
            minutos=(tmins2-tmins1)%60;      //diferenca em minutos
            printf("\r\n\nA diferenca entre estas duas datas e de %ld dias, %d horas e %d minutos. ",dif_data(ano_dt1,mes_dt1,dia_dt1,ano_dt2,mes_dt2,dia_dt2),horas,minutos);
        } else { //Se tmins1>tmins2 retiramos um dia e fazemos a conta ah diferenca de horas
            horas=(24*60-tmins1+tmins2)/60;        //diferenca em horas
            minutos=(24*60-tmins1+tmins2)%60;      //diferenca em minutos
            printf("\r\n\nA diferenca entre estas duas datas e de %ld dias, %d horas e %d minutos. ",dif_data(ano_dt1,mes_dt1,dia_dt1,ano_dt2,mes_dt2,dia_dt2)-1,horas,minutos);
        }

        printf("\r\n\nNovo Calculo de datas? (S/N) ");
//      opcao=getc();
        scanf(" %c", &opcao);
//      opcao = getchar();    */
        if((opcao =='S')||(opcao =='s')) continuar=1;
        else {
            continuar=0;
//          clrscr();
            printf("\r\nCalculos terminados! \r\n\n");
        }

    } while (continuar);
}

int bissexto(int ano)
{
    if((ano%400==0)||((ano%4==0)&&(ano%100!=0)))
        return 1;
    else
        return 0;
}

int dias_do_ano(int ano)
{
    if (bissexto(ano))return 366;
    else return 365;
}

int dias_do_mes(int ano,int mes)
{
    if (mes == 1||mes == 3||mes == 5||mes == 7||mes == 8||mes == 10||mes == 12)
        return 31;
    else if(mes == 4||mes == 6||mes == 9||mes == 11)
        return 30;
    else if (mes == 2)
        if (bissexto (ano))
            return 29;
        else
            return 28;
    else return 255; //erro!!! mes invalido//
}

int dias_ate_fim_mes(int ano,int mes,int dia)
{
    return (dias_do_mes(ano,mes)-dia);
}

int dias_dos_meses_intermedios(int ano,int mes1,int mes2)
{
    int i,dias=0;
    i=mes1;
    i++; /*O primeiro e o ultimo mes nao sao contabilizados. So os intermedios*/
    while (i<mes2) {
        dias = dias + dias_do_mes(ano,i);
        i++;
    }
    return dias;
}

int dias_dos_anos_intermedios(int ano1,int ano2)
{
    int i,dias = 0;
    i=ano1;
    i++; /*O primeiro e o ultimo ano nao sao contabilizados. So os intermedios*/
    while (i<ano2) {
        dias = dias + dias_do_ano(i);
        i++;
    }
    return dias;
}

int dias_ate_fim_ano(int ano,int mes,int dia)
{
    return dias_ate_fim_mes(ano,mes,dia)+ dias_dos_meses_intermedios(ano,mes,13);
    /*  Calcula dias ate fim do ano. Como os extremos nao sao contabilizados
            envia-se 13 para contabilizar Mes de Dezembro         */
}

int dias_desde_principio_ano(int ano,int mes,int dia)
{
    return dias_dos_meses_intermedios(ano,0,mes)+ dia;
    /*Calcula dias desde principio do ano.
            Como os extremos nao sao contabilizados
            envia-se 0 para contabilizar Janeiro         */
}

long int dif_data(int ano1,int mes1,int dia1,int ano2,int mes2,int dia2)
{
    if (ano1 == ano2 && mes1 == mes2)
        return dia2-dia1;
    else if(ano1 == ano2 && mes1 != mes2)
        return dias_ate_fim_mes(ano1,mes1,dia1) //Dias ate ao fim do 1o mes//
               + dias_dos_meses_intermedios(ano1,mes1,mes2) //Dias dos meses intermedios//
               + dia2; // Dias do ultimo mes //
    else
        return dias_ate_fim_ano(ano1,mes1,dia1)
               + dias_dos_anos_intermedios(ano1,ano2) //Calcula dias dos anos intermedios//
               + dias_desde_principio_ano(ano2,mes2,dia2);
}

int readkbd(void)
{
    int value=0;
    int ch=0;
    int sair=0;

    while (!sair) { //enquanto nao for enter, le
        char ch = pc.getc();
        if(ch >= '0' && ch <= '9') { // 0 .. 9?
            value = (value * 10) + (ch - '0'); // sim, acumula
            pc.putc(ch);
        } else {
            if (ch==13) sair=1;
            //else if (ch==8) printf("\b");
            else printf(">C%i<",ch);
        }
    }
    printf("\r\nValor introduzido: %i",value);
    return value;
}