Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Клас char[] - масив символів






У мові C# визначений клас Char[], і його можна використати для подання рядків постійної довжини. Більше того, оскільки масиви в C# динамічні, то розширюється клас завдань, у яких можна використати масиви символів для подання рядків. Так що є сенс розібратися, наскільки добре C# підтримує роботу з таким поданням рядків.

Насамперед, відповімо на запитання, чи задає масив символів C# рядок, що закінчується нулем? Відповідь: ні, не задає. Масив char[] - це звичайний масив. Константа, що задає рядок символів, належить класу String, а в C# не визначені взаємні перетворення між класами String й Char[], навіть явні. У класу String є, щоправда, динамічний метод ToCharArray, що задає подібне перетворення. Можливо також посимвольно передати вміст змінної string у масив символів. Приведемо приклад:

public void TestCharArAndString(){ //масиви символів //char[] str1 = " Hello, World! "; //помилка: немає перетворення класу string у клас char[] string hello = " Здраствуй, Мир! "; char[] str1 = hello.ToCharArray(); PrintCharAr(" str1", str1); //копіювання подстроки char[] World = new char[3]; Array.Copy(str1, 12, World, 0, 3); PrintCharAr(" World", World); Console.WriteLine(CharArrayToString(World)); }//TestCharArAndString

Закоментовані оператори на початку цієї процедури показують, що пряме присвоювання рядка масиву символів неприпустимо. Однак метод ToCharArray, яким володіють рядки, дозволяє легко перебороти ці труднощі. Ще одну можливість перетворення рядка в масив символів надає статичний метод Copy класу Array.

У нашому прикладі частина рядка str1 копіюється в масив World. По ходу справи в методі викликається процедура PrintCharAr класу Testing, що друкує масив символів як рядок. Ось її текст:

void PrintCharAr(string name, char[] ar){ Console.WriteLine(name); for(int i=0; i < ar.Length; i++) Console.Write(ar[i]); Console.WriteLine(); }//PrintCharAr

Метод ToCharArray дозволяє перетворити рядок у масив символів. На жаль, зворотна операція не визначена, оскільки метод ToString, яким, звичайно ж, володіють всі об'єкти класу Char[], друкує інформацію про клас, а не вміст масиву. Ситуацію легко виправити, написавши підходящу процедуру. Ось текст цієї процедури CharArrayToString, викликаної в нашому тестованому прикладі:

string CharArrayToString(char[] ar){ string result=" "; for(int i = 0; i< ar.Length; i++) result += ar[i]; return(result); }//CharArrayToString

Клас Char[], як і всякий масив^-масив-клас-масив в C#, є спадкоємцем не тільки класу Object, але й класу Array, і, отже, має всі методи батьківських класів. А є чи в нього специфічні методи, які дозволяють виконувати операції над рядками, представленими масивами символів? Таких спеціальних операцій немає. Але деякі перевантажені методи класу Array можна розглядати як операції над рядками. Наприклад, метод Copy дає можливість виділяти й заміняти підстрічку в тілі рядка. Методи 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); }//IndexOfStr

У реалізації використається метод IndexOf класу Array, що дозволяє знайти початок збігу рядків, після чого перевіряється збіг інших символів. Реалізований тут алгоритм є найочевиднішим, але далеко не найефективнішим.

А тепер розглянемо процедуру, у якій визначаються індекси входження символів і підстрічок у рядок:

public void TestIndexSym(){ char[] str1, str2; str1 = " рококо".ToCharArray(); //визначення входження символу int find, lind; find= Array.IndexOf(str1, 'о'); lind = Array.LastIndexOf(str1, 'о'); Console.WriteLine(" Індекси входження про у рококо: {0}, {1}; ", find, lind); //визначення входження підстрічки str2 = " доля".ToCharArray(); find = IndexOfStr(str1, str2); Console.WriteLine(" Індекс першого входження доля в рококо: {0}", find); str2 = " око".ToCharArray(); find = IndexOfStr(str1, str2); Console.WriteLine(" Індекс першого входження око в рококо: {0}", find); }//TestIndexSym

У цій процедурі спочатку використаються стандартні методи класу Array для визначення індексів входження символу в рядок, а потім створений метод IndexOfStr для визначення індексу першого входження підстрічки. Коректність роботи методу перевіряється на різних рядках. Ось результати її роботи.

Рис. 15.3. Індекси входження підрядка в рядок


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал