Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Рядки типу StringBuilder




 

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

При створенні екземпляра необхідно використовувати операцію new і конструктор, наприклад:

StringBuilder а=new StringBuilder(); // 1

StringBuilder b=new StringBuilder("qwerty"); // 2

StringBuilder с=new StringBuilder(100); // 3

StringBuilder d=new StringBuilder("qwerty", 100); // 4

StringBuilder e=new StringBuilder("qwerty",1, 3, 100); // 5

У конструкторі класу указуються два види параметрів: рядок, що ініціалізував, або підрядок і об'єм пам'яті, що відводиться під екземпляр (ємність буфера). Один або обидва параметри можуть бути відсутніми, в цьому випадку використовуються їх значення за умовчанням.

Якщо застосовується конструктор без параметрів (оператор 1), створюється порожній рядок розміру, заданого за умовчанням (16 байт). Інші види конструкторів задають об'єм пам'яті, рядку, що виділяється, і/або її початкове значення. Наприклад, в операторі 5 об'єкт ініціалізувався підрядком завдовжки 3 символи, починаючи з першого (підрядок "wer"). Основні елементи класу StringBuilder приведені в таблиці 6.6.

Таблиця 6.6

Основні елементи класу System.Text.StringBuilder

 

Назва Вид Опис
Append Метод Додавання в кінець рядка. Різні варіанти методу дозволяють додавати в рядок величини будь-яких вбудованих типів, масиви символів, рядка і підрядка типу string
AppendFormat Метод Додавання форматованого рядка в кінець рядка
Capacity Властивість Отримання або установка ємності буфера. Якщо встановлюване значення менше поточної довжини рядка або більше максимального, генерується виключення ArgumentOutOfRangeException
Insert Метод Вставка підрядка в задану позицію
Length Властивість Довжина рядка (кількість символів)
MaxCapacity Властивість Максимальний розмір буфера
Remove Метод Видалення підрядка із заданої позиції
Replace Метод Заміна всіх входжень заданого підрядка або символу новим підрядком або символом
ToString Метод Перетворення в рядок типу string

 

Приклад застосування методів приведений в лістингу 6.12.

 

Лістинг 6.12. Робота з рядками типу StringBuilder

using System;

using System.Text;

namespace ConsoleApplication1

{

class examp38

{

static void Main()

{

Console.Write("Введіть зарплату: ");

double salary = double.Parse(Console.ReadLine());

StringBuilder a = new StringBuilder();

a.Append("зарплата ");

a.AppendFormat("{0,6:C} - в рік {1,6:C}", salary, salary * 12);

Console.WriteLine(a);

a.Replace("р.","тис.$");

 

Console.WriteLine("А краще було б: " + a);

}

}

}

Результат роботи програми:

Введіть зарплату: 3500

зарплата 3 500.00р. - в рік 42 000,00р.

А краще було б: зарплата 3 500,00тис.$ - в рік 42 000.00тис.$

 

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

 

6.9. Рекомендації з програмування

 

Використовуйте для зберігання даних масив, якщо кількість однотипних елементів, які потрібно обробити у вашій програмі, відома або, принаймні, відома максимальна кількість таких елементів. У останньому випадку пам'ять під масив виділяється «по максимуму», а фактична кількість елементів зберігається в окремій змінній, яка обчислюється в програмі.

При роботі з масивом потрібно обов'язково передбачати обробку виключення IndexOutOfRangeException, якщо індекс для звернення до масиву обчислюється в програмі по формулах, а не задається за допомогою констант або лічильників циклів for.

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

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


РОЗДІЛ 7. КЛАСИ: ПОДРОБИЦІ

 

У цьому розділі ми продовжимо розглядати елементи класів. Спочатку ми розглянемо додаткові можливості методів, які не описані в розділі 5, а потім перейдемо до нових елементів класу - індексаторів, операцій і деструкторам.

7.1. Перевантаження методів

 

Компілятор визначає який саме метод потрібно викликати за типом фактичних параметрів. Цей процес називається дозволом (resolution) перевантаження. Тип повертаємого методом значення в дозволі не бере участь. Механізм дозволу заснований на достатньо складному наборі правил, сенс яких зводиться до того, щоб використовувати метод з найбільш відповідними аргументами і видати повідомлення, якщо такий не знайдеться. Допустимо, є чотири варіанти методу, що визначає найбільше значення:

 

// Повертає найбільше з двох цілих:

int max(int а, int b)

// Повертає найбільше з трьох цілих:

int max(int а, int b, int e)

// Повертає найбільше з першого параметра і довжини другого:

int max (int а, string b)

// Повертає найбільше з другого параметра і довжини першого:

int max (string b, int а)

Console.WriteLine(max (1,2));

Console.WriteLine(max (1,2,3));

Console.WriteLine(max (1,"2"));

