case "QUIT": case "quit":
return true ;
}
return false;
}
Такой подход работает постольку, поскольку выполняется сравнение только пред определенного ограниченного количества строк. Цикл for () представляет собой сущ ственно более гибкий подход, а применение функции Compare ( ) , нечувствительно! к регистру, существенно повышает возможности программы по "пониманию" введенно го пользователем.
Считывание ввода пользователя
Программа может считывать ввод пользователя по одному символу, но тогда вы сами должны заботиться о символах новой строки и прочих деталях. Более простым подходок оказывается считывание строки с ее последующим разбором.
Ваша программа может считывать строки, как если бы это были массива символов, с использованием оператора f oreac h или оператора индекса [], Приведенный ниже исходный текст программы StringToCharAccess демонстрирует данную методику.
// StringToCharAccess - обращение к |
символам строки, как |
// если бы строка была массивом |
|
using System; |
|
namespace |
StringToCharAccess |
|
{ |
|
|
public class Program |
|
{ |
|
|
public |
static voi d Main(string[] |
args) |
{ |
|
|
//Считывание строки с клавиатуры
Console . WriteLine("Введите произвольную " + "строку с и м в о л о в . " ) ;
string sRandom = C o n s o l e . R e a d L i n e О ; C o n s o l e . W r i t e L i n e ( ) ;
//Выводим стоку
Console . WriteLine("Вывод строки: " + s R a n d o m ) ;
C o n s o l e . W r i t e L i n e ( ) ;
// Выводим ее как последовательность символов Console . Write("Вывод с использованием foreach: " ) ; foreach(char с in sRandom)
{
C o n s o l e . W r i t e ( с ) ;
}
C o n s o l e . W r i t e L i n e ( ) ; .// Завершение строки
// Пустая строка - разделитель
206 |
Часть |
III. |
Объектно-основанное программирован |
C o n s o l e . W r i t e L i n e ( ) ;
/ / В ы в о д с т р о к и к а к п о с л е д о в а т е л ь н о с т и с и м в о л о в
C o n s o l e . W r i t e ( " В ы в о д с и с п о л ь з о в а н и е м for: " ) ; for(int i = 0; i < sRandom . Length; i++)
{
C o n s o l e . W r i t e { s R a n d o m [ i ] ) ;
}
C o n s o l e . W r i t e L i n e ( ) ; / / З а в е р ш е н и е с т р о к и
/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я
C o n s o l e . W r i t e L i n e ( "Нажмит е <Enter> д л я " +
" з а в е р ш е н и я п р о г р а м м ы . . . " ) ;
C o n s o l e . R e a d ( ) ;
Эта программа выводит некоторую совершенно случайную строку, вводимую поль зователем. Сначала строка выводится обычным способом с применением метода WriteLine (string) . Затем для вывода строки используется цикл f oreach, который выводит ее символы по одному. И наконец, для той же цели применяется цикл for на ряду с оператором индекса [ ]. В результате на экране получается примерно следующее:
|
|
|
|
|
|
|
|
Введите |
п р о и з в о л ь н у ю |
с т р о к у |
с и м в о л о в . |
Вывод |
с т р о к и : dj n dfv ckexfqyfz |
cnhjrf |
Вывод |
с |
и с п о л ь з о в а н и е м |
foreach: |
djn |
dfv ckexfqyfz cnhjrf |
Вывод |
с |
и с п о л ь з о в а н и е м |
for: |
dj n |
dfv |
ckexfqyfz cnhjrf |
Нажмите |
<Enter> д л я |
з а в е р ш е н и я п р о г р а м м ы . . . |
Зачастую требуется убрать все пробельные символы с обоих концов строки (под тер мином пробельный символ (white space) подразумеваются символы, обычно не отобра жаемые на экране, например, пробел, символ новой строки или табуляции). Для этого можно воспользоваться методом Trim ():
// Удаляем п р о б е л ь н ы е с и м в о л ы с к о н ц о в с т р о к и sRandom = sRandom. Trim () ;
String.Trim () возвращает новую строку. Применяя этот метод так, как по казано во фрагменте исходного текста выше, первоначальная версия строки с пробельными символами оказывается потерянной и больше не используется.
Разбор числового ввода
Функция ReadLine () используется для считывания объекта типа string. Про грамма, которая ожидает числовой ввод, должна эту строку соответствующим образом преобразовать в числа. С# предоставляет программисту класс Convert со всем необхо димым для этого инструментарием, в частности, методами для преобразования строки в каждый из встроенных числовых типов. Так, следующий фрагмент исходного текста считывает число с клавиатуры и сохраняет его в переменной типа int.
Глава ft Работа со строками в С# |
207 |
s t r i ng s = |
C o n s o l e . R e a d L i n e ( ) ; // |
Данные вводятся |
как |
строка, |
int n |
= C o n v e r t . T o I n t 3 2 ( s ) ; |
// |
и преобразуются |
в число |
Другие |
методы |
для преобразования еще |
более |
очевидны: ToDouble (), |
ToFloat |
T o B o o l e a n ( ) .
Метод ToInt32() выполняет преобразование в 32-битовое знаковое цел число (вспомните, что 32 бита — это размер обычного int), так что эта фуш ция выполняет преобразование строки в число типа int; для преобразован! строки в число типа long используется функция То Int 6 4 ().
Когда функции преобразования попадается "неправильный" символ, она может ви дать некорректный результат, так что вам следует убедиться, что строка содержит има| но те данные, которые ожидаются.
Приведенная далее функция возвращает значение true, если переданная ей crpoi состоит только из цифр. Такая функция может быть вызвана перед функцией преобрал вания строки в целое число, поскольку число может состоять только из цифр.
Вообще-то для чисел с плавающей точкой в строке может быть эта самая T«I ка, а кроме того, перед числом может находиться знак минус — но сейчас» терес представляют не эти частности, а сама идея.
Итак, вот эта функция:
// IsAllDigits - возвращает true, если все символы строки
//являются цифрами
public static bool |
IsAllDigits(string sRaw) |
|
|
{ |
|
|
|
|
|
|
// |
Убираем все лишнее с концов |
строки . |
Если |
при этом |
в |
// |
строке ничего |
не остается — |
значит, |
эта |
строка не |
|
//представляет собой число
string s = s R a w . T r i m ( ) ; // Игнорируем пробельные символы if (s.Length == 0)
{
return false;
}
//Циклически проходим по всем символам строки
for(int index = 0; index < s.Length; index++)
{ |
|
|
|
// |
Наличие в строке символа, не являющегося цифрой, |
// |
говорит о том, что это |
не |
число |
if |
(Char . IsDigit(s[index]) |
== |
false) |
{ |
|
|
|
|
retur n false ; |
|
|
}
}
// Все в порядке : строка состоит только из цифр
return true ;
}
Функция IsAllDigits сначала удаляет все ненужные пробельные символы с обош| концов строки. Если после этого строка оказывается пуста — значит, она состояла цели! ком из пробельных символов и числом не является. Если строка остается не пустой, функция проходит по всем ее символам. Если какой-то из символов оказывается не цщ
208 |
Часть |
III. |
Объектно-основанное |
программирована |
той, функция возвращает false, указывая, что переданная ей строка не является чис том. Возврат функцией значения true означает, что все символы строки — цифры, так что строка, по всей видимости, представляет собой некоторое числовое значение.
Следующая демонстрационная программа считывает вводимое пользовате лем число и выводит его на экран:
// IsAllDigits - демонстрационная программа, иллюстрирующая [// применение функции IsAllDigits
using System;
namespace IsAllDigits
{
class |
Program |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
public |
static voi d Main(string[] |
args) |
{ |
|
|
|
|
|
|
|
// Ввод строки с клавиатуры |
|
|
|
Console . WriteLine("Введите целое |
ч и с л о " ) ; |
string s = |
C o n s o l e . R e a d L i n e ( ) ; |
|
|
// Проверка, может ли эта строка |
быть числом |
if |
(!IsAllDigits(s)) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
Console . WriteLine("Это |
н е |
ч и с л о ! " ) ; |
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
// Преобразование строки в целое число |
|
int |
n = |
I n t 3 2 . P a r s e ( s ) ; |
|
|
|
|
// |
Выводим число, умноженное |
на 2 |
|
Console . WriteLine("2 * |
{ о } |
= |
{ l } " , n, 2 * n ) ; |
}
// Ожидаем подтверждения пользователя Console . WriteLine("Нажмите <Enter> для " +
"завершения п р о г р а м м ы . . . " ) ;
Console . Read();
}
// IsAllDigits - возвращает true, если все символы
//строки
//являются цифрами
public static bool IsAllDigits(string sRaw)
{ |
|
|
|
|
|
|
|
// |
Тело |
функции |
было рассмотрено ранее |
и здесь |
оно |
для |
II |
краткости |
опущено |
|
|
|
Программа считывает строку, вводимую пользователем с клавиатуры, после чего вы полняет ее проверку с помощью функции IsAllDigits. Если функция возвращает false, программа выводит пользователю предупреждающее сообщение. Если же нет,
Глава 9. Работа со строками в С # |
209 |