Luis Sousa / Mbed 2 deprecated DifDatas_1

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002 Programa que calcula a diferença entre duas datas.
00003  LESEM ENAUTICA 2014 Luis Sousa aluno 11001
00004  */
00005 
00006 #include <stdio.h>
00007 
00008 //#include "mbed.h"
00009 //Serial pc(USBTX, USBRX);
00010 
00011 int readkbd(void);
00012 int bissexto(int ano);
00013 int dias_do_mes(int ano,int mes);
00014 int dias_do_ano(int ano);
00015 int dias_ate_fim_mes(int ano,int mes,int dia);
00016 int dias_dos_meses_intermedios(int ano,int mes1,int mes2);
00017 int dias_dos_anos_intermedios(int ano1, int ano2);
00018 int dias_ate_fim_ano(int ano,int mes,int dia);
00019 int dias_desde_principio_ano(int ano,int mes,int dia);
00020 long int dif_data(int ano1,int mes1,int dia1,int ano2,int mes2,int dia2);
00021 
00022 
00023 
00024 int main(void)
00025 
00026 {
00027     int limite_ano_min=0,limite_ano_max=2100;//Valores limite para o ano//
00028     int ano_dt1,ano_dt2,mes_dt1,mes_dt2,dia_dt1,dia_dt2;
00029     long int score_dt1,score_dt2; //Variaveis que avaliam a data mais alta//
00030     int hora_dt1,hora_dt2,horas,min_dt1,min_dt2,tmins1,tmins2,minutos,tmp_ano,tmp_mes,tmp_dia,tmp_hora,tmp_min;
00031     char opcao='N';
00032     int continuar=1;
00033 
00034     do {
00035         printf("\r\n");
00036         printf("%c[2J",27);  //clrscr();
00037 
00038         printf(" ----------------------------------------------------\r\n");
00039         printf("| Programa que calcula a diferenca entre duas datas. |\r\n");
00040         printf("|                                                    |\r\n");
00041         printf("|    LESEM ENAUTICA 2015 Luis Sousa aluno 11001      |\r\n");
00042         printf(" ----------------------------------------------------\r\n\n");
00043 
00044         printf("\n\nIntroducao da Data 1\r\n");
00045         do {
00046             printf("\r\nIntroduza o ano da  Data 1: (%d-%d): ",limite_ano_min,limite_ano_max);
00047             //scanf("%d",&ano_dt1);
00048             ano_dt1=readkbd();
00049             if (!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max)))
00050                 printf("\r\nO ano tem de estar compreendido entre %d e %d ",limite_ano_min,limite_ano_max);
00051         } while(!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max)));
00052 
00053         do {
00054             printf("\r\nIntroduza o mes da Data 1: (%d-%d): ",1,12);
00055             //scanf("%d",&mes_dt1);
00056             mes_dt1=readkbd();
00057             if (!((mes_dt1>=1)&&(mes_dt1<=12)))
00058                 printf("\r\nO mes tem de estar compreendido entre %d e %d ",1,12);
00059         } while(!((mes_dt1>=1)&&(mes_dt1<=12)));
00060 
00061         do {
00062             printf("\r\nIntroduza o dia da Data 1: (%d-%d): ",1,dias_do_mes(ano_dt1,mes_dt1));
00063             //scanf("%d",&dia_dt1);
00064             dia_dt1=readkbd();
00065             if (!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1))))
00066                 printf("\r\nO dia tem de estar compreendido entre %d e %d ",1,dias_do_mes(ano_dt1,mes_dt1));
00067         } while(!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1))));
00068 
00069         do {
00070             printf("\r\nIntroduza a hora da Data 1: (%d-%d): ",0,23);
00071             //scanf("%d",&hora_dt1);
00072             hora_dt1=readkbd();
00073             if (!((hora_dt1>=0) && (hora_dt1 <= 23)))
00074                 printf("\r\nA hora tem de estar compreendida entre %d e %d ",0,23);
00075         } while(!((hora_dt1>=0) && (hora_dt1 <= 23)));
00076 
00077         do {
00078             printf("\r\nIntroduza os minutos da Data 1: (%d-%d): ",0,59);
00079             //scanf("%d",&min_dt1);
00080             min_dt1=readkbd();
00081             if (!((min_dt1>=0) && (min_dt1 <= 59)))
00082                 printf("\r\nOs minutos devem estar compreendidos entre %d e %d ",0,59);
00083         } while(!((min_dt1>=0) && (min_dt1 <= 59)));
00084 
00085 
00086         printf("\r\n\nIntroducao da Data 2");
00087         do {
00088             printf("\r\nIntroduza o ano da Data 2: (%d-%d): ",limite_ano_min,limite_ano_max);
00089             //scanf("%d",&ano_dt2);
00090             ano_dt2=readkbd();
00091             if (!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max)))
00092                 printf("\r\nO ano tem de estar compreendido entre %d e %d ",limite_ano_min,limite_ano_max);
00093         } while(!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max)));
00094 
00095         do {
00096             printf("\r\nIntroduza o mes da Data 2: (%d-%d): ",1,12);
00097             //scanf("%d",&mes_dt2);
00098             mes_dt2=readkbd();
00099             if (!((mes_dt2>=1)&&(mes_dt2<=12)))
00100                 printf("\r\nO mes tem de estar compreendido entre %d e %d ",1,12);
00101         } while(!((mes_dt2>=1)&&(mes_dt2<=12)));
00102 
00103         do {
00104             printf("\r\nIntroduza o dia da Data 2: (%d-%d): ",1,dias_do_mes(ano_dt2,mes_dt2));
00105             //scanf("%d",&dia_dt2);
00106             dia_dt2=readkbd();
00107             if (!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2))))
00108                 printf("\r\nO dia tem de estar compreendido entre %d e %d ",1,dias_do_mes(ano_dt2,mes_dt2));
00109         } while(!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2))));
00110 
00111         do {
00112             printf("\r\nIntroduza a hora da Data 2: (%d-%d): ",0,23);
00113             //scanf("%d",&hora_dt2);
00114             hora_dt2=readkbd();
00115             if (!((hora_dt2>=0) && (hora_dt2 <= 23)))
00116                 printf("\r\nA hora tem de estar compreendida entre %d e %d ",0,23);
00117         } while(!((hora_dt2>=0) && (hora_dt2 <= 23)));
00118 
00119         do {
00120             printf("\r\nIntroduza os minutos da Data 1: (%d-%d): ",0,59);
00121             //scanf("%d",&min_dt2);
00122             min_dt2=readkbd();
00123             if (!((min_dt2>=0) && (min_dt2 <= 59)))
00124                 printf("\r\nOs minutos devem estar compreendidos entre %d e %d ",0,59);
00125         } while(!((min_dt2>=0) && (min_dt2 <= 59)));
00126 
00127         score_dt1 = dif_data(limite_ano_min,1,1,ano_dt1,mes_dt1,dia_dt1);
00128         score_dt2 = dif_data(limite_ano_min,1,1,ano_dt2,mes_dt2,dia_dt2);
00129 
00130         tmins1= hora_dt1*60+min_dt1;   //reduz primeira hora a minutos
00131         tmins2= hora_dt2*60+min_dt2;   //reduz segunda hora a minutos
00132 
00133         if ((score_dt1>score_dt2)||((score_dt1 == score_dt2)&&(tmins1>tmins2)))
00134             /*
00135                     Se a primeira data for maior que a segunda
00136                     troca as datas de forma a ficar data2>data1
00137                     */
00138         {
00139             tmp_ano=ano_dt1;
00140             tmp_mes=mes_dt1;
00141             tmp_dia=dia_dt1;
00142             tmp_hora=hora_dt1;
00143             tmp_min=min_dt1;
00144 
00145             ano_dt1=ano_dt2;
00146             mes_dt1=mes_dt2;
00147             dia_dt1=dia_dt2;
00148             hora_dt1=hora_dt2;
00149             min_dt1=min_dt2;
00150 
00151             ano_dt2=tmp_ano;
00152             mes_dt2=tmp_mes;
00153             dia_dt2=tmp_dia;
00154             hora_dt2=tmp_hora;
00155             min_dt2=tmp_min;
00156 
00157             tmins1= hora_dt1*60+min_dt1;   //Depois da troca recalcula
00158             tmins2= hora_dt2*60+min_dt2;   //tmins1 e tmins2
00159         }
00160 
00161         printf("\r\n\nData 1: %d-%d-%d %d horas e %d minutos",dia_dt1,mes_dt1,ano_dt1,hora_dt1,min_dt1);
00162         printf("\r\nData 2: %d-%d-%d %d horas e %d minutos",dia_dt2,mes_dt2,ano_dt2,hora_dt2,min_dt2);
00163 
00164         if (tmins2>=tmins1) { //Se tmins2>tmins1 contabiliza dias completos mais algumas horas
00165             horas=(tmins2-tmins1)/60;        //diferenca em horas
00166             minutos=(tmins2-tmins1)%60;      //diferenca em minutos
00167             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);
00168         } else { //Se tmins1>tmins2 retiramos um dia e fazemos a conta ah diferenca de horas
00169             horas=(24*60-tmins1+tmins2)/60;        //diferenca em horas
00170             minutos=(24*60-tmins1+tmins2)%60;      //diferenca em minutos
00171             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);
00172         }
00173 
00174         printf("\r\n\nNovo Calculo de datas? (S/N) ");
00175 //      opcao=getc();
00176 //      scanf(" %c", &opcao);
00177         opcao = getchar();
00178         if((opcao =='S')||(opcao =='s')) continuar=1;
00179         else {
00180             continuar=0;
00181 //          clrscr();
00182             printf("\r\nCalculos terminados! \r\n\n");
00183         }
00184 
00185     } while (continuar);
00186 }
00187 
00188 int bissexto(int ano)
00189 {
00190     if((ano%400==0)||((ano%4==0)&&(ano%100!=0)))
00191         return 1;
00192     else
00193         return 0;
00194 }
00195 
00196 int dias_do_ano(int ano)
00197 {
00198     if (bissexto(ano))return 366;
00199     else return 365;
00200 }
00201 
00202 int dias_do_mes(int ano,int mes)
00203 {
00204     if (mes == 1||mes == 3||mes == 5||mes == 7||mes == 8||mes == 10||mes == 12)
00205         return 31;
00206     else if(mes == 4||mes == 6||mes == 9||mes == 11)
00207         return 30;
00208     else if (mes == 2)
00209         if (bissexto (ano))
00210             return 29;
00211         else
00212             return 28;
00213     else return 255; //erro!!! mes invalido//
00214 }
00215 
00216 int dias_ate_fim_mes(int ano,int mes,int dia)
00217 {
00218     return (dias_do_mes(ano,mes)-dia);
00219 }
00220 
00221 int dias_dos_meses_intermedios(int ano,int mes1,int mes2)
00222 {
00223     int i,dias=0;
00224     i=mes1;
00225     i++; /*O primeiro e o ultimo mes nao sao contabilizados. So os intermedios*/
00226     while (i<mes2) {
00227         dias = dias + dias_do_mes(ano,i);
00228         i++;
00229     }
00230     return dias;
00231 }
00232 
00233 int dias_dos_anos_intermedios(int ano1,int ano2)
00234 {
00235     int i,dias = 0;
00236     i=ano1;
00237     i++; /*O primeiro e o ultimo ano nao sao contabilizados. So os intermedios*/
00238     while (i<ano2) {
00239         dias = dias + dias_do_ano(i);
00240         i++;
00241     }
00242     return dias;
00243 }
00244 
00245 int dias_ate_fim_ano(int ano,int mes,int dia)
00246 {
00247     return dias_ate_fim_mes(ano,mes,dia)+ dias_dos_meses_intermedios(ano,mes,13);
00248     /*  Calcula dias ate fim do ano. Como os extremos nao sao contabilizados
00249             envia-se 13 para contabilizar Mes de Dezembro         */
00250 }
00251 
00252 int dias_desde_principio_ano(int ano,int mes,int dia)
00253 {
00254     return dias_dos_meses_intermedios(ano,0,mes)+ dia;
00255     /*Calcula dias desde principio do ano.
00256             Como os extremos nao sao contabilizados
00257             envia-se 0 para contabilizar Janeiro         */
00258 }
00259 
00260 long int dif_data(int ano1,int mes1,int dia1,int ano2,int mes2,int dia2)
00261 {
00262     if (ano1 == ano2 && mes1 == mes2)
00263         return dia2-dia1;
00264     else if(ano1 == ano2 && mes1 != mes2)
00265         return dias_ate_fim_mes(ano1,mes1,dia1) //Dias ate ao fim do 1o mes//
00266                + dias_dos_meses_intermedios(ano1,mes1,mes2) //Dias dos meses intermedios//
00267                + dia2; // Dias do ultimo mes //
00268     else
00269         return dias_ate_fim_ano(ano1,mes1,dia1)
00270                + dias_dos_anos_intermedios(ano1,ano2) //Calcula dias dos anos intermedios//
00271                + dias_desde_principio_ano(ano2,mes2,dia2);
00272 }
00273 
00274 int readkbd(void)
00275 {
00276     int value=0;
00277     int ch=0;
00278     int sair=0;
00279 
00280     while (!sair) { //enquanto nao for enter, le
00281         char ch = getchar();
00282         if(ch >= '0' && ch <= '9') { // 0 .. 9?
00283             value = (value * 10) + (ch - '0'); // sim, acumula
00284             putchar(ch);
00285         } else {
00286             if (ch==13) sair=1;
00287             //else if (ch==8) printf("\b");
00288             //else printf(">C%i<",ch);
00289         }
00290     }
00291     printf("\r\nValor introduzido: %i",value);
00292     return value;
00293 }