1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
// 3x07: Tiempo de vida de una persona /* Escriba un programa que lea una secuencia de caracteres (carácter a carácter), terminada con un punto, en las que se expresan las fechas de nacimiento y defunción de una persona (sólo el mes y el año), y escriba su edad en el momento del fallecimiento. La secuencia puede contener otra información además de las fechas, pero verifica las siguientes restricciones: a. No aparece ninguna otra información numérica. b. En cada fecha, el mes se representa con uno o dos dígitos, y el año con cuatro. c. Dentro de una fecha, el mes y el año pueden aparecer en cualquier orden. d. Las dos fechas pueden aparecer en cualquier orden, pero los datos de una fecha (mes y año) aparecen antes que los de la otra. Ejemplos de ejecución: ubuntu$ edad Mortadelo muere en un accidente de tráfico en febrero de 1956 (mes=2); había nacido en octubre (mes 10) de 1905. Edad de fallecimiento: 50 años y 4 meses. ubuntu$ edad Filemón, nacido en 1959 el mes 10; fallecido el 6/1992. Edad de fallecimiento: 32 años y 8 meses. ubuntu$ edad Nerón, muerto en un incendio el 10/1991, había nacido el 1 (enero) de 1891. Edad de fallecimiento: 100 años y 9 meses. */ /* Problemas conocidos: No esta controlado que alguno de los datos este a 0. */ #include <stdio.h> main(){ system("clear"); char car; int temp = 0; int mes[3]; // Se guardan dos numeros, el 0 no se quiere usar, el 3 tiene el fin del vector. int anio[3]; int m = 1; int a = 1; int mVida = 0; int aVida = 0; int salir = 0; // COMIENZA LA SOLICITUD DE NUMEROS Y SU RECOLECCION: printf("Introduzca una fechas de nacimiento y fallecimiento, cada una compuesta por un mes y un anio finalice la introduccion con un punto \'.\'\n\v "); do{ //Se recoge la cadena carácter a carácter: scanf( "%c", &car ); // Se comprueba si el carácter ASCII -48 esta entre el rango 0~9, si no se descarta. if( car-48 >= 0 && car-48 <= 9 ){ // Se guarda el numero: temp *= 10; temp += car-48; } else if( temp != 0 ){ // Cuando aparezca una letra operar con el numero temp: // Si el número tiene dos dígitos y no excede de 12: if( temp >= 1 && temp <= 12 ){ // Se guarda como mes: mes[m] = temp; m++; } else if( temp >= 1000 && temp <= 9999 ){ // Si es de cuatro digitos: // Se guarda como anio: anio[a] = temp; a++; } else { // Si no se ha podido guardar es que: printf("\n Algo no cuadra, compruebe que introdujo unas fechas validas:\n Mes de 1 a 12, Anio con cuatro digitos.\n\n"); salir = 1; }; // Se borra el numero temporal: temp = 0; }; }while( car != '.' && salir == 0 ); // SI NO HA HABIDO ERRORES SIGUE CON LAS CUENTAS: if( salir == 0 ){ // SE ORDENAN LAS FECHAS: //Si la concatenación de el año1+mes1 es menor que año2+mes2, se intercambian las fechas para tener la fecha de nacimiento en el componente[1] y la de fallecimiento en componente[2] if( anio[1]*100+mes[1] > anio[2]*100+mes[2] ){ temp = mes[1]; mes[1] = mes[2]; mes[2] = temp; temp = anio[1]; anio[1] = anio[2]; anio[2] = temp; }; // SE CALCULA EL TIEMPO DE VIDA: // Si el mes de nacimiento es mayor que el mes de fallecimiento: if( mes[1] > mes[2] ){ mVida = (12 - mes[1]) + mes[2]; // Se calcula cuantos meses hay entre ambos meses. aVida = (anio[2] - anio[1])-1; // Se resta año fallecimiento - año nacimiento y -1 por los meses de más. } else{ // En caso contrario haz las restas sin mas: mVida = mes[2] - mes[1]; aVida = anio[2] - anio[1]; }; // SE IMPRIME EL RESULTADO: // Se imprime el resultado teniendo en cuenta si aVida es ANIO o ANIOS, o mVida es MES o MESES, también si no hay años o no hay meses. if( aVida!=0 && aVida!=1 && mVida!=0 && mVida!=1 ){ // Si hay años y meses printf("\n Vivio durante %i anios y %i meses.\n\n", aVida, mVida ); } else if( aVida==1 && mVida!=0 && mVida!=1 ){ // Si hay año y meses printf("\n Vivio durante 1 anio y %i meses.\n\n", mVida ); } else if( aVida==1 && mVida==1 ){ // Si hay año y mes printf("\n Vivio durante 1 anio y 1 mes.\n\n" ); } else if( aVida==1 && mVida==0 ){ // Si hay año printf("\n Vivio durante 1 anio.\n\n" ); } else if( aVida!=0 && aVida!=1 && mVida==0 ){ // Si hay años printf("\n Vivio durante %i anios.\n\n", aVida ); } else if( aVida!=0 && aVida!=1 && mVida==1 ){ // Si hay años y mes printf("\n Vivio durante %i anios y 1 mes.\n\n", aVida, mVida ); } else if( aVida==0 && mVida!=0 && mVida!=1 ){ // Si hay meses printf("\n Vivio durante %i meses.\n\n", mVida ); } else if( aVida==0 && mVida==1 ){ // Si hay mes printf("\n Vivio durante 1 mes.\n\n" ); } else if( aVida==0 && mVida==0 ){ // No nació printf("\n No nacio.\n\n" ); }; }; }; |