Крок 9: Компоновка і тестування
Для компіляції коду виберіть Начать отладку в меню Отладка (Build). Якщо компоновка пройшла без помилок, виберіть в меню Debug пункт Start (або Start Without Debugging) для запуску додатку. Коли Web-форма відобразиться в Internet Explorer переконаєтеся, що вона працює правильно, ввівши такі значення:
Principal: 100000
Rate: 10
Term: 240
Клацніть кнопку Compute Payment. Понизу сторінки з'явиться «Monthly Payment = $965.02».
Текст програми LoanCalc
Серед безлічі файлів в каталозі LoanCalc найбільший інтерес для нас представляють WebForml.aspx і WebForml.aspx.cs. Вони містять початковий код LoanCalc. Більшість з цих додаткових файлів в даному прикладі надмірно, але Visual Studio .NET все одно створює їх.
WebForml.aspx не містить програмної коди — тільки HTML. Visual Studio .NET завжди використовує в своїх Web-формах фоновий код, тому весь код на С# знаходиться в WebForml.aspx.cs. Велика частина їх вмісту згенерувала Visual Studio.NET. Оператори, додані вами, показані курсивом.
ASPX-файл визначає призначений для користувача інтерфейс за допомогою HTML і Web-элементов управління, а CS-файл містить обробник події Click від кнопки Compute Payment, а також код, що підключає цей обробник до кнопки. Жоден з файлів не містить нічого такого, чого ви не могли б написати уручну, але абсолютно очевидно, що візуальне створення Web-форм набагато швидше і менше схильне до помилок, чим їх ручне кодування.
Контрольні питання:
1. Які засоби управління включені у середовище розробки Visual Studio 2012?
2. Як здійснити налаштування відображення вікон документів усередині інтегрованого середовища розробки?
3. Як створити новий додаток ASP.NET?
4. Призначення та основні функції вікна панелі компонентів Toolbox?
5. Як організован і що містить файл WebForml.aspx?
6. Як організован і що містить файл і WebForml.aspx.cs?
7. Визначьте і перечисліть переваги застосування технології ASP.NET. для розробки Web-додатку.
Лабораторна робота №2
Створення WEB-форми у середовищі розробки Visual Studio2012.
Робота з массивами, рядками, процедурами і функціям на мові С#
Мета роботи:розробка веб додатків на мові С# у інтегрованій середі розробки Microsoft Visual Studio 2012. Робота з масивами та рядками. Вивчення і практичне застосування основних принципів роботи з рядками, орієнтованих на вирішення ряду практичних завдань, визначаються принципи опису, виклику і передачі параметрів в процедури і функції
Постановка завдання: створити в Microsoft Visual Studio 2012 Web-додаток, що містить форму з заданою кількістю полів для введення значень елементів числового або символьного масиву, та скласти і відлагодити програму (мовою С#) для обробки елементів масиву та рядків. Виконати Завдання №1, 2 згідно з варіантом завданнь.
Теоретичні відомості:
Робота з масивами в C#
Масив, це послідовність однотипних елементів, упакована під одним ім'ям. Ці дані легко відсортувати, перебрати і обробляти. Масив в C# є об'єктом посилального типу. Створенням масиву є двоступінчатий процес: спочатку оголошується посилальна змінна на масив, а потім для нього виділяється пам'ять і змінною привласнюється посилання на цю пам'ять.
Одновимірні масиви
Так для одновимірного масиву синтаксис створення буде таким:
тип[ ] ім’я_масиву = new тип[розмір];
Наприклад, зарезервувати пам'ять під 10 елементів цілого типу можна так:
int[ ] array = new int[10];
Адресація елементів усередині масиву виконується за допомогою цілочисельного індексу, нумерація якого починається з нуля. Вихід індексу за межі меж компілятору не контролюється і виявляється середовищем CLR
Якщо масив оголошується як поле класу, то всі елементи за умовчанням набувають найближчого за типом значення (для числового - нуль, для строкового - порожньо, для булева - false, для посилального - null). Якщо масив оголошується усередині методу як локальна змінна, то його перед використанням потрібно явно ініціалізувати.
Масив в C# – це тип, похідний від класу System.Array, тому всі масиви успадковують від цього класу фіксований набір об'єктних властивостей і методів. Крім того, сам клас Array містить ряд статичних методів (рівня класу), що дозволяють виконувати обробку масивів як об'єктів.
Одне і те ж посилання на масив можна використовувати багато разів при створенні декількох сумісних з її типом масивів. У такому разі адресація колишнього масиву буде загублена. Наприклад:
int[ ] array = new int[10];
............
array = new int[20];
Можна виконувати відразу і оголошення і ініціалізацію масиву, тоді створення масиву і підрахунок його розмірності виконає компілятор за списком ініціалізації. В цьому випадку ключове слово new не потрібне. Наприклад:
int[ ] array = { 1, 2, 3, 4, 5 };
Можна створити масив фіксованої розмірності і відразу його ініціалізувати. Тоді розмір списку ініціалізації повинен строго відповідати замовленій розмірності масиву. Наприклад:
Int[ ] array = new int[5]{ 1, 2, 3, 4, 5 };
Допустимий і такий синтаксис - без вказівки розмірності, але з ініціалізацією:
int[ ] array = new int[]{ 1, 2, 3, 4, 5 };
Можна спочатку створити масив, а потім поелементно привласнити йому значення. І теж потрібно стежити, щоб не вийти за межі встановленої розмірності масиву.
int[ ] array = new int[5];
for (int i = 0; i < array.Length; i++)
array[i]= i;
Елементами масиву можуть бути значення довільного типу, зокрема масиви, класи, структури і інтерфейси. Масиви можуть бути як одновимірними, так і багатовимірними.
Приклад створення масиву, що складається з дванадцяти елементів типу string:
String[ ] st = new string[12];
При створенні масивів необхідно враховувати, що для створення масиву фіксованої довжини, як в попередніх прикладах, необхідно завжди використовувати ключове слово new. Таким чином, наступне визначення масиву неприпустимо і приведе до виникнення помилки ще на етапі компіляції: int[3] a={3,5,6};
Багатовимірні масиви
Окрім простих одновимірних масивів C# підтримує також багатовимірні масиви, які у свою чергу діляться на дві категорії. До першої категорії відносяться масиви, кількість елементів кожного рядка яких складається з однакової кількості елементів. Таким чином, масив можна розглядати як прямокутник, а самі такі масиви називають "прямокутними". До другої категорії відносяться масиви, кількість елементів в рядках у яких не однаково. Такі масиви утворюють прямокутник, у якого одна сторона представляє ламану лінію, тому такі масиви називають "ламаними".
Оголошення і заповнення масиву проводиться стандартним способом: для цього організовується два цикли:
Random rnd=new Random();
int[,] Matrix;
Matrix = new int[5, 4];
for (int i = 0; i < 5; i++)
for (int j=0;j<4;j++)
Matrix[i,j]= rnd.Next(10,99);
При необхідності виведення значень елементів масиву на екран також організовується цикл, що дозволяє послідовно перебирати всі елементи масиву:
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++)
{
Response.Write(Matrix[i, j].ToString());
Response.Write(" ");
}
Response.Write("<br/>");
}
"Ламаний" масив може розглядатися як масив, кожен осередок якого є масивом. Як приклад створимо масив із змінною кількістю елементів в рядках:
Random rnd = new Random();
int[][] JMatrix = new int[5][];
for (int i = 0; i < JMatrix.Length; i++)
{
JMatrix[i]= new int[rnd.Next(1,7)];
}
Кількість елементів в рядку визначається випадковим чином у момент формування масиву. Кількість рядків задана жорстко і рівна п'яти. Масив не заповнюється ніякими числами, тому на екран виводитимуться значення, якими заповнюється масив за умовчанням (в даному випадку це нуль). Для виведення інформації на екран необхідно використовувати два цикли, як це показано нижче.
for (int i = 0; i < JMatrix.Length; i++)
{
Response.Write("Кількість елементів в рядку " +
i.ToString() + "=" + JMatrix[i].Length.ToString()+" ");
for (int j = 0; j < JMatrix[i].Length; j++)
{
Response.Write(JMatrix[i][j].ToString() + " ");
}
Response.Write("<br/>");
}
У циклі по j відбувається визначення кількості елементів в рядку за допомогою властивості Length.
Клас Array
Для детальнішого розуміння особливостей використання масивів в C# необхідно розглянути спеціалізований клас, що реалізовує функції масиву. Всі типи даних в C# є класами, для яких як базовий виступає клас Object.
Клас Array - не виключення. Він реалізує всі базові властивості класів і є предком для всіх типів масивів, до яких ми звикли в мові C++ і синтаксис опису яких був приведений вище. Те, що клас Array є нащадком класу Object, дає можливість в класі Array визначати безліч різноманітних операцій, таких як копіювання, пошук, звернення, сортування і т. д. Нижче приведені найцікавіші методи класу Array:
BinarySearch() | Пошук елементів в одновимірному відсортованому масиві |
Sort() | Сортування елементів одновимірного масиву |
Clear() | Очищення елементів масиву в заданому діапазоні індексів |
CopyTo() | Копіювання елементів початкового масиву в масив призначення |
GetLength(), Length | Визначення кількості елементів у вказаному вимірюванні масиву |
GetLowerBound() | Визначення нижньої межі масиву |
GetUpperBound() | Визначення верхньої межі масиву |
GetValue() | Повертає значення вказаного індексу для масиву |
SetValue() | Встановлює значення вказаного індексу для масиву |
Reverse() | Розставляє елементи одновимірного масиву в зворотному порядку |
Rank | Визначення кількості вимірювань вказаного масиву |
Розглянемо приклад використання класу Array. Для цього створимо масив і забезпечимо можливість пошуку в нім елементів.
Оголосимо масив myArray як статичний член класу Page, що складається з шести елементів типу int:
static Array myArray = Array.CreateInstance(typeof(Int32), 6);
Розмістимо на формі елементи TextBox і Button, яким привласнимо імена tb_value і btn_find відповідно.
У обробник процедури натиснення на кнопку введемо наступний код, що заповнює масив випадковими числами, сортує його і здійснюючий пошук введеного в текстове поле елементу. Код процедури натиснення на кнопку приведений нижче.
protected void btn_find_Click(object sender, EventArgs e)
{
Random rnd = new Random();
Response.Write("Початковий масив <br/>");
for (int i = myArray.GetLowerBound(0); i <=
myArray.GetUpperBound(0); i++)
{
myArray.SetValue(rnd.Next(1, 10), i);
Response.Write(myArray.GetValue(i) + "\t");
}
Response.Write("<br/>");
Array.Sort(myArray);
Response.Write("Після сортування:<br/>");
for (int i = myArray.GetLowerBound(0); i <=
myArray.GetUpperBound(0); i++)
{
Response.Write(myArray.GetValue(i) + "\t");
}
object про = Convert.ToInt32(tb_value.Text);
int findIndex = Array.BinarySearch(myArray, про);
if (findIndex<0)
{
Response.Write("<br/>Элемент не знайдений");
}
else
{
Response.Write("<br/>Элемент знайдений у позиції <b>"+findIndex.
ToString()+"</b>");
}
}
Приклад роботи програми в результаті виконання приведеної вище коди представлений на рис.2.1.
Рис. 2.1– Результат роботи програми заповнення, сортування і пошуку елементів масиву
Як видно, працювати з масивами в C# досить просто, особливо враховуючи досить великі можливості класу Array.
Робота з рядками в 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);
}
Результат роботи програми представлений на рис.2.2.
Рис.2.2 – Результат роботи програми з використанням функції Join
Досить часто при роботі з рядками виникає необхідність розділити рядок на підрядки, відокремлені один від одного заданими символами-роздільниками.
ВПРАВА 2
Створити рядок символів, в якому присутні декілька символів-роздільників. За допомогою функції Split даний рядок розділяється на підряди, які потім виводяться на екран кожен в окремому рядку. Для завдання символів-роздільників використовується масив символів. В даному прикладі також застосовується функція Trim, необхідна в даному випадку для того, щоб переконатися, що заданий рядок не складається з одних лише пропусків.
string words = "рядок, що містить декілька слів, а також
знаків пунктуації: таких як двокрапка і крапка.";
string [] split = words.Split(new Char [] {' ', '',, '.' ':'});
foreach (string s in split)
{
if (s.Trim() != "")
Response.Write(s+"</br>");
}
Підсумком роботи даної програми буде наступний результат, зображений на рис. 2.3.
Рис. 2.3 – Результат роботи програми з використанням функції Split