Материал: Разработка консольных приложений в Visual Studio .NET. практикум. Ганцева Е.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Console.WriteLine("Метод IsSeparator:");

Console.WriteLine("sym ' ' - IsSeparator - {0}", char.IsSeparator(' '));

Console.WriteLine("sym ';' - IsSeparator - {0}", char.IsSeparator(lim));

Console.WriteLine("Метод IsSurrogate:");

Console.WriteLine("sym '\u10FF' - IsSurrogate - {0}", char.IsSurrogate('\u10FF'));

Console.WriteLine("sym '\\' - IsSurrogate - {0}", char.IsSurrogate('\\'));

string str = "\U00010F00";

//Символы Unicode в интервале [0x10000,0x10FFF]

//представляются двумя 16-битными суррогатными символами

Console.WriteLine("str = {0}, str[0] = {1}", str, str[0]);

Console.WriteLine("str[0] IsSurrogate - {0}", сhar.IsSurrogate(str, 0));

Console.WriteLine("Метод IsWhiteSpace:");

str ="пробелы, пробелы!" + "\xD" + "\xA" + "Всюду пробелы!";

Console.WriteLine("sym '\xD ' - IsWhiteSpace - {0}", char.IsWhiteSpace('\xD')); Console.WriteLine("str: {0}", str);

Console.WriteLine("и ее пробелы - символ 8 {0},символ 17 {1}",

char.IsWhiteSpace(str,8), char.IsWhiteSpace(str,17));

Console.WriteLine("Метод Parse:");

str="A"; ch = char.Parse(str);

Console.WriteLine("str:{0} char: {1}",str, ch);

Console.WriteLine("Минимальное и максимальное значение:{0}, {1}", char.MinValue.ToString(), char.MaxValue.ToString());

Console.WriteLine("Их коды: {0}, {1}", SayCode(char.MinValue), SayCode(char.MaxValue)); }

Рис. 25. Операции со строками

Кроме статических методов, у класса Char есть и динамические. Большинство из них - это методы родительского класса Object, унаследованные и переопределенные в классе Char.

Метод CompareTo() проводит сравнение символов. Он отличается от метода Equal() тем, что для несовпадающих символов выдает «расстояние» между символами в соответствии с их упорядоченностью в кодировке Unicode.

static void testCompareChars()

{

char ch1, ch2;

int dif;

Console.WriteLine("Метод CompareTo");

ch1='A'; ch2= 'Z';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);

ch1='а'; ch2= 'А';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);

ch1='Я'; ch2= 'А';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);

ch1='A'; ch2= 'A';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);

ch1='А'; ch2= 'A';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);

ch1='Ё'; ch2= 'А';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);

}

Рис. 26. Операции с символами

Строчные буквы в кодировке непосредственно следуют за прописными буквами. Расстояние между алфавитами в кодировке довольно большое - русская буква А на 975 символов правее в кодировке, чем соответствующая буква в латинском алфавите.

Класс Char[] – массив символов, является наследником не только класса Object, но и класса Array, и, следовательно, обладает всеми методами родительских классов.

Например, метод Cop()y дает возможность выделять и заменять подстроку в строке. Методы IndexOf(), LastIndexOf() позволяют определить индексы первого и последнего вхождения в строку некоторого символа. Их нельзя использовать для операции нахождения индекса вхождения подстроки в строку. При необходимости можно написать такую функцию:

int IndexOfStr( char[]s1, char[] s2)

{

//возвращает индекс первого вхождения подстроки s2 в строку s1

int i =0, j=0, n=s1.Length-s2.Length;

bool found = false;

while( (i<=n) && !found)

{

j = Array.IndexOf(s1,s2[0],i);

if (j <= n)

{

found=true; int k = 0;

while ((k < s2.Length)&& found)

{

found =char.Equals(s1[k+j],s2[k]); k++;

}

}

i=j+1;

}

if(found) return(j); else return(-1);

}

Метод IndexOf() класса Array ищет начало совпадения строк, после чего проверяется совпадение остальных символов.

Строки происходят от базового класса – System.String.

Он обеспечивает множество методов, выполняющих черновую работу, табл. 8.

