Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Інформаційні управляючі системи та технології

Поиск

Інформаційні управляючі системи та технології

Освітньо-кваліфікаційний рівень – магістр

 

ТЕМА 1. ПАРАДИГМА ІМПЕРАТИВНОГО ПРОГРАМУВАННЯ

Лекція 1. Огляд парадигм програмування

Базові поняття і визначення

Перш ніж почати вивчення парадигм, визначимо саме поняття «парадигма програмування».

В програмування цей термін ввів Роберт Флойд ще в 1987 році [1] в своїй лекції про виникнення і вплив на програмістів парадигм програмування, під парадигмою він розумів основну концептуальну ідею або комплекс ідей, які визначають характерні риси технологій програмування.

Інтернет-енциклопедія Вікіпедія дає таке визначення парадигми:

Парадигма (грец. paradeigma - приклад, зразок).

Паради́гма програмування — основні принципи програмування (не плутати з розробкою програм), або, парадигмне програмування.

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

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

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

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

Процедурне програмування часто використовують як синонім імперативного і навпаки.

Іноді до основної парадигми відносять також і паралельне програмування.

Розвиток парадигм пов'язаний з двома основними взаємозв'язаними причинами:

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

2. зростанням складності програм і систем, зростанням вимог до їхньої якості та надійності.

Таким чином - перша причина розвитку парадигм – неповнота мов програмування.

Друга причина – боротьба за ефективність обчислень і якість програм.

Окрім цих причин, є ще одна причина, яка стимулює появу нових парадигм – це обмежені ресурси, такі як: пам'ять, швидкість обчислень і продуктивність праці програмістів.

