Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование. Введение в разработку на C#. Учебное пособие
.pdf
Данный код позволяет вывести массив в виде матрицы с
форматированием по строкам и столбцам. Результат вывода:
1 2 3
4 5 6
7 8 9
3) прохождение многомерно массива от начала до конца по
столбцам-строкам:
int[,] Arr =
{{1,2,3},
{4,5,6},
{7,8,9}};
for (int i = 0; i < Arr.GetLength(0); i++)
{
for (int j = 0; j < Arr.GetLength(1); j++)
Console.Write(Arr[j, i] + " ");
Console.WriteLine();}
Для этого достаточно поменять местами переменные строк и столбцов.
Результат:
1 4 7
2 5 8
3 6 9
4) поиск элементов по диагонали для квадратных массивов:
Если учесть, что движение по диагонали происходит при одинаковых значениях строк и столбцов, то путем добавления простого условия
к вышеприведенному коду получаем:
for (int i = 0; i < Arr.GetLength(0); i++)
for (int j = 0; j < Arr.GetLength(1); j++)
if (i == j)
Console.Write(Arr[j, i] + " ");
5) взятие первого или последнего элемента:
Первый элемент в массиве всегда имеет нулевые индексы Arr[0] или
Arr[0,0] и так далее, а последний элемент можно получить с помощью
51

конструкции [Length – 1], для одномерного массива и [Arr.GetLength(0),
Arr.GetLength(1)] для двухмерного. Данные операторы возвращают ко-
личество элементов, поэтому требуется вычитание 1.
6) движение по массивам с заданным шагом:
Самым простым вариантом является изменение приращения в теле
цикла с i++ на нужное. Для более сложных вариантов можно перейти к
использованию циклов while и do-while.
5.4. Вопросы для самопроверки
1. Каково определение понятия «массив»?
2. При помощи каких функций, объектов и языковых конструкций
организуется работа с массивами в языке C#?
3. В какой области памяти хранятся массивы?
4. На какие два вида делятся массивы?
5.5. Задания для самопроверки
1. Создать программу, которая на вход принимает цифру от 1 до 5 –
длину массива. Далее, создаётся массив указанной длины, и пока он не
будет заполнен, программа считывает числа и заносит их в массив. Затем программа выводит на экран содержимое массива и заканчивает
работу.
2. Создайте программу-тест, задающую респонденту вопросы, ответ на которые находится в диапазоне от 1 до 5. По результатам тестирования программа выводит средний балл от всех ответов.
3. Разработайте приложение демонстрирующее работу с одномерными массивами. Определите функции для выдачи содержимого массива на экран и для перестановки элементов массива. Инициализируйте
массив в момент создания. Выведите содержимое массива на экран.
Переставьте элементы массива и снова выведите содержимое массива
на экран.
Задание повышенной сложности.
52

4*. Познакомьтесь с понятием «невыровненный» («рваный») массив
[1,2]. Разработайте приложение, демонстрирующее работу с рваными
массивами. Определите функции для выдачи содержимого массива на
экран и для перестановки элементов массива. Инициализируйте массив
с помощью отдельных инструкций присваивания. Выведите содержимое массива на экран. Переставьте элементы массива и снова выведите
содержимое массива на экран.
53

6. РАБОТА СО СТРОКАМИ И СИМВОЛАМИ
6.1. Строковой тип String
Тип string представляет последовательность из нуля или более
символов в кодировке Юникод.
Несмотря на то, что тип string является ссылочным типом, операторы
равенства (== и !=) определены для сравнения значений объектов типа
string, а не ссылок. Это упрощает проверку равенства строк [6].
Строки являются неизменяемыми: содержимое строкового объекта
невозможно изменить после создания объекта, хотя из-за синтаксиса
изменения кажутся возможными. Например, в случае конкатенации
строк, компилятор на самом деле создает новый строковый объект для
новой последовательности знаков.
Литералы из точных строк начинаются со знака @ и заключены в
двойные кавычки. Преимущество точных сток заключается в том, что
escape-последовательности не обрабатываются, благодаря чему можно
удобно написать, например, полное имя и путь файла.
Тип string имеет множество полезных методов для преобразования
строк [5]:
Compare(String, String) – сравнивает два указанных объекта String и воз-
вращает целое число, которое показывает их относительное положение
в порядке сортировки.
Concat(String[]) – сцепляет элементы указанного массива String.
Contains – возвращает значение, указывающее, содержит ли данная
строка заданный объект типа String.
Copy – создает новый экземпляр String, имеющий то же значение, что и
заданный экземпляр String.
CopyTo – копирует заданное число знаков, начиная с указанной позиции в
этом экземпляре до указанной позиции в массиве знаков Юникода.
EndsWith(String) – определяет, совпадает ли конец данного экземпляра
строки с указанной строкой.
54

