5

Estoy en proceso de realizar un programa donde cuente con preguntas y 4 alternativas y al final si están correctas te entrega el resultado, no conozco mucho sobre C++ es un trabajo para la Universidad, no logro que al final se sumen las variables, al iniciar y colocar las respuestas correctas me da como resultado = 0

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <cstdlib>

int main()
{
    int p1, p2, n1, n2, resultado;
    printf("esta es tu evaluación cuenta con 10 preguntas de selección multiple \n");
    printf("pregunta1 \n");
    printf("¿Cuantos ojos tiene un perro? \n");
    printf("1) 2 ojos \n");
    printf("2) 9 ojos \n");
    printf("3) 2 ojos \n");
    printf("4) 7 ojo \n");
    printf("Indica tu respuesta \n");
    scanf("%i", &p1);
    if (p1 == 1) {
        n1 = 1;
    }
    else {
    }
    n1 = 0;
    printf("cuantas patas tiene un perro \n");
    printf("1) 3 patas \n");
    printf("2) 7 patas \n");
    printf("3) 4 patas \n");
    printf("4) 9 patas \n");
    printf("Indica tu respuesta \n");
    scanf("%i", &p2);
    if (p2 == 3) {
        n2 = 1;
    }
    else {
    }
    n2 = 0;
    resultado = n1 + n2;
    printf("tu resultado del examen es de %i", resultado);
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82

1 Answers1

9

Al iniciar y colocar las respuestas correctas me da como resultado = 0

Normal, respondas lo que respondas, igualas el resultado a cero:

…

if (p1 == 1) {
    n1 = 1; // <---- Guardas 1
}
else {
}
n1 = 0;     // <---- Sobrescribes con 0

…

if (p2 == 3) {
    n2 = 1; // <---- Guardas 1
}
else {
}
n2 = 0;     // <---- Sobrescribes con 0

Seguramente querías poner la sobrescritura en el else:

…

if (p1 == 1) {
    n1 = 1;
}
else {
    n1 = 0;
}

…

if (p2 == 3) {
    n2 = 1;
}
else {
    n2 = 0;
}

Puedes incluso simplificar con un operador ternario:

…

n1 = (p1 == 1) ? 1 : 0;

…

n2 = (p2 == 3) ? 1 : 0;

Otras cosas a tener en cuenta.

Además del problema mencionado, tu código tiene otros problemas que vale la pena mencionar:

  • En C++ la entrada desde consola en C++ es mediante std::cin y la salida mediante std::cout. Las funciones printf y scanf pertenecen a las utilidades de C.
  • Estás incluyendo cabeceras que NO usas. Pero además las cabeceras <stdio.h>, <math.h> y <stdlib.h> son de no de . Las cabeceras de C disponen de una versión adaptada a C++ que tiene el prefijo c y carecen de extensión. Si realmente necesitas usar las cabeceras de C (que rara vez será el caso y ciertamente no es el tuyo) debes usar los equivalentes de C++ , y . Lee este hilo para saber por qué.
  • Relacionado con el punto anterior: estás incluyendo a la vez <stdlib.h> y <cstdlib> y ambas cabeceras son la misma pero en versión C y C++ respectivamente.
  • La cabecera <conio.h> no forma parte de las cabeceras estándar de C. Esta cabecera es una utilidad proveída por el compilador de la plataforma, declara varias funciones para permitir al usuario interactuar con la consola y las funciones proveídas varían entre compiladores y plataformas, en definitiva no sigue ni el ANSI C ni el POSIX. Ese es el motivo por el que no se recomienda su uso, pues hace que el código no sea portable.

Propuesta.

Tu código podría ser más C++ si usas programación orientada a objetos y las utilidades de C++:

struct Pregunta
{
    std::string texto;
    unsigned correcta;
};

Pregunta preguntas[] =
{
    { "¿Cuantos ojos tiene un perro?\n1) 2 ojos\n2) 9 ojos\n3) 2 ojos\n4) 7 ojos", 1 },
    { "¿Cuantas patas tiene un perro?\n1) 3 patas\n2) 7 patas\n3) 4 patas\n4) 9 patas", 3 }
};

int main()
{
    int aciertos = 0;
    std::cout << "Esta es tu evaluación cuenta con 10 preguntas de selección multiple\n";

    for (const auto &pregunta : preguntas)
    {
        std::cout << pregunta.texto;

        int respuesta;
        std::cin >> respuesta;

        aciertos += static_cast<int>(respuesta == pregunta.correcta);
    }

    std::cout << "Tu resultado del examen es de " << aciertos;

    return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • 1
    De hecho podría simplificarse aún más: `n1 = (p1 == 1);` – eferion Jul 10 '19 at 15:45
  • No exactamente. En [tag:c] el estándar indica que el resultado de una expresión booleana será `0` para falso y `1` para verdadero. En [tag:c++] el resultado es `false` para falso y `true` para verdadero. Mientras que `false` será siempre `0`, `true` puede ser cualquier valor. – PaperBirdMaster Jul 10 '19 at 15:50
  • No exactamente. Una cosa es la conversión `int->bool`, la cual es como dices, y otra cosa es `bool->int`. En este caso `false->0` y `true->1` – eferion Jul 10 '19 at 15:53
  • 2
    Perdón, tienes razón, he encontrado la cita relevante en [el estándar](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf): **7.6.6** *A prvalue of type bool can be converted to a prvalue of type int, with `false` becoming zero and `true` becoming one*. – PaperBirdMaster Jul 10 '19 at 15:53