Обмеження оперативної пам'яті перших комп'ютерів стимулювало розвиток процедурної парадигми. Недостатня швидкість обчислень для вирішення складних обчислювальних задач призвела до появи паралельного програмування. Низька продуктивність праці програмістів і складність пошуку помилок у програмах сприяла розвитку мов програмування високого рівня і технологій програмування (структурного, об'єктно-орієнтованого, компонентного). Ця ж причина стимулювала і розвиток парадигми візуального програмування і проектування.

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

Рис. 1.1. Парадигми і стилі програмування


Парадигми

Возможность Язык
Ada C C++ C# D Eiffel Erlang Prolog F# Groovy Java JavaScript Haskell Common Lisp Nemerle Perl PHP Python Ruby Scala Smalltalk Tcl VB.NET Delphi OCaml PureBasic
Императивный + + + + + + - - + + + + + [1] + + + + + + + + + + + + +
Объектно-ориентированный + - + + + + - [2] - + + + + [4] - [5] + + + + + + + + + + + + -/+
Функциональный - - -/+ +/- +/- +/- + + + + - + + + + + +/- +/- + + + + +/- -/+ + +/-
Рефлексивный - - - -/+ - ? + + -/+ -/+ -/+ + - + -/+ +/- + + + -/+ + + -/+ -/+ - ?
Обобщенное программирование + - + + + +/- + + + + + + + + + + + + + + + - + + + -/+
Логический - - - - - - - + - - - - +/- [6] +/- [7] +/- - - - - ? +/- - - - - ?
Декларативный - - - -/+ [8] -/+ ? + + + + - - + + [9] + -/+ [10] + + + + +/- - +/- - + +/-
Распределенный + [11] +/- [12] +/- [12] -/+ [13] - + + + - -/+ + - + [14] +/- - - - -/+ -/+ ? +/- ? - - - -
  Ada C C++ C# D Eiffel Erlang Prolog F# Groovy Java JavaScript Haskell Common Lisp Nemerle Perl PHP Python Ruby Scala Smalltalk Tcl VB.NET Delphi OCaml PureBasic

Функциональные возможности


Процедурне програмування

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

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

Приклади мов програмування: всі імперативні мови 2-го і 3-го поколінь підтримують цю парадигму. C/С++, Кобол, Паскаль тощо.

При цьому виключається дублювання коду, поліпшується супровід програми.

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

 

Модульне програмування.

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

- можна окремо розробляти (різними людьми);

- можна окремо зберігати і компілювати.

При модульному програмуванні виконується окрема компіляція модулів, збирання і формування виконуваного модуля роблять редактори зв'язків і компонувальники. До механізму раннього зв’язування (статичного) додається механізм пізнього зв’язування (динамічний виклик модулів).

Усередині модулів організація коду може бути як при процедурному програмуванні. Встановлено чіткі механізми введення-виведення даних – через аргументи (на вході) і результати (на виході) процедури; визначено сферу дії змінних. Забезпечується можливість автономної реалізації і зберігання коду (в бібліотеках модулів), а також збирання програм з модулів.

При модульному програмуванні полегшується тестування і повторне використання коду; допускається розподілена розробка програм (розробка автономних модулів окремими програмістами), а також розподілене виконання.

Модульний принцип покладено в основу практично всіх стилів програмування, особливо об'єктно-орієнтованого і компонентного. Він також пов'язаний з підходом до проектування «зверху-вниз» і структурним програмуванням.

Збіркове програмування. Базується на збиранні програми з готових модулів, які розміщуються в бібліотеках.

Модулі можуть зберігатися як у бінарному вигляді, так і початковому. Забезпечується багаторазове використання модулів. Ідея збіркового програмування отримала розвиток у парадигмі компонентного програмування. На відміну від компонентного – збіркове програмування не потребує компонентної моделі (каркасу).

Структурне програмування

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

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

Послідовністю називається конструкція, що реалізовує послідовне виконання двох або більше операторів (простих або складних).

Розгалуження задає виконання того чи іншого оператора залежно від виконання якої-небудь умови. Реалізується за допомогою операторів if та switch.

Цикл реалізує багатократне виконання операторів. Реалізується за допомогою операторів циклу.


Рис. 1.2. Базові конструкції структурного програмування

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

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

у С# їм відповідає чотири види циклів (while, do, for, foreach) і два види розгалужень (if та switch).

Блоки обчислень, які потрібно повторювати оформлюються у вигляді процедур.

Розробка програм виконується зверху-вниз.

Обмеження - скорочення (або заборона) використання оператора goto; одна точка входу в секцію (блок), але декілька можливих точок виходу. Структурне програмування часто асоціюється з розробкою «зверху-вниз».

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

Парадигма структурного програмування домінувала у 70-і 80-і роки минулого сторіччя до появи об'єктно-орієнтованої парадигми.

Структурний підхід до проектування застосовується в ORACLE, SSADM і ін. та добре підходить для ієрархічних систем.

Приклади мов: у всі сучасні мови імперативного програмування введені елементи і обмеження структуризації, наприклад, Pascal, Ada, Fortran, Cobol, Basic.

У C# ідеї структурного програмування використовуються на найнижчому рівні — при написанні методів класів.

Приклади конструкцій структурного програмування на мові C#

Послідовність:

static void Main(string[] args)

{

Console.WriteLine("Введите x- угол в радианах");

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

Console.WriteLine("Введите показатель степени n");

int n = int.Parse(Console.ReadLine());

//вызов метода вычисления sin(x) через ряд

double my_sinus = Calc_sin(x,n);

//вызов метода из класса Math

double sinus = Math.Sin(x);

double delta = sinus - my_sinus;

Console.WriteLine("my_sinus= {0},sin={1},delta={2}", my_sinus, sinus, delta);

Console.ReadKey();

}

 

Розгалуження

if (!IsNumeric(s1))

{

throw new Exception("Перший член виразу - не число");

}

Switch (op)

{

case ("+"):

result = digit1 + digit2;

break;

case ("-"):

result = digit1 - digit2;

break;

case ("/"):

result = digit1 / digit2;

break;

case ("*"):

result = digit1 * digit2;

break;

default:

throw new Exception("Невідома операція");

}//switch

 

Цикл

for (int i = 0; i < n; i++)

{

result=result+(Math.Pow((-1),i)*Math.Pow(x,(2*i+1)))/F(2*i+1);

}

 

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

Приклад (C#)

Public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

double x = double.Parse(txt_x.Text);

int n = int.Parse(txt_n.Text);

//вызов метода вычисления sin(x) из библиотеки

double my_sinus = MySin.MySin.Sin(x, n);

//вызов метода из класса Math

double sinus = Math.Sin(x);

txt_y1.Text = my_sinus.ToString();

txt_y2.Text = sinus.ToString();

}

private void button2_Click(object sender, EventArgs e)

{

this.Close();

}

}

В цьому фрагменті є два методи обробки подій: button1_Click і button2_Click, які викликаються при натисненні програмних кнопкок.

 

Базовим поняттям програмування керованого подіями, що відрізняє його від імперативного є поняття процесу.

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

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

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

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

В програмуванні керованому подіями окремі процеси максимально автономні, єдиний спосіб спілкування між ними - обмін повідомленнями.

