ЛР 4 МАссивы и строки CSharp
.pdfКафедра спеціалізованих комп’ютерних систем
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторної роботи № 3
« Масиви і рядки C#.NET»
за курсом «Програмування»
(для студентів I курсу напрямку 6.050102 «Комп’ютерна інженерія» усіх форм навчання)
Рекомендовано на засіданні кафедри СКС
Протокол № __ від _________
Затверджено на засіданні методради ДонДТУ
Протокол № ___ від ________
Алчевськ
ДонДТУ
2012
ББК У.в6
Методичні вказівки до виконання лабораторної роботи № 3 «Масиви і рядки C#.NET» за курсом «Програмування» (для студ. I курсу напрямку 6.050102 «Комп’ютерна інженерія» усіх форм навчання) /Укл.: Є.Є. Бізянов, С.В. Гонтовий, А.Ю. Кривцов. - Алчевськ: ДонДТУ, 2012. – 46с.
Розглянуто роботу з масивами і рядками у C#.NET. Наведено приклади виконання основних прийомів роботи, вимоги до звіту, сформульований ряд питань для самоперевірки.
Укладачі: |
Є.Є. Бізянов, доц., |
|
С.В. Гонтовий, доц. |
|
А.Ю.Кривцов, ас. |
Відповідальний редактор |
С.В. Гонтовий, доц. |
Відповідальний за випуск |
|
2
|
ЗМІСТ |
|
ЗМІСТ .......................................................................................................... |
|
3 |
1 МАСИВИ .................................................................................................. |
|
4 |
1.1 |
Оголошення й ініціалізація масивів ..................................... |
5 |
1.2 |
Основні операції з масивами ................................................ |
7 |
2 РЯДКИ ...................................................................................................... |
|
9 |
2.1 Оголошення й ініціалізація змінних-рядків............................ |
10 |
|
2.2 |
Перетворення рядків у числа .............................................. |
10 |
2.3 |
Функції класу String для роботи з рядками ....................... |
11 |
2. 4 Форматування рядків.......................................................... |
12 |
|
3 ПРИКЛАД ВИКОРИСТАННЯ МАСИВІВ І РЯДКІВ ........................ |
13 |
|
ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ......................................... |
17 |
|
ВИМОГИ ДО ЗВІТУ................................................................................. |
20 |
|
КОНТРОЛЬНІ ПИТАННЯ ....................................................................... |
21 |
|
СПИСОК РЕКОМЕНДОВАНОЇ ЛІТЕРАТУРИ..................................... |
22 |
3
Ціль роботи: навчитися працювати з масивами і рядками в програмах C#.NET.
1 МАСИВИ
Масив – це впорядкована послідовність даних одного типу, що зберігаються в пам'яті машини та мають індекси. У C#.NET масив не є основним типом даних, він утворюється з комбінації інших типів. Масив може складатися з елементів, що належать до основних типів C#.NET або типів користувача. Масиви можуть бути одномірними (вектори, рисунок 1.1), двомірними (матриці, рисунок 1.2), трьохмірними (куби) і n-мірними.
Адреса елементу в масиві
0 |
1 |
2 |
3 |
23.4-46.05 2 1.1
Елементи масиву
Рисунок 1.1 – Одномірний масив-вектор
Індекс |
Стовпця |
|
Рядка
|
0 |
1 |
2 |
|
|
|
|
0 |
0.55 |
123.5 |
-11 |
|
|
|
|
1 |
-13.5 |
0.006 |
-33.4 |
|
|
|
|
Рисунок 1.2 – Двомірний масив – матриця
Всі елементи масиву мають однакову довжину і належать до одного типу даних. Отже, масив не може містити дані різних типів. Однак, якщо елементом даних масиву є структура, масив може містити дані різного типу, що відносяться до полів структури.
Вимога однорідності елементів масиву необхідна для того, щоб компілятор знав місце розташування кожного елемента в пам'яті
4
комп'ютера. Саме тому елементи масиву розташовуються в пам'яті послідовно, друг за другом. На рисунку 1.3 показане розміщення масиву з 5 цілих чисел типу ushort у пам'яті комп'ютера.
Рисунок 1.3 – Розміщення масиву з 5 цілих чисел у пам'яті
Нехай початкова адреса масиву в пам'яті (адреса елемента a[0]) дорівнює 999. Тоді адреса елемента a[1] 999+2 = 1001, елемента a[2] 1001+2=1003 і т.д. Згадайте, що кожна змінна типу ushort займає в пам'яті 2 байти. Отже, для розміщення кожного елемента масиву потрібні 2 комірки пам'яті.
Двомірні масиви розташовуються в пам'яті в такий спосіб: спочатку йдуть елементи першого рядка, потім другого, третього і т.д.
1.1 Оголошення й ініціалізація масивів
Ідентифікатор масиву являє собою постійну адресу першого елемента масиву, який не може бути змінений під час виконання програми.
Формат оголошення змінної типу масив наступний:
ТД [,…,]ІЗ = new [Р1,…,Рn];
тут: ТД – тип даних елементів масиву;
5
ІЗ – ім'я змінної; Р – розмірність.
Приклади оголошень змінних-масивів.
//Вектор A із 5 цілих елементів int[] A = new int[5];
//Матриця C 10х10 із 100 елементів
//речовинного типу
float [,] C = new float[10, 10];
//Трьохмірний масив DS 4х5х6,
//який містить 120 елементів речовинного типу double[,,] DS = new double [4, 5, 6];
УВАГА! Індекс першого елемента масиву завжди дорівнює нулю та не може бути змінений! Індекс останнього елементу j-ї розмірності є таким, що дорівнює Рj-1.
Так, для оголошених вище масивів А та С перший елемент має
індекс: A[0] – для масиву А, C[0, 0] – для масиву С; відповідно останній елемент має індекс: A[4] – для масиву А та C[9, 9] для масиву С.
Вправа. Визначте самостійно індекси першого й останнього елементів для таких масивів:
int[] Ar_Int = new int[12];
float[] Ar_Float = new float[5, 18]; char[] Ar_Char = new char[10, 3, 11];
Якщо змінну-масив оголошено так, як показано вище, то при старті програми всі елементи масиву дорівнюють нулю. Це так названа
неявна ініціалізація. При явній ініціалізації значення елементів масиву задаються при його оголошенні:
int[] A = {0, 2, -10, 8 ,45};
float [,] C = new float [,] {{2.2,3.08}, {-4.1,5.0}};
Зверніть увагу, що при явній ініціалізації ми не вказуємо розмірності масиву. Компілятор визначить їх самостійно.
Інший спосіб – це ініціалізація під час виконання програми. При цьому необхідно звернутися до кожного елемента масиву за індексом, наприклад, так:
6
A[0]=2; A[1]=3; A[2]=-4; A[3]=0; A[4]=3;
або так
A[0]=A[1]=A[2]=3; A[3]=8; A[5]=6;
1.2 Основні операції з масивами
При розгляді операцій з масивами виділимо окремо операції з векторами, операції з матрицями й операції з векторами і матрицями. Відразу відзначимо, що всі операції доцільно виконувати з використанням циклів.
Операції з векторами:
додавання Ci = Ai + Bi;
Приклад програмної реалізації:
float[] AV = {-11.8f, 10.4f, 0.567f};// |
Вихідні |
|||||
float[] |
BV = {7.65f, -0.8f, -9.4f}; |
// |
масиви |
|||
float[] |
CV |
= |
new float [3]; |
// |
Результат |
|
for (int i |
= |
1;i<3;i++) |
CV[i] = AV[i] + BV[i]; |
вирахування Ci Ai Bi ;
Приклад програмної реалізації:
float[] AV = {-11.8f, 10.4f, 0.567f};// |
Вихідні |
|||||
float[] |
BV = {7.65f, -0.8f, -9.4f}; |
// |
масиви |
|||
float[] |
CV |
= |
new float [3]; |
// |
Результат |
|
for (int i |
= |
1;i<3;i++) |
CV[i] = AV[i] - BV[i]; |
множення вектора на константу Ci CS Ai ;
Приклад програмної реалізації:
float[] |
AV = {-11.8f, 10.4f, 0.567f};// |
Вихідні |
||||
float const CS = |
-1.65f; |
// |
дані |
|||
float[] |
CV |
= |
new |
float [3]; |
// Результат |
|
for (int i |
= |
1;i<3;i++) |
CV[i] = СІ*AV[i]; |
скалярний добуток CP Ai Bi ;
i
Приклад програмної реалізації:
7
float AV[3] = {-11.8f, 10.4f, 0.567f}; float BV[3] = {7.65f, -0.8f, -9.4f};
float CVP = 0.0f; |
|
|
// Скалярний добуток |
||
for (int |
i = 1;i<3;i++) |
CVP += AV[i]*BV[i]; |
|
векторний добуток |
Ci Ai Bi ; |
Приклад програмної реалізації:
float[] AV = {-11.8f, 10.4f, 0.567f};// Вихідні float[] BV = {7.65f, -0.8f, -9.4f}; // масиви
float[] CVP = new float [3]; |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
// Векторний добуток |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
for (int |
i = 1;i<3;i++) |
CVP[i] = AV[i]*BV[i]; |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
обчислення довжини вектора L |
Ai2 ; |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|||
|
|
|
|
|
|
|
|
|
|
1 |
|
|
n |
|
|
|
|
|
|
|
середнє арифметичне AСР |
|
|
Ai ; |
|||||||||||||||||
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
n i 1 |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
1 |
|
|
n |
|
|
|
|
|
|
|
|
середнє квадратичне SК |
|
|
Ai2 ; |
||||||||||||||||
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
n i 1 |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
|
|
|
середнє геометричне S ГМ n Ai |
; |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
i 1 |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
1 |
|
|
n |
1 |
|
|
|
|
|
|
середнє гармонійне S ГРМ |
|
|
|
|
; |
|
|
|
||||||||||||
|
n |
|
|
x |
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
i 1 |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
||||
|
дисперсія d |
і середньоквадратичне відхилення : |
||||||||||||||||||
|
|
n |
|
1 |
n |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
d |
|
|
|
|
Ai2 |
AСР2 |
, d , |
||||||||||||
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
n 1 n i 1 |
|
|
|
|
|
|
|
|
|
|
|
|
тут: A і B – вихідні вектори, C – результуючий вектор, CS – константа.
Умова: вектори повинні мати однакову розмірність. Операції з матрицями:
8
додавання Ci, j Ai, j Bi, j ;
вирахування Ci, j Ai, j Bi, j ;
транспонування AiT, j Aj, i ;
множення матриці A розмірністю m n на матрицю B
n
розмірністю n l Ck, j Ak,i Bi, j ; i 1
обчислення визначника матриці.
Умова: при додаванні та відніманні матриці повинні мати однакову розмірність.
Операції з векторами та матрицями:
множення матриці A розмірністю m n на вектор B ро-
m
змірністю m Ci Aij B j . j 1
Крім перерахованих вище операцій використовують також:
пошук максимального й мінімального елемента масиву (матриці або вектора);
пошук елемента масиву (матриці або вектора), що задовольняє заданій умові;
обертання квадратної матриці.
Застосування більшості цих операцій розглянуто нами у прикладі в розділі 3.
2 РЯДКИ
Рядок – це набір символів, укладений у подвійні лапки:
“Це рядок” “І це рядок 12345 ??? !!!”
“222 333 444 ”
Рядкові значення в програмах C#.NET можна зберігати у змінних і обробляти подібно до того, як обробляються дані інших типів.
9
2.1 Оголошення й ініціалізація змінних-рядків
Змінна-рядок – це ні що інше, як масив символів. Синтаксис оголошення рядкової змінної є таким:
string Iм'я_рядкової_змінної [=”Початкове значення”];
Приклад.
string svar, s1, as;
Рядкову змінну варто (але не обов’язково) ініціалізувати під час оголошення, наприклад, так:
string hello = “Усім привіт!”;
Якщо рядок – це масив, то логічно припустити, що і звертатися до його елементів можна так само, як ми звертаємося до елементів масиву, тобто за індексом:
string my_string = “Приклад рядка”;
. . .
Console.WriteLine(my_string[4]); // Виведе ‘л'
Для роботи з рядками визначені наступні операції:
відносин (порівняння): = =, !=, >, <, >=, <=;
присвоювання =, +=;
конкатенації (об'єднання, склеювання) +;
індексації [ ].
Рядки порівнюються посимвольно, з урахуванням регістра си-
мволів.
2.2 Перетворення рядків у числа
Рядок «123» і число 123 – це різні речі. Рядок – це послідовність будь яких символів, а число – це число. Часто зручніше здійснити введення у вигляді рядка, відредагувати цей рядок, потім перетворити в число і далі працювати з числом. Так, наприклад, користувач може вводити грошові суми або відсотки, дописуючи (або не дописуючи) наприкінці «грн.», «USD», «$», «%». Ми повинні передбачити цю ситуацію, видаливши непотрібні символи з уведеного рядка, після чого в
10