Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Sat Jul 16 2022 07:23:23 by
1.7.2