Програмування кероване подіями – найбільш поширена сучасна парадигма прикладного програмування, підтримувана операційними системами (ОС) і реалізована в мовах програмування (С++, Visual Basic, C#) та інших.

 

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

Висновки

1. Загальні парадигми програмування, що склалися на самому початку ери комп'ютерного програмування, - парадигми прикладного, теоретичного і функціонального програмування мають найбільш стійкий характер.

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

3. Домінуючі парадигми прикладного програмування за роками розвитку:

60-і роки 20 ст. – процедурне програмування;

70-і 80-і роки 20 ст – структурне програмування;

90-і роки 20 ст – об'єктно-орієнтоване програмування;

кінець 90-х – початок 21 ст. – компонентне програмування;

10-і – 20-і роки – функціональне?

3. Сучасні мови програмування підтримують одночасно декілька парадигм, тобто є мультипарадигменними.

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

5. Напрями розвитку парадигм програмування відбивають зміну кола фахівців, зацікавлених в розвитку і використанні інформаційних технологій.

Запитання

1. Що означає поняття “парадигма програмування”?

2. Які парадигми відносяться до основних?

3. Які основні причини, обумовлюють появу нових парадигм?

4. В чому різниця між передачею параметра за значенням та за посиланням?

5. Чим відрізняється підпрограма від функції?

6. Яку концепцію, покладено в основу парадигми процедурного програмування?

7. Які мови програмування підтримують процедурну парадигму?

8. Які основні риси модульного підходу?

9. До якої основної парадигми відноситься структурне програмування?

10. Що таке “область дії змінної”?

11. Що таке “модуль” і чим він відрізняється від процедури чи методу?

12. У чому суть структурного підходу?

13. Які основні ознаки визначають парадигму паралельного програмування?

14. Які основні ознаки визначають парадигму програмування, орієнтовану на обробку подій?

15. Що таке “розподілені обчислення”?

16. Що таке події, оброблювачі подій і як вони пов’язані між собою?

17. Які основні підходи використовуються для організації паралельних обчислень?

 


Питання

1. Які основні принципи об’єктно-орієнтованої парадигми?

2. У чому полягає сутність механізму абстракції даних?

3. Які парадигми підтримуються у С++?

4. Які концепції покладено в основу об’єктно-орієнтованої парадигми?

5. Назвіть основні відміни об’єктно-орієнтованого програмуванні від структурного.

6. Що таке об’єкт у об’єктно-орієнтованому програмуванні і як він використовується?

7. Що таке “властивість” об’єкта?

8. Що таке “наслідування”. Навести приклад

9. Що таке “поліморфізм” і стосовно якої парадигми він використовується?

10. Що таке “інкапсуляція” і до якої парадигми належить це поняття?

11. Яка особливість реалізації принципів ООП в C# порівняно з C++?

12. Які дві ролі класу в C#?


Програмування за прототипом

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

На відміну від стилю ООП, базованого на класах і концентруючого увагу розробника на ієрархії класів і на зв’язках між ними, стиль прототипного програмування загострює увагу на поведінці невеликої кількості «зразків», які далі використовуються як «базові» об'єкти для створення інших об'єктів.

Створення нового об'єкту виконується одним з двох методів: шляхом клонування існуючого об'єкту, або шляхом створення об'єкту « з нуля». Для створення об'єкту з нуля надаються синтаксичні засоби додавання властивостей і методів в об'єкт. Потім, для побудованого об'єкту може бути отримана повна копія, клон. В процесі клонування копія успадковує всі характеристики свого прототипу, але з цієї миті стає самостійною і може бути змінена. В деяких реалізаціях копії зберігають посилання на об'єкти-прототипи, делегуючи їм частину своєї функціональності; при цьому зміна прототипу може торкнутися всіх його копій. В інших реалізаціях нові об'єкти знаходять повну незалежність від своїх прототипів: прототип копіюється один-в-один, з усіма методами і атрибутами, і копії привласнюється нове ім'я (посилання). Перевага даного підходу полягає в тому, що творець копії може її міняти, не побоюючись побічних ефектів серед інших нащадків свого предка. Крім того, істотно знижуються обчислювальні витрати на диспетчеризацію, оскільки немає необхідності обходити весь ланцюжок можливих делегатів у пошуках відповідного методу або атрибута. В числі недоліків підходу - труднощі з розповсюдженням змін в системі: модифікація прототипу не спричиняє за собою негайну і автоматичну зміну всіх його нащадків. Канонічним прикладом прототипної мови є мова Self. Прототипний стиль програмування покладено також в основу JavaScript.

Сценарне програмування

Сценарні мови (або мови скриптів (scripting languages)) мають достатньо тривалу історію розвитку. Концепція сценарного програмування з'явилася як розвиток мови LISP (парадигми функціонального програмування). До перших сценарних мов відносять вбудовані засоби управління командної оболонки операційною системою. Командний файл на мові операційної системи, представляє собою управляючий сценарій, який виконує задану послідовність дій (*.bat-файл).

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

Характерною рисою сценарних мов є формування програми на деякій зовнішній мові як результату виконання сценарію (наприклад, PHP). Сценарна мова мало спирається на створення кінцевого продукту з нуля і більшою мірою – на використання тих можливостей, які має операційна система, графічне середовище, прикладна сервісна машина та інші подібні компоненти, взаємодія яких здійснюється за допомогою сценаріїв.

Сценарна парадигма припускає розбиття задачі на окремі частини, кожна з яких розв'язується спеціалізованими програмними засобами, а сценарій виступає в ролі «диспетчера», відповідального за організацію їхньої взаємодії.

Сценарні мови для web-розробки створені в 90-і роки XX століття і включають елементи різних парадигм програмування від імперативної до об'єктно-орієнтованої. Серед найбільш популярних сценарних систем можна відзначити: Perl, PHP, ASP, VBScript, JavaScript, Pyton. Синтаксис і семантика різних сценарних мов схожі. Це обумовлено значним впливом мов С і С++ на програмістів.

Крім Web-застосунків сценарні мови використовуються для настройки і розширення різних прикладних програмних продуктів (наприклад, OPIMA-Workflow), для запису сценаріїв тестування в інструментальних засобах тестування тощо.

Основна принципова відміна сценарних мов від компілюючих полягає в тому, що в них відсутній виконуваний код (.exe- файл). Кожна команда сценарію інтерпретується і одразу виконується.

Питання

1. Які мови сценаріїв вам відомі?

2. У чому відміна сценарної парадигми програмування від імперативної?

3. Які основні ознаки сценарної парадигми програмування та основні мови?


Питання

1. У чому сутність компонентної парадигми?

2. Які основні ознаки визначають парадигму компонентного програмування?

3. Що таке “компонент” і чим він відрізняється від класу?

4. Що таке “інтерфейс” компонента і як він використовується у компонентній системі (програмі)?

5. Які основні типи композицій використовуються у компонентній моделі?

6. З чого складається внутрішня частина компонента?

7. З чого складається інформаційна частина компонента?

8. З чого складається зовнішня частина компонента?

9. У якому вигляді використовуються компоненти (у вигляді початкового (исходного)), як exe-файли чи як dll-бібліотеки?

10. Які основні компоненті моделі використовуються у Windows?

11. Які основні складові утворюють структуру компонента?

12. Які основні типи композицій використовуються у компонентній моделі?

13. Які правила визначає модель COM?

14. З чого складається модель COM?

15. Які основні типи серверів моделі COM?

 


Структура FCL

За функціональним призначенням у складі FCL можна виділити:

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

- набір класів для роботи з даними, що надають можливість використовування SQL-запитів, ADO.Net і обробки XML даних;

- набір класів Windows Forms, що дозволяють створювати звичайні Windows-застосування, в яких використовуються стандартні елементи управління Windows;

- набір класів Web Forms, що забезпечують можливість швидкої розробки Web-застосувань, в яких використовується стандартний графічний інтерфейс користувача;

- набір класів Web Services, що підтримують створення розподілених компонентів-сервісів, доступ до яких може бути організований через Інтернет.

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

Допускається імпорт просторів імен з використанням зарезервованого слова using мови програмування C#.

Простір імен визначає область видимості об'єктів (змінних, класів, даних).

Основним простором імен бібліотек FCL є простір System, що містить як класи, так і інші вкладені простори імен. Наприклад, простір System.Windows.Forms містить класи, які використовуються при створенні Windows-застосувань. Клас Form з цього простору задає форму - вікно, на якому розміщуються елементами управління.

В таблиці перелічено ієрархію основних просторів імен та їх призначення

System Головний простір
System.Data Класи для роботи з базами даних
System.Data.Common  
System.Data.OleDb  
System.Data.SqlClient  
System.Collections Класи для роботи с контейнерами
System.Diagnostics Класи для трасування и відлагодження коду
System.Drawing Класи графіки
System.Drawing.Drawing2D  
System.Drawing.Printing  
System.IO Підтримка введення/виведення
System.Net Підтримка передачі даних по мережах
System.Reflection Робота з типами даних, визначеним користувачем, під час виконання програми
System.Reflection.Emit  
System.Runtime.InteropServices Підтримка взаємодії зі "звичайним кодом" (некерованим) – DLL, COM-сервери, віддалений доступ
System.Runtime.Remoting  
System.Security Криптографія, прівілеї
System.Threading Робота с потоками
System.Web Робота с web-застосунками

Рис. 5.1. Структура системи типів Microsoft.NET

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

Типи-значення не беруть участь в наслідуванні. Крім того, типи-значення копіюються при привласненні значення.

Посилкові типи потребують використовування покажчиків на об’єкти, що типізуються, а також централізованого зберігання і вивільнення пам'яті. Отже, об’єкти цього типу є динамічними, пам’ять під них виділяється з «кучі» і вивільняється після знищення об’єкти («збірка сміття»).

Посилкові типи можуть приймати одну з трьох форм:

1) об'єктні типи (object type);

