Add ecuacion_segundo_grado exercise

This commit is contained in:
Manuel Vergara 2024-05-05 14:23:27 +02:00
parent d46366ede0
commit 6cd4ebc24a
3 changed files with 130 additions and 7 deletions

View File

@ -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

View File

@ -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 <stdio.h>
// 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;
}