Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Основи роботи у середовищі Visual Studio 2005. Робота з рядками, процедурами і функціям




 

Мета роботи: розробка додатків на мові С# у середовищі Microsoft Visual Studio 2005. Вивчення і практичне застосування основних принципів роботи з рядками, орієнтовані на вирішення ряду практичних завдань, визначаються принципи опису, виклику і передачі параметрів в процедури і функції.

 

Постановка завдання: у середовищі Microsoft Visual Studio 2005 виконати Завдання №1, 2, 3, 4, використуючи інструкції до виконання, наведені в теоретичної частині цієї лабораторної роботи, а також завдання до самостійного виконання згідно з варіантом.

 

Теоретичні відомості:

 

Робота з рядками в C#

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

Length Дозволяє отримати кількість символів в рядку.
Concat() Дозволяє з'єднати декілька рядків або змінних типу object.
CompareTo() Дозволяє порівняти два рядки. У разі рівності рядків результат виконання функції дорівнює нулю. При позитивному значенні функції більшим є рядок, для якого викликався метод.
Copy() Створює нову копію існуючого рядка.
Format()   Застосовується для форматування рядка з використанням різних примітивів (рядків і числових даних) і підстановлювальних виразів вигляду {0}.
Insert() Дозволяє вставити один рядок всередину існує.
Remove() Replace() Видаляють або замінюють символи в рядку.
ToUpper() ToLower() Перетворять всі символи рядка в рядкові або прописні.
Chars Дозволяє отримати символ, що знаходиться в певній позиції рядка.
Join() Створює рядок, сполучаючи задані рядки і розділяючи їх рядком-роздільником.
Replace() Замінює один символ рядка іншим.
Split() Повертає масив рядків з елементами - підрядками основного рядка, між якими знаходяться символи-роздільники.
Substring() Дозволяє отримати підрядок основного рядка, що починається з певного символу і що маєзадану довжину.
Trim() Видаляє пропуски або набір заданих символів на початку і кінці основного рядка.
ToCharArray() Створює масив символів і поміщає в нього символи початкового рядка.

 

При роботі з рядками в C# необхідно враховувати наступне. Тип String є посилальним типом. Проте, не дивлячись на це, при використанні операцій порівняння відбувається порівняння значень строкових об'єктів, а не адрес цих об'єктів, розміщених в оперативній пам'яті. Крім того, оператор "+" об'єкту string переобтяжений так, що при його використанні використовується метод Concat().

Виконаємо декілька прикладів використання можливостей роботи з рядками.

 

ЗАВДАННЯ 1

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

protected void Page_Load(object sender, EventArgs e)

{

Response.Write(MakeLine(0, 5 ", "));

Response.Write("</br>");

Response.Write(MakeLine(1, 6 " "));

Response.Write("</br>");

Response.Write(MakeLine(9, 9 ": "));

Response.Write("</br>");

Response.Write(MakeLine(4, 7, "< "));

}

private static string MakeLine(int initVal, int multVal, string sep)

{

string[] sArr = new string[10];

for (int i = initVal; i < initVal+10; i++)

sArr[i-initVal]= String.Format("{0-3}", i * multVal);

return String.Join(sep, sArr);

}

Результат роботи програми представлений на мал. 8.

Мал. 8. – Результат роботи програми з використанням функції Join

 

Досить часто при роботі з рядками виникає необхідність розділити рядок на підрядки, відокремлені один від одного заданими символами-роздільниками.

 

ЗАВДАННЯ 2

 

Створити рядок символів, в якому присутні декілька символів-роздільників. За допомогою функції Split даний рядок розділяється на підряди, які потім виводяться на екран кожен в окремому рядку. Для завдання символів-роздільників використовується масив символів. В даному прикладі також застосовується функція Trim, необхідна в даному випадку для того, щоб переконатися, що заданий рядок не складається з одних лише пропусків.

string words = "рядок, що містить декілька слів, а також

