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

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

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

Добавлен: 11.12.2025

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

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

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

// строку,

не влияя на оригинал

 

s2.sName = s i . s N a m e . T o U p p e r ( ) ;

 

Console . WriteLine("si - { o } ,

s2 -

{ l } " ,

 

s1 . sName,

 

 

 

s 2 . s N a m e ) ;

 

 

// Ожидаем

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

Console . WriteLine("Нажмите <Enter>

для " +

 

"завершения

п р о г р а м м ы . . . " ) ;

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

 

 

}

II Student - простейший класс, содержащий строку class Student

{

public String sName;

}

}

Объекты класса Student si и s2 созданы так, что их члены sName указывают на од­ ни и те же строковые данные. Вызов метода ToUpper () преобразует строку si . sName, изменяя все ее символы на прописные. Никаких проблем, связанных с тем, что si и s2 указывают на один объект, не возникает, поскольку метод ToUpper () не изменяет sName, а создает новую строку, записанную прописными буквами.

Вот что выводит на экран приведенная выше программа:

Sl - Jenny, s2 - JENNY

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

Это свойство строк называется неизменностью (или неизменяемостью). Неизменность строк очень важна для строковых констант. Строка наподобие "Это строка" представляет собой вид строковой константы, как 1 представ­ ляет собой константу типа int. Компилятор, таким образом, может заменить все обращения к одинаковым константным строкам обращением к одной кон­ стантной строке, что снижает размер получающейся программы. Такое поведе­ ние компилятора было бы невозможным, если бы строки могли изменяться.

Сравнение строк

Множество операций рассматривает строку как единый объект— например, метод Compare ( ) , который сравнивает две строки, вводя для них отношение "меньше-больше".

Если левая строка больше правой, Compare () возвращает 1.

Если левая строка меньше правой, Compare () возвращает -1.

Если строки равны, Compare () возвращает 0.

Вот как выглядит алгоритм работы Compare ( ) , записанный с использованием псев­ докода:

compare (string sl, string s2)

{

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


//

Циклический

проход

по всем

символам строк, пока один из

//

символов одной строки не окажется больше

 

 

//

соответствующего ему

символа второй строки

 

 

f o r e a c h

(для

каждого)

символа

более короткой

строки

if

(числовое

значение символа строки sl > числового

 

 

значения

символа

 

строки

s2)

 

 

 

 

r e t u r n 1

 

 

 

 

 

 

 

if

 

(числовое значение символа строки sl < числового

 

 

значения

символа

 

строки

s2)

 

 

 

 

r e t u r n -1

 

 

 

 

 

 

//

Если

все

символы совпали,

но строка sl длиннее строки

//

s2,

то она

считается

больше строки s2

 

 

if В

строке

sl

остались

символы

 

 

r e t u r n

1

 

 

 

 

 

 

 

//

Если

все

символы совпали,

но строка s2 длиннее строки

//,

sl,

то она

считается больше строки sl

 

 

if

В

строке

s2

остались

символы

 

 

r e t u r n

- 1

 

 

 

 

 

 

 

//

Если все символы строк попарно одинаковы,

и

строки

//

имеют одну

и ту же

длину —

то это одинаковые

строки

r e t u r n О

}

Таким образом, "abed" больше "abbd", a "abede " больше "abed" . Как правило, в реальных ситуациях интересует не то, какая из строк больше, а равны ли две строки друг другу или нет

Сравнение строк "больше-меньше" необходимо для их сортировки.

Операция Compare () возвращает значение 0, если две строки идентичны. В приве­ денной далее тестовой программе это значение используется для выполнения ряда опе­ раций, когда программа встречает некоторую строку или строки.

Программа BuildASentence предлагает пользователю ввести несколько строк текста. Эти строки объединяются с предыдущими для построени единого предложения. Программа завершает работу, если пользователь вво­ дит слово EXIT, exit, QUI T или quit.

//BuildASentence - данная программа конструирует

//предложение путем конкатенации пользовательского ввода,

//до тех пор пока пользователь не введет команду

//завершения . Эта программа демонстрирует использование

//проверки равенства строк

using System;

namespace BuildASentence

