Encontrar un usuario en un array puede parecer complicado, pero con las herramientas adecuadas, es un proceso bastante sencillo. Usando el método Array.IndexOf, podemos buscar elementos dentro de un array y obtener su índice si existe. Este método devuelve la posición del elemento dentro del array, permitiéndonos saber si el usuario existe y dónde se encuentra.
int index = Array.IndexOf(usernames, userToSearch);
Parámetro 1: El array usernames donde se busca el elemento.
Parámetro 2:userToSearch, el usuario que intentamos encontrar.
Si el método devuelve -1, significa que el usuario no está presente en el array.
¿Cómo reaccionar ante usuarios no encontrados?
Cuando un usuario no es localizado, es importante manejar el error de forma que el usuario final tenga una experiencia fluida y comprensible. En este escenario, si index es igual a -1, informamos al usuario y le sugerimos que intente de nuevo o que se registre si no existe.
if(index ==-1){ Console.WriteLine("User not found. Try again or register.");}
¿Cómo realizar un registro de usuarios?
Registrar un nuevo usuario en un array requiere que manejemos el índice actual para evitar sobrescribir datos existentes. Usamos una variable arrayCurrentIndex para almacenar nuevos usuarios en la primera posición vacía.
Console.WriteLine("Please write and remember your username.");usernames[arrayCurrentIndex]= Console.ReadLine();Console.WriteLine($"Your user has been saved successfully. Your username is {usernames[arrayCurrentIndex]}.");arrayCurrentIndex++;
Incrementando el índice
El comando arrayCurrentIndex++ incrementa el índice después de almacenar un usuario, asegurando que la próxima entrada se guarde en la siguiente posición libre.
¿Cómo controlar la capacidad del array?
Para evitar exceder la capacidad del array, implementamos una verificación al inicio del ciclo while. Esto nos asegura que no se puedan registrar más de diez usuarios.
if(arrayCurrentIndex ==10){ Console.WriteLine("The restaurant is full. Good try again next year."); Environment.Exit(0);}
Este uso del método Environment.Exit(0) termina el programa de manera elegante si el array se llena, manteniendo la interacción del usuario clara y directa.
¿Cómo mejorar el control de flujo del programa?
El manejo del ciclo while es crucial para asegurar que el programa funcione correctamente. En lugar de usar condiciones adicionales, simplificamos estructurando el bucle para que continúe mientras arrayCurrentIndex sea menor que 10:
while(arrayCurrentIndex <10){// Lógica del programa}
Este enfoque asegura que el programa solo permita registrar nuevos usuarios mientras haya espacio, eliminando la necesidad de comprobaciones adicionales y optimizando la ejecución.
A medida que avanzas en el desarrollo de sistemas con C#, considera estas técnicas y consejos como herramientas fundamentales que mejorarán significativamente la gestión de arrays y la interacción con el usuario. Continúa aprendiendo y experimentando con diferentes métodos y pronto te sentirás cómodo implementando soluciones más complejas. ¡Sigue adelante!
Nuevas instrucciones de las cuales no estaba al tanto:
Environment.Exit(0);
Terminar de ejecutar el programa.
Array.IndexOf(userNames, userToSearch);
Buscar dato en especifico en un Array y obtener la posición de ese dato.
Cada clase te enseña más :).
Todo lenguaje de programación tiene muchas instrucciones, cada día tenemos que aprender algo nuevo, caso contrario, nos estancamos.
Saludos!
Hola,
Si como yo, siguieron al pie de la letra el código (full copy page 😀🤙🏽) y no les funcionó como se ve en la lección, es debido a que falta código que me puso la clase en modo díficil jajaja. En el min 7:20 nuestro querido maestro "termina" el bloque de código y pasa a ejecutar directamente, aquí esta el easter egg 😬.
ANTES
...
DESPUÉS
Las líneas que hacían falta tienen un trabajo MUY IMPORTANTE, no tenerlas implica que el programa no funcioné (hablo desde mi experiencia 👎🏽😢). Una línea te va a indicar que el nombre en efecto se guardó y a pesar de que su ausencia no rompa el código igual es lindo saber en la interfaz que si entró el dato; y la otra línea arrayCurrenIndex;++ evita que cambiemos el mismo nombre de la casilla de nuestro array por la eternidad y sobreescribamos el mismo espacio del array sin guardar los nombres ya ingresados🙄😥; en lugar de eso si agregamos esta línea, avanzaremos por la listar de arrays hasta llegar al último espacio, en este caso el décimo nombre de nuestro comensal guardando los nombres ya ingresados en las casillas anteriores.
...
Espero te haya ayudado si también te pasó esto. Saludos ✌🏽🤠
Muchas gracias por la observacion, me sirvio el aporte.
El Array.IndexOf no me lo sabía en C#, solo lo conocía del lado de JS. Excelente, anotado!
Ahí va mi código
string[] userNames =newstring[10]{"Marco","","","","","","","","",""};int arrayCurrentIndex =1;string isRegisteredUser;Console.WriteLine("Welcome to the best restaurent in the world!");while(true){Console.WriteLine("Are you a registred user? Y/N: "); isRegisteredUser =Console.ReadLine();if(isRegisteredUser =="Y"){//Es un usuario registradoConsole.WriteLine("Please, enter your user name: "); string userToSearch =Console.ReadLine();Console.WriteLine("The user you searched is {0}", userToSearch);if(userNames.Contains(userToSearch)){Console.WriteLine("Welcome {0}, It/s a pleasure to give you food", userToSearch);}else{Console.WriteLine("Sorry, user not found, please try again: ");}}else{//No es un usuario registradoif(arrayCurrentIndex <=9){Console.WriteLine("Please, enter your name"); string userToPost =Console.ReadLine(); userNames[arrayCurrentIndex]= userToPost;Console.WriteLine("User {0} has been registered!", userToPost); arrayCurrentIndex++;}else{Console.WriteLine("Reservations are over!");}}}
Coloque una extra. Es una validacion en caso de que la persona escriba false, no repita un usuario ya existente.
using System;/*
* 1-Validar si es usuario existente y registrarse o login.
* 2-El programa debe ser capaz de darle la bienvenida al usuario si existe.
* 3-El programa debe repetirse hasta que se registre los 10 comensales.
*/namespace Restaurante10TableReservationSystem{classProgram{staticvoidMain(string[] args){ string[] userNames =newstring[10]{"","","","","","","","","",""}; int arrayCurrentIndex =0; bool userType;Console.WriteLine("Welcome to the Best Restuarant in the World!");while(true){if(arrayCurrentIndex==10){Console.WriteLine("The register is full, try again next year");Environment.Exit(0);//Le dice a C++ que el programa termino de ejecutar.}Console.WriteLine("\n \n Are you registered user? Write True or false to register"); userType =Convert.ToBoolean(Console.ReadLine());if(userType ==true){Console.WriteLine("Welcome, you a registered user, please enter your user ID"); string userToSearch =Console.ReadLine();//Se usa variable inline cuando solo se va a usar una vez.Console.WriteLine("The user is : {0}", userToSearch);//El 0 representa la posicion de las variables. int index =Array.IndexOf(userNames, userToSearch);//1 Donde vas a buscar . 2-Que vas a buscar.if(index ==-1){Console.WriteLine("User not found, try again or register");}else{Console.WriteLine("Welcome {0}, it is a pleasure to give your food", userNames[index]);}}elseif(userType==false){Console.WriteLine("Please write and remember your username"); userNames[arrayCurrentIndex]=Console.ReadLine(); int prueba =Array.IndexOf(userNames, userNames[arrayCurrentIndex]);if(prueba !=-1){Console.WriteLine("Your has been succesfully \n"+"Your username is : {0}", userNames[arrayCurrentIndex]); arrayCurrentIndex++;}else{Console.WriteLine("This user is registered");}}}}}}
Mejoré mi código y añadí para que se pudieran registrar, aunque si en registrar presionan la tecla enter sin escribir nada, lo toma como que se ha registrado correctamente, pues originalmente el array no tiene nada (""). Podria ponerse una serie de caracteres en cada array para que nadie se pueda logear sin antes haberse registrado, y cuando se registran, se sobreescriben esos caracteres que vendrian siendo un "placeholder".
Código normal:
string[] usernames =newstring[10]{"","","","","","","","","",""};Console.WriteLine("Welcome to the best restaurant of the world!");for(var i =0; i <10; i++){Console.WriteLine("\nCurrently, we have "+(10- i)+" reservation slots left.\nAre you registered? Type y for yes, or n for no"); string strRegistered =Console.ReadLine();switch(strRegistered){case"y": bool isRegistered =true;Console.WriteLine("You are a registered user, please type your username"); string userToSearch =Console.ReadLine();Console.WriteLine("Searching for "+ userToSearch +"..."); int doesUserExist =Array.IndexOf(usernames, userToSearch);if(doesUserExist ==-1){Console.WriteLine(userToSearch +" is not registered on our data base"); i = i -1;}else{Console.WriteLine("Welcome, "+ usernames[i]+"! You are the "+(i +1)+"° user of the year to reserve a table");}break;case"n": isRegistered =false;Console.WriteLine("To register yourself, please type your username"); usernames[i]=Console.ReadLine();Console.WriteLine("User "+ usernames[i]+" has been successfully registered. You can now log in to reserve a table"); i = i -1;break;default:Console.WriteLine("Error: invalid answer, please try again"); i = i -1;break;}}```
Inicio del código cambiado para hacerlo aleatorio y que no se logeen con una cuenta que no es
Random rnd = new Random();
long placeholder = Convert.ToInt64(rnd.Next(1, 32767) * rnd.Next(1, 32767) - rnd.Next(1, 1073676289));
string[] usernames = new string[10] { Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder), Convert.ToString(placeholder)};
Console.WriteLine("Welcome to the best restaurant of the world!");```
Pueden hacer que Console.WriteLine diga el placeholder para comprobar que, efectivamente, puede tomar valores tanto positivos como negativos, aumentando aun mas la complejidad
Se puso mal al final
Random rnd =newRandom();long placeholder =Convert.ToInt64(rnd.Next(1,32767)* rnd.Next(1,32767)- rnd.Next(1,1073676289));string[] usernames =newstring[10]{Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder),Convert.ToString(placeholder)};Console.WriteLine(“Welcome to the best restaurant of the world!”);
Como se llaman esas expresiones \n creo que existen otras
Hola
Se llaman expresiones regulares y hay un curso en Platzi donde puedes aprender mucho más sobre este tema tan útil en programación.
Saludos
Hola, se llaman Secuencias de escape de cadena.
En el caso de \n corresponde a una nueva linea
Tambien podemos hacer uso de otras secuencias de escape como lo son:
Array.IndexOf: Busca el objeto especificado y devuelve el índice de su primera aparición en una matriz unidimensional o en un rango de elementos de la matriz.
Si no lo encuentra regresa -1
En general es mala práctica utilizar el método Exit(0) de la clase Environment para salir del bucle, en su lugar se debe controlar el fin del ciclo en el mismo while con una sentencia como:
bool isRegisterUserFull = false;
while(!isRegisterUserFull)
{
//sentencias
if(arrayCurrentIndex == userName.Length)
{
isRegisterUserFull = true;
}
}
¿Dónde puedo encontrar esas recomendaciones?
Y si uso un break en su lugar?
Finalice mi version del projecto para el restaurante "La caldera del caos"
using System;namespace CSharpDotnet{// 1- Generar un sistema de registro o login // 2- Validar si es usuario existente o si debe registrar// 3- Dar la bienvenida si el usuario existe// 4- Debe repetirse hasta que 10 usuarios esten registradosclassProgram{staticvoidMain(string[] args){ int index; string[] listaReserva =newstring[10];Console.WriteLine("\nBienvenido al caldero del Caos.\n"+"Estimados comensales, por este medio informamos que solo podremos realizar 10\n"+"reservas en total. Las primeras 10 personas en registrarse podran obtener una reserva");for(int i =0; i < listaReserva.Length; i++){ bool dejeloPasar =false;do{ int opcion;Console.WriteLine("\nPara ver el estado de su reserva, necesita ingresar con su cuenta. "+"\nIngrese el numero de la accion que desee realizar:"+"\n 1- Iniciar Sesion\n 2- Registrarse\n Seleccion: "); opcion =Convert.ToInt32(Console.ReadLine());switch(opcion){case1:Console.WriteLine("\nIngrese su nombre de usuario: "); string loginUsuario =Console.ReadLine(); index =Array.IndexOf(listaReserva, loginUsuario);if(index !=-1){ i--; dejeloPasar =true;Console.WriteLine($"\nBienvenido {listaReserva[index]}. Usted tiene una reserva para este dia.");break;}else{Console.WriteLine("\nUsted no tiene una reserva. Puede solicitar una reserva registrandose.");}break;case2:Console.WriteLine("\nIngrese el nombre de usuario para poder registrar su reserva: "); string usuario =Console.ReadLine(); index =Array.IndexOf(listaReserva, usuario);if(index !=-1){Console.WriteLine($"\nEl usuario {usuario} ya esta registrado");break;}else{ dejeloPasar =true;Console.WriteLine($"\nBienvenido {usuario}, su reserva ha sido registrada"); listaReserva[i]= usuario;Console.WriteLine($"\n{i + 1}/{listaReserva.Length} reservas realizadas. Aun se pueden realizar otra reserva");}break;default:Console.WriteLine("\nIngrese una opcion valida.");break;}}while(dejeloPasar ==false);if(i ==9){ string aviso ="\nYa no se pueden realizar mas reservas. "; string listado ="Los usuarios con reserva son los siguientes: \n";Console.WriteLine(aviso + listado);for(int j =0; j < listaReserva.Length; j++){Console.WriteLine(listaReserva[j]);}Console.WriteLine("\nMuchas gracias por su preferencia.");}}}}}
Yo lo realicé de esta manera, es una forma fácil de verlo:
for(short i=0;i<=10;i++)
{
Console.WriteLine("Esta usted registrado? Escriba si o no");
string escritura_usuario = Console.ReadLine();
if(escritura_usuario =="si"){Console.WriteLine("Digite su usuario por seguridad"); string usuario1 =Console.ReadLine();Console.WriteLine("Bienvenido "+ usuario1+"Usted es el usuario numero "+ i);}elseif(escritura_usuario =="no"){Console.WriteLine("Digite su usuario para la creacion de usuario"); string usuario2 =Console.ReadLine();Console.WriteLine("Felicidades "+ usuario2 +"acaba de crear su usuario, usted es el usuario numero "+i);}}
Algo bueno que pense es en validar que si alguien escribe false y repite un nombre que ya existe, se lo rechace.
Nooo, el programa no me esta cogiendo el condicional para parar de registrar, no me dice que ya esta lleno y no sé porque
namespace restaurant10TableReservationSystem
{classProgram{staticvoidMain(string[] args){ string[] userNames =newstring[10]{"Shirley","Juan","Pedro","Carlos","Milena","Cellis","María","Karla","",""}; int arrayCurrentIndex =0; bool userType;Console.WriteLine("Welcome to the best restaurant in the World!");while(true){if(arrayCurrentIndex ==10){Console.WriteLine("The restaurant is full, try again next year");Environment.Exit(0);}Console.WriteLine("\n \nAre you a register user? write true or write false to register"); userType =Convert.ToBoolean(Console.ReadLine());if(userType ==true){Console.WriteLine("Hello, you are a registered user, please enter your user name"); string userToSearch =Console.ReadLine();Console.WriteLine("The user you research is {0}", userToSearch); int index =Array.IndexOf(userNames, userToSearch);if(index ==-1){Console.WriteLine("User not found, try again or register");}else{Console.WriteLine("Welcome {0}, it´s a pleasure to give you food", userNames[index]);}}elseif(userType ==false){Console.WriteLine("Please write and remember your User Name"); userNames[arrayCurrentIndex]=Console.ReadLine();Console.WriteLine("Your user has been saved succesfully\n"+"Your User Name is> {0}", userNames[arrayCurrentIndex]); arrayCurrentIndex++;}}}}}
Revise tu código y no encontré el error, te recomiendo imprimas en pantalla la variable arrayCurrentIndex para ver si se esta incrementando cada vez que adicionas un nuevo usuario.
Alguien sabe por qué siempre me suelta como si no hubiese encontrado el UserToSearch sabiendo que lo escribo bien :c
namespace ProyectoPlatzi{classprogram{staticvoidMain(string[] args){ string[] userNames =newstring[10]{" Felipe ","","","","","","","","",""}; int arrayCurrentIndex =1; bool userType;Console.WriteLine("¡Bienvenido a el mejor restaurante del mundo!");while(true){Console.WriteLine("¿Estas registrado? Escribe true si sí, o false para registrarte"); userType =Convert.ToBoolean(Console.ReadLine());if(userType ==true){Console.WriteLine("¡Hola!, eres un usuario registrado, por favor entroduce tu nombre"); string userToSearch =Console.ReadLine().ToUpper().Trim(); char primerLetra1 = userToSearch[0];Console.WriteLine("El usuario que introduciste es {0}", primerLetra1 + userToSearch.ToLower().Remove(0,1)); int index =Array.IndexOf(userNames, userToSearch);if(index ==-1){Console.WriteLine("Escribe tu nombre bien, o registrate");}else{Console.WriteLine("¡Welcome! {0}, Es un placer servirte", userNames[index]);}}}}}}
List<string> usuarioNombres= new List<string>();
string nombre;
while (usuarioNombres.Count <= 10)
{
Console.WriteLine("Ingrese un clinete");
nombre = Console.ReadLine();
if (!usuarioNombres.Contains(nombre))
{
usuarioNombres.Add(nombre);
Console.WriteLine($"Bienvenido {nombre} !!");
}
else
{
Console.WriteLine("Ese nombre ya fue ingresado");
}
}
for (var i = 0; i < usuarioNombres.Count; i++)
{
Console.Write(usuarioNombres[i] + " ");
}
Les comparto mi solucion no lo hice igual que en el video pero el resultado es el mismo:
List<string> reservas =newList<string>();while(reservas.Count()<=10){Console.WriteLine("Ingrese el usuario"); string user =Console.ReadLine();if(reservas.Count()<10){if(reservas.Contains(user)){Console.WriteLine($"Bienvenido {user} ya cuentas con una reserva \n");}else{ reservas.Add(user);Console.WriteLine($"reserva realizada con exito para el usuario {user}");Console.WriteLine($"actualmente se llevan {reservas.Count()} reservas \n");}}else{Console.WriteLine("Excedido el maximo de reservas");break;}}
Yo queriendo ir mas adelantado a la clase para buscar si el usuario existia cree un codigo bien gaucho XD
Console.WriteLine("Ingrese su usuario: "); string whoYouare =Console.ReadLine();for(int i =0; i < users.Length; i++){if(users[i]== whoYouare){ userLog =true;}else{ userLog =false;}
Bueno ahora se que existe Array.IndexOf
Se puede simplificar el id escribiendo if (userType) en lugar de if (userType == true)
Hola compañeros yo hice el ejercicio de está forma con mi lógica espero les sirva:
class Program
{
staticvoidMain(string[] args){//Arrelo con las 10 posiciones para los usuarios string[] comensales; comensales =newstring[]{"","","","","","","","","",""};Console.WriteLine("Bienvenido al restaurante X ingrese su nombre para registrar"); string user; int contadorArreglo =0; int contador =0;while(contadorArreglo <10){Console.WriteLine("Ingrese su nombre"); user =Console.ReadLine(); int indice =Array.IndexOf(comensales, user);if(indice >-1){Console.WriteLine("El nombre de usuario: "+ user +" ya se encuentra registrado");}else{Console.WriteLine("Bienvenido "+ user +" te has registrado correctamente, bienvenido al restaurante X"); comensales[contadorArreglo]= user; contadorArreglo++;}}Console.WriteLine("Gracias por venir al restaurante X, ya tenemos todas nuestras reservas llenas por los siguientes clientes:");Console.WriteLine("Por favor venir el ano que viene");foreach(string cliente in comensales){Console.WriteLine("Cliente {0}, con nombre {1}", contador+1, comensales[contador]); contador++;}}
while (arrayComplete == false)
{
Console.WriteLine("Desea registrar un nuevo cliente? si/no");
string resp = Console.ReadLine();
if(resp =="si"){Console.WriteLine("\nIngrese el nombre"); name =Console.ReadLine(); int check =Array.IndexOf(userName, name);if(check ==-1){ userName[i]= name; i++;Console.WriteLine($"Bienvenido {name} a nuestro restaurante");Console.WriteLine($"\nla cantidad de usuarios ingresados hasta el momento son {i}/10\n");if(i ==10){Console.WriteLine("\nListado completado. La lista de clientes completa es: ");for(int j =0; j <10; j++){Console.WriteLine($"{j + 1}.- {userName[j]}");} arrayComplete =true;}}else{Console.WriteLine("\nUsuario ya ingresado. Los usuarios ingresados hasta el momento son: ");for(int j =0; j <10; j++){Console.WriteLine($"{j + 1}.- {userName[j]}");}Console.WriteLine(" ");}}elseif(resp=="no"){Console.WriteLine("\nlos clientes ingresados hasta el momento son: ");for(int j =0; j <10; j++){Console.WriteLine($"{j + 1}.- {userName[j]}");}Console.WriteLine(" ");}