знаків пунктуації: таких як двокрапка і крапка.";

string [] split = words.Split(new Char [] {' ', '',, '.' ':'});

foreach (string s in split)

{

if (s.Trim()!= "")

Response.Write(s+"</br>");

}

Підсумком роботи даної програми буде наступний результат, зображений на мал. 9.

Мал. 9. – Результат роботи програми з використанням функції Split

Використання класу System.Text.StringBuilder

 

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

string s1 = "Приклад рядка";

string s2 = s1.ToUpper();

Response.Write(s1);

Response.Write("</br>");

Response.Write(s2);

В даному випадку рядок s1 не зазнав ніяких змін. Метод ToUpper() створив копію рядка s1 і застосував до неї необхідні перетворення, тому на екран буде виведений як початковий рядок, так і рядок, що піддався зміні. Таке ж твердження справедливе і для звичайної операції конкатенації рядків. Результатом виконання операції конкатенації рядків є також новий рядок.

У ряді випадків слід уникати ситуацій, коли в результаті виконання операції створюється новий рядок, оскільки це неминуче пов'язано з додатковими накладними витратами пам'яті і інших ресурсів комп'ютера при виконанні операції.

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

Основною операцією, найчастіше використовуваною класом StringBuilder, є операція додавання до рядка вмісту. Для цього існує метод Append. Наступний код додає один рядок до іншої і виводить результат у вікно браузера. При цьому змінюється оригінал рядка, копія не створюється:

StringBuilder sb = new StringBuilder("Я студент Одесського державного екологічного університету");

sb.Append(", факультету комп’ютерних наук");

Response.Write(sb);

Окрім додавання клас StringBuilder містить безліч інших методів, найбільш значущі з яких перераховані нижче. Після того, як всі необхідні дії, пов'язані з обробкою рядка, були виконані, необхідно викликати метод ToString() для перекладу вмісту об'єкту в звичайний тип даних string.

Append Додавання заданого рядка в кінець рядка об'єкту
AppendFormat Додавання заданого форматованого рядка (рядка, що містить символи, які управляють) в кінець рядка об'єкту
CopyTo Копіювання символів заданого сегменту рядка в задані осередки масиву символів
Insert Додавання рядка в задану позицію рядка об'єкту
Remove Видалення заданої кількості символів з рядка об'єкту
Replace Заміна заданого символу або рядка об'єкту на інший заданий символ або рядок

 

При інтенсивній роботі з рядками рекомендується використовувати клас StringBuilder, оскільки це дозволяє зменшити накладні витрати, пов'язані із створенням копії рядка при виконанні кожної операції.

 

Процедури і функції C#

 

Процедури і функції C# практично повністю відповідають їх визначенням в мові C++.

Основна відмінність процедури від функції полягає в тому, що функція повинна завжди повертати деякий результат, і, крім того, має бути викликана у виразі. Процедура ж не повертає ніякого результату, її виклик здійснюється за допомогою оператора мови; крім того, вона має вхідні і вихідні аргументи, причому вихідних аргументів може бути досить багато. Таким чином, створювати функцію доцільно тільки у тому випадку, коли необхідно провести які-небудь обчислення, в результаті яких має бути отриманий результат у вигляді одного значення. Процедуру – відповідно у разі, коли може бути отриманий результат, що є набором яких-небудь значень.

Проте існує ряд нововведень, які стосуються функцій, що з'явилися в C#. Найбільш важливою особливістю використання функцій і процедур в C# є те, що, оскільки C# є повністю об'єктно-орієнтованою мовою програмування, функції не можуть існувати у відриві від класів. Тому функцію бібліотек процедур і функцій в C# виконують бібліотеки класів.

Оскільки відмінності між процедурами і функціями достатньо умовні, а існувати вони можуть тільки усередині класів, надалі як синонім процедур і функцій використовуватимемо термін "метод".

Синтаксис опису методів:

