"Сокрытие деталей реализации называется инкапсуляцией (от слова "капсула"). " Сколько можно объяснять?! ИНКАПСУЛЯЦИЯ НЕ РАВНА СОКРЫТИЮ!!! Инкапсуляция это парадигма ООП, которая ОБЕСПЕЧИВАЕТ СОКРЫТИЕ!!! НО СОКРЫТИЕМ НЕ ЯВЛЯЕТСЯ!!! Если буровая коронка обеспечивает разрушение породы, то является ли она сама разрушением породы? Конечно нет! |
Массивы, символы и строки
Строки типа string
Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом C#. Ему соответствует базовый класс System.String библиотеки .NET.
Создать строку можно несколькими способами:
string s; // инициализация отложена string t = "qqq"; // инициализация строковым литералом string u = new string(' ', 20); // конструктор создает строку из 20 пробелов char[] a = { '0', '0', '0' }; // массив для инициализации строки string v = new string( a ); // создание из массива символов
Для строк определены следующие операции:
- присваивание ( = );
- проверка на равенство ( == );
- проверка на неравенство ( != );
- обращение по индексу ( [] );
- сцепление (конкатенация) строк ( + ).
Несмотря на то, что строки являются ссылочным типом данных, на равенство и неравенство проверяются не ссылки, а значения строк. Строки равны, если имеют одинаковое количество символов и совпадают посимвольно.
Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Это связано с тем, что строки типа string относятся к так называемым неизменяемым типам данных. Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые "старые" копии автоматически удаляются сборщиком мусора.
В классе System.String предусмотрено множество методов, полей и свойств, позволяющих выполнять со строками практически любые действия. Некоторые элементы класса приведены в таблилце 6.3, с остальными можно ознакомиться по учебнику.
Пример применения методов приведен в листинге 6.8.
using System; namespace ConsoleApplication1 { class Class1 { static void Main() { string s = "прекрасная королева Изольда"; Console.WriteLine( s ); string sub = s.Substring( 3 ).Remove( 12, 2 ); // 1 Console.WriteLine( sub ); string[] mas = s.Split(' '); // 2 string joined = string.Join( "! ", mas ); Console.WriteLine( joined ); Console.WriteLine( "Введите строку" ); string x = Console.ReadLine(); // 3 Console.WriteLine( "Вы ввели строку " + x ); double a = 12.234; int b = 29; Console.WriteLine( " a = {0,6:C} b = {1,2:X}", a, b ); // 4 Console.WriteLine( " a = {0,6:0.##} a = {1,5:0.# ' руб. '}", a, b ); // 5 } } }Листинг 6.8. Работа со строками типа string
Результат работы программы:
прекрасная королева Изольда красная корова Изольда прекрасная! королева! Изольда Введите строку не хочу! Вы ввели строку не хочу! a = 12,23p. b = 1D a = 12,23 a=29 pуб.
Форматирование строк
В операторе 4 из листинга 6.7 неявно применяется метод Format, который заменяет все вхождения параметров в фигурных скобках значениями соответствующих переменных из списка вывода. После номера параметра можно задать минимальную ширину поля вывода, а также указать спецификатор формата, который определяет форму представления выводимого значения.
В общем виде параметр задается следующим образом:
{n [,m[:спецификатор_формата]]}
Здесь n — номер параметра. Параметры нумеруются с нуля, нулевой параметр заменяется значением первой переменной из списка вывода, первый параметр — второй переменной, и т. д. Параметр m определяет минимальную ширину поля, которое отводится под выводимое значение. Если выводимому числу достаточно меньшего количества позиций, неиспользуемые позиции заполняются пробелами. Если числу требуется больше позиций, параметр игнорируется.
Спецификатор формата, как явствует из его названия, определяет формат вывода значения. Например, спецификатор C (Currency) означает, что параметр должен форматироваться как валюта с учетом национальных особенностей представления, а спецификатор Х (Hexadecimal) задает шестнадцатеричную форму представления выводимого значения.
В операторе 5 используются так называемые пользовательские шаблоны форматирования. Если приглядеться, в них нет ничего сложного: после двоеточия задается вид выводимого значения посимвольно, причем на месте каждого символа может стоять либо #, либо 0. Если указан знак #, на этом месте будет выведена цифра числа, если она не равна нулю. Если указан 0, будет выведена любая цифра, в том числе и 0.
Строки типа StringBuilder
Возможности, предоставляемые классом string, широки, однако требование неизменности его объектов может оказаться неудобным. В этом случае для работы со строками применяется класс StringBuilder, определенный в пространстве имен System.Text и позволяющий изменять значение своих экземпляров. О нем можно прочитать в учебнике [4].
Вопросы и задания для самостоятельной работы студента
- Перечислите способы описания массивов.
- Чем отличается хранение в памяти массивов из величин значимого и ссылочного типов?
- Является ли размерность частью описания массива?
- Может ли размерность массива описана переменной (а не константой)?
- Можно ли изменить размерность массива после выделения памяти под него?
- Какие виды массивов используются в С#?
- Что происходит, если количество инициализаторов массива не соответствует заявленной размерности?
- Что происходит при присваивании массивов?
- Опишите два-три метода сортировки массивов.
- Опишите основные методы и свойства класса System.Array
- Какие ограничения имеет оператор foreach по сравнению с оператором for?
- Что такое кодировка Unicode?
- Какие средства работы с отдельными символами предоставляет C#?
- Опишите основные методы и свойства класса string.
- Можно ли изменить длину строки после того, как память под нее была выделена?
- Какое основное ограничение имеет класс string?
- Какие существуют возможности форматирования строк?
- Перечислите спецификации формата.
- Опишите пользовательский формат вещественного числа с двумя ведущими нулями и тремя знаками после запятой.
- Изучите по справочной системе свойства и методы стандартного класса System.Array.
- Изучите по справочной системе свойства и методы стандартного класса System.String.
- Изучите по справочной системе свойства и методы стандартного класса System.Char.
- Изучите по справочной системе свойства и методы стандартного класса System.Text.StringBuilder.
- Изучите разделы стандарта C#, касающиеся массивов.
- Изучите разделы стандарта C#, касающиеся символов.
- Изучите разделы стандарта C#, касающиеся строк.
Лабораторные работы
Лабораторная работа 5. Одномерные массивы
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
- сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами.
Упорядочить элементы массива по возрастанию.
Лабораторная работа 6. Двумерные массивы
Дана целочисленная прямоугольная матрица. Определить:
- количество строк, не содержащих ни одного нулевого элемента;
- максимальное из чисел, встречающихся в заданной матрице более одного раза.
Лабораторная работа 7. Строки
В файле находится текст, состоящий не более чем из 50 предложений. Перед выполнением индивидуального варианта задания необходимо считать содержимое этого файла в массив строк, предусмотрев обработку исключений.
В качестве результата выполнения работы вывести на консоль предложения, преобразованные в соответствии с вариантом задания. Каждое предложение начинать с новой строки.
Задание выполнить двумя способами: без использования элементов стандартных классов System.Array, System.Char и System.String и с их использованием.
Задание: упорядочить предложения по возрастанию количества содержащихся в них слов.