Curso-lenguaje-C/fundamentos-programacion/PR2/soluciones_c/solucion4/ecuacion_segundo_grado.c

72 lines
2.0 KiB
C

/*
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;
}