ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3246

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

программа преобразует строку в число с помощью функции Int3 2 . Parse ( ) , кош представляет собой альтернативу Convert . ToInt32 ( ) . И наконец, программа выво дит полученное число и его удвоенное значение (что должно доказывать корректность преобразования строки в число).

Вот как выглядит пример вывода рассматриваемой программы: В в е д и т е ц е л о е ч и с л о

1АЗ

Э т о н е ч и с л о !

Н а ж м и т е <Enter> д л я з а в е р ш е н и я п р о г р а м м ы . . .

Можно просто попытаться использовать функцию класса Convert для вьш нения преобразования строки в число, и обработать возможные исключен генерируемые функцией преобразования. Однако имеется немалая вероятна что при этом функция не сгенерирует исключения, а вернет некорректный зультат — например, в приведенном выше примере с вводом в качестве чи 1АЗ вернет значение 1.

Обработка последовательности чисел

Зачастую программы получают в качестве вводимых данных строку, состоящую нескольких чисел. Воспользовавшись методом String . Split ( ) , вы сможете лен разбить строку на несколько подстрок, по одной для каждого числа, и работать с ним| отдельности.

Функция Split () преобразует единую строку в массив строк меньшего рази

с применением указанного символа-разделителя. Например, если вы скажете функвД Split ( ) , что следует использовать в качестве разделителя запятую, строка "1,2, превратится в три строки — " 1", " 2" и " 3".

Приведенная далее демонстрационная программа применяет метод Split] для ввода последовательности чисел для суммирования.

/ / ParseSequenceWithSplit - с ч и т ы в а е т п о с л е д о в а т е л ь н о с т ь / / р а з д е л е н н ы х з а п я т ы м и ч и с е л , р а з д е л я е т е е н а о т д е л ь н ы е / / ц е л ы е ч и с л а и с у м м и р у е т и х

namespace ParseSequenceWithSplit

