[ Foro de C# ]

Problema en ejercicio.

25-Jan-2011 18:13
Raul C
7 Respuestas

Hola a todos, estoy siguiendo el curso y hasta ahora lo llevaba muy bien, pero me ha surjido un problemilla, en el ejercicio de la pagina 68-D del curso en C# .pdf: Esto es lo que yo he sacado.
-----------------------------------------------------------------


using System;

public class Ejercicio42
{
 public static void Main()
 {
/*Un programa que pida 10 nombres y los memorice (pista: esta vez se trata de un array
de "string"). Después deberá pedir que se teclee un nombre y dirá si se encuentra o no
entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se
encuentra entre ellos, y así sucesivamente hasta que se teclee "fin".*/
   
   string[] nombre = {"raul","jose","ivan","pepe","juan"};
   string n;
   int i;

   //hacemos...
   do
   {
    Console.Write("Introduce un nombre \'Para SALIR escribe \'fin\' \': "); //pedimos nombre
    n = Convert.ToString(Console.ReadLine()); //Convetimos a string
	
    for(i=0;i<=4;i++) //contador
    {
      if(n == nombre[i]) //si n es igual al nombre[en este momento]
	  {
	   Console.WriteLine("El nombre Si esta");	  
	   }
	  }	
    	 
    }//cierra do
	while(n != "fin"); 	
  }
}


-----------------------------------------------------------------
Bien, el problema es que no se donde poner Este nombre no esta para que me salga bien el ejercicio. Una ayuda?


26-Jan-2011 06:37
José Antonio Pla

Hola Raúl.
Soy novato en c# pero lo primero que me llama la atencion es que conviertas a string al recibir por teclado un string. Prueba con: n = Console.ReadLine();
Yo construiría el for con una variable booleana, es decir, que itere mientras no encuentre el string:


    bool cadenaencontrada=false;
    
    for(i=0;i<5 && !cadenaencontrada;i++)
    {
        if (nombre[i].IndexOf(n) >= 0)
        {
            Console.WriteLine("El nombre Si esta");
            cadenaencontrada=true;
        }
    }
    if (!cadenaencontrada)//Si sigue valiendo false  
        Console.WriteLine("El nombre No esta");



De esta forma si la cadena está en nombre[0] el bucle sólo hará una iteración. Si no está en ninguna posición del array nos lo marcará nuestra bandera "cadenaencontrada" y lo verificamos después de recorrer todo el array.

Saludos.                                                              


26-Jan-2011 09:59
Raul C

Gracias por responder, tienes razon la verdad no me habia dado cuenta que no hace falta convertir a string porque ya es string, pero no entiendo de donde has sacado: nombre[i].IndexOf(n), eso no me suena de haberlo visto hasta este momento. O me equivoco?


26-Jan-2011 19:25
Nacho Cabanes (+84)

Efectivamente, la solución es llevar una variable booleana, porque hasta que no has recorrido todo el array no sabes seguro que no aparece.

En cuanto a IndexOf, lo tienes en el apartado 4.4.5 de la versión online del curso: se usa para ver si una cadena contiene a la otra. Tiene sentido si te introducen sólo parte del texto (por ejemplo, tú has guardado nombre y apellidos, pero el usuario puede buscar indicando sólo el nombre).

En un ejemplo sencillo, bastaría con comprobar si es exactamente igual a lo que se ha introducido, tal y como tú haces:


if (n == nombre[i])
{
   Console.WriteLine("El nombre Si esta");
   cadenaEncontrada=true;
}


http://www.aprendeaprogramar.com/mod/resource/view.php?id=391


27-Jan-2011 12:40
Raul C

Gracias Nacho por responder, por fin he conseguido hacerlo:

Dejo el problema Resuelto:
---------------------------------------------------------------


using System;

public class Ejercicio42
{
 public static void Main()
 {
  /*Un programa que pida 10 nombres y los memorice (pista: esta vez se trata de un array
de "string"). Después deberá pedir que se teclee un nombre y dirá si se encuentra o no
entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se
encuentra entre ellos, y así sucesivamente hasta que se teclee "fin".*/
   
   string[] nombre = {"raul","jose","ivan","pepe","juan"};
   string n;
   bool cadenaEncontrada;
   int i;

   //hacemos...
   do
   {
    Console.Write("Escribe \'fin\' PARA SALIR\nIntroduce un nombre: "); //pedimos nombre
    n = Console.ReadLine(); //Recogemos el string
	cadenaEncontrada = false;
	
    for(i=0;i<=4 && !cadenaEncontrada;i++) //contador vale 0; contador es menor o igual a 4 y cadenaEncontrada es true;contador +1
    {
     if(n == nombre[i]) //si n es igual al nombre[en este momento]
	 {
	  Console.Write("\n");
	  Console.WriteLine("\tEl nombre Si esta");
	  Console.Write("\n");
  	  cadenaEncontrada = true; //la cadena es true
	  break;
	  }
	}
	 if(n == "fin") //si escribimos fin
     {
	   Console.Write("\n");
	   Console.WriteLine("\tHas decidido Salir del programa.");
	   Console.Write("\n");
       break;
	 }
     if(cadenaEncontrada == false) //si la cadena es false
     {
	  Console.Write("\n");
      Console.WriteLine("\tEl nombre No esta");
	  Console.Write("\n");
      }	
   }//cierra do
	while(n != "fin"); 	
  }
}


---------------------------------------------------------
Me imagino que luego habra otras formas, pero esta era la que estaba buscando.
Nacho porque no pones todos los ejercicios Resueltos, para asi poder contrastarlos con los que hacemos, porque he seguido alguna vez el curso de C o este que estoy haciendo ahora de C# y algunas veces no he podido seguir, porque no sabia resolverlo y al final lo he dejado por imposible. Me gustaria que dejases todos los ejercicios que pones Resueltos. Para ti sera facil,
Un saludo.


06-Dec-2014 01:37
Ivan Lynch

Hola estimado Raul, he visto tu codigo y me gustaria compartir el que yo he creado, tome como ayuda lo que ustedes ya han echo.


public class Class1
{
	public static void Main()
	{
        string[] nombres = new string[10];
        int i;
        string salir = "Fin", usuario;
        

        for(i = 0; i <= 9; i++)
        {
            Console.WriteLine("Ingrese un nombre por favor.");
            nombres[i] = Console.ReadLine();
        }

        do
        {
            Console.WriteLine("Por favor ingrese un nombre para saber si se encuentra en sistema.");
            usuario = Console.ReadLine();
            bool Nombre = false;
            if ((usuario == "Fin") || (usuario == "FIN") || (usuario == "fin"))//EN EL MOMENTO QUE EL USUARIO INGRESA FIN, SALE COMPLETAMENTE SIN COMPROBAR NADA, SI NO ES FIN VA A HACER LA COMPARACION.
            {
                Console.WriteLine("Decidiste salir del programa, Adios!.");

            }
            else
            {
                for (i = 0; i < nombres.Length && !Nombre; i++) // i vale 0 y mientra i sea menor o igual que la amplitud del array y nombre sea false, va a dar una vuelta.
                {
                    if (nombres[i].IndexOf(usuario) >= 0) //Si Nombre el nombre esta, el booleano nombre cambia a true y termina la la ronda.
                    {
                        Console.WriteLine("\nEl nombre {0} ya se encuentra en nuestra base.", usuario);
                        Nombre = true;
                    }

                }
                if (!Nombre)// SI ES FALSE.  
                    Console.WriteLine("El nombre no se encuentra.");
            }
           
        }
        while (usuario != salir);
	}
}




06-Dec-2014 01:40
Ivan Lynch

pregunta:, Como hacen para poner el IDE de ayuda aca en el post ?


08-Dec-2014 13:18
Nacho Cabanes (+84)

Tu solución funciona, aunque resulta poco legible, por las líneas tan largas que descuadran, los comentarios poco necesarios, los nombres de variable poco intuitivos ("encontrado" sería mejor que "Nombre") y las inconsistencias (unas veces comparas con nombres.Length y otras con 9, unas veces usas llaves en los "if" y otras no, unas veces usas la variable "salir" y otras la palabra "fin", incluso de tres formas distintas en vez de con ToUpper...).

Yo lo reescribiría así:


using System;

public class BuscarNombre
{
    public static void Main()
    {
        string[] nombres = new string[10];
        int i;
        string busqueda;
        
        for(i = 0; i < nombres.Length; i++)
        {
            Console.WriteLine("Ingrese un nombre por favor.");
            nombres[i] = Console.ReadLine();
        }

        do
        {
            Console.WriteLine("Por favor ingrese un nombre a buscar.");
            busqueda = Console.ReadLine();            
            if (busqueda.ToUpper() == "FIN")
                Console.WriteLine("Decidiste salir del programa, Adios!.");
            else
            {
                bool encontrado = false;
                for (i = 0; i < nombres.Length && !encontrado; i++)
                {
                    if (nombres[i].Contains(busqueda))
                    {
                        Console.WriteLine("{0} se encuentra en nuestra base", 
                            busqueda);
                        encontrado = true;
                    }
                }
                if (!encontrado)
                    Console.WriteLine("El nombre no se encuentra.");
            }
        }
        while (busqueda.ToUpper() == "FIN");
    }
}



Por otra parte, no sé a qué te refieres con el IDE. Un IDE es un entorno integrado de desarrollo. Obviamente, tú no puedes "desarrollar" desde un foro: sólo puedes teclear (o copiar y pegar) el fuente, pero no compilar ni ver el resultado del ejecutable en funcionamiento.

Si te refieres a que tu fuente se lea en colores, lo puedes hacer encerrándolo entre


[code csharp] ... 


[/code]






(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.)