ОСНОВНІ ПРИНЦИПИ ОБ’ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ. КЛАСИ, ЧЛЕНИ КЛАСУ, ЕКЗЕМПЛЯРИ КЛАСУ. РОЗРОБКА КОНСОЛЬНИХ ЗАСТОСУВАНЬ
ІНСТРУКЦІЯ ДО ЛАБОРАТОРНОЇ РОБОТИ № 5
З КУРСІВ «ТЕХНОЛОГІЇ ПРОГРАМУВАННЯ» ТА
«АЛГОРИТМІЧНІ МОВИ ТА ПРОГРАМУВАННЯ, Ч. 2»
для студентів базових напрямів
6.170101 «Безпека інформаційних та комунікаційних систем»
6.170102 «Системи технічного захисту інформації»
6.170103 «Управління інформаційною безпекою»
Львів – 2015
Основні принципи об’єктно-орієнтованого програмування. Класи, члени класу, екземпляри класу. Розробка консольних застосувань: інструкція до лабораторної роботи №5 з курсів «Технології програмування» та «Алгоритмічні мови і програмування, част.2» для студентів базових напрямів 6.170101 «Безпека інформаційних та комунікаційних систем», 6.170102 «Системи технічного захисту інформації», 6.170103 «Управління інформаційною безпекою». / Укл.: В.І. Отенко, А.І. Партика, Я.В. Решетар - Львів: НУЛП, 2015.- 16 с.
Укладачі: В.І. Отенко, к.т.н., доцент,
А.І. Партика, к.т.н., асистент,
Я.В. Решета, асистент.
Мета роботи – вивчити базові принципи об’єктно-орієнтованого програмування на прикладі алгоритмічної мови C#. Навчитися складати та відлагоджувати прості розрахункові програми лінійної структури.
1. ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Головне в мові С# – реалізація принципів об’єктно-орієнтованого програмування (ООП). Об’єктно-орієнтовна методика невіддільна від С# і всі С#-програми в якійсь мірі мають об’єктну орієнтацію. Тому, перш ніж приступати до написання навіть простої С#-програми, необхідно зрозуміти основні принципи ООП.
Для підтримки принципів об’єктно-орієнтованого програмування всі ООП–мови, включаючи С#, мають три характерні риси: інкапсуляцію, поліморфізм і наслідування.
Інкапсуляція – це механізм програмування, який зв’язує код (дії) і дані, якими він маніпулює, і при цьому охороняє їх від втручання зовні і неправильного використання. В об’єктно-орієнтованій мові код і дані можна зв’язати таким чином, що буде створений автономний чорний ящик. В середині цього ящика находиться всі необхідні дані і код. При такому зв’язку коду і даних утворюється об’єкт. Іншими словами, об’єкт – це елемент, який підтримує інкапсуляцію.
Код, дані чи обидві ці складові об’єкта можуть бути закритими в середині нього або відкритими. Закритий код або закриті дані відомі лише іншій частині цього об’єкта і доступні тільки їй. Це означає, що до закритого коду або даних не може отримати доступ жодна інша частина програми, яка існує не в цьому об’єкті. Якщо код або дані є відкритими, то до них (незважаючи на то, що вони визначені всередині об’єкта) можуть отримати доступ інші частини програми. Як правило відкриті частини об’єкта використовуються для забезпечення керованого інтерфейсу з закритими елементами.
Основною одиницею інкапсуляції в С# є клас. Клас визначає форму об’єкта. Він задає як дані, так і код, який буде керувати цими даними. В С# клас використовується для створення об’єктів. Об’єкти – це екземпляри класу. Таким чином, клас – це по суті набір шаблонних елементів, які показують, як побудувати об’єкт.
Коди і дані, які складають клас, називаються членами класу. Дані, визначені в класі називаються змінними екземплярами (instance variable), а код, який оперує цими даними, – методами-членами (member method), або просто методами. «Метод» - це термін, який використовується в С# для позначення підпрограм. Якщо ви знайомі з мовою С або С++, то, можливо, здогадуєтеся про те, що С# – програміст називає методом, С/С++ – програміст називає функцією. А оскільки С# – прямий нащадок С++, термін «функція», також прийнято використовувати, коли мова йде про C#-методи.
Поліморфізм – це властивість яка дозволяє одному інтерфейсу отримувати доступ до цілого класу дій. Розглянемо, наприклад, стек, тобто область пам’яті, яка функціонує за принципом “останній прийшов – першим буде обслужений”. Припустимо що ви пишете програму, для якої необхідно організувати три різних стека. Один стек призначений для цілочисельних значень, другий для значень з плаваючою комою, а третій для символів. В цьому випадку для реалізації кожного стеку використовується один і той самий алгоритм, не дивлячись на різницю в типах даних що зберігаються. Тобто завдяки поліморфізму в середовищі С# можна створювати один спільний набір “стекових” підпрограм, який обробляє всі три типи стеку.
Концепцію поліморфізму часто виражають такою фразою “один інтерфейс – багато методів”. Це означає, що для виконання групи подібних дій можна розробити спільний інтерфейс.
Наслідування – це процес завдяки якому один об’єкт може отримувати властивості другого. Завдяки наслідуванню підтримується концепція ієрархічної класифікації у вигляді якої організується більшість областей знань.
Якщо б не використовувати ієрархічне подання ознак, для кожного об’єкта необхідно було б в явні формі визначити всі властиві йому характеристики. Але завдяки наслідуванню об’єкту необхідно до визначити лише ті якості, які роблять його унікальними всередині його класу, оскільки цей об’єкт наслідує загальні атрибути свого батьківського класу.
Ідентифікатори
В С# ідентифікатор являє собою ім'я, яке присвоєне методу, змінній чи іншому елементу, визначеному користувачем. Ідентифікатори можуть складатися з одного або декількох символів. Імена мінних повинні починатися з букви або символу підкреслення. Наступним символом може бути буква, цифра і символ підкреслення. Символ підкреслення можна використовувати для покращення читабельності іменні змінної, наприклад max_a. В С# малі та великі букви сприймаються як різні символи. Варто особливо пам’ятати, що ідентифікатор не повинен починатися з цифри. В якості ідентифікаторів не можна використовувати ключові слова мови С# (в мові С# є 77 зарезервованих ключових слів).
Коментарі
Довільний рядок програми, який починається з символів // або /// – є звичайним текстом, призначеним для людини і повністю ігнорується С#. // та /// розглядаються як еквіваленті символи початку коментарю.
Константи
Додавання перед змінною ключового слова const при її оголошенні та ініціалізації помічає її як константу. Таким чином константа – це змінна значення якої не може бути змінено протягом всього часу тривалості її життя.
const int a=100 //ця величина не може змінюватися.
Типи даних
Типи даних в С# мають особливе значення, оскільки С# строго типізована мова. Це означає, що всі операції перевіряються компілятором на відповідність типів. Некоректні операції не компілюються. Крім того, тип значення визначає, які операції дозволяється виконувати з таким значенням.
В С# строго визначається діапазон та поведінка кожного типа значень.
Типи значень в С# наведені в табл.1
Таблиця 1
Ключове слово | Тип |
bool | Логічний, або булевий, надає значення істина/хибність |
byte | 8-ми розрядний цілочисельний без знака |
char | Символьний |
decimal | Числовий тип для фінансових обчислень |
double | З плаваючою точкою подвійної точності |
float | З плаваючою точкою |
int | Цілочисельний |
long | Тип для представлення довгого цілого числа |
sbyte | 8-ми розрядний цілочисельний зі знаком |
short | Тип для представлення короткого цілого числа |
uint | Цілочисельний без знака |
ulong | Тип для представлення довгого цілого числа без знаку |
ushort | Тип для представлення короткого цілого числа без знаку |
Характеристики цілочисельних типів наведені в табл.2:
Таблиця 2
Тип | Розмір в байтах | Діапазон значень |
byte | 0 – 255 | |
sbyte | -128 – 127 | |
short | -32768 – 326767 | |
ushort | 0 – 65535 | |
int | -2 147 483 648 – 2 147 483 647 | |
uint | 0 – 4 294 967 295 | |
long | -9 223 372 036 854 775 808 – 9 223 372 036 854 775 807 | |
ulong | 0 – 18 446 744 073 709 551 615 |
Характеристики типів з плаваючою комою наведені в табл.3:
Таблиця 3
Тип | Розмір в байтах | Діапазон значень |
double | Від 1.5*10-45 до 3.4*1038 | |
float | Від 5*10-324 до 1.7*10308 |
Керуючі послідовності символів наведені в табл.4.
Таблиця 4
ESC-послідовність | Опис |
\a | Звуковий сигнал (дзвінок) |
\b | Повернення на одну позицію |
\f | Подача сторінки (для переходу на іншу сторінку) |
\n | Нова сторінка |
\r | Повернення каретки |
\t | Горизонтальна табуляція |
\v | Вертикальна табуляція |
\0 | Нуль символ |
\’ | Одинарні лапки (апостроф) |
\” | Подвійні лапки |
\\ | Зворотна коса риска |
Арифметичні оператори
Арифметичні оператори мори С# наведені в табл.5:
Таблиця 5
ОПЕРАТОР | ДІЯ |
+ | Додавання |
- | Віднімання, унарний мінус |
* | Множення |
/ | Ділення |
% | Ділення за модулем |
-- | Декремент |
++ | інкремент |
Дія в С# операторів +,-,* та / співпадає з дією аналогічних операторів в будь-якій іншій мові програмування. Їх можна використовувати для довільних даних числового типу.
Оператори відношення та логічні оператори
Оператори відношення наведені в табл. 6:
Таблиця 6
ОПЕРАТОР | ЗНАЧЕННЯ |
== | Рівне |
!= | Не рівне |
> | Більше |
< | Менше |
>= | Більше або рівне |
<= | Менше або рівне |
Логічні оператори наведені в табл.7:
Таблиця 7
ОПЕРАТОР | ЗНАЧЕННЯ |
& | І |
| | АБО |
^ | Виключне І |
&& | Скорочене І |
|| | Скорочене АБО |
! | НІ |
Результат виконання операторів відношення та логічних операторів має тип boolean.
Оператор присвоєння:
Оператор присвоєння позначається одинарним знаком рівності (=). Загальна форма запису оператора присвоєння має наступний вигляд:
Змінна = вираз;
Тип елемента змінна повинен бути співставним з типом елемента вираз.
Пріоритет операторів
В таблиці 8 показано порядок дій операторів в мові С#. оператори у верхній частині таблиці мають найвищий пріоритет (тобто у виразах, які містять декілька операторів, вони обчислюються першими)
Таблиця 8
Група | Оператори |
Унарні | + – ! ~ |
Множення/ділення | * / % |
Додавання/віднімання | + - |
Операції побітового зсуву | << >> |
Відношення | < > <= >= |
Порівняння | == != |
Побітовий AND | & |
Побітовий XOR | | |
Побітовий OR | ^ |
Логічний AND | && |
Логічний OR | || |
Присвоєння | = += -= *= /= %= і т.д. |
Модифікатори доступу.
До визначення змінної можна додавати модифікатори, які служать для вказування додаткових параметрів змінної. Існують наступні модифікатори доступу: internal, private, protected і public. В оголошенні змінної може вказуватися лише один з цих модифікаторів, за виключенням спільного використання модифікаторів protected та internal. Таким чином існує п’ять можливих рівнів доступу, описані в табл.9:
Таблиця 9
Рівень доступу | Опис |
public | Члени доступні з будь-якого місця програми |
internal | Члени доступні з будь-якого класу в тому ж модулі програми |
protected | Члени доступні лише з поточного класу і всіх його підкласів. |
protected internal | Члени доступні для поточного класу і всіх його підкласів в тому ж модулі програми |
private | Члени доступні лише з поточного класу |
Введення в класи.
Класс – це шаблон, який визначає форму об’єкта. Він захищає як дані так і код , який оперує цими даними. С# використовує специфікацію класу для створення об’єкта. Об’єкти – це екземпляри класу. Таким чином, клас – це множина намірів (планів), які визначають, як повинен бути побудований об’єкт.
Визначаючи клас, ви визначаєте дані, які він містить, і код, який маніпулює цими даними.
Клас створюється за допомогою ключового слова class. Загальна форма визначення класу має наступний вигляд:
сlass ім’я класу
{
//оголошення змінних
доступ тип змінна 1;
доступ тип змінна 2;
//…
доступ тип змінна N;
// Оголошення методів
доступ тип_повернення метод 1 (параметри)
{
// тіло методу
}
доступ тип_повернення метод 2 (параметри)
{
// тіло методу
}
//…
доступ тип_повернення метод N (параметри)
{
// тіло методу
}
}
Елемент доступу означає специфікатор доступу (наприклад, public), який визначає як до цього члена можна отримати доступ. Специфікатор доступу є необов’язковим, і, якщо він не вказаний, то мається на увазі, що цей член закритий (private). Закриті члени можуть лише використовуватися тільки іншими членами свого класу.
Вважається, що клас повинен визначати лише одну логічну сутність.
Створення об’єктів
Базові типи мови С# (int, char та ін.) являються розмірними та зберігаються в стеці. Об’єкти зі своєї сторони, мають тип посилання і створюються за допомогою ключового слова new:
Time t = new Time()
Тут змінна t не містить значення об’єкта Time, а містить адресу об’єкта (безіменного). Сама змінна t є лише посиланням на цей об’єкт.
Конструктори
Ззовні оператор який створює об’єкт виглядає як виклик методу. Дійсно при створенні екземпляру відбувається звертання до методу. Він називається конструктором і програміст повинен визначити його як частину визначення класу. Задача конструктора полягає в тому, що він повинен створити об’єкт вказаного класу і перевести його в діючий стан. До виклику конструктора об’єкт являє собою неініціалізовану область пам’яті, по закінченню його роботи ця пам'ять містить діючий екземпляр даного класу.
Клас Math
В класі Math визначено багато стандартних математичних операцій. Деякі з методів визначених в класі Math наведені в наступній табл.10:
Таблиця 10
Метод | Опис |
Abs (x) | Повертає абсолютне значення x |
Acos (x) | Повертає арккосинус x |
Asinx (x) | Повертає арксинус x |
Atan (x) | Повертає арктангенс x |
Log (x) | Повертає натуральний логарифм х |
Log (x,y) | Повертає логарифм для параметра х за основою у |
Log10 (х) | Повертає логарифм для параметра х за основою 10 |
Max (x,y) | Повертає більше з значень x, y |
Min (x,y) | Повертає менше з значень х, у |
Pow (x,y) | Повертає значення х піднесене до степеня у |
Round (x) | Повертає значення х округлене до найближчого цілого числа |
Sin (x) | Повертає синус параметра х |
Sinh (x) | Повертає гіперболічний синус параметра х |
Tan (x) | Повертає тангенс параметра х |
Tanh (x) | Повертає гіперболічний тангенс параметра х |
2. ПОЧАТОК РОБОТИ В СЕРЕДОВИЩІ С#
Запуск Visual Studio 2005. Для запуску Visual Studio 2005 виберіть команду меню ПУСКПРОГРАМИMicrosft Visual C# 2005 Express Edition, або запустіть з робочого стола за допомогою ярлика, як показано на рис.1.
Рис.1. Запуск Microsft Visual C# 2005 Express Edition з меню ПУСК і за допомогою ярлика.
Створення консольної програми. Виберіть в меню команду FileNewProject, Visual Studio відкриє діалогове вікно як показано на рис.2.
Рис.2. Діалогове вікно створення нового проекту.
В панелі Templates виберіть піктограму Console Application, в рядку Name введіть назву свого проекту. Завантажиться шаблон програми, який можна буде редагувати для конкретних завдань. По замовчуванню ім’я консольної програми має назву ConsoleApplication1.
Visual Studio вимагає створення проекту перед тим, як ви зможете почати вводити вихідний текст вашої програми. Проект можна розглядати як кошик, в якому зберігаються всі файли, необхідні для розроблення програми.
Після того як ви натиснете кнопку ОК Visual Studio згенерує файл Program.cs. Розширення вихідних файлів С# - *.cs. Ім’я Program – це ім’я по замовчуванню, яке присвоюється файлу програми.
Вміст вашої першої консольної програми виглядатиме так:
using ...
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
Вздовж лівої границі вікна ви побачите декілька маленьких плюсів (+) і мінусів (-) в квадратиках. Клацніть на знак + біля using ... . Цією дією ви відкриєте область коду – це досить зручна можливість Visual Studio яка дозволяє зменшити кількість тексту на екрані, згортаючи області коду і ховаючи його від очей програміста, але не компілятора.
Області коду помагають сфокусуватись на коді, з яким ви працюєте, приховуючи код, який на даний момент не є необхідним. Деякі блоки коду, такі як блок класів, методів і ін., отримують значки +/- автоматично, без директиви #region. Ви можите включити у вихідний текст власні згортаючі області, добавляючи #region над частиною коду який хочете згорнути і #endregion після нього.
Запуск на виконання.
Щоб перетворити вихідний текст програми С# у виконавчу програму ConsoleApplication1.exe, скористайтесь командою меню BuildBuild ConsoleApplication1. Результатом виконання даної команди буде згенероване повідомлення, в якому буде відображеня службова інформація про результат перевірки. Для запуску програми скористуйтесь командою меню DebugStart Without Debugging. Програма виведе на екран чорне консольне вікно і одразу завершиться.
Для того щоб відкрити вікно DOS, спробуйте скористатися командою меню ToolsCommand Window. Якщо ця команда недоступна у вашому меню Tools, скористуйтесь командою меню StartAll ProgramsMicrosoft Visual Studio 2005Visual Studio ToolsVisual Studio 2005 Command Prompt.
Схема програми.
Базова схема всіх консольних програм починається з наступного коду:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{//Стартова точка програми
static void Main(string[] args)
{
//Ваш код
}
}
}
Програма починає виконання з першого рядка, який йде після назви функції Main(), і закінчується її закриваючою фігурною дужкою. Список директив using може знаходитись безпосередньо до або після рядка namespace ConsoleApplication1 {.
Тіло програми.
Створимо програму привітання.
using System;
namespace ConsoleApplication1
{//Фігурні дужки
//Клас Program – обєкт, який містить код
class Program
{//Це початок програми
//Кожна програма має метод Main()
static void Main(string[] args)
{//Запрошення ввести імя користувача
Console.WriteLine(“Будь-ласка, введіть ваше імя:”);
//Зчитування імя яке вводиться
string sName = Console.ReadLine();
//Вітання користувачу з використання введеного імені
Console.WriteLine(“Добрий день,” +sName);
//Очікування підтвердження користувача
Console.WriteLine(“Нажміть <Enter> для завершення
програми...”);
Сonsole.Read();
//Код Main() на цьому закінчується
}//Кінець методу Main()
}//Кінець класу Program
}//Кінець простору імен ConsoleApplication1
Ядро програми розміщене в блоці вихідного тексту, поміченого як Main():
//Запрошення ввести імя користувача
Console.WriteLine(“Будь-ласка, введіть ваше імя:”);
//Зчитування імя яке вводиться
string sName = Console.ReadLine();
//Вітання користувачу з використання введеного імені
Console.WriteLine(“Добрий день,” +sName);
Ви можете зекономити багато часу, використовуючи при вводі нову можливість – Code Snippets (фрагменти коду), яка полегшує ввід розповсюджених інструкцій, таких як Console.WriteLine. натисніть комбінацію клавіш <Ctrl+K>, і <Ctrl+X> для появи розгортаючого меню Code Snippets. Прокрутіть його до cw і натисніть клавішу <Enter>. Visual Studio вставить в тіло програми інструкцію Console.WriteLine() з точкою вводу між дужками.
Програма почне роботу з першої інструкції С#: Console.WriteLine. Ця команда виводить на екран рядок Будь-ласка, введіть ваше імя:.
Наступна інструкція зчитує рядок введений користувачем і зберігає його в змінній з іменем sName. В останньому рялку виконується обєднання рядків Добрий день з введеним іменем користувача, а також вивід рядка який утворився на екран.
Останні рядки заставляють компютер очікувати, поки користувач не натисне клавішу <Enter>.Ці рядки забезпечують зупинку виконання програми, щоб був час переглянути на екрані результат її роботи.