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.
main.cpp
- Committer:
- lmsousa
- Date:
- 2015-05-13
- Revision:
- 0:dce171f603a8
- Child:
- 1:0756a87e335f
File content as of revision 0:dce171f603a8:
/* Programa que calcula a diferença entre duas datas. LESEM ENAUTICA 2014 Luis Sousa aluno 11001 */ #include <stdio.h> //#include <conio.h> 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; //clrscr(); printf("Programa que calcula a diferenca entre duas datas. "); printf("\nLESEM ENAUTICA 2014 Luis Sousa aluno 11001"); printf("\n\nIntroducao da Data 1"); do { printf("\nIntroduza o ano da Data 1: (%d-%d): ",limite_ano_min,limite_ano_max); scanf("%d",&ano_dt1); if (!((ano_dt1>=limite_ano_min)&&(ano_dt1<=limite_ano_max))) printf("O 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("Introduza o mes da Data 1: (%d-%d): ",1,12); scanf("%d",&mes_dt1); if (!((mes_dt1>=1)&&(mes_dt1<=12))) printf("O mes tem de estar compreendido entre %d e %d \n",1,12); } while(!((mes_dt1>=1)&&(mes_dt1<=12))); do { printf("Introduza o dia da Data 1: (%d-%d): ",1,dias_do_mes(ano_dt1,mes_dt1)); scanf("%d",&dia_dt1); if (!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1)))) printf("O dia tem de estar compreendido entre %d e %d \n",1,dias_do_mes(ano_dt1,mes_dt1)); } while(!((dia_dt1>=1) && (dia_dt1 <= dias_do_mes(ano_dt1,mes_dt1)))); do { printf("Introduza a hora da Data 1: (%d-%d): ",0,23); scanf("%d",&hora_dt1); if (!((hora_dt1>=0) && (hora_dt1 <= 23))) printf("A hora tem de estar compreendida entre %d e %d \n",0,23); } while(!((hora_dt1>=0) && (hora_dt1 <= 23))); do { printf("Introduza os minutos da Data 1: (%d-%d): ",0,59); scanf("%d",&min_dt1); if (!((min_dt1>=0) && (min_dt1 <= 59))) printf("Os minutos devem estar compreendidos entre %d e %d \n",0,59); } while(!((min_dt1>=0) && (min_dt1 <= 59))); printf("\n\nIntroducao da Data 2"); do { printf("\nIntroduza o ano da Data 2: (%d-%d): ",limite_ano_min,limite_ano_max); scanf("%d",&ano_dt2); if (!((ano_dt2>=limite_ano_min)&&(ano_dt2<=limite_ano_max))) printf("O 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("Introduza o mes da Data 2: (%d-%d): ",1,12); scanf("%d",&mes_dt2); if (!((mes_dt2>=1)&&(mes_dt2<=12))) printf("O mes tem de estar compreendido entre %d e %d \n",1,12); } while(!((mes_dt2>=1)&&(mes_dt2<=12))); do { printf("Introduza o dia da Data 2: (%d-%d): ",1,dias_do_mes(ano_dt2,mes_dt2)); scanf("%d",&dia_dt2); if (!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2)))) printf("O dia tem de estar compreendido entre %d e %d \n",1,dias_do_mes(ano_dt2,mes_dt2)); } while(!((dia_dt2>=1) && (dia_dt2 <= dias_do_mes(ano_dt2,mes_dt2)))); do { printf("Introduza a hora da Data 2: (%d-%d): ",0,23); scanf("%d",&hora_dt2); if (!((hora_dt2>=0) && (hora_dt2 <= 23))) printf("A hora tem de estar compreendida entre %d e %d \n",0,23); } while(!((hora_dt2>=0) && (hora_dt2 <= 23))); do { printf("Introduza os minutos da Data 1: (%d-%d): ",0,59); scanf("%d",&min_dt2); if (!((min_dt2>=0) && (min_dt2 <= 59))) printf("Os minutos devem estar compreendidos entre %d e %d \n",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("\nData 1: %d-%d-%d %d horas e %d minutos",dia_dt1,mes_dt1,ano_dt1,hora_dt1,min_dt1); printf("\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("\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("\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); } } 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); }