diff --git a/fundamentos-programacion/PR2/README.md b/fundamentos-programacion/PR2/README.md index cfd1a00..29bf690 100644 --- a/fundamentos-programacion/PR2/README.md +++ b/fundamentos-programacion/PR2/README.md @@ -765,11 +765,11 @@ La posibilidad de crear las librerías facilita la reutilización del código y 2. Diseñad una acción que, dados un real que representa el saldo de una cuenta corriente y otro real que representa un cargo o imposición, actualice el saldo de la cuenta. -[Solución en lenguaje C]() +[Solución en lenguaje C](./soluciones_c/solucion2/saldo_cuenta.c) 3. Diseñad una función que calcule n (real) elevado a la potencia m (entero). -[Solución en lenguaje C]() +[Solución en lenguaje C](./soluciones_c/solucion3/potencia.c) 4. Diseñad una acción que, dados tres números reales que representan los coeficientes de una ecuación de segundo grado, retorne sus raíces, en caso de que existan. En caso contrario, que inicialice las raíces a 0. Recordad que dada la ecuación A * x2 + B * x + C las raíces se calculan: @@ -780,22 +780,19 @@ Si la expresión dentro de la raíz es negativa quiere decir que la ecuación no ``` function squareRoot(x: real): real; ``` +Declarad las variables necesarias para llamar a la acción del ejercicio anterior e indicad cómo se llamaría. -4b. Declarad las variables necesarias para llamar a la acción del ejercicio anterior e indicad cómo se llamaría. +[Solución en lenguaje C](./soluciones_c/solucion4/ecuacion_segundo_grado.c) -[Solución en lenguaje C]() - -1. Para cada apartado siguiente, decidid si es mejor una acción o una función y definid su cabecera (solamente se pide la cabecera, no hay que diseñar ningún algoritmo). +5. Para cada apartado siguiente, decidid si es mejor una acción o una función y definid su cabecera (solamente se pide la cabecera, no hay que diseñar ningún algoritmo). - Dadas las dimensiones de una pared (altura y anchura) y el precio de pintura por metro cuadrado, determinad el coste total de pintura necesario para pintar la pared. - Dado el consumo total de agua acumulado desde el mes de enero hasta junio (ambos incluidos), leed por el canal estándar el consumo del resto de meses (desde julio a diciembre, ambos incluidos), y retornadlo acumulado al total del consumo de los 6 primeros meses. - Dados dos números enteros intercambiad los valores de ambas variables siempre que ambas sean diferentes de cero. - Dado un entero retornad la suma de sus divisores. -[Solución en lenguaje C]() +Declarad las variables necesarias para llamar a las acciones del ejercicio anterior e indicad cómo se llamarían. -5b. Declarad las variables necesarias para llamar a las acciones del ejercicio anterior e indicad cómo se llamarían. - -[Solución en lenguaje C]() +[Solución en lenguaje C](./soluciones_c/solucion5/calculos_varios.c) (He añadido algunos extras para jugar) ### 12.10 Soluciones en lenguaje algorítmico @@ -994,14 +991,333 @@ end algorithm 5. Solución -```alg +En C: +```c + +#include + +// Función para calcular el coste total de pintura necesario para pintar una pared +float calcularCostePintura(float altura, float anchura, float precio_pintura) +{ + return altura * anchura * precio_pintura; +} + +// Función para calcular el consumo total de agua acumulado +float calcularConsumoAgua(float *consumo_actual, int *meses_consumo_actual, int *ano_consumo_actual) +{ + float consumo_mes; + int meses_a_introducir; + + printf("¿Cuántos meses quieres introducir? "); + scanf("%d", &meses_a_introducir); + + for (int i = 1; i <= meses_a_introducir; i++) + { + if (*meses_consumo_actual == 12) + { + *meses_consumo_actual = 1; + (*ano_consumo_actual)++; + } + else + { + (*meses_consumo_actual)++; + } + + printf("Introduce el consumo de agua del mes %d: ", *meses_consumo_actual); + scanf("%f", &consumo_mes); + *consumo_actual += consumo_mes; + } +} + +// Función para obtener el nombre del mes +char *calcularMesString(int mes) +{ + char *meses[] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}; + return meses[mes - 1]; +} + +// Acción para intercambiar los valores de dos números enteros +void intercambiarValores(int *a, int *b) +{ + if (*a != 0 && *b != 0) + { + int temp = *a; + *a = *b; + *b = temp; + } +} + +// Función para calcular la suma de los divisores de un número entero +int sumaDivisores(int n) +{ + int suma = 0; + + for (int i = 1; i <= n; i++) + { + if (n % i == 0) + { + suma += i; + } + } + + return suma; +} + +int main() +{ + int opcion; + float consumo_actual = 60; + int meses_consumo_actual = 6; + int ano_consumo_actual = 2021; + + do + { + printf("\n[+] Elige una opción:\n"); + printf("1. Calcular el coste total de pintura necesario para pintar una pared\n"); + printf("2. Calcular el consumo total de agua acumulado\n"); + printf("3. Intercambiar los valores de dos números enteros\n"); + printf("4. Calcular la suma de los divisores de un número entero\n"); + printf("5. Salir\n\n"); + printf("> "); + scanf("%d", &opcion); + + switch (opcion) + { + case 1: + { + float altura, anchura, precio_pintura; + printf("\n[+] Introduce la altura de la pared: "); + scanf("%f", &altura); + printf("[+] Introduce la anchura de la pared: "); + scanf("%f", &anchura); + printf("[+] Introduce el precio de la pintura por metro cuadrado: "); + scanf("%f", &precio_pintura); + + float coste_pintura = calcularCostePintura(altura, anchura, precio_pintura); + printf("\n[+] El coste total de pintura necesario para pintar la pared es de %.2f euros\n", coste_pintura); + break; + } + + case 2: + { + calcularConsumoAgua(&consumo_actual, &meses_consumo_actual, &ano_consumo_actual); + char *nombre_mes = calcularMesString(meses_consumo_actual); + printf("\n[+] El consumo total de agua acumulado hasta %s del año %d es de %.2f litros\n", nombre_mes, ano_consumo_actual, consumo_actual); + break; + } + + case 3: + { + int num1, num2; + printf("\n[+] Introduce el primer número entero: "); + scanf("%d", &num1); + printf("[+] Introduce el segundo número entero: "); + scanf("%d", &num2); + + intercambiarValores(&num1, &num2); + printf("\n[+] Los valores intercambiados son: %d y %d\n", num1, num2); + break; + } + + case 4: + { + int numero; + printf("[+] Introduce un número entero: "); + scanf("%d", &numero); + + int suma_divisores = sumaDivisores(numero); + printf("\n[+] La suma de los divisores de %d es: %d\n", numero, suma_divisores); + break; + } + + case 5: + printf("\n[!] Saliendo...\n"); + break; + + default: + printf("[!] Opción no válida\n"); + break; + } + + } while (opcion != 5); + + return 0; +} ``` -5b. Solución - +En lenguaje algorítmico: ```alg +function calcularCostePintura(altura: real, anchura: real, precio_pintura: real): real + return altura * anchura * precio_pintura; +end function +action calcularConsumoAgua(inout consumo_actual: real, inout meses_consumo_actual: integer, inout ano_consumo_actual: integer) + var + consumo_mes: real; + meses_a_introducir: integer; + end var + + writeString("¿Cuántos meses quieres introducir? "); + meses_a_introducir:= readInteger(); + + for i:= 1 to meses_a_introducir do + if meses_consumo_actual = 12 then + meses_consumo_actual:= 1; + ano_consumo_actual:= ano_consumo_actual + 1; + else + meses_consumo_actual:= meses_consumo_actual + 1; + end if + + writeString("Introduce el consumo de agua del mes "); + writeString(meses_consumo_actual); + writeString(": "); + readReal(consumo_mes); + consumo_actual:= consumo_actual + consumo_mes; + end for + +end action + +function calcularMesString(mes: integer): string + var + meses: array[1..12] of string; + end var + + meses[1]:= "Enero"; + meses[2]:= "Febrero"; + meses[3]:= "Marzo"; + meses[4]:= "Abril"; + meses[5]:= "Mayo"; + meses[6]:= "Junio"; + meses[7]:= "Julio"; + meses[8]:= "Agosto"; + meses[9]:= "Septiembre"; + meses[10]:= "Octubre"; + meses[11]:= "Noviembre"; + meses[12]:= "Diciembre"; + + return meses[mes]; + +end function + +action intercambiarValores(inout a: integer, inout b: integer) + var + temp: integer; + end var + + if a ≠ 0 and b ≠ 0 then + temp:= a; + a:= b; + b:= temp; + end if + +end action + +function sumaDivisores(n: integer): integer + var + suma, i: integer; + end var + + suma:= 0; + + for i:= 1 to n do + if n mod i = 0 then + suma:= suma + i; + end if + end for + + return suma; + +end function + +algorithm main + var + opcion: integer; + consumo_actual: real; + meses_consumo_actual, ano_consumo_actual: integer; + end var + + consumo_actual:= 60; + meses_consumo_actual:= 6; + ano_consumo_actual:= 2021; + + repeat + writeString("[+] Elige una opción:"); + writeString("1. Calcular el coste total de pintura necesario para pintar una pared"); + writeString("2. Calcular el consumo total de agua acumulado"); + writeString("3. Intercambiar los valores de dos números enteros"); + writeString("4. Calcular la suma de los divisores de un número entero"); + writeString("5. Salir"); + writeString("> "); + readInteger(opcion); + + case opcion of + 1: + var + altura, anchura, precio_pintura: real; + end var + + writeString("[+] Introduce la altura de la pared: "); + readReal(altura); + writeString("[+] Introduce la anchura de la pared: "); + readReal(anchura); + writeString("[+] Introduce el precio de la pintura por metro cuadrado: "); + readReal(precio_pintura); + + writeString("[+] El coste total de pintura necesario para pintar la pared es de "); + writeReal(calcularCostePintura(altura, anchura, precio_pintura)); + writeString(" euros"); + + 2: + calcularConsumoAgua(consumo_actual, meses_consumo_actual, ano_consumo_actual); + writeString("[+] El consumo total de agua acumulado hasta "); + writeString(calcularMesString(meses_consumo_actual)); + writeString(" del año "); + writeInteger(ano_consumo_actual); + writeString(" es de "); + writeReal(consumo_actual); + writeString(" litros"); + + 3: + var + num1, num2: integer; + end var + + writeString("[+] Introduce el primer número entero: "); + readInteger(num1); + writeString("[+] Introduce el segundo número entero: "); + readInteger(num2); + + intercambiarValores(num1, num2); + writeString("[+] Los valores intercambiados son: "); + writeInteger(num1); + writeString(" y "); + writeInteger(num2); + + 4: + var + numero: integer; + end var + + writeString("[+] Introduce un número entero: "); + readInteger(numero); + + writeString("[+] La suma de los divisores de "); + writeInteger(numero); + writeString(" es: "); + writeInteger(sumaDivisores(numero)); + + 5: + writeString("[!] Saliendo..."); + + otherwise + writeString("[!] Opción no válida"); + + end case + + until opcion = 5 + +end algorithm ``` diff --git a/fundamentos-programacion/PR2/soluciones_c/solucion5/calculos_varios b/fundamentos-programacion/PR2/soluciones_c/solucion5/calculos_varios new file mode 100755 index 0000000..140407c Binary files /dev/null and b/fundamentos-programacion/PR2/soluciones_c/solucion5/calculos_varios differ diff --git a/fundamentos-programacion/PR2/soluciones_c/solucion5/calculos_varios.c b/fundamentos-programacion/PR2/soluciones_c/solucion5/calculos_varios.c new file mode 100644 index 0000000..2e163d6 --- /dev/null +++ b/fundamentos-programacion/PR2/soluciones_c/solucion5/calculos_varios.c @@ -0,0 +1,169 @@ +/* Para cada apartado siguiente escoger si es mejor una acción o una función +y definir su cabecera. +- Dadas las dimensiones de una pared (altura y anchura) +y el precio de pintura por metro cuadrado, +determinar el coste total de pintura necesario para pintar la pared. +- Dado el consumo total de agua acumulado +desde el mes de enero hasta junio (ambos incluidos), +leer por el canal estándar el consumo del resto de meses +(desde julio a diciembre, ambos incluidos), +y retornar acumulado al total del consumo de los 6 primeros meses. +- Dados dos números enteros intercambiad los valores de ambas variables siempre +que ambas sean diferentes de cero. +- Dado un entero retornad la suma de sus divisores. + +Declarar las variables necesarias para llamar a las acciones del ejercicio +anterior e indicar cómo se llamarían. */ + +#include + +// Función para calcular el coste total de pintura necesario para pintar una pared +float calcularCostePintura(float altura, float anchura, float precio_pintura) +{ + return altura * anchura * precio_pintura; +} + +// Función para calcular el consumo total de agua acumulado +float calcularConsumoAgua(float *consumo_actual, int *meses_consumo_actual, int *ano_consumo_actual) +{ + float consumo_mes; + int meses_a_introducir; + + printf("¿Cuántos meses quieres introducir? "); + scanf("%d", &meses_a_introducir); + + for (int i = 1; i <= meses_a_introducir; i++) + { + if (*meses_consumo_actual == 12) + { + *meses_consumo_actual = 1; + (*ano_consumo_actual)++; + } + else + { + (*meses_consumo_actual)++; + } + + printf("Introduce el consumo de agua del mes %d: ", *meses_consumo_actual); + scanf("%f", &consumo_mes); + *consumo_actual += consumo_mes; + } +} + +// Función para obtener el nombre del mes +char *calcularMesString(int mes) +{ + char *meses[] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}; + return meses[mes - 1]; +} + +// Acción para intercambiar los valores de dos números enteros +void intercambiarValores(int *a, int *b) +{ + int temp; + + if (*a != 0 && *b != 0) + { + temp = *a; + *a = *b; + *b = temp; + } +} + +// Función para calcular la suma de los divisores de un número entero +int sumaDivisores(int n) +{ + int suma = 0; + int i; + + for (i = 1; i <= n; i++) + { + if (n % i == 0) + { + suma += i; + } + } + + return suma; +} + +int main() +{ + int opcion; + float consumo_actual = 60; + int meses_consumo_actual = 6; + int ano_consumo_actual = 2021; + + do + { + printf("\n[+] Elige una opción:\n"); + printf("1. Calcular el coste total de pintura necesario para pintar una pared\n"); + printf("2. Calcular el consumo total de agua acumulado\n"); + printf("3. Intercambiar los valores de dos números enteros\n"); + printf("4. Calcular la suma de los divisores de un número entero\n"); + printf("5. Salir\n\n"); + printf("> "); + scanf("%d", &opcion); + + switch (opcion) + { + case 1: + { + float altura, anchura, precio_pintura; + printf("\n[+] Introduce la altura de la pared: "); + scanf("%f", &altura); + printf("[+] Introduce la anchura de la pared: "); + scanf("%f", &anchura); + printf("[+] Introduce el precio de la pintura por metro cuadrado: "); + scanf("%f", &precio_pintura); + + float coste_pintura = calcularCostePintura(altura, anchura, precio_pintura); + printf("\n[+] El coste total de pintura necesario para pintar la pared es de %.2f euros\n", coste_pintura); + break; + } + + case 2: + { + calcularConsumoAgua(&consumo_actual, &meses_consumo_actual, &ano_consumo_actual); + char *nombre_mes = calcularMesString(meses_consumo_actual); + printf("\n[+] El consumo total de agua acumulado hasta %s del año %d es de %.2f litros\n", nombre_mes, ano_consumo_actual, consumo_actual); + break; + } + + case 3: + { + int num1, num2; + printf("\n[+] Introduce el primer número entero: "); + scanf("%d", &num1); + printf("[+] Introduce el segundo número entero: "); + scanf("%d", &num2); + + intercambiarValores(&num1, &num2); + printf("\n[+] Los valores intercambiados son: %d y %d\n", num1, num2); + break; + } + + case 4: + { + int numero; + printf("[+] Introduce un número entero: "); + scanf("%d", &numero); + + int suma_divisores = sumaDivisores(numero); + printf("\n[+] La suma de los divisores de %d es: %d\n", numero, suma_divisores); + break; + } + + case 5: + printf("\n[!] Saliendo...\n"); + break; + + default: + printf("[!] Opción no válida\n"); + break; + } + + } while (opcion != 5); + + return 0; +}