Member 12731696 Ответов: 3

Как взять пользовательский ввод в виде строки и сверить его с массивом, чтобы получить какое-то сообщение ?


Я пытаюсь создать программу, которая принимает пользовательский ввод и на основе этого дает некоторые результаты.

Входные данные представлены в виде переменной sting и проверяются по строкам, хранящимся в массиве .
Если входные данные совпадают с этими сохраненными переменными, то отображается сообщение об успехе или сообщение об ошибке.

Проблема в том, что когда входные данные совпадают со значением, хранящимся в массиве вместе с какой-то другой буквой в качестве входных данных, даже тогда он принимает их и показывает сообщение об успехе.

Есть какие-нибудь предложения о том, как сделать это более эффективно и улучшить код ?

using System;
namespace LearnigToProgram{
	class Travel{
		

		string []travellers_name=new string[8];
		public string []departure_location=new string[4];
		public string[]arrival_location=new string[4];
		int[]mobileno=new int[8];

		public Travel(){

			departure_location[0]="Phuket";
			departure_location[1]="Amsterdam";
			departure_location[2]="Mumbai";
			departure_location[3]="Thailand";

			arrival_location[0]="1.Bangkok";
			arrival_location[1]="2.Damascas";
			arrival_location[2]="3.Sri Lanka";
			arrival_location[3]="4.Peshawar";
		}
	}

	class TripManager{
		static void Main(){

			int casecheck1,casecheck2,casecheck3,casecheck4;
			string welcome_msg="Welcome to Sharp Travel Planner .\nPlease select your dream destination\n";
			Travel display_location = new Travel ();
			Console.WriteLine (welcome_msg);
			for (int i = 0; i < display_location.departure_location.Length; i++)
				Console.WriteLine (display_location.arrival_location [i]);

			string input=Console.ReadLine ();
			casecheck1 = input.IndexOf ("Bangkok", StringComparison.Ordinal);
			casecheck2 = input.IndexOf ("Damascas", StringComparison.Ordinal);
			casecheck3 = input.IndexOf ("Sri Lanka", StringComparison.Ordinal);
			casecheck4 = input.IndexOf ("Peshawar", StringComparison.Ordinal);
			if((casecheck1==0)|(casecheck2==0)|(casecheck3==0)|(casecheck4==0))
				Console.WriteLine ("Your choice is {0}", input);
			//if (input != ("Bangkok") || ("Damascas") || ("Sri Lanka") || ("Peshawar"))
			else	
			Console.WriteLine ("Destination not available");


		}


	}

}

NotPolitcallyCorrect

Метод Contains поможет вам.

3 Ответов

Рейтинг:
20

BillWoodruff

Вот пример того, как вы можете проверить входные данные:

string input=Console.ReadLine ();

if (input == "") Environment.Exit(-1); // handle user entered nothing ?
                             
input = input.Trim().ToLower(); // get rid of white-space, make all lower-case

string destination = "";

foreach(string dest in display_location.arrival_location)
{
    if(dest.ToLower().Contains(input))
    {
        destination = dest;
        break;
    }
}

if (destination == "") Environment.Exit(-1); // handle no match

// do something with valid entry ?
switch(input)
{
        case "Bangkok":
            // ?
            break;

        case "Damascas":
            // ?
            break;

        // left for you to  complete

        default:
            break;
}
Записи:

1. Преобразуя пользовательский ввод в нижний регистр и сравнивая его с именами адресатов в нижнем регистре, пользователь может иметь немного больше свободы для совершения ошибок ввода с точки зрения регистра.

2. Код для выхода из консольного приложения, который вы видите здесь, - это просто держатели мест.

Реальная работа в консольном приложении, imho, заключается в том, чтобы настроить структуру цикла, чтобы вы могли позволить пользователю повторять ввод данных ... до тех пор, пока они либо не "преуспеют", либо не введут какой-то символ, который приведет к завершению консоли.


Рейтинг:
2

cigwork

Более общим решением было бы рассматривать ваш список пунктов назначения скорее как базу данных и искать введенный текст. Если вы сделаете это, то сможете расширить список пунктов назначения без необходимости жестко кодировать свой тест. Как правило, жесткое кодирование-это плохая вещь, и оно может привести ко всем видам неприятностей, включая, но не ограничиваясь этим, код, который является хрупким и трудным в обслуживании.

Таким образом, предполагая, что список пунктов назначения находится в области действия, вы можете сделать что-то вроде следующего :

string foundDestination = "";
for (int i=0; i < arrival_location.length; i++) {
  // We'll use indexof but other comparison methods are available.
  // Have a look at String.Equals(...) to start with.
  // There are ways of exiting the loop early when a match is made. 
  // Further reading for you.
  if (arrival_location[i].IndexOf(input, Ordinal) >= 0 ) {
    foundDestination = input;
  }
}

if (foundDestination.length == 0) {
 // Tell the user no match.
} else {
 // Display all matches made.
 // 
} 


Если вы хотите получить фантазию, то есть и другие способы поиска по данным, например...

// Xamarin docs say linq is supported, but I don't know how well.
Using System.Linq;

// We'll use indexof but other comparison methods are available.
// Have a look at String.Equals(...) to start with.
IEnumerable<string> findLocation = From string dest in arrival_location
                                   where dest.indexof(input, Ordinal) >=0
                                   select dest;

// We allow for the possibility of multiple matches
string[] matches = findLocation.ToArray();

if (matches.length == 0) {
 // Tell the user no match.
} else {
 // Display all matches made.
 // 
}


Рейтинг:
2

manu_dhobale

Я тоже кое-что попробовал для Вас, пожалуйста, посмотрите

class Travel
{


    string[] travellers_name = new string[8];
    public string[] departure_location = new string[4];
    public string[] arrival_location = new string[4];
    int[] mobileno = new int[8];

    public Travel()
    {

        departure_location[0] = "Phuket";
        departure_location[1] = "Amsterdam";
        departure_location[2] = "Mumbai";
        departure_location[3] = "Thailand";

        arrival_location[0] = "1.Bangkok";
        arrival_location[1] = "2.Damascas";
        arrival_location[2] = "3.Sri Lanka";
        arrival_location[3] = "4.Peshawar";
    }
}
static void Main()
{
    string welcome_msg = "Welcome to Sharp Travel Planner .\nPlease select your dream destination\n";
    Travel display_location = new Travel();
    Console.WriteLine(welcome_msg);
    for (int i = 0; i < display_location.departure_location.Length; i++)
        Console.WriteLine(display_location.arrival_location[i]);

    string input = Console.ReadLine();
    int selectedIndex = 0;
    if (!int.TryParse(input, out selectedIndex))
    {
        Console.WriteLine("InValid input!");
        Console.ReadKey();
        return;
    }
    if (selectedIndex > display_location.arrival_location.Count())
    {
        Console.WriteLine("InValid input!");
        Console.ReadKey();

        return;
    }
    var selection = display_location.arrival_location[selectedIndex - 1];

    bool res = display_location.arrival_location.Contains(selection);


    if (res)
        Console.WriteLine("Your choice is {0}", selection);
    else
        Console.WriteLine("Destination not available");

    Console.ReadKey();
}