1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 33
Текст из файла (страница 33)
Язык C#Вот результаты выполнения этой программы:Значение элемента равно: 1Значение элемента равно: 2Значение элемента равно: 3Значение элемента равно: 4Значение элемента равно: 5Значение элемента равно: 2Значение элемента равно: 4Значение элемента равно: 6Значение элемента равно: 8Значение элемента равно: 10Значение элемента равно: 3Значение элемента равно: 6Значение элемента равно: 9Значение элемента равно: 12Значение элемента равно: 15Сумма равна: 90Поскольку цикл fоreach может опрашивать массив последовательно (от начала кконцу), может сложиться впечатление, что его использование носит весьма ограниченныйхарактер.
Однако это не так. Для функционирования широкого круга алгоритмов требуетсяименно такой механизм. Одним из них является алгоритм поиска. Например, следующаяпрограмма использует цикл foreach для поиска в массиве заданного значения. Когдазначение найдено, цикл останавливается.// Поиск значения в массиве с помощью цикла foreach.using System;class Search {public static void Main() {int[] nums = new int[10];int val;bool found = false;// Присваиваем элементам массива nums значения.for(int i = 0; i < 10; i++)nums[i] = i;val = 5;}}// Используем цикл foreach для поиска в массиве nums// заданного значения.foreach(int x in nums) {if(x == val) {found = true; break;}}if(found)Console.WriteLine("Значение найдено!");Цикл foreach также используется для вычисления среднего значения, определенияминимального или максимально числа в наборе чисел, поиска дубликатов и т.д. Как будетпоказано далее, цикл foreach особенно полезен при работе с другими типами коллекций.Глава 7.
Массивы и строки171СтрокиС точки зрения ежедневного программирования одним из самых важных типовданных C# является тип string. Он предназначен для определения и поддержкисимвольных строк. Во многих других языках программирования строка представляет собоймассив символов. В C# дело обстоит иначе: здесь строки являются объектами. Такимобразом, string — это ссылочный тип.
Несмотря на то что string — встроенный типданных, для его рассмотрения необходимо иметь представление о классах и объектах.На самом деле мы негласно используем класс string, начиная с главы 2, но выпопросту об этом не знали. При создании строкового литерала в действительностисоздается объект класса string. Например, в инструкцииConsole.WriteLine("В C# строки являются объектами.");строка "В C# строки являются объектами." средствами языка C# автоматически превращенав объект класса string. Таким образом, в предыдущих программах мы подспудноиспользовали класс string. В этом разделе мы научимся работать с ними в явном виде.Создание строкСамый простой способ создать объект типа string — использовать строковыйлитерал.
Например, после выполнения приведенной ниже инструкции str будет объявленассылочной переменной типа string, которой присваивается ссылка на строковый литерал.string str = "C#-строки - это мощная сила.";В данном случае переменная str инициализируется последовательностью символов“C#-строки - это мощная сила.”.Можно также создать string-объект из массива типа char. Вот пример:char[] charray = ('t', 'e', 's', 't');string str = new string(charray);После создания string-объект можно использовать везде, где разрешаетсяиспользование строки символов, заключенной в кавычки. Например, string-объектможно использовать в качестве аргумента функции WriteLine(), как показано вследующем примере.// Знакомство со строками.using System;class StringDemo {public static void Main() {char[] charray = {'A', ' ', 's', 't', 'r','i', 'n', 'g', '.' };string str1 = new string(charray);string str2 = "Еще один string-объект.";}}172Console.WriteLine(str1);Console.WriteLine(str2);Часть I.
Язык C#Результаты выполнения этой программы таковы:A string.Еще один string-объект.Работа со строкамиКласс string содержит ряд методов, которые предназначены для обработки строк(некоторые из них показаны в табл. 7.1). Тип string также включает свойство Length,которое содержит длину строки.Чтобы получить значение отдельного символа строки, достаточно использоватьиндекс. Например:string str = "test";Console.WriteLine(str[0]);При выполнении этого фрагмента программы на экран будет выведен символ t(первый символ слова "test"). Как и у массивов, индексация строк начинается с нуля.Однако здесь важно отметить, что с помощью индекса нельзя присвоить символу внутристроки новое значение.
Индекс можно использовать только для получения символа.Таблица 7.1. Наиболее часто используемые методы обработки строкstatic string Copy(string str)int CompareTo(string str)int IndexOf(string str)int LastIndexOf(string str)string ToLower()string ToUpper()Возвращает копию строки strВозвращает отрицательное значение, если вызывающаястрока меньше строки str, положительное значение, есливызывающая строка больше строки str, и нуль, еслисравниваемые строки равныВыполняет в вызывающей строке поиск подстроки,заданной параметром str. возвращает индекс первоговхождения искомой подстроки или -1, если она не будетобнаруженаВыполняет в вызывающей строке поиск подстроки,заданной параметром str.
Возвращает индекс последнеговхождения искомой подстроки или -1, если она не будетобнаруженаВозвращает строчную версию вызывающей строкиВозвращает прописную версию вызывающей строкиЧтобы узнать, равны ли две строки, необходимо использовать оператор "==".Обычно, когда оператор "==" применяется к ссылочным объектам, он определяет,относятся ли обе ссылки к одному и тому же объекту. Но применительно к объектам типаstring дело обстоит иначе.
В этом случае проверяется равенство содержимого двух строк.То же справедливо и в отношении оператора "!=". Что касается остальных операторовотношения (например, ">" или ">="), то они сравнивают ссылки так же, как и объектыдругих типов.Рассмотрим программу, которая демонстрирует выполнение ряда операций надстроками.// Демонстрация выполнения некоторых операций над строками.using System;class StrOps {public static void Main() {string str1 ="В .NET-программировании без C# не обойтись.";string str2 = string.Copy(str1);Глава 7.
Массивы и строки173string str3 = "C#-строки — могучая сила.";string strUp, strLow; int result, idx;Console.WriteLine("str1: " + str1);Console.WriteLine("Длина строки str1: " + str1.Length);// Создаем прописную и строчную версии строки str1.strLow = str1.ToLower();strUp = str1.ToUpper();Console.WriteLine("Строчная версия строки str1:\n " +strLow);Console.WriteLine("Прописная версия строки str1:\n " +strUp);Console.WriteLine();// Отображаем str1 в символьном режиме.Console.WriteLine("Отображаем str1 посимвольно.");for(int i=0; i < str1.Length; i++)Console.Write(str1[i]);Console.WriteLine("\n");// Сравниваем строки.if(str1 == str2)Console.WriteLine("str1elseConsole.WriteLine("str1if(str1 == str3)Console.WriteLine("str1elseConsole.WriteLine("str1== str2");!= str2");== str3");!= str3");result = str1.CompareTo(str3);if(result == 0)Console.WriteLine("str1 и str3 равны.");else if(result < 0)Console.WriteLine("str1 меньше, чем str3");elseConsole.WriteLine("str1 больше, чем str3");Console.WriteLine();// Присваиваем str2 новую строку.str2 = "Один Два Три Один";// Поиск строк.idx = str2.IndexOf("Один");Console.WriteLine("Индекс первого вхождения подстроки Один: " + idx);idx = str2.LastIndexOf("Один");Console.WriteLine("Индекс последнего вхождения подстроки Один: " + idx);}}174Часть I.
Язык C#При выполнении этой программы получаем следующие результаты:str1: В .NET-программировании без C# не обойтись.Длина строки str1: 43Строчная версия строки str1:в .net-программировании без C# не обойтись.Прописная версия строки str1:В .NET-ПРОГРАММИРОВАНИИ БЕЗ C# НЕ ОБОЙТИСЬ.Отображаем str1 посимвольно.В .NET-программировании без C# не обойтись.str1 == str2str1 != str3str1 больше, чем str3Индекс первого вхождения подстроки Один: 0Индекс последнего вхождения подстроки Один: 13С помощью оператора "+" можно конкатенировать (объединить) несколько строк.Например, при выполнении этого фрагмента кодаstring str1 = "Один";string str2 = "Два";string str3 = "Три";string str4 = str1 + str2 + str3;переменная str4 инициализируется строкой "ОдинДваТри".И еще. Ключевое слово string представляет собой псевдоним для класса System.String, определенного библиотекой классов среды .NET Framework.
Таким образом, поляи методы, определяемые типом string, по сути являются полями и методами классаSystem.String (здесь были представлены только некоторые из них). Подробно классSystem.String рассматривается в части П.Массивы строкПодобно другим типам данных, строки могут быть собраны в массивы. Рассмотримпример.// Демонстрация использования массивов строк.using System;class StringArrays {public static void Main() {string[] str = { "Это", "очень", "простой", "тест." };Console.WriteLine("Исходный массив: ");for(int i=0; i < str.Length; i++)Console.Write(str[i] + " ");Console.WriteLine("\n");}}// Изменяем строку.str[1] = "тоже";str[3] = "тест, не правда ли?";Console.WriteLine("Модифицированный массив: ");for(int i=0; i < str.Length; i++)Console.Write(str[i] + " ");Глава 7.
Массивы и строки175После выполнения этой программы получаем такие результаты:Исходный массив:Это очень простой тест.Модифицированный массив:Это тоже простой тест, не правда ли?А вот пример поинтереснее. Следующая программа отображает целочисленноезначение с помощью слов. Например, значение 19 будет отображено как словосочетание“один девять”.// Отображение цифр целого числа с помощью слов.using System;class ConvertDigitsToWords {public static void Main() {int num;int nextdigit;int numdigits;int[] n = new int[20];string[] digits = { "нуль", "один", "два","три", "четыре", "пять","шесть", "семь", "восемь","девять" };num = 1908;Console.WriteLine("Число: " + num);Console.Write("Число в словах: ");nextdigit = 0; numdigits = 0;/* Получаем отдельные цифры и сохраняем их в массиве п.Эти цифры хранятся в обратном порядке.