Member 13504137 Ответов: 2

Как правильно структурировать/переписать этот код ?


class Program
    {
        static void Main(string[] args)
        {
            char c = 'x';
            Console.Write("Input string: ");
            string str = Console.ReadLine();
            for (int i = 0; i < str.Length; i++)
            {
                c = str[i];
                if (System.Char.IsSymbol(c) || System.Char.IsSeparator(c) || System.Char.IsWhiteSpace(c))
                {
                    Console.WriteLine("Integers and identifiers can not be symbols, space or contain them");
                }
            }
            int a;
            bool check = int.TryParse(str, out a);
            if (check == true)
            {
                Console.WriteLine("The input string is an integer.");
            }
            if (check == false)
            {
                Console.WriteLine("The input string is an identifier.");
            }
        }
    }
}


Что я уже пробовал:

Проблема : "Создайте метод, который проверяет, является ли входная строка целым числом или идентификатором." Мой код кажется неправильным, потому что когда я ввожу "abc abc" или "$азбука"в виде строки выводится следующее: :

Целые числа и идентификаторы не могут быть символами, пробелами или содержать их
Введенная строка является идентификатором.
Нажмите любую клавишу, чтобы продолжить ...

CHill60

Когда вы закончите свой цикл, ваш код сразу перейдет в проверку на целочисленность. Попробуйте добавить bool, чтобы отметить, что ошибка уже найдена, и окружить вашу проверку целого числа/идентификатора оператором if

BillWoodruff

Существуют различные способы интерпретации "проблемы", как вы ее описываете.

Я подозреваю, что "правильное" (то, что требует ваш курс) решение не позволяет пользователю вводить целую строку текста одновременно. Я не могу себе представить, как это делается в коде "реального мира".

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

2 Ответов

Рейтинг:
5

CHill60

Попробуйте что-нибудь вроде этого (непроверенное)

ass Program
{
    static void Main(string[] args)
    {
        char c = 'x';
        Console.Write("Input string: ");
        string str = Console.ReadLine();
                
		if ValidInput(str)
		{
			int a;
			bool check = int.TryParse(str, out a);
			if (check)
			{
				Console.WriteLine("The input string is an integer.");
			}
			else
			{
				Console.WriteLine("The input string is an identifier.");
			}
		}
		else
		{
			Console.WriteLine("Integers and identifiers can not be symbols, space or contain them");
		}
    }
	bool ValidInput(string x)
	{
		ValidInput = true;
		for (int i = 0; i < str.Length; i++)
        {
            c = str[i];
            if (System.Char.IsSymbol(c) || System.Char.IsSeparator(c) || System.Char.IsWhiteSpace(c))
            {
                ValidInput = false;
				exit for;
            }
        }
	}
}

Примечание вам не нужно = true для була. И если bool не является истинным, то это должен будьте фальшивы - так что нет необходимости во втором if


Member 13504137

Спасибо ^_^. Нашел это полезным не только для этой проблемы.

Рейтинг:
19

OriginalGriff

Проблема в том, что если вы обнаружите проблему в своей строке, вы ничего не сделаете, кроме как сообщите об этом пользователю.
Добавить а return к if код:

c = str[i];
 if (System.Char.IsSymbol(c) || System.Char.IsSeparator(c) || System.Char.IsWhiteSpace(c))
 {
     Console.WriteLine("Integers and identifiers can not be symbols, space or contain them");
     return;
 }
И это должно сработать.
Но я бы либо использовал foreach петля вместо for:
foreach (char c in str)
   {
   ...
   }
Или используйте встроенный метод Any (но это может быть немного продвинутым для вас на данном этапе):
if (str.Any(c => char.IsSymbol(c) || char.IsSeparator(c) || char.IsWhiteSpace(c)))
    {
    Console.WriteLine("Integers and identifiers can not be symbols, space or contain them");
    return;
    }


Member 13504137

Спасибо! Это было полезно и дало ответы на некоторые другие вопросы. :)