1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 39
Текст из файла (страница 39)
" ) ;Console.Read();}// IsAllDigits - в о з в р а щ а е т t r u e ,// строки// я в л я ю т с я ц и ф р а м иpublicstatic boolесли все символыIsAllDigits(stringsRaw){//IIТелофункциибылократкостиопущенорассмотреноранееиздесьонодляПрограмма считывает строку, вводимую пользователем с клавиатуры, после чего выполняет ее проверку с помощью функции I s A l l D i g i t s . Если функция возвращаетfalse, программа выводит пользователю предупреждающее сообщение.
Если же нет,Глава 9. Работа со строками в С #209программа преобразует строку в число с помощью функции I n t 3 2 . P a r s e ( ) , кошпредставляет собой альтернативу C o n v e r t . T o I n t 3 2 ( ) . И наконец, программа выводит полученное число и его удвоенное значение (что должно доказывать корректностьпреобразования строки в число).Вот как выглядит пример вывода рассматриваемой программы:Введите целое число1АЗЭто не ч и с л о !Нажмите <Enter> д л язавершенияпрограммы...Можно просто попытаться использовать функцию класса C o n v e r t для вьшнения преобразования строки в число, и обработать возможные исключенгенерируемые функцией преобразования. Однако имеется немалая вероятначто при этом функция не сгенерирует исключения, а вернет некорректныйзультат — например, в приведенном выше примере с вводом в качестве чи1АЗ вернет значение 1.Обработка последовательности чиселЗачастую программы получают в качестве вводимых данных строку, состоящуюнескольких чисел.
Воспользовавшись методом S t r i n g . S p l i t ( ) , вы сможете ленразбить строку на несколько подстрок, по одной для каждого числа, и работать с ним|отдельности.Функция S p l i t () преобразует единую строку в массив строк меньшего разис применением указанного символа-разделителя. Например, если вы скажете функвДS p l i t ( ) , что следует использовать в качестве разделителя запятую, строка "1,2,превратится в три строки — " 1", " 2" и " 3".Приведенная далее демонстрационная программа применяет метод Split]для ввода последовательности чисел для суммирования.// ParseSequenceWithSplitсчитывает последовательность// разделенных запятыми ч и с е л , р а з д е л я е т ее на отдельные// целые ч и с л а и суммирует ихnamespace ParseSequenceWithSplit{using System;classProgram{p u b l i c static v o i d M a i n ( s t r i n g []args){// Приглашение пользователю ввести последовательность// целых чиселConsole.WriteLine("Введитепоследовательностьцелых"+" чисел, разделенных запятыми:");// Считывание строки текстаstring input = C o n s o l e .
R e a d L i n e О ;Console.WriteLine();210ЧастьIII.Объектно-основанноепрограммирован*// П р е о б р а з у е м с т р о к у в о т д е л ь н ы е п о д с т р о к и с// и с п о л ь з о в а н и е м в к а ч е с т в е с и м в о л о в - р а з д е л и т е л е й// з а п я т ы х и п р о б е л о в11c h a r [] c D i v i d e r s = { ' , ' ,};string[] segments = i n p u t . S p l i t ( c D i v i d e r s ) ;// К о н в е р т и р у е м к а ж д у ю п о д с т р о к у в ч и с л оint n S u m = 0;f o r e a c h ( s t r i n g s in s e g m e n t s ){//if(Пропускаем пустые( s .
L e n g t h > 0)подстроки){// Пропускаем строки,if ( I s A l l D i g i t s ( s ) )не являющиеся числами{// Преобразуем строку в 32-битовое целое числоint n u m = I n t 3 2 . P a r s e ( s ) ;Console.WriteLine("Очередное число = { о } " , n u m ) ;// Д о б а в л я е м полученноеnSum += num;числовсумму}// В ы в о д с у м м ыConsole.WriteLine("Сумма={ о } " ,nSum);// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +" з а в е р ш е н и я п р о г р а м м ы .
. . ") ;Console.Read();// I s A l l D i g i t s - в о з в р а щ а е т t r u e ,// я в л я ю т с я ц и ф р а м иpublicstatic boolесли все символы строкиIsAllDigits(stringsRaw){// Убираем все л и ш н е е с к о н ц о в с т р о к и . Е с л и п р и э т о м в// строке н и ч е г о не о с т а е т с я - з н а ч и т , эта с т р о к а не// п р е д с т а в л я е т собой ч и с л оstring s = s R a w . T r i m f ) ; // И г н о р и р у е м п р о б е л ь н ы е с и м в о л ыif ( s . L e n g t h == 0){return f a l s e ;}// Циклически проходим по всем символам строкиfor (int 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 ] ) == f a l s e ){returnfalse;tea 9. Работа со строками в С#211}// Все в порядке:return true;}строкасостоиттолько из цифр}Программа P a r s e S e q u e n c e W i t h S p l i t начинает со считывания строки с клав]ры.
Затем методу S p l i t () передается массив символов c D i v i d e r s , представляю:собой символы-разделители, использующиеся при отделении отдельных чисел в строке.Далее программа циклически проходит по всем "подмассивам", созданным фукS p l i t ( ) , применяя для этой цели цикл f o r e a c h . Программа пропускает все подстрЯнулевой длины, а для непустых строк вызывает функцию I s A l l D i g i t s () для тячтобы убедиться, что строка представляет собой число. Корректные строки преобриются в целые числа и суммируются с аккумулятором nSum. Некорректные числа щрируются (я предпочел не генерировать сообщения об ошибках).Вот как выглядит типичный вывод данной программы:Введите последовательность целых чисел, разделенных1, 2 , а , 3, 4Очередное число = 1Очередное число = 2Очередное число = 3Очередное число = 4С у м м а = 10Нажмите<Enter>длязавершениязапятыми:программы...Программа проходит по списку, рассматривая запятые, пробелы (или оба симвсЯвместе) как разделительные.
Она пропускает "число" а и выводит общую сумму цректных чисел, равную 10. В реальных программах, однако, вряд ли можно простоиигнорировать некорректные числа, никак не сообщая об этом пользователю. При notлении во входном потоке любой программы "мусора" обычно требуется тем или щ.способом привлечь к этому факту внимание пользователя.Управление выводом программы представляет собой важный аспект работы со стаками.
Подумайте сами: вывод программы— это именно то, что видит пользователь. •имеет значения, насколько элегантна внутренняя логика и реализация программы —Жвряд ли впечатлит пользователя; куда важнее для него корректность и внешнее предстшление выводимых программой данных.Класс S t r i n g предоставляет программисту ряд методов для форматирования вьйдимой строки. В следующих разделах будут рассмотрены такие методы, как TrimPad(), PadRight(), PadLeft(), Substring() и Concat().Использование методов Trim() и Pad()Методом T r i m () можно воспользоваться для.удаления ненужных пробельных сю!волов с обоих концов строки.
Обычно этот метод применяется для удаления оробело)при выравнивании выводимой строки.212ЧастьIII.Объектно-основанноепрограммирован*Еще один распространенный метод, часто используемый при форматировании —функции Pad, которые добавляют к строке пробелы с тем, чтобы ее длина стала равнойнекоторому предопределенному значению. Например, так вы можете добавить к строкепробелы слева или справа, чтобы обеспечить выравнивание вывода по правому или левому краю.В приведенной далее небольшой демонстрационной программе A l i g n O u t p u t для выравнивания списка имен применяются обе упомянутые функции.// AlignOutput - в ы р а в н и в а н и е м н о ж е с т в а с т р о к д л я у л у ч ш е н и я// внешнего в и д а в ы в о д а п р о г р а м м ыnamespace A l i g n O u t p u t(using S y s t e m ;class P r o g r a m{public s t a t i c v o i d M a i n ( s t r i n g []args){string[]names={"Christa","Sarah","Jonathan","Sam"," Schmekowitz " } ;// Вывод и м е н в т о м в и д е , в к о т о р о м о н и п о л у ч е н ыConsole.WriteLine("Имена имеют разную д л и н у " ) ;foreach(stringsin n a m e s ){Console.WriteLine("Имя '{о}' до обработки", s);}C o n s o l e .
W r i t e L i n e () ;II Выравниваем с т р о к и по л е в о м у краю и д е л а е м их// р а в н о й д л и н ыstring [] s A l i g n e d N a m e s = T r i m A n d P a d ( n a m e s ) ;// Выводим о к о н ч а т е л ь н ы й р е з у л ь т а т на э к р а нC o n s o l e . W r i t e L i n e ( " Т е же и м е н а в ы р о в н е н ы и и м е ю т"одинаковую д л и н у " ) ;foreach(string s in s A l i g n e d N a m e s )"+C o n s o l e .