2) інтерфейсні типи (interface type);

3) типи-покажчики (pointer type).

Управління типами в CTS

• Типи можуть використовуватися після ініціалізації (з урахуванням методу виклику, властивостей get і set і т.д.).

• Над типами можуть виконуватися перетворення (як явним, так і неявним чином).

 

 

Наприклад,

using System;

Створення DLL-бібліотеки

Запустимо Visual Studio 2008, із стартової сторінки перейдемо до створення проекту, виберемо тип проекту «Class Library». У вікні створення DLL всі поля заповнені значеннями за замовчанням. Як правило, їх слід перевизначити, задаючи власну інформацію.

У полі Name задати ім'я DLL – MyLib.

У полі Location вказується шлях до каталогу, де зберігатиметься Рішення, що містить проект.

У полі Solution вибраний елемент «Create New Solution», що створює нове Рішення. Альтернативою є елемент списку, вказуючий, що проект може бути доданий до існуючого Рішення.

У вікні Solution Name задано ім'я Рішення.

Зверніть увагу на інші установки, зроблені в цьому вікні, - включений прапорець (за замовчанням) «Create directory for solution», у верхньому віконці із списку можливих каркасів вибраний каркас Framework.Net 3.5. Задавши необхідні установки і клацнувши по кнопці «OK», отримаємо автоматично побудовану заготівку проекту DLL, відкриту в середовищі Visual Studio 2008.

