[ Foro de C# ]

Ejercicio 2.2.1.2.4 resuelto, pero... (adivinar número)

29-Apr-2020 22:46
Gaby Ferrer
8 Respuestas

El enunciado es este:
un programa que dé al usuario tres oportunidades para adivinar un número del 1 al 10.
He conseguido que el programa de el resultado deseado, pero tengo la impresion de que me he complicado mucho y que podría haberse desarrollado mucho mas simple, pero no veo como.


using System;

public class ejercicio60
{
	public static void Main()
	{
		int numero, numero1, contador;
		numero1 = 5;
		contador = 0;
		
		Console.Write("Adivina un número del 1 al 10: ");
		numero=Convert.ToInt32(Console.ReadLine());
		
		if (numero == numero1)
			Console.WriteLine("Has acertado el número.");
		else		
			while ((numero != numero1) && (contador <= 1))
				{
					Console.WriteLine("Número incorrecto.");
			
					Console.Write("Adivina un número del 1 al 10: ");
					numero=Convert.ToInt32(Console.ReadLine());
					
					if (numero == numero1)
						Console.WriteLine("Numero Correcto.");
					
					contador = contador + 1;
				}
			
	}
}


 


29-Apr-2020 23:07
Nacho Cabanes (+83)

Tu planteamiento es mejorable: dices que es correcto en dos sitios distintos, y tu contador... no cuenta, se va incrementando pero compruebas un límite inferior, no un límite superior.


29-Apr-2020 23:19
Gaby Ferrer

Ok, mañana me centro en esos dos puntos y intento darle una vuelta de tuerca.

Muchas gracias.


29-Apr-2020 23:48
Nacho Cabanes (+83)

Perfecto, no dudes en compartir tu resultado o consultar dudas.

Yo te recomendaría que primero hagas una versión con intentos ilimitados. Cuando esa funcione bien, añades el contador para limitar la cantidad de intentos aceptados.


30-Apr-2020 22:37
Gaby Ferrer

Pues nada, no hay manera. Hasta aqui he llegado:


using System;

public class adivina
{
	public static void Main()
	{
		int numero, numero1, contador;
		
		numero=7;
		contador=0;
		
		while (contador < 3)
			{
			Console.Write("Adivina un número del 1 al 10: ");
			numero1=Convert.ToInt32(Console.ReadLine());
		
			if (numero1 != numero)
				Console.WriteLine("No has adivinado el número.");
			
			else
				Console.WriteLine("Has adivinado el número.");

			contador++;
			}
	

	}
}


El problema es que siempre te pide los tres intentos, aunque aciertes a la primera. Pero si saco la declaración de numero1 del while, siempre acabo duplicando el que diga que es correcto o no y modificando el contador.... Mae mia!!!


01-May-2020 09:18
Gaby Ferrer

Ahora creo que si, mi problema era ver "while" como un simple repetidor, y no verlo como un condicional.
Creo que ahora es una solución mucho mas aceptable.


using System;

public class Prueba
{
	public static void Main()
	{
		int n1, n2, contador;
		
		n2 = 7;
		contador = 1;
		
		Console.Write("Adivina un número del 1 al 10: ");
		n1=Convert.ToInt32(Console.ReadLine());
		
		while ((n1 != n2) && (contador < 3))
		{
			Console.WriteLine("Número incorrecto.");
			
			Console.Write("Prueba de nuevo, Adivina un número del 1 al 10: ");
			n1=Convert.ToInt32(Console.ReadLine());
			
			contador++;			
		}
		
		if (n1 == n2)
			Console.WriteLine("Has acertado el número.");
		else
			Console.WriteLine("Has agotado tus intentos. No has conseguido acertar.");
	}
}


Muchas gracias Nacho por la ayuda.


01-May-2020 11:23
Nacho Cabanes (+83)

Perfecto, ahora sí tiene muy buena pinta.


10-May-2020 13:10
Antonio Torres Fernnadez (+1)



static void Main(string[] args)
        {
            int contador = 0, numSecreto = 7;
            while (contador < 3)
            {
                Console.WriteLine("Adivina el número del 1 al 10...");
                if (Convert.ToInt32(Console.ReadLine()) == numSecreto)
                {
                    contador = 2;
                    Console.WriteLine("Enhorabuena");
                }
                else if (contador<2){
                    Console.WriteLine("NO!!!!, intentalo de nuevo...");
                    
                }
                else
                {
                    Console.WriteLine("Ohhhhh, otra vez será :)");
                }
                contador++;
            }
        }


 


10-May-2020 13:18
Nacho Cabanes (+83)

Bienvenido, Antonio.

Tu propuesta funciona, pero el forzar "contador = 2;" para salir del bucle es una solución que deberías evitar, mucho más dañina aún que un "break". La propuesta de Gaby, con una doble condición en el "while" es más elegante. Cualquier "programador profesional" esperará que la condición de salida esté en la cláusula "while" y no que se interrumpa desde dentro.

Insisto, funciona, pero no es la mejor solución. Gracias por tu aportación.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)