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 12:01:41 2015 +0000
Revision:
0:dce171f603a8
Child:
1:0756a87e335f
Initial Version

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