- •Глава 9. Многомерные массивы
- •9.1 Прямоугольные массивы
- •9.1.1 Объявления и инициализация
- •9.1.2 Примеры
- •9.2 Ступенчатые массивы
- •9.2.1 Объявления и инициализация
- •9.2.2 Примеры
- •9.3 Оператор цикла с перебором foreach
- •9.4 Массивы с числом размерностей больше двух
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 10. Исключительные ситуации
- •10.1 Основные понятия
- •10.2 Механизм обработки исключений
- •10.3 Примеры обработки исключений
- •10.4 Оператор throw
- •10.5 Дополнительные сведения
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 11. Обработка текстовой информации
- •11.1 Символьный тип char
- •11.2 Массив символов
- •11.3 Тип String
- •11.4 Класс StringBuilder
- •11.5 Форматирование строк
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
11.3 Тип String
Тип stringпредназначен для определения и поддержки символьных строк. Самый простой способ создать объект типаstring–использовать строковый литерал:
string str = "Обработка С# - строк";
Существуют и другие варианты создания строк.
Объявление без инициализации:
string s;
С помощью оператора newсоздается строка из пяти символов:
string s= new string(‘*‘,5);
Создание и инициализация строки из массива символов:
char[] a = {‘0’,’0’,’0’};
string v = new string(a);
Последовательность символов, составляющих строку, изменить нельзя. Это связано с тем, что строки типа string относятся к так называемым неизменяемым типам данных. Поэтому обращаться к отдельному элементу строки по индексу (например,s[i]) можно только для получения значения, но не для его изменения.
Хотя это кажется серьезным недостатком, на самом деле это не так. Это ограничение позволяет С# эффективно использовать строки. Если понадобится строка, которая должна содержать изменения уже существующей строки, то потребуется создать новую строку. Поскольку неиспользуемые строковые объекты автоматически утилизируются системой сбора мусора.
При описании строковой переменной память под нее отводится по максимуму. При работе же с переменной может использоваться лишь часть этой памяти, реально занятая символами строки в данный момент.
Для строк определены следующие операции:
присваивание (=);
проверка на равенство (==); (Строки равны, если имеют одинаковое количество символов и совпадают посимвольно) ;
проверка на неравенство (!=);
обращение по индексу ([ ]);
конкатенация (сцепление) строк (+).
Пример 3. Дан массив слов. Составить программу, которая вводит исходный массив, затем вводит поочередно различные слова и проверяет, имеются ли такие слова в исходном массиве.
Сформулированная задача в данной постановке подобна многим другим, осуществляющим обработку элементов одномерного массива глава 8). Основное отличие данной задачи заключается в том, что в этом случае поиск требуемого элемента должен производиться не в числовом массиве, а в массиве слов. Программа представлена в листинге 3. Ее исполнительная часть содержит вложенные циклы.
Наличие внешнего цикла объясняется тем, что пользователю предоставляется возможность поиска не одного, а нескольких слов в массиве, содержащем ksслов. Чтобы предоставить ему неограниченную свободу в поиске, внешний цикл организован с помощью цикла с постусловием, работа которого завершается при введении для поиска слова«конец».
Внутренний цикл представляет собой также цикл с постусловием, в котором просматриваются поочередно слова массива, начиная с первого элемента. В том случае, если будет найден элемент массива, совпадающий с введенным во внешнем цикле словом, формируется признак pr=trueи завершается работа внутреннего цикла. Пользователь переходит к поиску следующего слова. По поиску каждого слова выдается сообщение о том, найдено ли оно или нет.
Листинг 3
using System;
namespace ConsoleApplication1
{ class Program
{ static void Main(string[] args)
{ int ks,n=15;
bool pr;
string s;
string[] sl=new string[n];
Console.WriteLine("Введите количество слов в массиве: ks");
ks = Convert.ToInt32(Console.ReadLine());
for (int k=1; k<ks; k++)
{ Console.WriteLine("Введите слово массива");
sl[k]=Console.ReadLine();
}
do
{ Console.WriteLine("Введите новое слово");
s = Console.ReadLine();
pr = false;
int j = 0;
do
{ if (sl[j] == s) pr = true;
j++;
}
while ((pr == false) && (j < ks));
if (pr) Console.WriteLine("Да, такое слово есть");
else Console.WriteLine("Такого слова нет");
}
while (s != "конец");
}
}
}
Результаты работы программы:
Для облегчения работы со строками в языке С# существует специальный класс System.String (табл. 11.2).
Таблица 11.2 – Основные элементы класса System.String
Название |
Тип |
Пояснение |
1 |
2 |
3 |
Compare |
Статич. метод |
Сравнение двух строк в лексикографическом (алфавитном) порядке |
Compare Ordinal |
Статич. метод |
Сравнение двух строк по кодам символов |
CompareTo |
Метод |
Сравнение текущей строки с другой строкой |
Concat |
Статич. метод |
Конкатенация строк. Метод допускает сцепление произвольного числа строк |
Copy |
Статич. метод |
Создание копии строки |
Empty |
Статич. поле |
Пустая строка (только для чтения) |
Format |
Статич. метод |
Форматирование в соответствии с заданными спецификаторами формата |
IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny |
Методы |
Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора |
Insert |
Метод |
Вставка подстроки в заданную позицию |
Intern, IsInterned |
Статич. методы |
Возвращает ссылку на строку. Если строки нет, Intern добавляет строку во внутренний пул, IsIntern возвращает null |
Join |
Статич. метод |
Слияние массива строк в единую строку. Между элементами массива вставляются разделители |
Length |
Свойство |
Длина строки (количество символов)
|
1 |
2 |
3 |
PadLeft, PadRight |
Методы |
Выравнивание строки по левому или правому краю путем вставки нужного числа пробелов |
Remove |
Метод |
Удаление подстроки из заданной позиции |
Replace |
Метод |
Замена всех вхождений заданной подстроки или символа новой подстрокой или символом |
Split |
Метод |
Разделение строки на элементы, используя заданные разделители. Результаты помещаются в массив строк |
StartsWith, EndsWith |
Методы |
Возвращает true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой |
Substring |
Метод |
Выделение подстроки, начиная с заданной позиции |
ToCharArray |
Метод |
Преобразование строки в массив символов |
ToLower, ToUpper |
Методы |
Преобразование символов строки к нижнему или верхнему регистру |
Trim, Trim Start, TrimEnd |
Методы |
Удаление пробелов в начале и конце строки или только с одного ее конца (обратные по отношению к методам PadLeft и PadRight действия) |
Рассмотрим пример с использованием методов этого класса.
Пример 4.
Листинг 4 – Использование методов класса System.String
using System;
namespace ConsoleApplication1
{ class Program
{ static void Main(string[] args)
{ int ks=5;
string s,s1;
string[] sl=new string[ks];
for (int k=1; k<ks; k++)
{ Console.WriteLine("Введите слово массива");
sl[k]=Console.ReadLine();
}
s = string.Join(":", sl);
Console.WriteLine(s);
s1 = s.Replace(":",",");
Console.WriteLine(s1);
s = s1.Substring(1);
Console.WriteLine(s);
s1 = s.ToUpper();
Console.WriteLine(s1);
}
}
}
Результат работы программы:
Данная программа демонстрирует использование ряда методов класса System.String. В ней сначала вводится произвольная строка, а затем осуществляется четыре последовательных вызова различных методов классаSystem.String.
В операторе s = string.Join(":", sl); вызывается статический методJoin (он вызывается через имя класса) слияния массива строкslв единую строкуs, помещая между словами в строке разделитель«:».
В операторе s1=s.Replace(":",",");вызывается методReplace, осуществляющий замену всех вхождений символа":"новым символом, в нашем случае",", и присваивание полученного результата строкеs1.
В операторе s = s1.Substring(1);вызывается методSubstring, который возвращает подстроку из строкиs1, начиная с первой позиции, отбрасывая первый символ«:»и присваивая результат строкеs.
В операторе s1 = s.ToUpper();вызывается методToUpper, выполняющий преобразование символов строки к верхнему регистру. Результат присваивается строкеs1.
Пример 5. Дана последовательность, состоящая из 10 слов. Напечатать все различные слова, указав для каждого из них число его вхождений в последовательность.
Листинг 5 – К примеру 5
using System;
namespace primer
{
class Program
{
static void Main(string[] args)
{/*CompareOrdinal---Сравнение двух строк по кодам символов.
* Разные реализации метода позволяют сравнивать строки и подстроки
* CompareTo----Сравнение текущего экземпляра строки с другой строкой
* 12. Дана последовательность,
* состоящая из 10 слов.
* Напечатать все различные слова,
* указав для каждого из них число его вхождений в последовательность.
*/
int col = 0;
int ks = 10;
string[] sl = new string[ks];
Console.WriteLine("Введите 10 слов ");
for (int k = 0; k < ks; k++)
{
sl[k] = Console.ReadLine();
}
Console.WriteLine("Количество вхождений");
for (int i = 0; i < ks; i++)
{
col = 0;
for (int j = 0; j < ks; j++)
{
if (String.Compare(sl[i], sl[j]) == 0) col++;
}
Console.WriteLine(sl[i] + " Количество вхождений слова в последовательность " + col);
}
}
}
}
Результат работы программы: