diff --git a/fundamentos-programacion/PR2/README.md b/fundamentos-programacion/PR2/README.md index f33f1b6..cfd1a00 100644 --- a/fundamentos-programacion/PR2/README.md +++ b/fundamentos-programacion/PR2/README.md @@ -781,13 +781,11 @@ Si la expresión dentro de la raíz es negativa quiere decir que la ecuación no function squareRoot(x: real): real; ``` -[Solución en lenguaje C]() - 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]() -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). +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). - 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. @@ -925,19 +923,73 @@ algorithm main writeReal(potencia(base, exponente)); end algorithm - ``` 4. Solución ```alg +function squareRoot(x: real): real + var + estimacion, epsilon: real; + end var -``` + estimacion:= x / 2.0; + epsilon:= 0.0001; -4b. Solución + while (((estimacion * estimacion - x) > epsilon) or (x - estimacion * estimacion) > epsilon) do + estimacion:= (estimacion + x / estimacion) / 2.0; + end while -```alg + return estimacion; +end function + +action calcularRaices(in A: real, in B: real, in C: real, out raiz1: real, out raiz2: real) + var + discriminante: real; + end var + + discriminante:= B * B - 4 * A * C; + + if discriminante >= 0 then + var + raiz_discriminante: real; + end var + + raiz_discriminante:= squareRoot(discriminante); + + raiz1:= (-B + raiz_discriminante) / (2 * A); + raiz2:= (-B - raiz_discriminante) / (2 * A); + else + raiz1:= 0; + raiz2:= 0; + end if + +end action + +algorithm main + var + coeficiente_A, coeficiente_B, coeficiente_C, raiz1, raiz2: real; + end var + + writeString("Introduce los coeficientes de la ecuación de segundo grado."); + writeString("A: "); + coeficiente_A:= readReal(); + + writeString("B: "); + coeficiente_B:= readReal(); + + writeString("C: "); + coeficiente_C:= readReal(); + + calcularRaices(coeficiente_A, coeficiente_B, coeficiente_C, raiz1, raiz2); + + writeString("Las raíces son: "); + writeReal(raiz1); + writeString(" y "); + writeReal(raiz2); + +end algorithm ``` 5. Solución diff --git a/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado b/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado new file mode 100755 index 0000000..52eb38e Binary files /dev/null and b/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado differ diff --git a/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado.c b/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado.c new file mode 100644 index 0000000..884a1f2 --- /dev/null +++ b/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado.c @@ -0,0 +1,71 @@ +/* +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: + +``` +x1 = (-B + sqrt(B2 - 4 * A * C)) / (2 * A) +``` + +Si la expresión dentro de la raíz es negativa quiere decir +que la ecuación no tiene raíces. + +Podéis suponer que la función raíz cuadrada está ya definida y su cabecera es: + +``` +function squareRoot(x: real): real; +``` +Declarad las variables necesarias para llamar a la acción anterior +e indicad cómo se llamaría. + +*/ + +#include + +// Función para calcular la raíz cuadrada utilizando el método de Newton +float squareRoot(float x) { + float estimacion = x / 2.0; // Estimación inicial + float epsilon = 0.0001; // Precisión deseada + + while ((estimacion * estimacion - x) > epsilon || (x - estimacion * estimacion) > epsilon) { + estimacion = (estimacion + x / estimacion) / 2.0; + } + + return estimacion; +} + +// Función para calcular las raíces de una ecuación de segundo grado +void calcularRaices(float A, float B, float C, float *raiz1, float *raiz2) { + float discriminante = B * B - 4 * A * C; + + if (discriminante >= 0) { + float raiz_discriminante = squareRoot(discriminante); + *raiz1 = (-B + raiz_discriminante) / (2 * A); + *raiz2 = (-B - raiz_discriminante) / (2 * A); + } else { + *raiz1 = 0; + *raiz2 = 0; + } +} + +int main() { + float coeficiente_A, coeficiente_B, coeficiente_C, raiz1, raiz2; + + printf("Introduce los coeficientes de la ecuacion de segundo grado.\nA: "); + scanf("%f", &coeficiente_A); + + printf("B: "); + scanf("%f", &coeficiente_B); + + printf("C: "); + scanf("%f", &coeficiente_C); + + calcularRaices(coeficiente_A, coeficiente_B, coeficiente_C, &raiz1, &raiz2); + + printf("\nLas raices son: %.2f y %.2f\n\n", raiz1, raiz2); + + return 0; +}