I need to create a program that will take the users name and "password". If they match the program will say you are in if not, that you're out. I wrote it for 1 user, but I don't know how to make multiple users in one program. My code is below. Thanks for your help :)
Console.WriteLine("Enter your Name");
Console.WriteLine("Enter your Pswrd");
string name = Console.ReadLine();
string pswrd = Console.ReadLine();
string myname = "John";
string mypswrd = "123456";
if (name == myname & pswrd == mypswrd)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or pswrd");
}
Console.ReadLine();
//building the user "database" each pair is <user,password>
Dictionary<string, string> users = new Dictionary<string, string>();
users.Add("John", "123456");
//Here you should add more users in the same way...
//But i would advise reading them from out side the code (SQL database for example).
Console.Writeline("Enter your Name");
string name = Console.ReadLine();
Console.WriteLine("Enter your Passward");
string password = Console.ReadLine();
if (users.ContainsKey(name) && users[name] == password)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or password");
}
Console.ReadLine();
This should work (contains no checks to see if the entered values are correct or not, you should add this kind of safety yourself :)):
Dictionary<string, string> namesToCheck = new Dictionary<string, string>
{
{"John", "123456"},
{"Harry", "someotherpassword"}
};
Console.WriteLine("Enter your Name");
string name = Console.ReadLine();
Console.WriteLine("Enter your Pswrd");
string pswrd = Console.ReadLine();
if (namesToCheck.ContainsKey(name) && namesToCheck[name] == pswrd)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or pswrd");
}
Console.ReadLine();
Why not use arrays?
Console.WriteLine("Enter your Name");
Console.WriteLine("Enter your Pswrd");
string name = Console.ReadLine();
string pswrd = Console.ReadLine();
string[] names = "James,John,Jude".Split(Convert.ToChar(","));
string[] passes = "Pass1, Word2, Password3".Split(Convert.ToChar(","));
for (int i = 0; i<names.Length, i++)
{
if (names[i] == name && passes[i] == pswrd)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or pswrd");
}
}
This will work with the following name/pswrd combinations:
James/Pass1, John/Word2, Jude/Password3
For a bigger list I suggest you use external text file and read lines in each.
Related
I'm trying to make a username and login system to validate if the username and password passed by an user by input matches the username and password in an array of objects. I did using Array.Find() but when I run the program, the user and password are asked twice and I have to put them twice correct so I can advance which does not make sense...
Utilizador[] usersIniciais = utilizadoresDefault.UtilizadoresDefault(utilizadoresDefault.GenerateID());
PersonalTrainer[] ptsIniciais = ptsDefault.PTsDefault(utilizadoresDefault.GenerateID());
int option = novoLogin.LoginInicial();
Tuple<string, string> strings = novoLogin.DadosLogin(option);
string username = strings.Item1;
string password = strings.Item2;
novoLogin.ValidacaoDados(username, password, usersIniciais);
Console.ReadLine();
}
}
namespace RSGymPT.Classes
{
internal class Login
{
public static void Log(string Username)
{
Console.WriteLine($"User Logged: {Username}");
}
public int LoginInicial()
{
int option;
do
{
Console.Clear();
Console.WriteLine("Seleciona a opção pretendida: \n");
Console.WriteLine("1. Login");
Console.WriteLine("2. Sair\n");
Console.Write("A tua opção: ");
Int32.TryParse(Console.ReadLine(), out option);
} while (option != 1 && option != 2);
return option;
}
public Tuple<string, string> DadosLogin(int option)
{
if (option == 1)
{
Console.Clear();
Console.WriteLine("Please insert your Login data: \n");
Console.Write("User: ");
Username = Console.ReadLine();
Console.Write("Password: ");
Password = Console.ReadLine();
return Tuple.Create(Username, Password);
}
else if (option == 2)
{
Console.Clear();
Console.WriteLine("See you soon.\n");
Console.ReadKey();
Environment.Exit(0);
}
return Tuple.Create(Username, Password);
}
public void ValidacaoDados(string user, string password, Utilizador[] utilizadores)
{
Utilizador utilizador = Array.Find(utilizadores, element => element.NomeUtilizador == user);
do
{
Console.Clear();
Console.Write("User: ");
Username = Console.ReadLine();
Console.Write("Password: ");
Password = Console.ReadLine();
if (utilizador != null && utilizador.Password.Equals(password))
{
Console.WriteLine("Login correct");
}
else
{
Console.WriteLine("Bye");
Console.ReadKey();
Console.WriteLine();
Environment.Exit(0);
}
} while (Username == null || Password == null);
}
}
namespace RSGymPT.Classes
{
internal class Utilizador
{
public Utilizador[] UtilizadoresDefault(int id)
{
Utilizador[] usersInicial = new Utilizador[]
{
new Utilizador {Id = GenerateID(), Nome = "user1", NomeUtilizador = "user1user", Password = "user1234"},
new Utilizador {Id = GenerateID(), Nome = "user2", NomeUtilizador = "user2user", Password = "user1234"},
};
return usersInicial;
}
#endregion
}
}
I tried a lot of different approaches life foreach loop and array.firstOrDefault() but I keep with the same thing. Can someone kindly help me to find my mistake?
I am trying to find duplicates from user inputs. I am trying to add customers with their first name, last name, and phone number. If all three of the information already exists, I want to throw an appropriate message saying {firstname}, {lastname}, and {phonenumber} already exists. Any idea how to do it?
//this code is on functions class.
public bool addCustomer(params)
{
if (numCustomer < maxCustomer)
{
Random rnd = new Random();
int id = rnd.Next(10000, 99999);
clist[numCustomer] = new Customer(params);
numCustomer++;
return true;
}
return false;
}
//Menu class to prompts user to choose an option
switch (input)
{
case 1: // Add Customer
Console.Clear();
string fName;
string lName;
long phone;
Console.WriteLine("Adding new customer...\nPlease enter the following:");
Console.Write("First Name: ");
fName = Console.ReadLine();
Console.Write("Last Name: ");
lName = Console.ReadLine();
Console.Write("Phone Number (no dashes or spaces): ");
phone = Convert.ToInt64(Console.ReadLine());
m.addCustomer(fName, lName, phone);
Console.WriteLine("\nPress any key to go back to the Customer Menu...");
Console.ReadKey();
customerMenu();
break;
...
}
I want to create a program where I can save cars based of their models, types and license plates. I try to save all of this information inside a dictionary but they aren't saved as to when I search for them
through the 2nd option ("2. Search Vehicle") they aren't found. Here is my code:
What should I do in order for my code to work? I want to be able to search for the cars through their license plates (Swedish license plates, ABC123) but I can't figure out why the dictionary values aren't saved which I enter through my ReadLines()
Dictionary<string, string> newVehicle = new Dictionary<string, string>();
bool sunfleetAdminTools = true;
Dictionary<string, string> newVehicle = new Dictionary<string, string>();
do
{
WriteLine("1. Add Vehicle");
WriteLine("2. Search Vehicle");
WriteLine("3. Log Out");
ConsoleKeyInfo keyInput = ReadKey(true);
Clear();
switch (keyInput.Key)
{
case ConsoleKey.D1:
Clear();
bool invalidCarCredentials = true;
do
{
Write("Registration Number: ");
string regNumber = ReadLine();
newVehicle["Registration Number"] = regNumber;
Write("Brand: ");
string brand = ReadLine();
newVehicle["Brand"] = brand;
Write("Model: ");
string vehicleModel = ReadLine();
newVehicle["Model: "] = vehicleModel;
Write("Type (Sedan, Compact, Subcompact): ");
string vehicleType = ReadLine();
newVehicle["Type: "] = vehicleType;
Write("Autopilot (Yes, No): ");
string autoPilot = ReadLine();
newVehicle["Autopilot: "] = autoPilot;
Clear();
foreach (KeyValuePair<string, string> kvp in newVehicle)
{
WriteLine("Car {0}: {1}", kvp.Key, kvp.Value);
}
WriteLine("Is this correct? (Y)es (N)o");
ConsoleKeyInfo newInput = ReadKey(true);
if (newInput.Key == ConsoleKey.Y)
{
Clear();
WriteLine("Vehicle registered.");
Thread.Sleep(2000);
Clear();
break;
}
else if (newInput.Key == ConsoleKey.N)
{
Clear();
}
} while (invalidCarCredentials);
break;
case ConsoleKey.D2:
Write("Search for vehicle by license plate: ");
string searchingForVehicle = ReadLine();
if (newVehicle.ContainsValue(searchingForVehicle))
{
WriteLine("Value found.");
foreach (KeyValuePair<string, string> kvp in newVehicle)
{
WriteLine("Car {0}: {1}", kvp.Key, kvp.Value);
}
}
else
{
WriteLine("Car not found.");
Thread.Sleep(2000);
}
Clear();
break;
case ConsoleKey.D3:
Clear();
WriteLine("Logging out...");
Thread.Sleep(1000);
sunfleetAdminTools = false;
Environment.Exit(0);
break;
}
} while (sunfleetAdminTools);
but they aren't saved
You stepped into an interesting trap of dictionary syntactic suggar. It has to do with the way you try to add values to the dictionary:
newVehicle["Registration Number"] = regNumber;
If the dictionary is empty, then the key "Registration Number" will be created and saved with regNumber as key value pair. On the other hand if this key already exists, then the value on this key will be simply overwritten!
This is why your problem arises and you get the impression that the values are not saved. You should always be able to find the last values that you have entered.
If you would have used the oldscool way of adding values:
newVehicle.Add("Registration Number", regNumber);
this would have led to an exception that the key already exists. You would have immideately realised that this cannot work.
What should I do in order for my code to work?
You should addapt an object oriented approach and encapsulate all information that belong together in one class:
public class VehicleRepresentation
{
public string RegistrationNumber { get; set; }
public string Brand { get; set; }
public string Model { get; set; }
public string Type { get; set; }
public bool AutoPilot { get; set; }
}
Now you can use a List<VehicleRepresentation> allVehicles to collect all your cars.
VehicleRepresentation vehicle = new VehicleRepresentation();
Console.Write("Registration Number: ");
vehicle.RegistrationNumber = Console.ReadLine();
Console.Write("Brand: ");
vehicle.Brand = Console.ReadLine();
Console.Write("Model: ");
vehicle.Model = Console.ReadLine();
Console.Write("Type (Sedan, Compact, Subcompact): ");
vehicle.Type = Console.ReadLine();
Console.Write("Autopilot (Yes, No): ");
vehicle.AutoPilot = Console.ReadLine() == "Yes";
Console.Clear();
allVehicles.Add(vehicle);
Edit:
Addition by WSC:
typically you'd want to create an enum for vehicle.Type rather than a list of user entered strings. Getting that from user input might be a bit cumbersome in a console environment, however.
Search:
The searching can be implemented in different ways. If you want to keep your loop
foreach(var veh in allVehicles)
{
if(veh.RegistrationNumber == searchingForVehicle)
{
WriteLine("Value found.");
// write here all the information you want to display.
}
}
You can of course use also LINQ for filtering. But that you can figure out on your own I guess.
I'm currently having issue on editing an existing username and password that i stored in a list.
Declarations:
public static Administrator Cadmin = new Administrator("", "", "", "");
public static Staff Cstaff = new Staff("", "", "", "");
public static Administrator Ladmin = new Administrator("", "", "", "");
public static Staff Lstaff = new Staff("", "", "", "");
public static string NCName;
public static string NCPassword;
List<User> UserList = new List<User>();
Executing code:
Console.WriteLine("Which user would you like to edit?");
string ruser = Console.ReadLine();
bool Ustop = false;
while (!Ustop)
{
foreach (User u in UserList)
{
if (ruser == Cadmin.CName)
{
Console.WriteLine("Please key in the existing password of the selected username");
string epass = Console.ReadLine();
if (epass == Cadmin.CPassword)
{
Console.WriteLine("Create new Administrator Username:");
NCName = Console.ReadLine();
Console.WriteLine("\nCreate new Administrator Password: ");
NCPassword = Console.ReadLine();
ruser.Replace(ruser, NCName);
epass.Replace(epass, NCPassword);
}
else
{
Console.WriteLine("Password that you key in is invalid!");
}
}
else
{
Console.WriteLine("Username that you key in did not exist!");
Console.WriteLine("Please key in a valid username");
}
}
}
I understood that you have issues on storing data in currently filled List, so here are one solution, use for instead if foreach, and then you can edit the specific member of the list, using it's index (I considered that CAdmin is inherited from User and User class has properties for CName and CPassword):
bool Ustop = false;
while (!Ustop)
{
for (var i = 0; i< UserList.Count ; i++ )
{
User u = UserList[i];
if (ruser == u.CName)
{
Console.WriteLine("Please key in the existing password of the selected username");
string epass = Console.ReadLine();
if (epass == u.CPassword)
{
Console.WriteLine("Create new Administrator Username:");
NCName = Console.ReadLine();
Console.WriteLine("\nCreate new Administrator Password: ");
NCPassword = Console.ReadLine();
u.CName = NCName;
u.CPassword = NCPassword;
}
else
{
Console.WriteLine("Password that you key in is invalid!");
}
}
else
{
Console.WriteLine("Username that you key in did not exist!");
Console.WriteLine("Please key in a valid username");
}
}
}
I'm wondering how to change this code to get first name and last name. My friend and I develop this code but I need to alter this code. There is Customer class as well where I set their properties. So looking for suggestion to alter this:
//Getting No: Of Customers for user wish to enter data.
do
{
needToGetInputFromUser = false;
Console.WriteLine("Please enter customer name");
customerName = Console.ReadLine();
if (customerName.Length < 5 || customerName.Length > 20)
{
Console.WriteLine("Invalid name length, must be between 5 and 20 characters");
Console.WriteLine("Please try again.");
Console.WriteLine(" ");
needToGetInputFromUser = true;
}
else
{
isUserEnteredValidInputData = true;
}
} while (needToGetInputFromUser);
//Getting Account number
My approach is slightly different from everyone else's, Where I ask for first name first, then last name. Here is the Customer class:
class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get { return FirstName + " " + LastName; } }
}
Basically I create a Customer object then set the FirstName and LastName based on user input individually like so:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var customer = new Customer();
customer.FirstName = GetStringValueFromConsole("Customer First Name");
customer.LastName = GetStringValueFromConsole("Customer Last Name");
Console.WriteLine("New Customers name: " + customer.FullName);
Console.WriteLine("Finished");
Console.ReadLine();
}
private static string GetStringValueFromConsole(string valueToAskFor)
{
var needToGetInputFromUser = false;
var stringValue = string.Empty;
do
{
Console.WriteLine("Please enter " + valueToAskFor);
stringValue = Console.ReadLine();
if (stringValue.Length < 5 || stringValue.Length > 20)
{
Console.WriteLine("Invalid \"" + valueToAskFor + "\", must be between 5 and 20 characters");
Console.WriteLine("Please try again.");
Console.WriteLine(" ");
needToGetInputFromUser = true;
}
else
{
needToGetInputFromUser = false;
}
} while (needToGetInputFromUser);
return stringValue;
}
}
}
List<Customer> ListOfCustomer = new List<Customer> ();
do
{
needToGetInputFromUser = false;
Console.WriteLine("Please enter customer name");
customerName = Console.ReadLine();
if (customerName.Length < 5 || customerName.Length > 20)
{
Console.WriteLine("Invalid name length, must be between 5 and 20 characters");
Console.WriteLine("Please try again.");
Console.WriteLine(" ");
needToGetInputFromUser = true;
}
else
{
Customer c = new Customer();
c.Name = customerName;
ListOfCustomer.Add(c);
isUserEnteredValidInputData = true;
}
} while (needToGetInputFromUser);
int CustomerCount = ListOfCustomer.Count;
I assume you get a string like:
Brian Mains
And you want to split by the " " between Brian and Mains, storing it in first/last name in the Customer object right? I think you are trying to do something like:
Customer c = new Customer();
if (customerName.Contains(" ")) {
var terms = customerName.Split(' ');
if (terms.Length == 2) {
c.FirstName = terms[0];
c.LastName = terms[1];
}
else {
//TBD
}
}