Імена класів повинні бути змістовними. Змінимо ім'я «Class1» на ім'я «MyFun». Для цього у вікні коду проекту виділимо ім'я змінної об'єкту, потім в головному меню виберемо пункт Refactor і підпункт Rename. У вікні, що відкрилося, вкажемо нове ім'я. Тоді будуть показані всі місця, що вимагають перейменування об'єкту. В даному випадку буде лише одна очевидна заміна, але в загальному випадку замін багато, так що автоматична заміна всіх входжень корисна.

Наступний крок також продиктований правилом стилю – ім'я класу і ім'я файлу, що зберігає клас, повинні збігатися. Перейменування імені файлу робиться безпосередньо у вікні проектів Solution Explorer.

І наступний крок продиктований також важливим правилом стилю, - додавання коментаря. Для цього в рядку перед заголовком класу слід набрати три слеша (три косі риски). В результаті перед заголовком класу з'явиться заголовний коментар – тег «summary», в який і слід додати короткий, але змістовний опис призначення класу. Теги «summary», якими слід супроводжувати класи, відкриті (public) методи і поля класу відіграють три важливі ролі. Вони полегшують розробку і супровід проекту, роблячи його самодокументованим. Клієнти класу при створенні об'єктів класу отримують інтелектуальну підказку, що пояснює суть того, що можна робити з об'єктами. Спеціальний інструментарій дозволяє побудувати документацію за проектом, що включає інформацію з тегів «summary».

У нашому випадку коментар до класу MyFun може бути достатньо простим – «Обчислення математичних функцій».

Напишемо реалізацію одного методу класу – обчислення функції Sin(x) через ряд Тейлора.

Спочатку напишемо коментарі до методу (у форматі XML). Далі напишемо реалізацію методу. Отримаємо код.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace MyLib

