Programación 1 Tema II – Clase de problemas Diseño de funciones elementales 1 Problema 1º. Diseñar esta función /* * Pre: anyo >= 1600 * Post: Devuelve [true] si y solo si [anyo] es un año * bisieto */ bool esBisiesto (int anyo) { ... completar la escritura de su código ... } 2 Diseño C++ de la función esBisiesto(anyo) /* * Pre: anyo >= 1600 * Post: Devuelve [true] si y solo si [anyo] es un año * bisieto */ bool esBisiesto (int anyo) { // Un año es bisiesto si es múltiplo de 400 o, siendo // múltiplo de 4, no lo es de 100. En caso contrario // no es bisiesto return (anyo % 4 == 0 && anyo % 100 != 0) || (anyo % 400 == 0); } 3 Problema 2º. Diseñar esta función /* * Pre: anyo >= 1600 * Post: Devuelve el número de días del año [anyo] */ int diasDelAnyo (int anyo) { ... completar la escritura de su código ... } 4 Diseño C++ de la función diasDelAnyo(anyo) /* * Pre: anyo >= 1600 * Post: Devuelve el número de días del año [anyo] */ int diasDelAnyo (int anyo) { // Si el año es bisiesto tiene 366 días y, // si no lo es, tiene 365 días if (esBisiesto(anyo)) { return 366; } else { return 365; } } 5 Problema 3º. Diseñar esta función /* * Pre: mes >= 1 y mes <= 12 y anyo >= 1600 * Post: Devuelve el número de días del mes [mes] * del año [anyo] */ int diasDelMes (int mes, int anyo) { ... completar la escritura de su código ... } 6 Diseño C++ de la función diasDelMes(mes,anyo) /* * Pre: mes >= 1 y mes <= 12 y anyo >= 1600 * Post: Devuelve el número de días del mes [mes] del año [anyo] */ int diasDelMes (int mes, int anyo) { // Los meses 1, 3, 5, 7, 8, 10 y 12 tienen 31 días, los // meses 4, 6, 9 y 11 tienen 30 días y el mes 2 tiene 28 // días los años no bisiestos y 29 días los años bisiestos 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 (esBisiesto(anyo)) { return 29; } else { return 28; } } 7 Problema 4º. Diseñar esta función /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Devuelve el valor del día (entre 1 y 31) * correspondiente a la fecha del calendario * representada por el entero [fecha] */ int dia (int fecha) { ... completar la escritura de su código ... } 8 Diseño C++ de la función dia(fecha) /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Devuelve el valor del día (entre 1 y 31) * correspondiente a la fecha del calendario * representada por el entero [fecha] */ int dia (int fecha) { return fecha % 100; } 9 Problema 5º. Diseñar esta función /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Devuelve el valor del mes (entre 1 y 12) * correspondiente a la fecha del calendario * representada por el entero [fecha] */ int mes (int fecha) { ... completar la escritura de su código ... } 10 Diseño C++ de la función mes(fecha) /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Devuelve el valor del mes (entre 1 y 12) * correspondiente a la fecha del calendario * representada por el entero [fecha] */ int mes (int fecha) { return fecha / 100 % 100; } 11 Problema 6º. Diseñar esta función /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Devuelve el valor del año correspondiente * a la fecha del calendario representada * por el entero [fecha] */ int anyo (int fecha) { ... completar la escritura de su código ... } 12 Diseño C++ de la función mes(fecha) /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Devuelve el valor del año correspondiente * a la fecha del calendario representada * por el entero [fecha] */ int anyo (int fecha) { return fecha / 10000; } 13 Problema 7º. Diseñar esta función /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Asigna a [elDia], [elMes] y [elAnyo] los valores * del día, del mes y del año, respectivamente, * que corresponden a la fecha del calendario * representada por el entero [fecha] */ void descomponer (int fecha, int& elDia, int& elMes, int& elAnyo) { ... completar la escritura de su código ... } 14 Diseño C++ de la función descomponer(…) /* * Pre: [fecha] escrita en base 10 tiene la forma * aaaammdd donde los dígitos aaaa representan * el año, los dígitos mm el mes y los dígitos dd * el día de una fecha * Post: Asigna a [elDia], [elMes] y [elAnyo] los valores * del día, del mes y del año, respectivamente, * que corresponden a la fecha del calendario * representada por el entero [fecha] */ void descomponer (int fecha, int& elDia, int& elMes, int& elAnyo) { elDia = dia(fecha); elMes = mes(fecha); elAnyo = anyo(fecha); } 15 Problema 8º. Diseñar esta función /* * Pre: los valores [dia]/[mes]/[anyo] definen una fecha * del calendario * Post: Asigna a [fecha] un valor que defina la fecha * [dia]/[mes]/[anyo] sabiendo que [fecha], cuando * sea escrito en base 10, tiene la forma aaaammdd, * donde los dígitos aaaa representan el año, * los dígitos mm el mes y los dígitos dd el día * de la fecha que representa */ void componer (int dia, int mes, int anyo, int& fecha) { ... completar la escritura de su código ... } 16 Diseño C++ de la función componer(…) /* * Pre: los valores [dia]/[mes]/[anyo] definen una fecha * del calendario * Post: Asigna a [fecha] un valor que defina la fecha * [dia]/[mes]/[anyo] sabiendo que [fecha], cuando * sea escrito en base 10, tiene la forma aaaammdd, * donde los dígitos aaaa representan el año, * los dígitos mm el mes y los dígitos dd el día * de la fecha que representa */ void componer (int dia, int mes, int anyo, int& fecha) { fecha = dia + 100 * mes + 10000 * anyo; } 17 18