{

public class Program

{

public static voi d Main(string[] args)

{

Console . WriteLine("Каждая введенная вами строка " "будет добавляться в предложение, "

202

Часть

III.

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


"пока вы не введете

EXIT or Q U I T " ) ;

// Запрашиваем пользовательский ввод

и соединяем

// вводимые пользователем фразы в единое целое, пока // не будет введена команда завершения работы

string sSentence = "" ; for( ; ; )

{

//

Получение очередной строки

Console . WriteLine("Введите с т р о к у " ) ;

string sLine = C o n s o l e . R e a d L i n e ( ) ;

// Выход при команде завершения

if

(IsTerminateString(sLine))

{

 

break;

}

// В противном случае добавление введенного к строке

sSentence = String . Concat(sSentence ,

s L i n e ) ;

// Обратная связь

 

Console . WriteLine("\пВы ввели: { о } " ,

s S e n t e n c e ) ;

}

Console .WriteLine("\пПолучилось:\n{OJ", s S e n t e n c e ) ; // Ожидаем подтверждения пользователя

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

Console.Read();

}

//IsTerminateString - возвращает true, если введенная

//строка представляет собой команду завершения работы

public static bool IsTerminateString(string source)

{

string[] sTerms = { "EXIT", "exit", "QUIT", "quit" };

//Сравниваем введенную строку с командами завершения

//работы

foreach (string sTerm in sTerms)

{

// Возвращаем true при совпадении

if (String.Compare(source, sTerm) == 0)

{

return true ;

} }

return false;

После краткого описания своих действий программа создает пустую строку для пред- ложения — sSentence, после чего входит в "бесконечный" цикл.

Конструкции while (true) и for (; ;) представляют собой бесконечные циклы, выход из которых осуществляется посредством операторов break (выход из цикла) или return (выход из программы). Эти два цикла эквива­ лентны, и оба встречаются в реальных программах. О циклах подробно расска­ зывается в главе 5, "Управление потоком выполнения".

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

203


Далее программа предлагает пользователю ввести строку текста, которую затем счи тывает с помощью метода ReadLine ( ) . После прочтения строки программа проверяя не является ли введенная строка командой завершения работы, пользуясь для этого функцией IsTerminateString ( ) . Эта функция возвращает true, если переданная строка — одна из команд завершения работы, и false в противном случае.

По соглашению имя функции, проверяющей некоторое свойство и возвра щающей значение true или false, начинается с Is, Has, Can или иного по добного слова. Само собой, это соглашение предназначено исключительно для людей, для облегчения понимания и удобочитаемости программы — С# без различно, какое имя используется для функции.

Если введенная строка не является командой завершения работы, она добавляете в конец предложения посредством функции String . Concat ( ) . Полученный результа тут же выводится на экран, чтобы пользователь мог видеть, что у него получается.

Метод IsTerminateString () определяет массив строк sTerms. Каждый член этого массива представляет собой один из вариантов команды завершения работы. Лю бая из перечисленных в массиве строк, будучи введенной пользователем, приводит к за вершению работы программы.

В массив включены как строка "EXIT", так и строка "exit", поскольку функ ция Compare () по умолчанию рассматривает эти строки как различные (так что другие варианты написания этого слова, такие как " exit " или " Exit ", не буду восприняты программой в качестве команд завершения).

Функция IsTerminateString () циклически просматривает все элементы массив команд завершения работы и сравнивает их с переданной строкой. Если функция Соm pare () сообщает о соответствии строки одному из образцов команд завершения, функ ция тут же возвращает значение true; если же до завершения цикла соответствие не

найдено, то по выходе из цикла функция возвращает значение fa 1 зе.

Итерации по массиву — отличный способ проверки на равенство одному из возможных значений.

Вот пример вывода программы BuildASentence .

Каждая введенная вами строка будет добавляться в предложение, пока вы не введете EXIT or QUI T Введите строку

П р о г р а м м и р о в а н ие на С#

Вы ввели: Программирование на С# Введите строку

-сплошное удовольствие

Вы ввели: Программирование на С# - сплошное удовольствие Введите строку

EXIT

П о л у ч и л о с ь :

204

Часть III.

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


Программирование на С# - сплошное удовольствие

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

Пользовательский ввод здесь выделен полужирным шрифтом.

Сравнение без учета регистра

Метод Compare ( ) , использованный в функции IsTerminateString ( ) , рассмат­ ривает строки "EXIT" и "exit" как различные. Однако имеется перегруженная версия функции Compare ( ) , которой передается три аргумента. Третий аргумент этой функции указывает, следует ли при сравнении игнорировать регистр букв (значение true) или нет (значение false). О перегрузке функций рассказывалось в главе 7, "Функции функций".

Следующая версия функции IsTerminateString () возвращает значение true, какими бы буквами не была введена команда завершения.

// IsTerminateString - возвращает значение true,

если

// исходная строка соответствует одной из команд

завершения

// программы

 

public static bool IsTerminateString (string source)

{

// Проверяет, равна ли переданная строка строкам exit

//или quit, независимо от регистра используемых букв return (String . Compare("exit", source, true) == 0)

(String . Compare("quit", source, true) = = 0 ) ;

)

Эта версия функции IsTerminateString () проще предыдущей версии с исполь­ зованием цикла. Ей не надо заботиться о регистре символов, и она может обойтись всего лишь двумя условными выражениями, так как ей достаточно рассмотреть только два ва­ рианта команды завершения программы.

Обратите внимание, что приведенная версия функции IsTerminateString () не применяет оператор if. Вычисленное значение логического выражения просто непосредственно передается пользователю, что позволяет избежать применения if.

Использование конструкции switch

Мне не нравится этот способ, но вы можете использовать конструкцию switch для поиска действий для конкретной строки. Обычно switch применяется для сравнения значения переменной с некоторым набором возможных значений, однако эту конструк­ цию можно применять и для объектов string. Вот как выглядит версия функции Is ­ TerminateString () с использованием конструкции switch.

//IsTerminateString - возвращает значение true,

если

// исходная строка соответствует одной из команд

завершения

// программы

 

public static bool IsTerminateString (string source)

{

switch (source)

{

case "EXIT" : case "exit" :

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

205