{

///Обчислення математичних фунцій

 

public class MySin

{

/// <summary>

/// Sin(x)

/// </summary>

/// <param name="x">кут в радіанах – перший аргумент функції Sin</param>

///<param name="n">показник ступеня – другий аргумент функції Sin</param>

/// <returns>Повертає значення функції Sin для заданого кута</returns>

public static double Sin(double x, int n)

{

double result = 0;

for (int i = 0; i < n; i++)

{

result = result + (Math.Pow((-1), i) * Math.Pow(x, (2 * i + 1))) / F(2 * i + 1);

}

return result;

}

static double F(int n)

{

double tmp = 1;

for (int i = 1; i <= n; i++)

{

tmp = tmp * i;

}

return tmp;

 

}

 

}

}

 

 

Побудуємо Рішення, що містить проект, для чого в Головному меню виберемо пункт Build|Build Solution. В результаті успішної компіляції буде побудований файл з уточненням dll. Він знаходиться в папці проекту

.\bin\Debug

Оскільки побудована збірка не містить виконуваного файлу, то безпосередньо запустити наш проект на виконання не удасться. Побудуємо консольний проект, до якого приєднаємо нашу DLL, і протестуємо, наскільки коректно працюють створені нами методи.

Set as StartUp Project

 

Після цього його можна запустити на виконання.

 

Документування коду

/// <summary>

/// Sin(x)

/// </summary>

/// <param name="x">кут в радіанах – перший аргумент функції Sin</param>

///<param name="n">показник ступеня – другий аргумент функції Sin</param>

/// <returns>Повертає значення функції Sin для заданого кута</returns>

 

 

Завдання для самостійної роботи

2. Створити DLL-бібліотеку, яка містить методи, що реалізують завдання. В кожному методі вказати XML-коментарі.

3. Створити рішення, яке включає DLL-бібліотеку, консольний проект, який тестує роботу бібліотечних методів.

3. Створити Windows-проект в тому самому рішенні, який викликає бібліотечні методи.

4. Створити DLL-бібліотеку як окреме рішення. Зв'язати бібліотеку з Windows-проектом.

 

№ варіанту Зміст завдання
  1. Створити масив для зберігання значень зросту студентів групи (20 чоловік). Заповнити масив за допомогою класу Random цілими числами в діапазоні від 160 до 190 включно. Відсортувати масив і вивести на консоль його елементи.   2. Є прямокутний масив розмірністю (5x5). Визначити суму всіх елементів третього рядка і суму всіх елементів першого стовпчика.   3. Реалізувати консольній застосунок знаходження методом бісекції коренів нелінійного рівняння 6x4-3x3+8x2-25=0  
  1. Згенерувати масив М випадкових чисел в діапазоні від 1 до 50. Обчислити суму елементів масиву, середнє арифметичне (мат.очікування) елементів M, квадратний корінь від М, min і max елементів масиву. Результати вивести на консоль.   2. В двовимірному масиві зберігається інформація про зарплату 18 співробітників за 12 місяців (за січень – першому стовпчику, лютий – другому,...). Визначити загальний бюджет зарплати за рік, загальну і середню зарплату за квітень.   3. Реалізувати консольній застосунок знаходження методом Ньютона коренів нелінійного рівняння (x2-6*x)2 -2(x-3)2=81  
  1. Згенерувати масив випадкових чисел в діапазоні від 10 до 100. Обчислити добуток елементів масиву, середнє арифметичне (мат.очікування) елементів M, min і max елементів масиву. Результати вивести на консоль.   2. В двовимірному масиві зберігається інформація про зарплату 18 співробітників за 12 місяців (за січень – першому стовпчику, лютий – другому,...). Визначити загальну зарплату кожного співробітника за рік і середню зарплату за кожний місяць.   3. Реалізувати консольній застосунок знаходження методом бісекції коренів нелінійного рівняння (x2+2x)2-(x+1)2=55  
  1. Згенерувати масив випадкових дійсних чисел в діапазоні від 0 до 1. Відсортувати масив, знайти min і max елементи. Результати вивести на консоль.   2. В двовимірному масиві зберігається інформація про зарплату 30 працівників фірми за 12 місяців (за січень – першому стовпчику, лютий – другому,...). Визначити середню зарплату фірми за кожний місяць року, а також середню зарплату за кожний місяць кожного співробітника. 3. Реалізувати консольній застосунок знаходження коренів нелінійного рівняння методом бісекції (x2+x+1)(x2+x+1) -12=0  
  1. Згенерувати дві серії випадкових чисел, що повторюються. Кількість чисел ввести з консолі. Результати вивести на консоль.   2. В двовимірному масиві зберігається інформація про оцінки студентів з двох дисциплін (з дисципліни ОС – в першому стовпчику, з дисципліни Мова С# - в другому). Визначити середню успішніс


Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 328; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.72.220 (0.015 с.)