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

Committer:
lmsousa
Date:
Wed May 13 14:17:28 2015 +0000
Revision:
2:1d24f233ac26
Parent:
1:0756a87e335f
Child:
3:add864dd8eab
KL25Z program that calculates the difference between two dates. Terminal on the PC side is required to communicate with the program. ; Terminal must have local echo activated, for the input to be visible. Needs improvement with the data input process;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lmsousa 0:dce171f603a8 1 /*
lmsousa 0:dce171f603a8 2 Programa que calcula a diferença entre duas datas.
lmsousa 0:dce171f603a8 3 LESEM ENAUTICA 2014 Luis Sousa aluno 11001
lmsousa 0:dce171f603a8 4 */
lmsousa 0:dce171f603a8 5
lmsousa 0:dce171f603a8 6 #include <stdio.h>
lmsousa 0:dce171f603a8 7
lmsousa 2:1d24f233ac26 8
lmsousa 0:dce171f603a8 9 int bissexto(int ano);
lmsousa 0:dce171f603a8 10 int dias_do_mes(int ano,int mes);
lmsousa 0:dce171f603a8 11 int dias_do_ano(int ano);
lmsousa 0:dce171f603a8 12 int dias_ate_fim_mes(int ano,int mes,int dia);
lmsousa 0:dce171f603a8 13 int dias_dos_meses_intermedios(int ano,int mes1,int mes2);
lmsousa 0:dce171f603a8 14 int dias_dos_anos_intermedios(int ano1, int ano2);
lmsousa 0:dce171f603a8 15 int dias_ate_fim_ano(int ano,int mes,int dia);
lmsousa 0:dce171f603a8 16 int dias_desde_principio_ano(int ano,int mes,int dia);
lmsousa 0:dce171f603a8 17 long int dif_data(int ano1,int mes1,int dia1,int ano2,int mes2,int dia2);
lmsousa 0:dce171f603a8 18
lmsousa 2:1d24f233ac26 19
lmsousa 2:1d24f233ac26 20
lmsousa 0:dce171f603a8 21 int main(void)
lmsousa 2:1d24f233ac26 22
lmsousa 0:dce171f603a8 23 {
lmsousa 1:0756a87e335f 24 int limite_ano_min=0,limite_ano_max=2100;//Valores limite para o ano//
lmsousa 1:0756a87e335f 25 int ano_dt1,ano_dt2,mes_dt1,mes_dt2,dia_dt1,dia_dt2;
lmsousa 1:0756a87e335f 26 long int score_dt1,score_dt2; //Variaveis que avaliam a data mais alta//
lmsousa 1:0756a87e335f 27 int hora_dt1,hora_dt2,horas,min_dt1,min_dt2,tmins1,tmins2,minutos,tmp_ano,tmp_mes,tmp_dia,tmp_hora,tmp_min;
lmsousa 2:1d24f233ac26 28 char opcao='N';
lmsousa 2:1d24f233ac26 29 int continuar=1;
lmsousa 0:dce171f603a8 30
lmsousa 1:0756a87e335f 31 do {
lmsousa 2:1d24f233ac26 32 printf("%c[2J",27); //clrscr();
lmsousa 0:dce171f603a8 33
lmsousa 2:1d24f233ac26 34 printf(" ----------------------------------------------------\r\n");
lmsousa 2:1d24f233ac26 35 printf("| Programa que calcula a diferenca entre duas datas. |\r\n");
lmsousa 2:1d24f233ac26 36 printf("| |\r\n");
lmsousa 2:1d24f233ac26 37 printf("| LESEM ENAUTICA 2015 Luis Sousa aluno 11001 |\r\n");
lmsousa 2:1d24f233ac26 38 printf(" ----------------------------------------------------\r\n\n");
lmsousa 0:dce171f603a8 39
lmsousa 2:1d24f233ac26 40 printf("\n\nIntroducao da Data 1\r\n");
lmsousa 2:1d24f233ac26 41 do {
lmsousa 2:1d24f233ac26 42 printf("\r\nIntroduza o ano da Data 1: (%d-%d): ",limite_ano_min,limite_ano_max);
lmsousa 2:1d24f233ac26 43 scanf("%d",&ano_dt1);
lmsousa 2:1d24f233ac26 44 if (!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max)))
lmsousa 2:1d24f233ac26 45 printf("\r\nO ano tem de estar compreendido entre %d e %d ",limite_ano_min,limite_ano_max);
lmsousa 2:1d24f233ac26 46 } while(!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max)));
lmsousa 1:0756a87e335f 47
lmsousa 2:1d24f233ac26 48 do {
lmsousa 2:1d24f233ac26 49 printf("\r\nIntroduza o mes da Data 1: (%d-%d): ",1,12);
lmsousa 2:1d24f233ac26 50 scanf("%d",&mes_dt1);
lmsousa 2:1d24f233ac26 51 if (!((mes_dt1>=1)&&(mes_dt1<=12)))
lmsousa 2:1d24f233ac26 52 printf("\r\nO mes tem de estar compreendido entre %d e %d ",1,12);
lmsousa 0:dce171f603a8 53
lmsousa 2:1d24f233ac26 54 } while(!((mes_dt1>=1)&&(mes_dt1<=12)));
lmsousa 0:dce171f603a8 55
lmsousa 2:1d24f233ac26 56 do {
lmsousa 2:1d24f233ac26 57 printf("\r\nIntroduza o dia da Data 1: (%d-%d): ",1,dias_do_mes(ano_dt1,mes_dt1));
lmsousa 2:1d24f233ac26 58 scanf("%d",&dia_dt1);
lmsousa 2:1d24f233ac26 59 if (!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1))))
lmsousa 2:1d24f233ac26 60 printf("\r\nO dia tem de estar compreendido entre %d e %d ",1,dias_do_mes(ano_dt1,mes_dt1));
lmsousa 2:1d24f233ac26 61 } while(!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1))));
lmsousa 0:dce171f603a8 62
lmsousa 2:1d24f233ac26 63 do {
lmsousa 2:1d24f233ac26 64 printf("\r\nIntroduza a hora da Data 1: (%d-%d): ",0,23);
lmsousa 2:1d24f233ac26 65 scanf("%d",&hora_dt1);
lmsousa 2:1d24f233ac26 66 if (!((hora_dt1>=0) && (hora_dt1 <= 23)))
lmsousa 2:1d24f233ac26 67 printf("\r\nA hora tem de estar compreendida entre %d e %d ",0,23);
lmsousa 2:1d24f233ac26 68 } while(!((hora_dt1>=0) && (hora_dt1 <= 23)));
lmsousa 0:dce171f603a8 69
lmsousa 2:1d24f233ac26 70 do {
lmsousa 2:1d24f233ac26 71 printf("\r\nIntroduza os minutos da Data 1: (%d-%d): ",0,59);
lmsousa 2:1d24f233ac26 72 scanf("%d",&min_dt1);
lmsousa 2:1d24f233ac26 73 if (!((min_dt1>=0) && (min_dt1 <= 59)))
lmsousa 2:1d24f233ac26 74 printf("\r\nOs minutos devem estar compreendidos entre %d e %d ",0,59);
lmsousa 2:1d24f233ac26 75 } while(!((min_dt1>=0) && (min_dt1 <= 59)));
lmsousa 0:dce171f603a8 76
lmsousa 0:dce171f603a8 77
lmsousa 2:1d24f233ac26 78 printf("\r\n\nIntroducao da Data 2");
lmsousa 2:1d24f233ac26 79 do {
lmsousa 2:1d24f233ac26 80 printf("\r\nIntroduza o ano da Data 2: (%d-%d): ",limite_ano_min,limite_ano_max);
lmsousa 2:1d24f233ac26 81 scanf("%d",&ano_dt2);
lmsousa 2:1d24f233ac26 82 if (!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max)))
lmsousa 2:1d24f233ac26 83 printf("\r\nO ano tem de estar compreendido entre %d e %d ",limite_ano_min,limite_ano_max);
lmsousa 2:1d24f233ac26 84
lmsousa 2:1d24f233ac26 85 } while(!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max)));
lmsousa 2:1d24f233ac26 86
lmsousa 2:1d24f233ac26 87 do {
lmsousa 2:1d24f233ac26 88 printf("\r\nIntroduza o mes da Data 2: (%d-%d): ",1,12);
lmsousa 2:1d24f233ac26 89 scanf("%d",&mes_dt2);
lmsousa 2:1d24f233ac26 90 if (!((mes_dt2>=1)&&(mes_dt2<=12)))
lmsousa 2:1d24f233ac26 91 printf("\r\nO mes tem de estar compreendido entre %d e %d ",1,12);
lmsousa 2:1d24f233ac26 92 } while(!((mes_dt2>=1)&&(mes_dt2<=12)));
lmsousa 2:1d24f233ac26 93
lmsousa 2:1d24f233ac26 94 do {
lmsousa 2:1d24f233ac26 95 printf("\r\nIntroduza o dia da Data 2: (%d-%d): ",1,dias_do_mes(ano_dt2,mes_dt2));
lmsousa 2:1d24f233ac26 96 scanf("%d",&dia_dt2);
lmsousa 2:1d24f233ac26 97 if (!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2))))
lmsousa 2:1d24f233ac26 98 printf("\r\nO dia tem de estar compreendido entre %d e %d ",1,dias_do_mes(ano_dt2,mes_dt2));
lmsousa 2:1d24f233ac26 99 } while(!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2))));
lmsousa 2:1d24f233ac26 100
lmsousa 2:1d24f233ac26 101 do {
lmsousa 2:1d24f233ac26 102 printf("\r\nIntroduza a hora da Data 2: (%d-%d): ",0,23);
lmsousa 2:1d24f233ac26 103 scanf("%d",&hora_dt2);
lmsousa 2:1d24f233ac26 104 if (!((hora_dt2>=0) && (hora_dt2 <= 23)))
lmsousa 2:1d24f233ac26 105 printf("\r\nA hora tem de estar compreendida entre %d e %d ",0,23);
lmsousa 2:1d24f233ac26 106 } while(!((hora_dt2>=0) && (hora_dt2 <= 23)));
lmsousa 2:1d24f233ac26 107
lmsousa 2:1d24f233ac26 108 do {
lmsousa 2:1d24f233ac26 109 printf("\r\nIntroduza os minutos da Data 1: (%d-%d): ",0,59);
lmsousa 2:1d24f233ac26 110 scanf("%d",&min_dt2);
lmsousa 2:1d24f233ac26 111 if (!((min_dt2>=0) && (min_dt2 <= 59)))
lmsousa 2:1d24f233ac26 112 printf("\r\nOs minutos devem estar compreendidos entre %d e %d ",0,59);
lmsousa 2:1d24f233ac26 113 } while(!((min_dt2>=0) && (min_dt2 <= 59)));
lmsousa 2:1d24f233ac26 114
lmsousa 2:1d24f233ac26 115 score_dt1 = dif_data(limite_ano_min,1,1,ano_dt1,mes_dt1,dia_dt1);
lmsousa 2:1d24f233ac26 116 score_dt2 = dif_data(limite_ano_min,1,1,ano_dt2,mes_dt2,dia_dt2);
lmsousa 2:1d24f233ac26 117
lmsousa 2:1d24f233ac26 118 tmins1= hora_dt1*60+min_dt1; //reduz primeira hora a minutos
lmsousa 2:1d24f233ac26 119 tmins2= hora_dt2*60+min_dt2; //reduz segunda hora a minutos
lmsousa 2:1d24f233ac26 120
lmsousa 2:1d24f233ac26 121 if ((score_dt1>score_dt2)||((score_dt1 == score_dt2)&&(tmins1>tmins2)))
lmsousa 2:1d24f233ac26 122 /*
lmsousa 2:1d24f233ac26 123 Se a primeira data for maior que a segunda
lmsousa 2:1d24f233ac26 124 troca as datas de forma a ficar data2>data1
lmsousa 2:1d24f233ac26 125 */
lmsousa 2:1d24f233ac26 126 {
lmsousa 2:1d24f233ac26 127 tmp_ano=ano_dt1;
lmsousa 2:1d24f233ac26 128 tmp_mes=mes_dt1;
lmsousa 2:1d24f233ac26 129 tmp_dia=dia_dt1;
lmsousa 2:1d24f233ac26 130 tmp_hora=hora_dt1;
lmsousa 2:1d24f233ac26 131 tmp_min=min_dt1;
lmsousa 2:1d24f233ac26 132
lmsousa 2:1d24f233ac26 133 ano_dt1=ano_dt2;
lmsousa 2:1d24f233ac26 134 mes_dt1=mes_dt2;
lmsousa 2:1d24f233ac26 135 dia_dt1=dia_dt2;
lmsousa 2:1d24f233ac26 136 hora_dt1=hora_dt2;
lmsousa 2:1d24f233ac26 137 min_dt1=min_dt2;
lmsousa 2:1d24f233ac26 138
lmsousa 2:1d24f233ac26 139 ano_dt2=tmp_ano;
lmsousa 2:1d24f233ac26 140 mes_dt2=tmp_mes;
lmsousa 2:1d24f233ac26 141 dia_dt2=tmp_dia;
lmsousa 2:1d24f233ac26 142 hora_dt2=tmp_hora;
lmsousa 2:1d24f233ac26 143 min_dt2=tmp_min;
lmsousa 2:1d24f233ac26 144
lmsousa 2:1d24f233ac26 145 tmins1= hora_dt1*60+min_dt1; //Depois da troca recalcula
lmsousa 2:1d24f233ac26 146 tmins2= hora_dt2*60+min_dt2; //tmins1 e tmins2
lmsousa 2:1d24f233ac26 147 }
lmsousa 2:1d24f233ac26 148
lmsousa 2:1d24f233ac26 149 printf("\r\n\nData 1: %d-%d-%d %d horas e %d minutos",dia_dt1,mes_dt1,ano_dt1,hora_dt1,min_dt1);
lmsousa 2:1d24f233ac26 150 printf("\r\nData 2: %d-%d-%d %d horas e %d minutos",dia_dt2,mes_dt2,ano_dt2,hora_dt2,min_dt2);
lmsousa 2:1d24f233ac26 151
lmsousa 2:1d24f233ac26 152 if (tmins2>=tmins1) { //Se tmins2>tmins1 contabiliza dias completos mais algumas horas
lmsousa 2:1d24f233ac26 153 horas=(tmins2-tmins1)/60; //diferenca em horas
lmsousa 2:1d24f233ac26 154 minutos=(tmins2-tmins1)%60; //diferenca em minutos
lmsousa 2:1d24f233ac26 155 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);
lmsousa 2:1d24f233ac26 156 } else { //Se tmins1>tmins2 retiramos um dia e fazemos a conta ah diferenca de horas
lmsousa 2:1d24f233ac26 157 horas=(24*60-tmins1+tmins2)/60; //diferenca em horas
lmsousa 2:1d24f233ac26 158 minutos=(24*60-tmins1+tmins2)%60; //diferenca em minutos
lmsousa 2:1d24f233ac26 159 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);
lmsousa 2:1d24f233ac26 160 }
lmsousa 2:1d24f233ac26 161
lmsousa 2:1d24f233ac26 162 printf("\r\n\nNovo Calculo de datas? (S/N) ");
lmsousa 2:1d24f233ac26 163 // opcao=getc();
lmsousa 2:1d24f233ac26 164 scanf(" %c", &opcao);
lmsousa 2:1d24f233ac26 165 // opcao = getchar(); */
lmsousa 2:1d24f233ac26 166 if((opcao =='S')||(opcao =='s')) continuar=1;
lmsousa 2:1d24f233ac26 167 else {
lmsousa 2:1d24f233ac26 168 continuar=0;
lmsousa 2:1d24f233ac26 169 // clrscr();
lmsousa 2:1d24f233ac26 170 printf("\r\nCalculos terminados! \r\n\n");
lmsousa 2:1d24f233ac26 171 }
lmsousa 2:1d24f233ac26 172
lmsousa 2:1d24f233ac26 173 } while (continuar);
lmsousa 0:dce171f603a8 174 }
lmsousa 0:dce171f603a8 175
lmsousa 0:dce171f603a8 176 int bissexto(int ano)
lmsousa 0:dce171f603a8 177 {
lmsousa 1:0756a87e335f 178 if((ano%400==0)||((ano%4==0)&&(ano%100!=0)))
lmsousa 1:0756a87e335f 179 return 1;
lmsousa 1:0756a87e335f 180 else
lmsousa 1:0756a87e335f 181 return 0;
lmsousa 0:dce171f603a8 182 }
lmsousa 0:dce171f603a8 183
lmsousa 0:dce171f603a8 184 int dias_do_ano(int ano)
lmsousa 0:dce171f603a8 185 {
lmsousa 1:0756a87e335f 186 if (bissexto(ano))return 366;
lmsousa 1:0756a87e335f 187 else return 365;
lmsousa 0:dce171f603a8 188 }
lmsousa 0:dce171f603a8 189
lmsousa 0:dce171f603a8 190 int dias_do_mes(int ano,int mes)
lmsousa 0:dce171f603a8 191 {
lmsousa 1:0756a87e335f 192 if (mes == 1||mes == 3||mes == 5||mes == 7||mes == 8||mes == 10||mes == 12)
lmsousa 1:0756a87e335f 193 return 31;
lmsousa 1:0756a87e335f 194 else if(mes == 4||mes == 6||mes == 9||mes == 11)
lmsousa 1:0756a87e335f 195 return 30;
lmsousa 1:0756a87e335f 196 else if (mes == 2)
lmsousa 0:dce171f603a8 197 if (bissexto (ano))
lmsousa 1:0756a87e335f 198 return 29;
lmsousa 0:dce171f603a8 199 else
lmsousa 1:0756a87e335f 200 return 28;
lmsousa 1:0756a87e335f 201 else return 255; //erro!!! mes invalido//
lmsousa 0:dce171f603a8 202 }
lmsousa 0:dce171f603a8 203
lmsousa 0:dce171f603a8 204 int dias_ate_fim_mes(int ano,int mes,int dia)
lmsousa 0:dce171f603a8 205 {
lmsousa 1:0756a87e335f 206 return (dias_do_mes(ano,mes)-dia);
lmsousa 0:dce171f603a8 207 }
lmsousa 0:dce171f603a8 208
lmsousa 0:dce171f603a8 209 int dias_dos_meses_intermedios(int ano,int mes1,int mes2)
lmsousa 0:dce171f603a8 210 {
lmsousa 1:0756a87e335f 211 int i,dias=0;
lmsousa 1:0756a87e335f 212 i=mes1;
lmsousa 1:0756a87e335f 213 i++; /*O primeiro e o ultimo mes nao sao contabilizados. So os intermedios*/
lmsousa 1:0756a87e335f 214 while (i<mes2) {
lmsousa 1:0756a87e335f 215 dias = dias + dias_do_mes(ano,i);
lmsousa 1:0756a87e335f 216 i++;
lmsousa 1:0756a87e335f 217 }
lmsousa 1:0756a87e335f 218 return dias;
lmsousa 0:dce171f603a8 219 }
lmsousa 0:dce171f603a8 220
lmsousa 0:dce171f603a8 221 int dias_dos_anos_intermedios(int ano1,int ano2)
lmsousa 0:dce171f603a8 222 {
lmsousa 1:0756a87e335f 223 int i,dias = 0;
lmsousa 1:0756a87e335f 224 i=ano1;
lmsousa 1:0756a87e335f 225 i++; /*O primeiro e o ultimo ano nao sao contabilizados. So os intermedios*/
lmsousa 1:0756a87e335f 226 while (i<ano2) {
lmsousa 1:0756a87e335f 227 dias = dias + dias_do_ano(i);
lmsousa 1:0756a87e335f 228 i++;
lmsousa 1:0756a87e335f 229 }
lmsousa 1:0756a87e335f 230 return dias;
lmsousa 0:dce171f603a8 231 }
lmsousa 0:dce171f603a8 232
lmsousa 1:0756a87e335f 233 int dias_ate_fim_ano(int ano,int mes,int dia)
lmsousa 0:dce171f603a8 234 {
lmsousa 1:0756a87e335f 235 return dias_ate_fim_mes(ano,mes,dia)+ dias_dos_meses_intermedios(ano,mes,13);
lmsousa 1:0756a87e335f 236 /* Calcula dias ate fim do ano. Como os extremos nao sao contabilizados
lmsousa 1:0756a87e335f 237 envia-se 13 para contabilizar Mes de Dezembro */
lmsousa 0:dce171f603a8 238 }
lmsousa 0:dce171f603a8 239
lmsousa 0:dce171f603a8 240 int dias_desde_principio_ano(int ano,int mes,int dia)
lmsousa 0:dce171f603a8 241 {
lmsousa 1:0756a87e335f 242 return dias_dos_meses_intermedios(ano,0,mes)+ dia;
lmsousa 1:0756a87e335f 243 /*Calcula dias desde principio do ano.
lmsousa 1:0756a87e335f 244 Como os extremos nao sao contabilizados
lmsousa 1:0756a87e335f 245 envia-se 0 para contabilizar Janeiro */
lmsousa 0:dce171f603a8 246 }
lmsousa 0:dce171f603a8 247
lmsousa 0:dce171f603a8 248 long int dif_data(int ano1,int mes1,int dia1,int ano2,int mes2,int dia2)
lmsousa 0:dce171f603a8 249 {
lmsousa 1:0756a87e335f 250 if (ano1 == ano2 && mes1 == mes2)
lmsousa 1:0756a87e335f 251 return dia2-dia1;
lmsousa 1:0756a87e335f 252 else if(ano1 == ano2 && mes1 != mes2)
lmsousa 1:0756a87e335f 253 return dias_ate_fim_mes(ano1,mes1,dia1) //Dias ate ao fim do 1o mes//
lmsousa 1:0756a87e335f 254 + dias_dos_meses_intermedios(ano1,mes1,mes2) //Dias dos meses intermedios//
lmsousa 1:0756a87e335f 255 + dia2; // Dias do ultimo mes //
lmsousa 0:dce171f603a8 256 else
lmsousa 1:0756a87e335f 257 return dias_ate_fim_ano(ano1,mes1,dia1)
lmsousa 1:0756a87e335f 258 + dias_dos_anos_intermedios(ano1,ano2) //Calcula dias dos anos intermedios//
lmsousa 1:0756a87e335f 259 + dias_desde_principio_ano(ano2,mes2,dia2);
lmsousa 0:dce171f603a8 260 }
lmsousa 0:dce171f603a8 261
lmsousa 0:dce171f603a8 262