[атрибути][модифікатори]{void | тип результату функції}

ім'я методу ([список формальних аргументів])

Ім'я методу і список формальних аргументів представляють сигнатуру методу. Квадратні дужки, як це прийнято, показують, що їх вміст може бути опущен при описі методу.

Атрибути і модифікатори є дуже важливій складовій опису будь-якого методу, проте вони будуть розглянуті при описі класів, оскільки мають до цього найбезпосередніше відношення. Поки ж можна вважати, що під модифікаторами маються на увазі модифікатори доступу, з яких ми розглядатимемо поки тільки два: private і public.

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

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

Простими прикладами опису функцій є наступні:

private void A()

{}

public int B()

{}

public long Stepen(int а, int b)

{

long r;

r = (long)Math.Pow(а, b);

return (r);

}

Тут метод A є закритою процедурою, методи B і Stepen – відкритими функціями. У методів A і B не визначені формальні параметри, тоді як у методу Stepen два формальні параметри: а і b.

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

Повний синтаксис оголошення формального аргументу виглядає таким чином:

[ref|out|params] тип_аргумента имя_аргумента

При цьому обов'язковою є вказівка типу аргументу, який може бути скалярним, масивом, класом, структурою, – будь-яким типом, допустимим в C#.

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

Всі аргументи методів можна розділити на три групи: вхідні, вихідні, що оновлюються.

Вхідні, необхідні для передачі інформації методу, їх значення в тілі методу доступні тільки для читання.

Вихідними є результати методу, вони отримують значення в ході роботи методу.

Оновлюванні, здатні виконувати обидві функції.

Вихідні аргументи мають бути помічені ключовим словом out, при цьому в тілі методу має бути обов'язково присутнім оператор надання значення цьому аргументу; оновлюванні аргументи позначаються за допомогою ключового слова ref.

Як приклад злегка модернізуємо описаний раніше метод Stepen:

public void Stepen(out long r,int а, int b)

{

r = (long)Math.Pow(а, b);

}

Як видно з прикладу, функція Stepen була фактично перетворена в процедуру (тип значення поверненої функції був змінений на void). Також був доданий формальний аргумент r, використовуваний як вихідний. У тілі методу цьому аргументу привласнюється значення, яке згодом може бути використане в програм, яка визивається.

Виклик цього методу може бути здійснений таким чином:

long s;

Stepen(out s, 2, 6);

Response.Write(s.ToString());

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

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

ЗАВДАННЯ 3

 

Створіть метод Stepen в якому може передаватися довільна кількість чисел для знаходження суми їх квадратів. Оголошення методу в цьому випадку виглядає таким чином:

public void Stepen(out long r, int а, params int[] b)

{

r = 0;

foreach (int i in b)

r += (long)Math.Pow(i, а);

}

Виклик методу може бути здійснений так:

int[] digits ={1,8,4};

Stepen(out s, 2, digits);

Response.Write(s.ToString());

Для виклику методу необхідно сформувати масив цілих чисел, який потім слід передати як третій аргументу в метод. Результат обчислення суми накопичується в змінній r, а потім передається в змінну s визиваючої програми. Результатом роботи програми буде повернення результату у вигляді числа – 81.

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

 

ЗАВДАННЯ 4

 

Створіть процедуру, що дозволяє отримувати масив чисел, підносити кожне з них до певного ступеня, передавати результат розрахунку в визиваючу програму і виводити результат на екран. Процедура в цьому випадку виглядатиме таким чином:

public void Stepen(out long[] r,int а, params int[] b)

{

r=new long[0];

Array.Resize(ref r,b.Length);

int j=0;

foreach (int i in b)

r[j++]= (long)Math.Pow(i, а);

}

Тут необхідно відзначити наступні важливі особливості. По-перше, як параметр, що повертає значення в звизиваючу програму, використан масив чисел типу long.

