1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 38
Текст из файла (страница 38)
C o m p a r e ( " e x i t " , s o u r c e , t r u e ) = = 0 )(String.Compare("quit", source, true) == 0 ) ;)Эта версия функции I s T e r m i n a t e S t r i n g ()проще предыдущей версии с использованием цикла. Ей не надо заботиться о регистре символов, и она может обойтись всеголишь двумя условными выражениями, так как ей достаточно рассмотреть только два варианта команды завершения программы.Обратите внимание, что приведенная версия функции I s T e r m i n a t e S t r i n g ()не применяет оператор if. Вычисленное значение логического выраженияпросто непосредственно передается пользователю, что позволяет избежатьприменения if.Использование конструкции switchМне не нравится этот способ, но вы можете использовать конструкцию s w i t c h дляпоиска действий для конкретной строки.
Обычно s w i t c h применяется для сравнениязначения переменной с некоторым набором возможных значений, однако эту конструкцию можно применять и для объектов s t r i n g . Вот как выглядит версия функции I s TerminateString () с использованием конструкции s w i t c h .//IsTerminateString - в о з в р а щ а е т з н а ч е н и е t r u e , е с л и// исходная с т р о к а с о о т в е т с т в у е т о д н о й из к о м а н д з а в е р ш е н и я// программыpublic static b o o l I s T e r m i n a t e S t r i n g ( s t r i n g s o u r c e ){switch (source){case "EXIT" :case "exit" :Глава 9. Работа со строками в С#205case "QUIT":case "quit":return true;}returnfalse;}Такой подход работает постольку, поскольку выполняется сравнение только предопределенного ограниченного количества строк.
Цикл f o r ()представляет собой сущственно более гибкий подход, а применение функции C o m p a r e ( ) , нечувствительно!к регистру, существенно повышает возможности программы по "пониманию" введенного пользователем.Считывание ввода пользователяПрограмма может считывать ввод пользователя по одному символу, но тогда вы самидолжны заботиться о символах новой строки и прочих деталях.
Более простым подходококазывается считывание строки с ее последующим разбором.Ваша программа может считывать строки, как если бы это были массивасимволов, с использованием оператора f o r e a c h или оператора индекса [],Приведенный ниже исходный текст программы StringToCharAccessдемонстрирует данную методику.// S t r i n g T o C h a r A c c e s s - о б р а щ е н и е// если бы строка была массивомusing System;namespaceк символам строки,какStringToCharAccess{publicclassProgram{publicstatic void Main(string[]args){// С ч и т ы в а н и е строки с клавиатурыConsole.WriteLine("Введите произвольную " +"строку с и м в о л о в . " ) ;string sRandom = C o n s o l e .
R e a d L i n e О ;Console.WriteLine();// Выводим стокуConsole.WriteLine("Вывод строки: " + s R a n d o m ) ;Console.WriteLine();// Выводим ее как последовательность символовConsole.Write("Вывод с использованием foreach: " ) ;f o r e a c h ( c h a r с in s R a n d o m ){Console.Write(с);}C o n s o l e . W r i t e L i n e ( ) ; .// З а в е р ш е н и е с т р о к и//206Пустаястрока-разделительЧастьIII.Объектно-основанноепрограммированConsole.WriteLine();/ / Вывод с т р о к и как п о с л е д о в а т е л ь н о с т и с и м в о л о вConsole.Write("Вывод с и с п о л ь з о в а н и е м for: " ) ;f o r ( i n t i = 0; i < s R a n d o m .
L e n g t h ; i + + ){Console.Write{sRandom[i]);}Console.WriteLine();//Завершениестроки// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> д л я " +"завершения п р о г р а м м ы . . . " ) ;Console.Read();Эта программа выводит некоторую совершенно случайную строку, вводимую пользователем. Сначала строка выводится обычным способом с применением методаWriteLine ( s t r i n g ) . Затем для вывода строки используется цикл f o r e a c h , которыйвыводит ее символы по одному.
И наконец, для той же цели применяется цикл f o r наряду с оператором индекса [ ]. В результате на экране получается примерно следующее:Введите п р о и з в о л ь н у ю с т р о к у с и м в о л о в .Вывод с т р о к и : d j n d f v c k e x f q y f z c n h j r fВывод с и с п о л ь з о в а н и е мforeach:Вывод с и с п о л ь з о в а н и е мfor:Нажмите<Enter>дляdjn dfv ckexfqyfzdjn dfv ckexfqyfzзавершенияcnhjrfcnhjrfпрограммы...Зачастую требуется убрать все пробельные символы с обоих концов строки (под термином пробельный символ (white space) подразумеваются символы, обычно не отображаемые на экране, например, пробел, символ новой строки или табуляции).
Для этогоможно воспользоваться методом T r i m ():// Удаляем п р о б е л ь н ы е с и м в о л ыsRandom = s R a n d o m . T r i m () ;сконцовстрокиS t r i n g . T r i m () возвращает новую строку. Применяя этот метод так, как показано во фрагменте исходного текста выше, первоначальная версия строки спробельными символами оказывается потерянной и больше не используется.Разбор числового вводаФункция R e a d L i n e () используется для считывания объекта типа s t r i n g . Программа, которая ожидает числовой ввод, должна эту строку соответствующим образомпреобразовать в числа. С# предоставляет программисту класс C o n v e r t со всем необходимым для этого инструментарием, в частности, методами для преобразования строкив каждый из встроенных числовых типов.
Так, следующий фрагмент исходного текстасчитывает число с клавиатуры и сохраняет его в переменной типа int.Глава ft Работа со строками в С#207string s = Console.ReadLine();int n = C o n v e r t . T o I n t 3 2 ( s ) ;/ / Д а н н ы е в в о д я т с я к а к строка,// и п р е о б р а з у ю т с я в ч и с л оДругие методы для преобразования еще более очевидны: T o D o u b l e (), ToFloatToBoolean().Метод T o I n t 3 2 ( )выполняет преобразование в 32-битовое знаковое целчисло (вспомните, что 32 бита — это размер обычного int), так что эта фушция выполняет преобразование строки в число типа int; для преобразован!строки в число типа l o n g используется функция То Int 6 4 ().Когда функции преобразования попадается "неправильный" символ, она может видать некорректный результат, так что вам следует убедиться, что строка содержит има|но те данные, которые ожидаются.Приведенная далее функция возвращает значение t r u e , если переданная ей crpoiсостоит только из цифр.
Такая функция может быть вызвана перед функцией преобралвания строки в целое число, поскольку число может состоять только из цифр.Вообще-то для чисел с плавающей точкой в строке может быть эта самая T«Iка, а кроме того, перед числом может находиться знак минус — но сейчас»терес представляют не эти частности, а сама идея.Итак, вот эта функция:////IsAllDigits - возвращаетявляются цифрамиpublicstaticbooltrue,если все символы строкиIsAllDigits(stringsRaw){// У б и р а е м все л и ш н е е с концов строки. Если при этом в// строке ничего не остается — значит, эта строка не// представляет собой числоstring s = s R a w . T r i m ( ) ; // И г н о р и р у е м п р о б е л ь н ы е символыif ( s .
L e n g t h == 0){returnfalse;}// Циклически проходим по всем символам строкиf o r ( i n t i n d e x = 0; i n d e x < s . L e n g t h ; i n d e x + + ){// Наличие в строке символа, не являющегося цифрой,// говорит о том, что это не числоif ( C h a r . I s D i g i t ( s [ i n d e x ] ) == false){return false;}}// Все в порядке:return true;строкасостоиттолько из цифр}Функция I s A l l D i g i t s сначала удаляет все ненужные пробельные символы с обош|концов строки. Если после этого строка оказывается пуста — значит, она состояла цели!ком из пробельных символов и числом не является. Если строка остается не пустой,функция проходит по всем ее символам. Если какой-то из символов оказывается не цщ208ЧастьIII.Объектно-основанноепрограммированатой, функция возвращает f a l s e , указывая, что переданная ей строка не является чистом.
Возврат функцией значения t r u e означает, что все символы строки — цифры, такчто строка, по всей видимости, представляет собой некоторое числовое значение.Следующая демонстрационная программа считывает вводимое пользователем число и выводит его на экран:// IsAllDigits - д е м о н с т р а ц и о н н а я п р о г р а м м а ,[// применение ф у н к ц и и I s A l l D i g i t susing S y s t e m ;namespaceиллюстрирующаяIsAllDigits{class P r o g r a m{publicstatic void 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 ) ;// В ы в о д и м ч и с л о , у м н о ж е н н о е на 2Console.WriteLine("2 * { о } = { l } " , n, 2 * n ) ;}// Ожидаем подтверждения пользователяConsole.WriteLine("Нажмите <Enter> для " +"завершения п р о г р а м м ы . . .