Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 39
Текст из файла (страница 39)
Еогеасп(апг х Еп пцщз) ( Сопао1е.нг1геьапе("Значение элемента равно: " + х)4 зцщ + х) ) Сопао1е.нггсеьапе("Сумма равна: " т зцщ) ) ) ) Выполнение этой программы дает следующий результат: равно: 1 равно: 2 равно: 3 равно: 4 равно: 5 равно: 2 равно: 4 равно: б равно: 8 равно: 10 равно: 3 равно: б равно: 9 равно: 12 равно: 15 Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Значение элемента Сумма равна: 90 // Поиск в массиве с помощью оператора цикла Еогеасв.
цз1пд Зузгещ) Оператор Еогеасп допускает циклическое обращение к массиву только в определенном порядке: от начала и до конца массива, поэтому его применение кажется, на первый взгляд, ограниченным. Но на самом деле это не так. В большом числе алгоритмов, самым распространенным из которых является алгоритм поиска, требуется именно такой механизм. В качестве примера ниже приведена программа, в которой цикл Еогеасп используется для поиска в массиве определенного значения. Как только это значение будет найдено, цикл прервется. Глава 7.
Массивы и строки 193 с1аяя Яеагсп ( ясаггс чсгб маги() ( гпс[) пцюя = пен 1пг[10) тпг ча1т Ьсс1 гсцпб = Га1яет // Задать первоначальные значения'элементов // массива пцтвя. Гсг(1пс г О) 1 < 10) 1+е) пцюя[1) = 1т ча1 = 5 // Использовать цикл гсгеасп для поиска эаданногс // значения в массиве пцюя. Гогеасп(гпс х 1п пцюя) ( 1Е(х == ча1) ( Гоцпб = Ггце; ЬгеаК; ) ) 11(тсцпб) Сспяс1е.нг1сеь1пе("Значение найдено!")т При выполнении этой программы получается следующий результат; Значение найдено! ' Оператор цикла Еогеасп отлично подходит для такого применения, поскольку при поиске в массиве приходится анализировать каждый его элемент.
К другим примерам применения оператора цикла гогеасЬ относится вычисление среднего, поиск минимального или максимального значения среди ряда заданных значений, обнаружение дубликатов и т д. Как будет показано далее в этой книге, оператор цикла гогеасЬ оказывается особенно полезным для работы с разными типами коллекций. Строки С точки зрения регулярного программирования строковый тип данных ясг1по относится к числу самых важных в С№. Этот тип определяет и поддерживает символьные строки. В целом ряде других языков программирования строка представляет собой массив символов.
А в С№ строки являются объектами. Следовательно, тип ягг1по относится к числу ссылочных. И хотя згг1птт является встроенным в С№ типом данных, его рассмотрение пришлось отложить до тех пор, пока не были представлены классы и объекты. На самом деле класс типа ягг1по уже не раз применялся в примерах программ, начиная с главы 2, но это обстоятельство выясняется только теперь, когда очередь дошла до строк. При создании строкового литерала в действительности формируется строковый объект. Например, в следующей строке кода: Сспяс1е.иггсеъгпе("В СВ строки являются объектами,") 194 Часть!.
Язык С№ текстовая строка "Е С() строки являются опъектами. " автоматически преобразуется в строковый объект средствами С№. Следовательно, применение класса типа ясг1пд происходило в предыдущих примерах программ подспудно и неявным образом. А в этом разделе будет показано, как обращаться со строками явным образом. Построение строк Самый простой способ построить символьную строку — воспользоваться строковым литералом.
Например, в следую(цей строке кода переменной ссылки на строку ягг присваивается ссылка на строковый литерал: зсг1пд зсг = "Строки в С() весьма эффективны." В данном случае переменная яхт инициализируется последовательностью символов "Строки в СФ весьма эффективны." Объект типа ягг1пд можно также создать из массива типа с)тат.
Например: спагН спаггау = ('с', 'е', 'я', 'г'); зсггод зсг = пен зсггпд(оьаггау)у Как только объект типа ясг1пд будет создан, его можно использовать везде, где только требуется строка текста, заключенного в кавычки. Как показано в приведенном ниже примере программы, объект типа яс гг од может служить в качестве аргумента при вызове метода Хггсевфпе () . // Создать н вывести символьную строку. оя1пд зузсепц с1аяз зсг1пдоеюо ( зсас1с то1О Маго() ( зсг1пд зсг1 = пеи ясг1пд(сваггау)) згг1пд ясг2 = "Еще одна строка."; Сопяо1е.иг1сеаапе(зсг1); Сопзо1е.иг1сей1пе(ясг2); ) ) Результат выполнения этой программы приведен ниже. Это строка.
Еще одна строка. Обращение со строками Класс типа ясг1пд содержит ряд методов для обращения со строками. Некоторые из этих методов перечислены в табл. 7.1. к типу ягг1пд относится также свойство еепдс)ь содержащее длину строки. Глава 7. Массивы и строки 195 Таблица 7.1. Некоторые общеупотребительные методы обращения оо отроками Описание Метод ясасас всгспч сору(всгспч ясг) Возвращаеткопиюстрокиясг 1пС Сошрагето(вкгспд якг) Возвращает отрицательное значение, если вызывающая строка меньше строки я сг; положительное значение, если вызывающая строка больше строки я сг( и нуль, если сравниваемые строки равны спС 1пдехОГ(вкгспд вСг) Осуществляет поиск в вызывающей строке подстроки я сг. Возвращает индекс первого вхождения искомой подстроки или -1, если она не обнаружена спС ЬввС1пдехОГ(вггспд ягг) Осуществляет поиск в вызывающей строке подстроки всг. Возвращает индекс последнего вхождения искомой подстроки или -1, если она не обнаружена вггспЧ тоьочег() Возвращает вариант вызывающей строки, набранный строчными буквами вкг1по топррег() Возвращает вариант вызывающей строки, набранный про- писными буквами Отдельный символ выбирается из строки с помощью индекса, как в приведенном ниже фрагменте кода.
всгспо вкг = "тест"и Сопво1е.игсгеььпе(ягг[0]) В этом фрагменте кода выводится символ "т", который является первым в строке "тест". Как и в массивах, индексирование строк начинается с нуля. Следует, однако, иметь в виду, что с помощью индекса нельзя присвоить новое значение символу в строке. Индекс может служить только для выборки символа из строки. Для проверки двух строк на равенство служит оператор ==. Как правило, если оператор == применяется к ссылкам на объект, то он определяет, являются ли они ссылками на один и тот же объект. Совсем иначе обстоит дело с объектами типа зсгспо.
Когда оператор == при,меняется к ссылкам на две строки, он сравнивает содержимое этих строк. Это же относится и к оператору ! =. При сравнении объектов типа в с гйпо сравнивается содержимое строк. А для других видов сравнения строк приходится пользоваться методом Сошрагето () . В приведенном ниже примере программы демонстрируется несколько операций со строками.
// Некоторые операции со строкаын. ивано Яувкеш) с1авв ЯСгсрв ( вовС1с чо1д Мвтп() ( вггспЧ вкг1 = "Программировать в .НЕТ лучше всего ня Са.' вкгспЧ вкг2 = вкгспд.Сору(вкг1)) вггспд вггэ = "Строки в С» весьма эффективны."; вкгспд вггор, вггьоиг спС гевц1С, 1дхг 196 Часть ). Язык С» Сопяо1е.йг1сеЬгпе("згг1: " + всг1) т Сопяо1е.йгьсеЬ1пе("Длина строки зсг1: ясг1.ЬепВГП)т // Создать варианты строки зсг1, набранные // прописными и строчными буквами. ясгЬон = всг1.ТоЬонег()) ясгОр = зсг1.ТоОррег()) Сопяо1е.йг1сеЬ1пе("Вариант строки зсг1, " + "набранный строчными буквамик1п " + всгЬон)) Сопво1е.йгзсеЬЬпе("Вариант строки всг1, "набранный прописньвяи буквамик)п " + вггОр)к Сопво1е.йг1геЬ1пе() // Вывести строку зсг1 посимвольно.
Сопво1е.ИггсеЬ1пе("Вывод строки згг1 посимвольно.") Тог(1пп 1=От г < ясг1.Ьепсспт 1++) Сопзо1е.Иг1се(впг1[1])т Сопяо1е.йг1сеЬ1пе(")п")т // Сравнить строки. 11(всг1 == зсг2) Сопяо1е.ИггсеЬгпе("всг1 == всг2") е1зе Сопяо1е.ИгьсеЬгпе("зсг1 != всг2") 11 (зсг1 == всгЗ) Сопво1е.йг1сеЬ1пе("ясг1 == зсгзь) е1яе Сопзо1е.йг1сеЬ1пе("ясг1 != зсгЗ") геяп1Г = всг1.СошрагеТо(зсгЗ)т 11(гевп1Г == О) Сопво1е.Иг1сеЬгпе("Строки зсг1 и зсгЗ равны"); е1ве 1Х(гевп1г < О) Сопзо1е.йг1сеЬ1пе("Строка ясг1 меньше строки зггЗ") е1яе Сопзо1е.йггсеЬЬпе("Строка ясг1 больше строки всгЗ") Сопзо1е.йггсеЬгпе()т // Присвоить новую строку переменной ясг2. всг2 = "Один Два Три Один"; // Поиск строки. ).бх = ясг2.1пбехОТ("Один" )) Сопво1е.йг1сеЬгпе("Индекс первого вхождения подстроки <Один>: " + Ьбх)) 1бх = ягг2.Ьавг1п<(ехОТ("Один")т сопяо1е.игьгеьапе("индекс последнего вхождения подстроки <Один>: " ь 1бх)т ) ) Глава 7.
Массивы и строки 197 При выполнении этой программы получается следующий результат: ягг1: Программировать в .НЕТ лучше всего на СВ. длина строки ягг1: 41 Вариант строки ягг1, набранный строчными буквами: программировать в .пег лучше всего на си. Вариант строки ягг1, набранный прописными буквами: программировать в .пег лучше всего на св.
Вывод строки ягг1 посимвольно. Программировать в .ИЕТ лучше всего на СФ. ясг1 == ягг2 ягг1 .'= яггЗ ясгт больше ясгЗ Индекс первого вхождения подстроки <Один>: 0 Индекс последнего вхождения подстроки <Один>: 13 С помощью оператора т можно сцепить Гт.е. объединить вместе) две строки. Например, в следующем фрагменте кода: ясггпд ясг1 = "Один"; яггъпд ясг2 = "два") ягг1пд ясгЗ = "Три"и ягг1пс яггс = ягг1 + ягг2 + яггЗт переменная ясгс инициализируется строкой "ОдиндваТри".
И еще одио замечание: ключевое слово згг1по является псевдонимам класса Вузгеш. 5сгтпо,определенного в библиотеке классов для среды .[к[ЕТ Ртатпежог[<,т.е.оио устанавливает прямое соответствие с этим классом. Следовательно, поля и методы, определяемые типом згг1псов относятся иепосредствеино к классу Вуягеш. 5гг1псл в который входят и многие другие компоненты. Псдробиее о классе Еуясеш.
Всг1по речь пойдет в части П этой книги. Массивы строк Аналогично данным любого другого типа, строки могут быть организованы в массивы. Ниже приведен соответствующий пример. // Продемонстрировать строковые массивы. лягу 5уягеш; с1аяя зкгтпсаггауя ( ясаггс нот б Ма1п() ( яггтпд[) ясг = ( "Это", "очень", "простой", "тест." )т Сопяо1е.игасеЬЬпе("Исходный массив: ")," гог(гпг 1=от 1 < ягг.ьепогьт Тт+) Сопяо1е.иг)ге(ягг[1) т " ")т Сопяо1е.ыгтсеьгпе(")и")т // Изменить строку. всг[1) = "тоже"; ясг[3) = "до предела тест!"; Сопяо1еЛгтгеьтпе("видоизмененная<массив: ")т Гог(ьпс 1=0( 1 < Ясг.ьепчс)Ы 1++) 198 Часть!, язык Сз Сопзо1е.Игзсе(акт[1] + " "); ) ) Вот какой результат дает выполнение приведенного выше кода: Исходный массив: Это очень простой тест.
Видоизмененный массив: Это тоже простой до предела тест! Рассмотрим более интересный пример. В приведенной ниже программе целое число выводится словами. Например, число [9 выводится словами "один девять". // Вывести отдельные цифры целого числа словаыи. пзьпЯ Эузкегы с1азз Сопнегкрфяьгзтоыогбз ( зсас1с токо Маьп() [ 1пс пцш) зпз пехсб101Г) 1пг пцшк(101гз; Впг[] и = пен ьпг[20]; зсг1пЯ[] сьЯВГз = ( "нуль", "один", "два", "шесть", "семь", "восемь", "девять" ); пош = 1808; Сопзо1е.нг1се11пе("Число: " + ппш); Сопзо1е.игьсе("Число словами: "); пехсбьязс = О) пцшб101гз = О) // Получить отдельные цифры и сохранить их // в массиве п.,Эти цифры сохраняются в // обратном порядке.