Console.WriteLine(max ("1",2));

 

При виклику методу max компілятор вибирає варіант методу, відповідний типу переданих в метод аргументів (у приведеному прикладі будуть послідовно викликані всі чотири варіанти методу). Якщо точної відповідності не знайдено, виконуються неявні перетворення типів відповідно до загальних правил, наприклад, bool і char в int, float в double і тому подібне. Якщо перетворення неможливе, видається повідомлення про помилку. Якщо відповідність на одному і тому ж етапі може бути отримане більш ніж одним способом, вибирається “кращий з варіантів, тобто варіант, що містить менші кількість перетворень. Якщо існує декілька варіантів, з яких неможливо вибрати кращий, видається повідомлення про помилку.

Перевантажені методи мають одне ім'я, але повинні розрізнятися параметрами, точніше, їх типами і способами передачі (out або ref). Наприклад, методи, заголовки яких приведені нижче, мають різні сигнатури і вважаються перевантаженими:

int max(int а, int b)

int max(int а, ref int b)

 

Перевантаження методів є проявом поліморфізму, однієї з основних властивостей ООП. Програмістові набагато зручніше пам'ятати одне ім'я методу і використовувати його для роботи з різними типами даних, а рішення про те, який варіант методу викликати, покласти на компілятор. Цей принцип широко використовується в класах бібліотеки. NET. Наприклад, в стандартному класі Console метод Writeline перевантажений 19 разів для виведення величин різних типів.

 

7.2. Рекурсивні методи

 

Рекурсивним називається метод, який викликає сам себе. Така рекурсія називається прямою. Існує ще непряма рекурсія, коли два або більш за метод викликають один одного. Якщо метод викликає себе, в стеку створюється копія значень його параметрів, як і при виклику звичайного методу, після чого управління передається першому виконуваному операторові методу. При повторному виклику цей процес повторюється.

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

Класичним прикладом рекурсивної функції є функція обчислення факторіалу (це не означає, що факторіал слід обчислювати саме так). Для того, щоб набути значення факторіалу числа n, потрібно помножити на n факторіал числа (n - 1). Відомо також, що 0!= 1 і 1!= 1:

 

long fact (long n)

{

if (n = = 0 || n = = 1) return 1; // нерекурсивна гілка

return (n* fact(n -1)); // рекурсивна гілка

}

Tе ж саме можна записати коротше:

long fact (long n)

{

return (n >1)? n * fact(n -1):1;

}

 

Рекурсивні методи найчастіше застосовують для компактної реалізації рекурсивних алгоритмів. Будь-який рекурсивний метод можна реалізувати без застосування рекурсії, для цього програміст повинен забезпечити зберігання всіх необхідних даних самостійно. До переваг рекурсії можна віднести компактність запису, до недоліків - витрата часу і пам'яті на повторні виклики методу і передачу йому копій параметрів. Головний недолік - переповнення стека.

7.3. Методи із змінною кількістю аргументів

 

Іноді буває зручно створити метод, в який можна передавати різну кількість аргументів. Мова С# надає таку можливість за допомогою ключового слова params. Параметр, помічений цим ключовим словом, розміщується в списку параметрів останнім і позначає масив заданого типу невизначеної довжини, наприклад:

 

public int Calculate(int a, out int c, params int[] d)

...

 

У цей метод можна передати три і більше параметрів. Усередині методу до параметрів, починаючи з третього, звертаються як до звичайних елементів масиву. Кількість елементів масиву отримується за допомогою властивості Length. Як приклад розглянемо метод обчислення середнього значення елементів масиву (лістинг 7.1).

 

Лістинг 7.1. Методи із змінною кількістю аргументів

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace examp40

{

class Program

{

static long fact(long n)

{

if (n == 0 || n == 1) return 1;

return (n * fact(n - 1));

}

public static double Average(params int[] a)

{

if (a.Length == 0)

throw new Exception

("Недостатньо аргументів в методі");

double av = 0;

foreach (int elem in a) av += elem;

return av / a.Length;

}

static void Main(string[] args)

{

int[] a = { 10, 20, 30 };

int[] b = { -11, -4, 12, 14, 32, -1, 28 };

long d;

try

{

// ---------------------------------

Console.Write(" ВВедите N ");

d = Convert.ToInt32(Console.ReadLine());

Console.WriteLine(" " + fact(d));

// ---------------------------------

 

Console.WriteLine(Average(a));

Console.WriteLine(Average(b));

short z=1,e=12;

byte v=107;

Console.WriteLine(Average(z,e,v));

Console.WriteLine(Average());

}

 

catch(Exception e)

{

Console.WriteLine(e.Message);

return;

}

 

}

}

}

Результат роботи програми:

Недостатньо аргументів в методі

 




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


Дата добавления: 2014-12-27; Просмотров: 577; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.