{

usin g System;

class Program

{

public static void Main(strin g [] args)

{

/ / П р и г л а ш е н и е п о л ь з о в а т е л ю в в е с т и п о с л е д о в а т е л ь н о с т ь / / ц е л ы х ч и с е л

C o n s o l e . W r i t e L i n e ( " В в е д и т е п о с л е д о в а т е л ь н о с т ь ц е л ы х " + " ч и с е л , р а з д е л е н н ы х з а п я т ы м и : " ) ;

/ / С ч и т ы в а н и е с т р о к и т е к с т а string input = 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 ( ) ;

210

Часть III.

Объектно-основанное программирован*


//Преобразуем строку в отдельные подстроки с

//использованием в качестве символов - разделителей

//запятых и пробелов

char [] cDividers

= {',', 1 1} ;

string[]

segments

= i n p u t . S p l i t ( c D i v i d e r s ) ;

// Конвертируем каждую подстроку в число

int nSum

= 0;

 

foreach(string s

in segments)

{

//(Пропускаем пустые подстроки)

if (s.Length > 0)

{

//

Пропускаем строки, не являющиеся числами

if

(IsAllDigits(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("Сумма = { о } " , n S u m ) ;

// Ожидаем подтверждения пользователя Console . WriteLine("Нажмите <Enter> для " +

"завершения программы .. . ") ;

C o n s o l e . R e a d ( ) ;

//

IsAllDigits - возвращает true, если

все символы

строки

//

являются цифрами

 

 

public static bool IsAllDigits(string sRaw)

 

{

 

 

 

 

//

Убираем все лишнее с концов строки . Если при этом в

//

строке ничего не остается - значит, эта строка не

//

представляет собой число

 

 

string s = s R a w . T r i m f ) ; // Игнорируем

пробельные

символы

if

(s.Length == 0)

 

 

{

return false;

}

// Циклически проходим по всем символам строки for (int index = 0; index < s.Length; index++)

{

//

Наличие

в строке символа,

не являющегося цифрой,

//

говорит

о том, что это не число

if

(Char.IsDigit(s[index]) ==

false)

{

 

 

 

return false;

tea 9. Работа со строками в С#

211


}

// Все в порядке : строка состоит только из цифр return true ;

}

}

Программа ParseSequenceWithSplit начинает со считывания строки с клав] ры. Затем методу Split () передается массив символов cDividers, представляю: собой символы-разделители, использующиеся при отделении отдельных чисел в строке.

Далее программа циклически проходит по всем "подмассивам", созданным фук Split ( ) , применяя для этой цели цикл foreach. Программа пропускает все подстрЯ нулевой длины, а для непустых строк вызывает функцию IsAllDigits () для тя чтобы убедиться, что строка представляет собой число. Корректные строки преобри ются в целые числа и суммируются с аккумулятором nSum. Некорректные числа щ рируются (я предпочел не генерировать сообщения об ошибках).

Вот как выглядит типичный вывод данной программы:

Введите

последовательность целых чисел, разделенных запятыми:

1, 2, а,

3, 4

Очередное число = 1 Очередное число = 2 Очередное число = 3 Очередное число = 4 Сумма = 10

Нажмите <Enter> для завершения программы ...

Программа проходит по списку, рассматривая запятые, пробелы (или оба симвсЯ вместе) как разделительные. Она пропускает "число" а и выводит общую сумму ц ректных чисел, равную 10. В реальных программах, однако, вряд ли можно простои игнорировать некорректные числа, никак не сообщая об этом пользователю. При not лении во входном потоке любой программы "мусора" обычно требуется тем или щ. способом привлечь к этому факту внимание пользователя.

Управление выводом программы представляет собой важный аспект работы со ста ками. Подумайте сами: вывод программы— это именно то, что видит пользователь. • имеет значения, насколько элегантна внутренняя логика и реализация программы —Ж вряд ли впечатлит пользователя; куда важнее для него корректность и внешнее предстш ление выводимых программой данных.

Класс String предоставляет программисту ряд методов для форматирования вьй димой строки. В следующих разделах будут рассмотрены такие методы, как Trim P a d ( ) , P a d R i g h t ( ) , P a d L e f t ( ) , S u b s t r i n g ( ) и C o n c a t ( ) .

Использование методов Trim() и Pad()

Методом Trim () можно воспользоваться для.удаления ненужных пробельных сю! волов с обоих концов строки. Обычно этот метод применяется для удаления оробело) при выравнивании выводимой строки.

212

Часть III.

Объектно-основанное программирован*


Еще один распространенный метод, часто используемый при форматировании — функции Pad, которые добавляют к строке пробелы с тем, чтобы ее длина стала равной некоторому предопределенному значению. Например, так вы можете добавить к строке пробелы слева или справа, чтобы обеспечить выравнивание вывода по правому или ле­ вому краю.

В приведенной далее небольшой демонстрационной программе AlignOut - put для выравнивания списка имен применяются обе упомянутые функции.

//AlignOutput - выравнивание множества строк для улучшения

//внешнего вида вывода программы

namespace AlignOutput

(

using System;

class Program

{

public static voi d Main(strin g [] args)

{

string[] names = {"Christa ",

"Sarah",

"Jonathan",

"Sam",

"Schmekowitz " } ;

//Вывод имен в том виде, в котором они получены Console.WriteLine("Имена имеют разную д л и н у " ) ;

foreach(string s in names)

{

Console.WriteLine("Имя '{о}' до обработки", s);

}

Console.WriteLine () ;

 

 

II

Выравниваем строки по левому краю и делаем их

 

//

равной

длины

 

 

string []

sAlignedNames = TrimAndPad(names) ;

 

// Выводим окончательный результат на экран

 

Console.WriteLine("Те же имена

выровнены и имеют

" +

 

 

"одинаковую

д л и н у " ) ;

 

foreach(string s in sAlignedNames)

 

Console.WriteLine("Имя ' {0} ' после обработки",

s) ;

}

II Ожидаем подтверждения пользователя

Console.WriteLine("Нажмите <Enter> для " + "завершения программы . . . " ) . ;

Console.Read();

 

}

 

Глава 9. Работа со строками в С#

213


//

TrimAndPad

- для данного массива строк удаляются

//

пробелы с

обоих сторон строки, после чего

выполняется

//

дополнение

пробелов таким образом, чтобы

все строки

//оказались выровнены с наибольшей строкой в массиве

public static string[] TrimAndPad(strin g [] strings)

{

//

Копируем исходный массив в

массив , с которым будем

//

работать

 

string[] stringsToAlign = ne w

S t r i n g [ s t r i n g s . L e n g t h ] ;

//

Удаляем ненужные пробелы с обоих сторон каждой

//

строки

 

for(int i = 0; i <

stringsToAlign . Length; i++)

{

 

stringsToAlign[i]

= s t r i n g s [ i ] . T r i m ( ) ;

}

 

// Находим наибольшую длину строки в массиве int nMaxLengt h = 0;

foreach(string

s

in stringsToAlign)

{

 

 

if (s.Length

>

nMaxLength)

{

 

 

nMaxLengt h

=

s.Length;

}

}

//Выравниваем все строки к длине самой длинной

for(int i = 0; i <

stringsToAlign . Length; i++)

{

 

stringsToAlign[i]

=

stringsToAlign[i] . PadRight(nMaxLengt h + 1 ) ;

}

// Возвращаем результа т вызывающей функции retur n stringsToAlign ;

}

}

}

Демонстрационная программа AlignOutput определяет массив имен, которые шеи разные выравнивание и длину (вы можете переписать программу так, чтобы эти имена счип вались с клавиатуры или из файла). Функция Main () сначала выводит эти имена на экран том виде, в котором они получены программой. Затем вызывается функция TrimAndPad существенно улучшающая внешний вид выводимых программой строк:

Имена

имеют разную

длину

Имя

'Christa

'

до

обработки

Имя

'

Sarah'

до

обработки

Имя

'Jonathan'

до обработки

Имя

'Sam' до обработки

Имя

'

Schmekowitz 1

до обработки

214

Часть

III.

Объектно-основанное программировя