По-друге, перш ніж стане можливим використовувати цей масив, його розмір необхідно привести у відповідність з розміром масиву b. Для цього можна скористатися методом Resize об'єкту Array. Проте цей метод дозволяє змінювати кількість елементів такого масиву, для якого ця кількість вже визначена, тому перед викликом методу Resize створюється новий масив r, що складається з нуля елементів.

Варто відзначити також те, що перед першим параметром методу Resize знаходиться ключове слово ref, що говорить про те, що даний метод приймає посилання на масив r, – саме тому усередині методу стає можливою зміна параметрів самого масиву, а не його копії. Виклик методу можна здійснити таким чином:

 

Response.Write("Результати обчислення значень масиву:<br/>");

long [] result;

int [] data={2,3,4,5};

Stepen3(out result, 2, data);

foreach (long i in result)

Response.Write(i.ToString()+"<br/>");

Результат роботи програми зображений на малюнку.

Мал. 10. – Результат роботи методу, що підносить до заданого ступеня масив чисел

 

Підсумовуючи все сказане вище щодо методів, необхідно звернути увагу на наступне.

Як відомо, в об'єктно-орієнтованих мовах, таких як С#, основну роль грають посилальні типи, тому коли методу передається об'єкт посилального типу, всі поля цього об'єкту можуть мінятися в методі, тобто програмний код методу може дістати повний доступ до всіх полів об'єкту. Це відбувається не дивлячись на те, що формально об'єкт не є вихідним і не має ключових слів ref і out, тобто використовує семантику виклику за значенням. При такому виклику саме посилання на об'єкт залишається незмінним, але стан об'єкту, значення його полів можуть повністю змінитися. Така ситуація достатньо поширена і є типовою, тому при роботі з посилальними типами даних ключові слова ref і out нечасто з'являються в описі аргументів методу.

 

Варіанти завдань:

 

1. Даний рядок, що містить англійський текст. Знайти кількість слів, що починаються з букви «с».

2. Даний рядок. Підрахувати, скільки в ньому букв «а», «е», «я».

3. Даний рядок. Визначити, скільки в ньому символів «,» і пропуск.

3. Даний рядок, що містить текст. Знайти довжину найкоротшого слова і щонайдовшого слова.

4. Даний рядок символів, серед яких є двокрапка (:). Визначити, скільки символів йому передує.

5. Даний рядок, що містить текст, що закінчується крапкою. Вивести на екран слова, що містять менше п'яти букв.

6. Даний рядок. Перетворити його, видаливши кожну букву «и» і повторивши кожну букву «а».

7. Даний рядок. Підрахувати кількість букв «и» в останньому його слові.

8. Даний рядок. Підрахувати, скільки різних букв зустрічається в ньому. Вивести їх на екран.

9. Даний рядок символів, серед яких є та, що відкривається і та дужка, що закривається. Вивести на екран всі символи, розташовані усередині цих дужок.

10.Є рядок, що містить букви латинського алфавіту і цифри. Вивести на екран довжину найбільшої послідовності цифр, що йдуть підряд.

11. Даний рядок. Вказати ті слова, які містять хоч би одну букву «ж».

12. Даний рядок. Знайти ті слова, які починаються і закінчуються однією і тією ж буквою.

13. У рядку замінити всі знаки пропусків двокрапкою (:). Підрахувати кількість замін.

14. Визначити, скільки разів в рядку зустрічається задане слово.

15. У рядку є одна крапка з комою (;). Підрахувати кількість символів до крапки з комою і після неї.

Контрольні питання:

1. Від якого базового класу походять всі рядки в C#?

2. Перерахуйте основні методи классу System.String?

3. Поясніть особливості використання классу System. Text. StringBuilder?

4. Дайте визначення процедури і функції

5. Пояснить різницю між процедурами й функціями?

6..Як здійснюється виклик процедури і функції

7. Дайте визначення групам аргументів методів?

8. Коли краще використовувати процедури й коли функції?

 

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных