• Me ayudarian con este ejercicio de scheme??

 #493534  por srcombos
 01 Mar 2018, 03:01
Muy buenos dias, soy estudiante de ingenieria de sistemas apenas estoy comenzando y me acaban de dejar el primer taller de scheme y me e quedado estancado en dos puntos y me pregunto si me podrian ayudar
 #493541  por Slek
 04 Mar 2018, 02:45
Buenas, por desgracia no conozco el lenguaje scheme, aunque puedo explicar las soluciones en C. Espero que se entienda igual.

Para el ejercicio 2: un polinomio de grado 2 tiene 0, 1 o 2 raíces reales. El número de raíces reales se puede determinar fácilmente estudiando el signo del discriminante de la solución.



El discriminante es la expresión que hay dentro de la raíz cuadrada. Si esa expresión es positiva no nula, el polinomio tiene 2 raíces reales. Si es negativa, no tiene ninguna raíz real (tiene 2 complejas) y si es nula, tiene una única raíz real.

El código en C quedaría algo así:
int nroots(double a, double b, double c) {
    double d = b*b - 4.0*a*c;

    if (std::abs(d) < 1e-9)
        return 1;
    else if (d < 0.0)
        return 0;
    else
        return 2;
}
Nota: en lugar de comparar el discriminante con el valor 0, es buena práctica compararlo con un intervalo muy pequeño (e.g. 1e-9) para evitar problemas de representación numérica. Al ser un curso de Fundamentos de Programación, dudo que se exija eso, y con hacer d == 0.0 sería suficiente.

Para el ejercicio 3: se puede reducir a un problema sencillo de acotación si se incluye el radio de la bola dentro de los límites. Es decir, la posición mínima válida que puede tener la bola será el valor de minX más el radio r, y la máxima como maxX - r. La acotación se puede resolver fácilmente empleando los algoritmos max y min.

El código en C sería algo así:
enum movement {
    LEFT,
    RIGHT
};

double move (double minX, double maxX, double x, double r, double dx, movement movimiento) {

    dx = std::abs(dx);
    if (movimiento == LEFT)
        dx *= -1.0;

    minX += r;
    maxX -= r;

    if (minX < maxX)
        return std::min(maxX, std::max(minX, x + dx));
    else
        return x;
}
Nota: al utilizar el signo de dx para calcular la dirección del movimiento se está asumiendo que el parámetro de entrada dx es positivo, y puesto que no se especifica que dicho parámetro será siempre positivo, debemos asegurarnos que así lo sea. Algo similar pasa al modificar los límites: puede ser que los nuevos límites calculados sean incompatibles, y que la nueva posición no sea válida. También habría que comprobar la posición de entrada de la bola es válida en un pricipio...

Espero que te sirva de algo. Si tienes cualquier duda, te animo a seguir preguntando.

Un saludo!