Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота_5.doc
Скачиваний:
4
Добавлен:
16.11.2019
Размер:
205.82 Кб
Скачать

Лабораторна робота № 5 робота з рядковими типами. Використання класів char, char[], string та stringbuilder у мові c#

    1. Рядкові типи даних

Коли говорять про рядковий тип, то звичайно розрізняють тип, що представляє:

- окремі символи – тип char;

- рядки постійної довжини – масив символів;

- рядки змінної довжини – тип string.

Символьний тип char, що представляє окремий випадок рядків довжиною 1. Основні операції над рядками – це розбір і зборка.

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

5.2. Клас char

В C# є символьний клас Char, заснований на класі System.Char, який використовує двобайтне кодування Unicode подання символів. Символьну константу можна задавати:

- символом, вкладеним в одинарні ( 'A' ) лапки;

- escape-послідовністю, що задає код символу (Escape-послідовність («виключена послідовність») – відповідні послідовності текстових символів, що являють собою логічне кодування.

Необхідність логічного кодування текстових знаків виникла тому, що деякі з текстових знаків у програмах, що працюють із текстом, мають спеціальне (керуюче) значення. Для того, щоб використати ці знаки безпосередньо як текст, їх кодують специфічними для кожної системи (escape-послідовностями,: наприклад у С послідовності – \n (символ переходу рядка), \t( символ табулювання) і т.д. використовуються при форматному виведенні.);

  • Unicode-послідовністю, що задає Unicode-код символу.

Приклади оголошення символьних змінних і роботи з ними:

static void Main(string[] args)

{

char ch1 = 'A'; //Символ

char ch2 = '\x5A'; //Шістнадцятковий код

char ch3 = '\u0058'; //Unicode-код

char VK = '\n'; //Escape – послідовність переклад рядка

char TAB = '\t'; // табуляція

char ch = new Char();

int code;

string s;

ch = ch1;

//перетворення символьного типу в тип int

code = ch;

ch1 = (char)(code + 1);

//перетворення символьного типу в рядок

s = ch1.ToString() + ch2.ToString() + ch3.ToString() + VK + TAB;

Console.WriteLine("s= {0},\t ch= {1}, \t code= {2}", s, ch, code);

for (int i = 1; i < 64; i++)

{

ch1 = (char)(code + i);

Console.WriteLine(TAB + ch1.ToString());

}

}

Три символьні змінні ініціалізовані константами, значення яких задані трьома різними способами. Змінна ch оголошується як об'єкт, використовуючи new і виклик конструктора класу. Тип char, як і всі типи C#, є класом. Цей клас успадковує властивості і методи класу Object і має велику кількість власних методів.

Явні або неявні перетворення між класами char й string відсутні, але, завдяки методу ToString, змінні типу char перетворяться в тип string.

У результаті роботи процедури рядок s, отриманий зчепленням трьох символів, перетворених у рядки, має значення BZX, змінна ch дорівнює A, а її код – змінна code 65.

Таблиця 5.1 – Статичні методи і властивості класу Char

Метод

Опис

GetNumericValue

Повертає чисельне значення символу, якщо він є цифрою, і (-1) у протилежному випадку.

GetUnicodeCategory

Всі символи розділені на категорії. Метод повертає Unicode категорію символу.

IsControl

Повертає true, якщо символ є керуючим.

IsDigit

Повертає true, якщо символ є десятковою цифрою.

IsLetter

Повертає true, якщо символ є літерою.

IsLetterOrDigit

Повертає true, якщо символ є літерою або цифрою.

IsLower

Повертає true, якщо символ заданий у нижньому регістрі.

IsNumber

Повертає true, якщо символ є числом (десятковою або шістнадцятковою цифрою).

IsPunctuation

Повертає true, якщо символ є розділовим знаком.

IsSeparator

Повертає true, якщо символ є роздільником.

IsSurrogate

Деякі символи Unicode з кодом в інтервалі [0x1000, 0x10FFF] представляються двома 16-бітними "сурогатними" символами. Метод повертає true, якщо символ є сурогатним.

IsUpper

Повертає true, якщо символ заданий у верхньому регістрі.

IsWhiteSpace

Повертає true, якщо символ є "білим пробілом". До білих пробілів, крім пробілу, відносяться й інші символи, наприклад, символ кінця рядка та символ переводу каретки.

Parse

Перетворить рядок у символ. При цьому рядок повинен складатися з одного символу, інакше виникне помилка.

ToLower

Приводить символ до нижнього регістра.

ToUpper

Приводить символ до верхнього регістра.

MaxValue, MinValue

Властивості, що повертають символи з максимальним і мінімальним кодом. Символи, що повертаються, не мають видимого образа.

Більшість статичних методів перевантажені. Вони можуть застосовуватися як до окремого символу, так і до рядка, для якого вказується номер символу для застосування методу. Основну групу становлять методи Is…, використовувані при розборі рядка.

Крім статичних методів, у класу Char є й динамічні. Більшість із них – це методи батьківського класу Object, успадковані й перевизначені в класі Char. Із власних динамічних методів варто відзначити метод CompareTo, що дозволяє проводити порівняння символів. Він відрізняється від методу Equal тим, що для незбіжних символів видає "відстань" між символами відповідно до їх упорядкованості в кодуванні Unicode.

Приклад. Результати виконання представлені на рис. 5.1.

using System;

using System.Collections.Generic;

using System.Text;

namespace String2

{

class Program

{

static void Main(string[] args)

{

int dif;

char ch1, ch2;

Console.WriteLine("Метод CompareTo");

ch1 = 'A'; ch2 = 'Z';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0},{1} = {2}", ch1, ch2, dif);

ch1 = 'а'; ch2 = 'А';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0},{1} = {2}", ch1, ch2, dif);

ch1 = 'Я'; ch2 = 'А';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0},{1} = {2}", ch1, ch2, dif);

ch1 = 'A'; ch2 = 'A';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0},{1} = {2}", ch1, ch2, dif);

ch1 = 'А'; ch2 = 'A';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0},{1} = {2}", ch1, ch2, dif);

ch1 = 'Ё'; ch2 = 'А';

dif = ch1.CompareTo(ch2);

Console.WriteLine("Расстояние между символами {0},{1} = {2}", ch1, ch2, dif);

}

}

}

Рис. 5.1 - Порівняння символів

Аналізуючи ці результати, можна зрозуміти, що в кодуванні Unicode як латиниця, так і кирилиця щільно впаковані. Виключення становить російська літера Ё – заголовна й мала – вони випадають із щільного кодування. Малі літери в кодуванні безпосередньо слідують за заголовними літерами. Відстань між алфавітами в кодуванні досить велика – російська літера А на 975 символів правіше в кодуванні, ніж відповідна літера в латинському алфавіті.

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

У мові C# визначений клас Char[], і його можна використовувати для подання рядків постійної довжини. Крім того, оскільки масиви в C# динамічні, то можна використовувати масиви символів для подання рядків.

Масив char[] – це звичайний масив, його не можна ініціалізувати рядком символів. Константа, що задає рядок символів, належить класу String, а в C# не визначені взаємні перетворення між класами String й Char[]. У класу String є динамічний метод ToCharArray, що задає перетворення рядка символів у масив.

Клас Char[] є спадкоємцем не тільки класу Object, але й класу Array, і тому має всі методи батьківських класів. Деякі перевантажені методи класу Array можна розглядати як операції над рядками. Методи IndexOf, LastIndexOf дозволяють визначити індекси першого і останнього входження в рядок деякого символу. Однак їх не можна використовувати для знаходження індексу входження підрядка в рядок.