Метод Format(), как и большинство методов, является перегруженным и может вызываться с разным числом параметров. Первый необязательный параметр метода задает провайдера, определяющего национальные особенности, которые используются в процессе форматирования. Это должен быть объект, реализующий интерфейс System.IFormatProvider. Если этот параметр не задан, то используется культура, заданная по умолчанию.

Примеры:

public static string Format(string, object);

public static string Format(IFormatProvider, string, params object[]);

Параметр типа string задает форматируемую строку. Заданная строка содержит 1 или несколько форматов, они распознаются за счет окружающих формат фигурных скобок. Число форматов, вставленных в строку, определяет и число объектов, передаваемых при вызове метода.

Каждый формат определяет форматирование объекта, на который он ссылается и который, после преобразования его в строку, будет подставлен в результирующую строку вместо формата. Метод Format() возвращает переданную ему строку, где все спецификации формата заменены строками, полученными в результате форматирования объектов.

Таблица 8

Член класса

Назначение

Length

Свойство возвращает длину строки

Empty

Возвращается пустая строка. Свойство со статусом readonly

Concat()

Статический метод возвращает новую строку, склеенную из исходных. Метод перегружен, допускает сцепление произвольного числа строк

Compare()

Сравнение двух строк. Метод перегружен. Реализации метода позволяют сравнивать как строки, так и подстроки. При этом можно учитывать или не учитывать регистр, особенности национального форматирования дат, чисел

CompareOrdinal()

Сравнение двух строк. Метод перегружен. Реализации метода позволяют сравнивать как строки, так и подстроки. Сравниваются коды символов

CompareTo()

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

Copy()

Статический метод создает новую копию существующей строки

Format()

Используется для форматирования строки с использованием других примитивов (числовых данных, других строк) и подстановочных выражений вида {0}

Insert()

Вставляет строку внутрь существующей

PadLft()

PadRight()

Методы позволяют заполнить строку указанными символами

Remove()

Replace()

Методы создают копию строки с внесенными изменениями (удаленными или замененными символами)

ToUpper() ToLower()

Методы дают копии строки, в которой все символы станут строчными или прописными

Trim()

TrimStart()

TrimEnd()

Убирает пробелы с двух сторон строки,

с начала строки и в конце строки

Split()

Выделяет подстроки, ограниченные 1 или несколькими заданными символами, а затем переносит эти подстроки в массив string

Intern(),

IsIntern()

Отыскивается и возвращается ссылка на строку, если таковая уже хранится во внутреннем пуле данных. Если же строки нет, то первый из методов добавляет строку во внутренний пул, второй - возвращает null. Методы применяются обычно тогда, когда строка создается с использованием построителя строк - класса StringBuilder

Join

Конкатенация массива строк в единую строку. При конкатенации между элементами массива вставляются разделители. Операция, заданная методом Join, является обратной к операции, заданной методом Split.

Объекты класса String объявляются с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса.

Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. Но у класса String много конструкторов, позволяющих строить строку из:

- символа, повторенного заданное число раз;

- массива символов char[];

- части массива символов.

Примеры объявления строк:

public void TestDeclStrings()

{

//конструкторы

string world = "Мир";

//string s1 = new string("s1");

//string s2 = new string();

string sssss = new string('s',5);

char[] yes = "Yes".ToCharArray();

string stryes = new string(yes);

string strye = new string(yes,0,2);

Console.WriteLine("world = {0}; sssss={1}; stryes={2};"+" strye= {3}", world, sssss, stryes, strye);

}

Объект world создан без явного вызова конструктора, а объекты sssss, stryes, strye созданы разными конструкторами.

Не допускается явный вызов конструктора по умолчанию - конструктора без параметров. Нет конструктора, которому в качестве аргумента можно передать обычную строковую константу. Соответствующие операторы в тексте закомментированы.

При использовании операций == и != происходит сравнение значений строковых объектов, а не адресов этих объектов в оперативной памяти.

Операция сложения + в С# перегружена так, что при применении к строкам она вызывает метод Concat().

Пример использования членов класса System.String:

System.String strObj = "Это 1-я строка";

string s="Тест";

