0

Hoy estuve practicando si puedo poner de manera verbal las elecciones de si y no, pero ocurre un problema.

No sé si esta mal mi lógica, pero el el primer while pese a que escribo s o n, este siempre vuelve a intentarlo, y no sé porque ocurre eso. También cuando escribo muchas letras para dar valor a elección por ejemplo: jhkiu. Este imprime cinco veces "vuelva a intentarlo" ¿Por qué?

#include <iostream>
#include <cmath>
#include <string.h>

using namespace std;

const float pi = 3.1416;

float raiz(int n)
{
    return sqrt(n); 
}

float potencia(float n)
{
    return n*n;     
}
 
int main()
{
    float m, n, a, b;
    char eleccion;

    cout << "Raiz de: ";
    cin >> a;

    m = raiz(a);
    cout << "es " << m << endl;

    n = potencia(raiz(a));
    cout << "el cuadrado del numero escrito es " << n << endl;

    b = potencia(pi);
    cout << "el cuadrado de pi es " << b << endl;

    cout << "¿Desea continuar pero con diferentes numeros? s/n: ";
    cin >> eleccion;
    while (eleccion != 's' || eleccion != 'n')
    {
        cout << "Vuelva a elegir: ";
        cin >> eleccion;
    }

    while (eleccion == 's')
    {
        cout << "Raiz de: ";
        cin >> a;

        m = raiz(a);
        cout << "es " << m << endl;

        n = potencia(raiz(a));
        cout << "el cuadrado del numero escrito es " << n << endl;

        cout << "¿Desea continuar pero con diferentes numeros? s/n: ";
        cin >> eleccion;
    }

    if (eleccion == 'n') cout << "Gracias por utilizar el programa!!!" << endl;
}

Sería gratificante que me brinden sus consejos. Si esto es una mala práctica para programar hacérmelo llegar. Gracias.

Eequiis
  • 1,807
  • 4
  • 19
Ipsir
  • 39
  • 1

2 Answers2

0

El primer while provoca un bucle infinito porque usa un || (or), le estas diciendo que repita mientras no sea 's' O no sea 'n'. Dicho al revés, que salga del bucle cuando eleccion valga 's' y 'n' a la vez, cosa que no ocurrirá nunca.
La variable eleccion siempre sera diferente a uno de los dos, ya que cuando sea 's' no será 'n' y a la inversa.
El bucle debería iterar mientras eleccion no sea 's' y (&&) no sea 'n', o sea, salir del bucle cuando sea uno de los dos.
Ejemplo:

    while(eleccion != 's' && eleccion != 'n')
         {
            cout << "Vuelva a elegir: "; cin >> eleccion;
         }

O simplemente repetir mientras no sea 's', ya que no haces nada cuando sea 'n'

    while(eleccion != 's')
         {
            cout << "Vuelva a elegir: "; cin >> eleccion;
         }
Arnau Castellví
  • 2,370
  • 8
  • 14
0
  while(eleccion != 's' || eleccion != 'n')
  {
     cout << "Vuelva a elegir: "; cin >> eleccion;
  }

Observa como se leeria tu While...

Repetir mientras:
  Eleccion es Diferente de "S" Ó eleccion es diferente de "N"...

y entu otro While tienes :

Eleccion==S

Entonces como Eleccion es Diferente de N... osea que Eleccion vale "S" Y "S" es Diferente de "N" seguira dentro del While por que siempre sera diferente... en este caso podrías poner que se repida solo si es Diferente de "S" de esta manera:

 while(eleccion != 's')
  {
     cout << "Vuelva a elegir: "; cin >> eleccion;
  }

Asi repetira si es diferente de "S" osea cada vez que elección sera "N"... Pero recomiendo algo mejor...

Bool repetir=true;
While(repetir)
{
  if(Eleccion!="S")
{
  repetir=true;
}
else
{
  repetir=false;
}

Estaré a la espera de tus comentarios.

  • Eso último podría simplificarse con `repetir = (Eleccion!="S");`. Aunque por lo sencillo de la lógica, no veo que haya beneficio en crear una variable adicional. Es más legible que la condición esté directamente en el `while`. – Andrew Aug 07 '20 at 07:13