Format(String, Object) – заменяет один или более элементов формата в
указанной строке строковым представлением указанного объекта.
IndexOf(String) – возвращает индекс с отсчетом от нуля первого вхождения значения указанной строки в данном экземпляре.
Insert – возвращает новую строку, в которой указанная строка вставляется на указанной позиции индекса в данном экземпляре.
Join(String, Ienumerable<String>) – сцепляет элементы созданной коллекции IEnumerable<T> типа String, помещая между ними заданный
разделитель.
LastIndexOf(String) – возвращает позицию индекса с отсчетом от нуля
последнего вхождения указанной строки в данном экземпляре.
PadLeft(Int32) – возвращает новую строку, в которой знаки данного экземпляра выровнены по правому краю путем добавления слева пробелов до указанной общей длины.
PadRight(Int32) – возвращает новую строку, в которой знаки данной
строки выровнены по левому краю путем добавления справа пробелов
до указанной общей длины.
Remove(Int32, Int32) – возвращает новую строку, в которой было удалено указанное число символов в указанной позиции.
Replace(String, String) – возвращает новую строку, в которой все вхождения заданной строки в текущем экземпляре заменены другой заданной строкой.
Split(Char[]) – возвращает строковый массив, содержащий подстроки
данного экземпляра, разделенные элементами заданного массива знаков
Юникода.
StartsWith(String) – определяет, совпадает ли начало данного экземпляра
строки с указанной строкой.
ToLower() – возвращает копию этой строки, переведенную в нижний регистр.
ToUpper() – возвращает копию этой строки, переведенную в верхний
регистр.
Trim() – удаляет все начальные и конечные знаки пробела из текущего
объекта String.
55

6.2. Примеры работы с типом String
Следующие несколько примеров демонстрируют различные методы, предоставляемые С# для сравнения строк. Как было сказано выше,
класс string предоставляет несколько способов сравнения строк. Далее
показано использование методов Equals и CompareTo и оператора сравнения (=).
Для примеров объявим 5 переменных:
string str1 = "Первая строка";
string str2 = str1;
string str3 = "вторая строка";
string str4 = "Вторая строка";
string str5 = "Вторая строка";
и далее проделаем несколько проверок:
if (str1.Equals(str2))
Console.WriteLine("=="); // ==
if (str4.Equals(str5))
Console.WriteLine("=="); // ==
Условие в операторе if использует метод экземпляра Equals для сравнения значения str1 и значения str2, переданного по ссылке (так как тип
string относится к типам передаваемым по ссылке) литерала string
«Первая строка» для определения их равенства. Метод Equals (унаследован классом string из класса object, переопределен для проверки равенства значений, а не ссылок) проверяет любые два объекта на равенство (т. е. проверяет, содержат ли эти объекты идентичные компоненты). Метод возвращает true, если объекты равны, в противном
случае возвращает false. В данном случае предшествующее условие
возвращает true, потому, что str2 делает ссылку на объект «Первая строка» строкового литерала. Метод Equals использует лексикографическое
56