if (s == strObj)

Console.WriteLine("Одинаковые строки");

else

Console.WriteLine("Разные строки");

string newString = s+strObj;

Console.WriteLine("s + strObj = {0}", newString);

for (int i=0; i<s.Length; i++)

Console.WriteLine("{0}-й символ {1} ", i, s[i]);

Рис. 27. Сравнение строк

Ни один из методов класса String не меняет значения существующих объектов.

Аналогично, при работе со строкой как с массивом, разрешено только чтение отдельных символов, но не их замена.

//Неизменяемые значения

s1= "можно"; ch1 = s1[0];

// s1[0]='L'; ошибка

C# предлагает напрямую, без создания лишних копий, изменять строки. Это средство – класс StringBuilder, определенный в пространстве System.Text.

Все изменения, вносимые в объект этого класса, немедленно в нем отражаются. Часто это оказывается гораздо эффективнее, чем работать с множеством копий.

using System;

using System.Text; // здесь описан класс StringBuilder

namespace ConsoleApplication3

{

class Class1

{

static void Main(string[] args)

{

StringBuilder myBuf = new StringBuilder("Я - буфер");

myBuf.Append(" и меня можно увеличить...");

Console.WriteLine(myBuf);

} }

}

Рис. 28. Строка StringBuilder

В классе StringBuilder можно выполнять непосредственно со строками и другие операции, например, удалять или заменять символы. После обработки такой строки часто бывает удобно содержимое объекта StringBuilder перевести в обычную строку типа string.

using System;

using System.Text; // здесь описан класс StringBuilder

namespace ConsoleApplication3

{

class Class1

{

static void Main(string[] args)

{

StringBuilder myBuf = new StringBuilder("Я - буфер");

myBuf.Append(" и меня можно увеличить...");

Console.WriteLine(myBuf);

myBuf.Append(" и еще увеличить");

Console.WriteLine(myBuf);

string finalString = myBuf.ToString().ToUpper(); //в верх. регистр

Console.WriteLine(finalString);

}

} }

Рис. 29. Пример работы со строкой типа StringBuilder

Контрольные вопросы

1. Как задать строковую переменную?

2. Что общего между строкой и массивом символов?

3. Какие методы определены для строк?

4. Для чего используются методы массива символов?

5. Как работает метод Format()?

6. Чем отличается тип String от StringBuilder?

Содержание и порядок выполнения работы

Ознакомиться с теоретическими сведениями. По заданию преподавателя разработать программу и отчет.

Вариант 1

Найти в тексте, вводимом с клавиатуры, самое короткое слово. Предполагается, что слова разделены одним или несколькими пробелами или знаками препинания. Текст вводится с клавиатуры, его длина не превышает 1000 символов.

Вариант 2

Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить количество символов в самом коротком слове. Слова разделены пробелами и знаками препинания.

Вариант 3

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить максимальное количество подряд идущих пробелов. Слова разделены пробелами и знаками препинания.

Вариант 4

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить количество вхождений в текст заданного слова. Слова разделены пробелами и знаками препинания.

Вариант 5

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Удалить лишние подряд идущие пробелы. Слова разделены пробелами и знаками препинания.

Вариант 6

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Поменять местами 1-е и последнее слова каждого предложения. Слова разделены пробелами и знаками препинания.

Вариант 7

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Добавить в конец каждого предложения заданное слово. Слова разделены пробелами и знаками препинания.

Вариант 8

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. В каждом предложении слова переставить в обратном порядке. Слова разделены пробелами и знаками препинания.

Вариант 9

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Заключить во всем тексте заданное слово в кавычки. Слова разделены пробелами и знаками препинания.

Вариант 10

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. В тексте удалить все слова, совпадающие с заданным. Слова разделены пробелами и знаками препинания.

Вариант 11

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. В тексте поменять местами заданные слова. Слова разделены пробелами и знаками препинания.

Вариант 12

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Удалить из текста заданное слово. Слова разделены пробелами и знаками препинания.

Вариант 13

Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить порядковый номер заданного слова в каждом предложении. Слова разделены пробелами и знаками препинания.

Источник: https://studfile.net/preview/16562901/