сравнение – целочисленные значения Unicode, представляющие символы в каждой строке.
if (str1 == str2)
Console.WriteLine("=="); // ==
if (str4 == str5)
Console.WriteLine("=="); // ==
Условие в данном примере использует оператор (==) для сравнения
строк на предмет их равенства. В С# оператор равенства также базируется на лексикографическом сравнении двух строк. Таким образом, условие в операторе if оценивается как true, потому что значения str1, str2
и str4, str5 равны.
if (str3 == str4)
Console.WriteLine("==");
else
Console.WriteLine("!="); // !=
Сравнение строки «вторая строка» со строкой "Вторая строка" возвратит false, потому что числовое представление строчных букв отличается от числового представления соответствующих им прописных
букв.
Console.WriteLine(str3.CompareTo(str4));
Для сравнения в последнем примере применяется метод CompareTo
класса string. Метод CompareTo возвращает: значение 0, если строки
равны; -1, если строка, активизирующая CompareTo, меньше строки,
переданной в качестве аргумента; и 1, если строка, активизирующая
метод CompareTo, больше строки, переданной в качестве аргумента.
Метод CompareTo использует лексикографическое сравнение. В данном
примере вернется -1 из-за неравенства строк.
57

Для того, чтобы убедиться в неизменяемости строк, проделаем
следующие, часто используемые, манипуляции на примерах:
str1.Remove(0,6);
Если теперь посмотреть результат выполнения команды удаления
первых 6 символов, то окажется, что строка «Первая строка» не изменилась и осталась «Первая строка».
Чтобы изменения вступили в силу, необходимо результат присваивать новой строке:
str2 = str1.Remove(0, 6);
Console.WriteLine(str2);
Было "Первая строка"
Стало "строка"
str1 = str2.Insert(0, "Новая");
Было "строка"
Стало "Новая строка"
str2 = str1.ToUpper();
Было "Новая строка"
Стало "НОВАЯ СТРОКА"
str1 = str2.Replace("НОВАЯ", "Старая");
Было "НОВАЯ СТРОКА"
Стало "Старая строка"
Чтобы определить индекс любого символа, можно воспользоваться такой командой:
58

Console.WriteLine(str1.IndexOf(' '));
Вернет число 6 – это, начиная от нуля, индекс пробела.
Со строками можно работать в стиле массивов, но только на чтение.
Например, так:
int i=0;
foreach (char ch in str1)
if (ch == 'а')
i++;
Console.WriteLine(i);
Подсчитывает количество символов 'а' в строке.
6.3. Тип работы со строками StringBuilder
Как уже говорилось ранее, при конкатенации строк создается новый
экземпляр строки, потому что объекты строк неизменны. Это может
сказываться на производительности приложений, собирающих из
небольших строк длинные документы в текстовом виде. Такие задачи
решает большинство современных приложений, примерами которых
являются Web-серверы и шаблонизаторы HTML-разметки.
Для таких задач существует специальный класс StringBuilder. Он
позволяет экономно расходовать уже выделенную память для сборки
всего документа из множества подстрок. Его основным методом является Append, который добавляет к внутреннему представлению строки
входной объект и делает это очень быстро. И конечно он обладает классическими методами, сходными с таковыми из типа String: Replace, Re-
move, Insert и другими.
string str;
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append("Первая");
strBuilder.Append(" строка");
59

strBuilder.Replace("Первая", "Новая");
strBuilder.Remove(0,5);
strBuilder.Insert(0, "Модифицированная");
Пример выше дает представление о принципах работы с типом.
Связь между типами StringBuilder и String осуществляется через приведение
str = strBuilder.ToString();
Ряд независимых исследований (http://www.chinhdo.com/20070224/
stringbuilder-is-not-always-faster/) показал, что использование StringBuilder
для сборки строк имеет смысл, если сложная строка состоит не менее
чем из трех простых строк.
6.4. Символьный тип Char
Тип Char используется для представления одного символа в стандарте Unicode. Большинство методов структуры Char являются статическими (static), принимают минимум один символ в качестве аргумента и выполняют либо проверку этого символа, либо определенную манипуляцию им. Данный тип напрямую связан с типом String – строка
состоит из символов Char. В следующем примере показано определение символа пользовательского ввода:
Char ch;
Console.Write("Введите символ = ");
ch = Char.Parse(Console.ReadLine());
if (Char.IsDigit(ch))
Console.WriteLine("Цифра");
if (Char.IsLetter(ch))
Console.WriteLine("Буква");
if (Char.IsLetterOrDigit(ch))
Console.WriteLine("Цифра или буква");
if (Char.IsLower(ch))
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
