Міністерство освіти і науки, молоді та спорту України Східноукраїнський національний університет імені В. І. Даля Коледж Спеціальність: “Розробка програмного забезпечення” ПРАКТИКА НАВЧАЛЬНА Технічній звіт ПН.5.05010301.02.15.ТЗ Прийняв Губанова І. О. 07.04.2011 Виконав студент групи 2РП09/11 Ланін А. О. 06.04.2011 2011 ЗМІСТ 1 ХАРАКТЕРИСТИКА МОВИ ПРОГРАМУВАННЯ С++ 5 2 ЗАВДАННЯ №1 9 2.1 Постановка задачі 9 2.2 Проектування форми 9 2.3 Опис класів та методів 13 2.4 Програмний код 14 2.5 Інструкція користувачеві 19 2.6 Контрольний приклад 19 3 ЗАВДАННЯ №2 20 3.1 Постановка задачі 20 3.2 Проектування форм 21 3.3 Опис класів та методів 29 3.4 Програмний код 32 3.5 Інструкція користувачеві 34 3.6 Контрольний приклад 35 4 ЗАВДАННЯ №3 37 4.1 Постановка задачі 37 4.2 Проектування форм 38 4.3 Опис класів та методів 47 Змн. Арк. Разраб. Провер. Н. Контр. Утверд. № докум. Ланін Губанова Підпис ь Дата ПН.5.05010301.02.01.ТЗ Літ. Технічний звіт Арк. Аркушів 2 89 КСНУ ім. В. Даля 2РП09/11 4.4 Програмний код 4.5 Інструкція користувачеві 4.6 Контрольний приклад 5 ПРИНЦИПИ ООП 6 ЗАВДАННЯ №4 6.1 Постановка задачі 6.2 Інтерфейс класу 6.3 Реалізація класу 6.4 Проектування форм 6.5 Програмний код 6.6 Інструкція користувачеві 6.7 Контрольний приклад 7 ЗАВДАННЯ №5 7.1 Постановка задачі 7.2 Проектування форм 7.3 Перевантаження функції 7.4 Шаблон функції 7.5 Інструкція користувачеві 7.6 Контрольний приклад 8 ЗАВДАННЯ №6 Змн. Арк. Разраб. Провер. Н. Контр. Утверд. № докум. Ланін Губанова Підпис ь Дата 48 52 54 58 62 62 62 63 65 66 67 67 69 69 69 72 74 77 78 80 ПН.5.05010301.02.01.ТЗ Літ. Технічний звіт Арк. Аркушів 3 89 КСНУ ім. В. Даля 2РП09/11 8.1 Постановка задачі 8.2 Проектування форм 8.3 Базовий клас 8.4 Спадкові класи 8.5 Програмний код 8.6 Інструкція користувачеві 8.7 Контрольний приклад ВИСНОВКИ ЛІТЕРАТУРА Змн. Арк. Разраб. Провер. Н. Контр. Утверд. № докум. Ланін Губанова Підпис ь Дата 80 80 82 84 86 87 88 89 90 ПН.5.05010301.02.01.ТЗ Літ. Технічний звіт Арк. Аркушів 4 89 КСНУ ім. В. Даля 2РП09/11 1 ХАРАКТЕРИСТИКА МОВИ ПРОГРАМУВАННЯ С++ C++ - компільована статично типізована мова програмування загального призначення. Підтримуючи різні парадигми програмування, поєднує властивості як високорівневих, так і низькорівневих мов. У порівнянні з його попередником - мовою C, - найбільшу увагу приділено підтримці об'єктно-орієнтованого та узагальненого програмування. Назва «C++» походить від мови C, в якому унарний оператор + + позначає інкремент змінної. Будучи одною із найбільш популярних мов програмування, C++ широко використовується для розробки програмного забезпечення. Область її застосування включає створення операційних систем, різноманітних прикладних програм, драйверів пристроїв, додатків для вбудованих систем, високопродуктивних серверів, а також розважальних програм (наприклад, відеоігр). Розвиток мови С++ відбувався на базі мови С, і, за невеликим винятком, С був збережений як підмножина C++. Базова мова С була спроектована таким чином, що існує дуже тісний зв'язок між типами, операціями, операторами та об'єктами, з якими безпосередньо працює машина, тобто числами, символами та адресами. Спочатку мова C замислювався як конкурент асемблера, здатний витіснити його з основних і найбільш вимогливих до ресурсів задач системного програмування. У проекті С++ були вжиті заходи для того, щоб успіхи С в цій області не опинилися під загрозою. Різниця між двома мовами перш за все в ступені уваги, що приділяється типам і структурам. Мова С виразна і в той же час поблажлива по відношенню до типів. Мова С + + ще більш виразна, але такої виразності можна досягти лише тоді, коли типам приділяють велику увагу. Коли типи об'єктів відомі, транслятор правильно розпізнає такі вирази, в яких інакше програмісту довелося б записувати операції з втомливими подробицями. Крім того, знання типів дозволяє транслятору виявляти такі помилки, які в іншому випадку були б виявлені тільки при тестуванні. Саме по собі використання суворої типізації мови для Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 5 контролю параметрів функції, захисту даних від незаконного доступу, визначення нових типів і операцій не потребує додаткових витрат пам'яті та збільшення часу виконання програми. Переваги мови програмування C++ C++ - надзвичайно потужна мова, що містить засоби створення ефективних програм практично будь-якого призначення, від низькорівневих утиліт і драйверів до складних програмних комплексів самого різного призначення. Зокрема: Підтримуються різні стилі та технології програмування, включаючи традиційне директивне програмування, ООП, узагальнене програмування, метапрограмування (шаблони, макроси). Передбачуване виконання програм є важливим достоїнством для побудови систем реального часу. Весь код, неявно генерований компілятором для реалізації мовних можливостей (наприклад, при перетворенні змінної до іншого типу), визначений у стандарті. Також суворо визначені місця програми, у яких цей код виконується. Це дає можливість заміряти або розраховувати час реакції програми на зовнішню подію. Автоматичний виклик деструкторів об'єктів при їх знищенні, причому в порядку, зворотному викликом конструкторів. Це спрощує (досить оголосити змінну) і робить більш надійним звільнення ресурсів (пам'ять, файли, семафори і т. п.), а також дозволяє гарантовано виконувати переходи станів програми, не обов'язково пов'язаних зі звільненням ресурсів (наприклад, запис у журнал). Користувацькі функції-оператори дозволяють стисло і ємко записувати вирази над типами користувача в природній алгебраїчній формі. Мова підтримує поняття фізичної (const) і логічної (mutable) константності. Це робить програму надійніше, тому що дозволяє компілятору, наприклад, діагностувати помилкові спроби зміни значення змінної. Оголошення константності дає програмісту, що читає текст програми додаткове уявлення про правильне використання класів і функцій, а також може бути підказкою для оптимізації. Перевантаження функцій-членів за ознакою константності дозволяє визначати зсередини Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 6 об'єкта мети виклику методу (константних для читання, неконстантний для зміни). Об'явлення mutable дозволяє зберігати логічну константність при використанні кешів і ледачих обчислень. Використовуючи шаблони, можливо створювати узагальнені контейнери і алгоритми для різних типів даних, а також спеціалізувати і обчислювати на етапі компіляції. Можливість імітації розширення мови для підтримки парадигм, які не підтримуються компіляторами безпосередньо. Наприклад, бібліотека Boost.Bind дозволяє пов'язувати аргументи функцій. Можливість створення вбудованих предметно-орієнтованих мов програмування. Такий підхід використовує, наприклад бібліотека Boost.Spirit, що дозволяє задавати EBNF-граматику парсерів прямо в коді C++. Використовуючи шаблони і множинне успадкування можна імітувати класи-домішки і комбінаторну параметризацію бібліотек. Такий підхід застосовано в бібліотеці Loki, клас SmartPtr який дозволяє, керуючи лише кількома параметрами часу компіляції, згенерувати близько 300 видів «розумних покажчиків» для управління ресурсами. Кросплатформенність: стандарт мови накладає мінімальні вимоги на ЕОМ для запуску скомпільованих програм. Для визначення реальних властивостей системи виконання в стандартній бібліотеці присутні відповідні можливості (наприклад, std:: numeric_limits <T>). Доступні компілятори для великої кількості платформ, на мові C++ розробляють програми для самих різних платформ і систем. Ефективність. Мова спроектована так, щоб дати програмістові максимальний контроль над усіма аспектами структури і порядку виконання програми. Жодна з мовних можливостей, що призводить до додаткових накладних витрат, не є обов'язковою для використання - при необхідності мова дозволяє забезпечити максимальну ефективність програми. Є можливість роботи на низькому рівні з пам'яттю, адресами. Висока сумісність з мовою C, що дозволяє використовувати весь існуючий C-код (код на C може бути з мінімальними переробками скомпільований компілятором C++; бібліотеки, написані на C, звичайно Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 7 можуть бути викликані з C++ безпосередньо без будь-яких додаткових витрат, в тому числі і на рівні функцій зворотного виклику, дозволяючи бібліотекам, написаним на C, викликати код, написаний на С++). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 8 2 ЗАВДАННЯ №1 2.1 Постановка завдання Написати програму для перетворення чисел з десяткової(10) системи числення у вісімкову(8) і шістнадцятиричну(16) та навпаки. 2.2 Проектування форми Створимо за допомогою MFC AppWizard (exe) додаток, заснований на діалоговому вікні. Спочатку запустимо Visual C++. Зайдемо в меню FILE -> NEW. Далі виберемо MFC AppWizard(exe) на вкладці Projects. У вікні редагування Project Name задамо ім'я програми «Lanin» (див. рис. 2.1). Рисунок 2.1 – Вікно створення нового проекту Натиснемо OK. Відкриється діалогове вікно. В ньому виберемо перемикач Dialog Based та натиснемо кнопку Finish (див. рис. 2.2). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 9 Рисунок 2.2 З’явиться діалогове вікно (див. рис. 2.3). Рисунок 2.3 Видалимо з форми Static Text “TODO…” та Button під назвою «Cancel». Потім перенесемо на неї один Static Text, один Edit Box (текстове поле) і три Radio Button (радіо-кнопка). (див. рис 2.4) Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 10 Рисунок 2.4 Потім відредагуємо форму: змінимо текст Static Text на «Введіть число», першому Radio Button задаємо назву «8», другому «10», третьому «16» (див. рис 2.5). Рисунок 2.5 Після цього підрівняємо елементи управління щодо форми. Клацнемо правою кнопкою миші на формі діалогового вікна і виберемо пункт Properties. У діалоговому вікні Dialog Properties, що з'явилося, клацнемо на кнопці Keep Visible (див. рис 2.6). Вікно властивостей залишатиметься постійно видимим на екрані. Рисунок 2.6 – Властивості діалогу Виділимо перший Radio Button. Для цього клацнемо лівою кнопкою миші на перемикачі Radio1. У вікні Dialog Properties увімкнемо перемикач Group (див. рис 2.7), що дозволить згрупувати розташовані на формі радіо-кнопки. Таким чином, зі всіх радіо-кнопок зможе бути активною лише одна. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 11 Рисунок 2.7 – Властивості Radio Button Клацнемо закладку Styles і виберемо перемикач Flat. Обернемо свій погляд на Edit Box. Клацнемо на ньому лівою кнопкою миші і у вікні Edit Properties -> Styles виберемо перемикач Uppercase і в списку Aligh text виберемо значення Right (див. рис 2.8). Рисунок 2.8 – Властивості Edit Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 12 2.3 Опис класів та методів Класи: CAboutDlg – клас діалогового вікна про програму CLaninApp – клас, відповідає за роботу програми. CLaninDlg - клас діалогового вікна //Вироблюваний від класу CDialog Сеdit – клас віконця для введення або виводу користувачем якоїнебудь інформації. CRadio – клас перемикача CStatic – клас напису CButton – клас кнопки Методи класу CRadio: AddChild - Додає вказаний об'єкт, як дочірній по відношенню до ContentControl. AddHandler - Додає обробник маршрутизованої події. AddLogicalChild - Додає вказаний об'єкт в логічне дерево даного елементу. AddText - Додає вказаний рядок тексту до ContentControl. AddToEventRoute - Додає обробники у вказаний EventRoute для колекції обробників подій UIElement. AddVisualChild - Визначає зв'язок "батько-нащадок" між двома візуальними об'єктами. ApplyAnimationClock - Застосовує анімацію до вказаної властивості залежностей даного елементу. ApplyTemplate - Виконує побудову візуального дерева поточного шаблону і повертає значення, що показує, чи було перебудовано візуальне дерево даним викликом. Arrange - Позиціонує дочірні елементи і визначає розмір для UIElement. ArrangeCore - Реалізує метод ArrangeCore і запечатує реалізацію. ArrangeOverride - Викликається, щоб розмістити і масштабувати вміст об'єкту Control. BeginAnimation - Запускає анімацію для вказаної властивості даного елементу, що має анімацію. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 13 BeginInit - Запускає процес ініціалізації даного елементу. BeginStoryboard - Починає послідовність дій, що містяться в наданому розкадровуванні. CaptureMouse - Намагається примусово захопити мишу даним елементом. CaptureStylus - Намагається примусово захопити перо даним елементом. CaptureTouch – Виконує спробу примусового отримання операції сенсорного введення даним елементом. ClearValue - Очищає локальне значення властивості. 2.4 Програмний код LaninDlg.h: int m_Radio; afx_msg void OnRadio1(); afx_msg void OnRadio2(); // віртуальна процедура відповіді на вибір Radio-кнопки afx_msg void OnRadio3(); private: short int m_LastMode; void LaninValue(); CEdit* m_pEdit; LaninDlg.cpp: #include "math.h" //підключення математичної бібліотеки m_pEdit=NULL; //обнулення змінної ON_BN_CLICKED(IDC_RADIO3, OnRadio3) //реакція на підключення Radio-кнопки встановимо перемикач на десяткову систему числення поле m_Radio пов'язане з групою радіо-кнопок привласнюючи значення від 0 до 2 (як завжди відлік з нуля) ми вибираємо потрібну радіо-кнопку m_Radio=m_LastMode=1; UpdateData(FALSE); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 14 SetDlgItemText(IDC_EDIT1,"0"); //отримаємо покажчик на Edit Box m_pEdit=(CEdit*) GetDlgItem(IDC_EDIT1); //встановимо обмеження на кількість символів, що вводяться максимальний діапазон даних типу UINT може бути 4294967295 m_pEdit->SetLimitText(10); //встановимо стиль що дозволяє вводити тільки цифри m_pEdit->ModifyStyle(0,ES NUMBER,0); void CLaninDlg::LaninValue() { UpdateData(TRUE); //оператор оновлює значення змінних елементів управління поточними значеннями, які містяться на екрані. if (m_Radio==m_LastMode) return; CString sNumber;//місце зберігання вмісту Edit Box m_pEdit->GetWindowText(sNumber);//Отримання вмісту Edit Box CString sNewValue;//допоміжний об'єкт int i=0, z=0,Sum=0; //i - лічильник //z - міститиме цифру, отриману в результаті перетворення з однієї системи в іншу Sum //буде містити повне число в ДЕСЯТКОВІЙ системі числення switch(m_LastMode){ //була шістнадцятирична с.и. case 2: sNumber.MakeReverse();//виконуємо "переворот" рядка for (;i<sNumber.GetLength();i++) //пройдемося по всіх ЦИФРАХ числа if (isdigit(sNumber.GetAt(i))) //якщо це символ від '0' до '9' sNewValue=sNumber.GetAt(i);//то запам'ятовуємо символ в рядку z=atoi(sNewValue);//перетворюємо рядок в цифру else //якщо це не символ в діапазоні від '0' до '9' if (isxdigit(sNumber.GetAt(i))) //то це має бути символ від 'A' до 'Z' switch (sNumber.GetAt(i)) //перевіримо, який саме це символ case 'A':z=10;break; Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 15 case 'B':z=11;break; case 'C':z=12;break; case 'D':z=13;break; case 'E':z=14;break; case 'F':z=15;break; } else //коли користувач ввів "чужий" символ { MessageBox("You had entered wrong symbol!\rTake care friend...","Illegal symbol",MB_OK|MB_ICONHAND); Sum=0; break; //отримане число z * на 16 (оскільки система числення шістнадцятирічна) у ступені i (оскільки важливий порядок цифр в числі) Sum+=int(z*int(pow(16,i))); } if (m_Radio==0) //якщо користувач вибрав 8 систему числення sNewValue.Format("%o",Sum); //то перетворюємо в 8 else sNewValue.Format("%u",Sum); //інакше, перетворюємо в 10 с.и. break; була десяткова с. і. case 1: switch(m_Radio){ case 0:sNewValue.Format("%o",atoi(sNumber));break;//в 8 систему числення case 2:sNewValue.Format("%X",atoi(sNumber));;break;//в 16 систему числення } break; //була вісімкова система числення case 0: sNumber.MakeReverse(); for (;i<sNumber.GetLength();i++) sNewValue=sNumber.GetAt(i); z=atoi(sNewValue); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 16 if (z>7){ MessageBox("You had entered wrong symbol!\rTake care friend...","Illegal symbol",MB_OK|MB_ICONHAND); Sum=0; break; Sum+=int(z*int(pow(8,i))); if (m_Radio==2) 16 sNewValue.Format("%X",Sum); else sNewValue.Format("%u",Sum); break; m_pEdit->SetWindowText(sNewValue); //заповнимо Edit Box новим вмістом m_LastMode=m_Radio;//запам’ятовування поточного вибору } void CLaninDlg::OnRadio1() //у 8 систему числення { //встановимо обмеження на кількість символів, що вводяться максимальний діапазон даних типу UINT може бути 37777777777 m_pEdit->SetLimitText(11); //встановимо стиль, що дозволяє вводити тільки цифри m_pEdit->ModifyStyle(0,ES NUMBER,0); LaninValue(); } void CLaninDlg::OnRadio2() //в десяткову систему числення { //встановимо обмеження на кількість символів, що вводяться //максимальний діапазон даних типу UINT може бути 4294967295 m_pEdit->SetLimitText(10); //встановимо стиль, що дозволяє вводити тільки цифри m_pEdit->ModifyStyle(0,ES NUMBER,0); LaninValue(); } void CLaninDlg::OnRadio3() //в шістнадцятирічну систему числення { Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 17 //встановимо обмеження на кількість символів, що вводяться //максимальний діапазон даних типу UINT може бути 0xffffffff m_pEdit->SetLimitText(8); СНІМІМ стиль дозволяє вводити тільки цифри ІНАКШЕ користувач не введе ABCDEF m_pEdit->ModifyStyle(ES_NUMBER,0,0); LaninValue(); } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 18 2.5 Інструкція користувачеві Після запуску програми перемикач встановлений на десятичній системі числення. Для перекладу числа в іншу систему числення, необхідно ввести число у вікно редагування Edit Box. Після цього поставте перемикач Radio на ту систему, в яку ви хочете перевести число (8-у, 10-у, або 16-у). Натисніть на кнопку ОК, якщо бажаєте вийти з програми (див. рис 2.9). Рисунок 2.9 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 19 2.6 Контрольний приклад 1 2 3 8 10 16 12 10 A 131 89 59 2240 1184 4A0 8 10 16 35445 15141 3B25 10002 4098 1002 12224 5268 1494 8 10 16 3543543 968547 EC763 122144 42084 A4645 206016757 35134959 2181DEF Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 20 3 ЗАВДАННЯ №2 3.1 Постановка завдання Створити програму, що містить меню: Завдання Про програму Вихід Задача1; Задача2; Задача3; Задача4 1) Скласти структурну схему алгоритму і програму обчислення значень по формулі. ax cos 2 b 3 x 5,1c 2 , y e 0,007 x ln b 5cx , 2 3 2 2 cos b x ln bx a , 1 b2 a 1 b2 a При складанні 1 b2 a програми передбачити: введення значень х з клавіатури (для перевірки), вивід на форму проекту всіх варіантів значень початкових даних і результатів обчислення. 2) Скласти схему алгоритму і програму обчислення суми членів ряду 12 x k 1 k k cos k 4 Завдання 2 - при розробці програми використовувати оператор циклу з параметром (for). Завдання 3 - при розробці програми використовувати оператор циклу з параметром (while). Завдання 4 - при розробці програми використовувати оператор циклу з параметром (do ... while). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 21 3.2 Проектування форми Спершу створимо додаток, заснований на діалоговому вікні як описано вище. Далі створимо меню для нашого діалогу Lanin. Для цього додамо новий ресурс (Пункт меню Insert->Resource...) (див. рис 3.1). Рисунок 3.1 У діалоговому вікні, що з'явилося, виберемо рядок Menu і натиснемо кнопку New (див. рис. 3.2). Рисунок 3.2 Тепер на вкладці ResourceView з’явиться новий ресурс - меню (див. рис. 3.3). Рисунок 3.3 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 22 Створимо заголовки. Для цього на вкладці ресурсів виберемо створене раніше меню - IDR_MENU1. Далі викличемо Properties і введемо в поле Caption заголовки меню: «Завдання», «Про програму», «Вихід». Для заголовку «Завдання», створимо випадаючий список, поставивши відмітку на Pop-up у вікні Properties. Потім введемо заголовки випадаючого меню: «Задача 1», «Задача 2», «Задача 3», «Задача 4» (див. рис 3.4). Рисунок 3.4 - Меню Викличемо ClassWizard (Меню View -> ClassWizard). З’явиться вікно, повідомляючи про те, що IDR_MENU1 – новий ресурс і необхідно створити для нього новий клас або асоціювати з існуючим. Виберемо другий варіант: Select an existing class (див. рис 3.5). Рисунок 3.5 Виберемо із запропонованих класів клас діалогу CLaninDlg, і натиснемо на кнопку Select (див. рис 3.6) Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 23 Рисунок 3.6 Підключимо меню до головного діалогового вікна Lanin. Для цього на формі викличемо Properties і на вкладці General в пункті Menu виберемо IDR_MENU1 (див. рис 3.7). Рисунок 3.7 Створимо чотири діалогові вікна для задач. Викличемо контекстне меню теки Dialog на вкладці ResourceView і виберемо пункт Insert Dialog (див. рис 3.8). Повторимо цю операцію тричі. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 24 Рисунок 3.8 Перейменуємо створені діалогові вікна: викличемо контекстне меню першого з них, виберемо пункт Properties і задамо ідентифікатор IDD_ZADACHA1. Повторимо це ж саме для інших трьох діалогових вікон, змінюючи останню цифру ідентифікатору (див. рис. 3.9). Рисунок 3.9 Виберемо діалогове вікно IDD_ZADACHA1 у теці Dialog на вкладці ResourceView. Викличемо ClassWizard (Меню View -> ClassWizard). З’явиться вікно, як і після створення меню, про новий ресурс. Цього разу виберемо перший варіант: Create а new class(див. рис. 3.10). Рисунок 3.10 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 25 З’явиться вікно створення нового класу. Введемо ім’я класу: CZadacha1 (див. рис 3.11). Натискаємо OK та повторимо цю операцію для інших діалогових вікон таким же чином, задаючи, відповідно, імена класів: CZadacha2, CZadacha3, CZadacha4. Рисунок 3.11 – Вікно створення нового класу Тепер створимо обробники повідомлень меню і напишемо в них код. Для цього викличемо ClassWizard, перейдемо на вкладку MessageMaps, у вікні під назвою Idject IDs виділимо ID_1 і у вікні Messages виділимо команду BN_CLICKED. Натиснемо кнопку Add Function і натиснемо ОК (див. рис 3.12). Повторимо аналогічно для ID_2, ID_3, ID_4, ID_MENUITEM32776, ID_MENUITEM32775. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 26 Рисунок 3.12 Далі у вікні Object Ids виберемо ID_1, у вікні Messages – COMMAND, натиснемо кнопку Edit Code. У файлі LaninDlg.cpp, що відкрився, напишемо наступний код: void CLaninDlg::On1() { CZadacha1 dlg; dlg.DoModal(); } Аналогічно пропишемо код для інших діалогів. Для виклику діалогового вікна About напишемо (ID_MENUITEM32776): void CLaninDlg::OnMenuitem32776() { CAboutDlg dlg; dlg.DoModal(); } І для виходу (ID_MENUITEM32775) void CLaninDlg::OnMenuitem32775() Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 27 { OnOK(); }: На початку файлу для підключення діалогових вікон пропишемо: #include "Zadacha1.h" #include "Zadacha2.h" #include "Zadacha3.h" #include "Zadacha4.h" Після цього видалимо з діалогу «ZADACHA1» Static Text з написом “TODO:…”, Button OK та Cancel, розмістимо на ньому п'ять Edit Box, п'ять Static Tex і два Button (див. рис 3.13) Рисунок 3.13 Далі редагуємо діалог. Для Static Text задаємо назви «x», «a», «b», «c», «y =», для Button - «Обчислити» і «Вийти» (див. рис 3.14). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 28 Рисунок 3.14 Перейдемо до діалогових вікон, що залишилися: «ZADACHA2», «ZADACHA3», «ZADACHA4». На кожному з них розмістимо по два Edit Box, два Static Text і два Button (див. рис 3.15). Рисунок 3.15 Після редагування діалогового вікна двом Static Text задамо назву «Введіть X:» і «Результат», Button’и назвемо «Порахувати суму» та «Вийти» (див. рис 3.16). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 29 Рисунок 3.16 3.3 Опис класів і методів CLaninDlg - клас діалогового вікна //Похідний від класу CDialog СEdit – клас віконця для введення або виводу користувачем якоїнебудь інформації. CStatic – клас CButton – клас кнопки CZADACHA 1 – клас доданих діалогових вікон //Похідний від класу CDialog CZADACHA 2 CZADACHA 3 CZADACHA 4 Методи класу CEdit: CanUndo - Указує, чи можна відмінити операцію редагування в текстовому полі CEdit - Створює об'єкт CEdit CharFromPos - Отримує індекси рядка і символу, розташованих якомога ближче до заданої точки Clear - Видаляє поточний виділений фрагмент текстового поля Copy - Копіює поточний виділений фрагмент текстового поля в буфер обміну Create - Створює текстове як елемент Windows, що управляє, і пов'язує його з об'єктом CEdit Cut - Видаляє поточний виділений фрагмент текстового поля і копіює текст в буфер обміну Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 30 EmptyUndoBuffer - Скидає прапор відміни для текстового поля FmtLines – Розв’язує або забороняє включення "м'яких" розривів рядків GetFirstVisibleLine - Визначає верхній видимий рядок текстового поля GetHandle - Отримує логічний номер області пам'яті, яка зараз виділена для багаторядкового текстового поля GetLimitText - Отримує максимальний об'єм тексту, який може зберігатися в об'єкті CEdit GetLine - Отримує рядок тексту з текстового поля GetLineCount - Визначає кількість рядків в багаторядковому текстовому полі GetMargins - Отримує розміри лівого і правого полів GetModify - Показує, чи змінився вміст текстового поля GetPasswordChar - Отримує символ, що відображається в текстовому полі при введенні тексту GetRect - Отримує розміри прямокутника формату GetSel - Отримує позицію початкового і кінцевого символів для поточного виділеного фрагмента LimitText - Обмежує довжину тексту, який може бути введений користувачем LineFromChar - Отримує номер рядка, що містить символ із заданим індексом LineIndex - Отримує символьний індекс (тобто зсув в символах від початку тексту) для заданого рядка LineLenght - Отримує довжину рядка LineScroll - Прокручує текст в багаторядковому текстовому полі Paste - Вставляє в текстове поле дані з буфера обміну PosFromChar - Отримує координати лівого верхнього кута символу із заданим індексом ReplaceSel - Замінює поточний виділений фрагмент текстового поля заданим текстом SetHandle - Задає логічний номер локальної області пам'яті, яка використовуватиметься для багаторядкового текстового поля Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 31 SetLimitText - Задає максимальний об'єм тексту, який може зберігатися в об'єкті CEdit SetMargins - Задає розміри лівого і правого полів SetModify - Встановлює або скидає прапор змін SetPasswordChar - Задає або відміняє спеціальний символ, що відображається при введенні тексту SetReadOnly - Встановлює або відміняє для текстового поля режим "тільки для читання" SetRect Задає розміри прямокутника формату для багаторядкового текстового поля і оновлює його зображення SetRectNP - Задає розміри прямокутника формату для багаторядкового текстового поля без перемальовування SetSel - Задає поточний виділений фрагмент SetTabStops - Задає позиції табуляції для багаторядкового текстового поля Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 32 3.4 Програмний код ZADACHA1.cpp: #include "math.h" // Підключаємо математичну бібліотеку. void CZadacha1::OnButton1() { UpdateData(); if ((1-m_3*m_3)==m_2) m_5=sqrt(m_2*m_1-pow(pow(m_3,3),2)* m_1+5.1*m_4* m_4); if ((1-m_3*m_3)>m_2) m_5=exp(0.007*m_1)+log(fabs(pow(m_3,exp(m_1)))); if ((1-m_3*m_3)<m_2) m_5=pow(cos(pow(m_3,3)),2)*m_1* m_1+log(fabs(m_3* m_1+m_2*m_2)); UpdateData(false); } ZADACHA2.cpp #include "math.h" // Підключаємо математичну бібліотеку. void CZadacha2::OnButton1() { int k; //оголошення змінних UpdateData(); for (k=1;k<=12;k++) // оператор циклу for { m_2=pow(m_1,k)*pow(cos(k/4),k); } UpdateData(false); } ZADACHA3.cpp #include "math.h" // Підключаємо математичну бібліотеку. void CZadacha3::OnButton1() { int k; //оголошення змінних UpdateData(); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 33 k=1; while (k<=12) // оператор циклу while { m_2=pow(m_1,k)*pow(cos(k/4),k); k++; } UpdateData(false); } ZADACHA4.cpp #include "math.h" // Підключаємо математичну бібліотеку. void CZadacha4::OnButton1() { int k; UpdateData(); k=1; do { m_2=pow(m_1,k)*pow(cos(k/4),k); k++; } while (k<=12); UpdateData(false); } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 34 3.5 Інструкція користувачеві Запускаємо програму. ax cos 2 b 3 x 5,1c 2 , Для розв’язання виразу y e 0,007 x ln b 5cx , 2 3 2 2 cos b x ln bx a , 1 b2 a 1 b 2 a на головному 1 b2 a діалозі натискаєте меню «Задачі». У пункті меню вибираєте «Задача 1». Відкривається діалогове вікно програми. Вводите значення x,a,b,c. Після натиснення на кнопку «Обчислити» результат виводиться у вікні редагування «y =» (див. рис 3.16) Рисунок 3.16 - Вікно Задачі №1 Для обчислення суми ряду, 12 x k 1 k k cos k можна скористатись одним 4 із підпунктів меню «Завдання». При виборі підпункту «Завдання 2» сума ряду обчислюється за допомогою оператора циклу for (див. рис 3.17). При виборі підпункту «Завдання 3» сума ряду обчислюється за допомогою оператора циклу while (див. рис 3.18). При виборі підпункту «Завдання 4» сума ряду обчислюється за допомогою оператора циклу do…while (див. рис 3.19). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 35 Задайте значення у вікно редагування «Введіть X». Натисніть на кнопку «Порахувати суму» і у вікні редагування «Сума =» з’явиться результату розв’язання всього виразу. Рисунок 3.17 Рисунок 3.18 Рисунок 3.19 3.6 Контрольний приклад Завдання 1 Тест №1: x = -0,5 a=0 b=1 c = -0,22 |1-12|=0 -> y ax cos 2 b 3 x 5,1c 2 y 0(0,5) cos 2 13 (0,5) 5,1(0,22) 2 = 0.86 Тест №2: x = 1,01 a = -0,7 b = 0,2 c = 0,9 |1-0,22|>-0,7 -> y e 0,007 x ln b 5cx y e 0,007*1,01 ln 0,2 50,9*1, 01 =3.41 Тест №3: x = 1,12 a = 1,1 b = 0,1 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 36 c = -0,45 |1-0,12|<1,1 -> y cos 2 b 3 x 2 ln bx a 2 y cos 2 0,13 *1,12 2 ln 0,1*1,12 1,12 =0,21 Завдання 2, 3, 4 Тест 1 x=2 12 2 k k 1 k 1 2 3 4 5 cos k = 21 cos1 + 2 2 cos 2 + 2 3 cos 3 + 2 4 cos 4 + 2 5 cos 5 + 4 4 4 4 4 4 6 7 8 9 10 11 12 2 6 cos 6 + 2 7 cos 7 + 2 8 cos 8 + 2 9 cos 9 + 210 cos10 + 211 cos11 + 212 cos12 =3 4 4 4 4 4 4 4 630,3 Тест 2 x=3 12 3 k 1 k k 1 2 3 4 5 6 cos k = 31 cos1 + 3 2 cos 2 + 33 cos 3 + 3 4 cos 4 + 35 cos 5 + 36 cos 6 4 4 4 4 4 4 4 7 8 9 10 11 12 + 37 cos 7 + 38 cos 8 + 39 cos 9 + 310 cos10 + 311 cos11 + 312 cos12 =471018 4 4 4 4 4 4 Тест 3 x = 2,5 12 2,5 k 1 k k 1 2 3 4 5 cos k = 2,51 cos1 + 2,5 2 cos 2 + 2,53 cos 3 + 2,5 4 cos 4 + 2,5 5 cos 5 + 4 4 4 4 4 4 6 7 8 9 10 11 2,5 6 cos 6 + 2,5 7 cos 7 + 2,58 cos 8 + 2,59 cos 9 + 2,510 cos10 + 2,511 cos11 + 4 4 4 4 4 4 12 2,512 cos12 = 52827.9 4 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 37 4 ЗАВДАННЯ №3 4.1 Постановка завдання Створити одновіконне застосування, яке на панелі інструментів містить дві кнопки, створені вами (малюнки на кнопках довільні). По натисненню першої - запускається діалогове вікно, яке реалізує завдання. Одновимірний масив. 1. Дано масив цілих чисел з n елементів, заповнений випадковим чином числами з проміжку [-400,400]. Знайти добуток додатних елементів, значення яких складаються з двох цифр. 2. Знайти кількість тих елементів, значення яких за модулем перевищують 100 та кратні 3 і 7. 3. Знайти номер першої пари сусідніх елементів з різними знаками, сума яких менше заданого числа. Двомірний масив. 1. Дано двомірний масив розміром n * m, заповнений випадковими числами. 2. Знайти в кожному стовпці масиву максимальний та мінімальний елементи і поміняти їх з першим і останнім елементом відповідно. 3. Визначити суму додатних елементів. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 38 4.2 Проектування форми Створимо за допомогою MFC AppWizard (exe) додаток типу Single document. Спочатку запустимо Visual C++. Зайдемо в меню FILE -> NEW. Далі виберемо MFC AppWizard(exe) на вкладці Projects. У вікні редагування Project Name задамо ім'я програми «Lanin» (див. рис. 4.1). Рисунок 4.1 У діалоговому вікні MFC AppWizard – Step1 виберемо Single document(див. рис 4.2). Рисунок 4.2 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 39 Сворений проект не має діалогових вікон. Для їх створення перейдемо на вкладку ResourceView. Далі відкриємо теку Dialog, викличемо контекстне меню та виберемо пункт Insert Dialog (див. рис 4.3). Нам потрібно два діалогові вікна, тому ми ще раз повторимо операцію, описану вище. Рисунок 4.3 Тепер створимо клас для наших діалогових вікон. Виберемо Меню View -> ClassWizard(Має бути виділене перше діалогове вікно). У діалоговому вікні, що відкрилося, виберемо перемикач Create а new class і натиснемо кнопку ОК (див. рис 4.4). Рисунок 4.4 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 40 В наступному діалоговому вікні введемо ім'я нового класу – CDialog1 і натиснемо ОК (див. рис 4.5). Створимо таким же чином клас і для другого діалогового вікна, давши йому назву CDialog2. Рисунок 4.5 Тепер створимо дві кнопки для запуску створених діалогових вікон. Для цього перейдемо на вкладку ResourceView, відкриємо теку Toolbar і виберемо IDR_MAINFRAME (див. рис 4.6). Рисунок 4.6 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 41 В правій частині екрану з’явиться панель з кнопками. Клацнемо на порожній кнопці, намалюємо на ній нам потрібний малюнок. Цю ж операцію повторимо для другої кнопки(див. рис 4.7) Рисунок 4.7 – Створення малюнків кнопок Потім потрібно зробити, щоб при натисненні на створені кнопки відкривалися діалогові вікна. Для цього виділимо першу кнопку, потім відкриємо ClassWizard. З’явиться вікно про появу нового ресурсу. Виберемо другий перемикач – Select an existing class (Вибір класу із вже існуючих)(див. рис. 4.8). Рисунок 4.8 З’явиться вікно зі списком класів. Виберемо CMainFrame(див. рис. 4.9) Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 42 Рисунок 4.9 Тепер перейдемо на вкладку MessageMaps. У вікні Object IDs виберемо назву нашої кнопки ID_BUTTON32771, а у вікні Messages виберемо команду COMMAND і натискнемо на кнопку Add Function та ОК(див. рис. 4.10). Аналогічно повторимо для другої кнопки. Рисунок 4.10 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 43 Потім у вікні ClassWizard виділимо першу із створених функцій. Натиснемо кнопку Edit code. Відкриється файл MainFrm.cpp, в якому пропишемо код: CDialog1 d1; d1.DoModal(); Аналогічно повторимо для другої кнопки, а на початку файлу підключимо наші діалогові вікна, написавши код: #include "Dialog1.h" #include "Dialog2.h” Перейдемо до першого діалогу. Виберемо його на вкладці ResourceView в теці Dialog. Видалимо кнопку Cancel. Розмістимо на ньому чотири Static Text, п’ять Edit Box, один List Box і чотири Button (див. рис 4.11). Рисунок 4.11 Відредагуємо діалог. Задамо наступні назви для Static Text: «елементів» «Добуток + з 2 цифр», «Кількість 100/3 і 7», «№ “+” <», а для чотирьох Button «Заповнити масив з» та тричі «Вирахувати», Button «OK» перейменуємо на «Вихід»(див. рис 4.12). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 44 Рисунок 4.12 Потім перейдемо до другого діалогу. Розмістимо на формі перший елемент: викличемо контекстне меню на формі, виберемо пункт Insert ActiveX Control…(див. рис 4.13). Рисунок 4.13 Відкриється діалогове вікно, в якому виберемо елемент Microsoft FlexGrid Control(див. рис. 4.14). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 45 Рисунок 4.14 Задамо створеному елементу необхідні параметри. Для цього викличемо його контекстне меню, виберемо пункт Properties. Перейдемо на вкладку Control і у віконцях Rows, Cols, Fixed Rows, Fixed Cols введемо потрібні параметри(див. рис 4.15). Рисунок 4.15 Видалимо з форми кнопку Cancel та розмістимо на ній наступні елементи: чотири Static Text, три Edit Box, один List Box, і три Button(див. рис 4.16). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 46 Рисунок 4.16 Тепер займемося редагуванням діалогу. Для цього задамо Static Text назви «Кількість рядків», «Кількість стовпців», «Сума “+”», «max min». Назви для Button: «Заповнити», «Вирахувати», «Вивести». Змінюємо назву Button «OK» на «Закрити»(див. рис 4.17). Рисунок 4.17 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 47 4.3 Опис класів і методів CLaninDlg - клас діалогового вікна //спадковий від класу CDialog Сеdit – клас віконця для введення або виводу користувачем якоїнебудь інформації. CStatic – клас напису CButton – клас кнопки CListBox – CFleixGrid – Методи класу CListBox: ResetContent - Очищає вміст списку, роблячи його порожнім. AddString - Додає рядок lpszItem в список і сортує його, якщо при створенні включена властивість Sort. DeleteString - Видаляє зі списку елемент з індексом nIndex. GetCurSel - Отримує індекс елементу, вибраного користувачем. SetCurSel - Відзначає елемент з індексом nSelect як вибраний елемент списку. GetText - Копіює елемент з індексом nIndex в буфер. SetTopIndex - Організовує прокрутку списку у вікні так, щоб елемент з індексом nIndex був видимим. FindString - Організовує пошук в списку і повертає як результат індекс елементу списку, префікс якого збігається з рядком lpszItem. FindStringExact - Організовує пошук в списку і повертає елемент списку, префікс якого збігається з рядком lpszItem. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 48 4.4 Програмний код Dialog1.cpp: #include "math.h" //підключаємо математичну бібліотеку double b[100]; int i,n; void CDialog1::OnButton1() { m_l.ResetContent(); srand (time (NULL)); UpdateData(); n=m_1; double k; CString S; for (i=0; i<n; i++) { k=rand()%800-400+1; m[i]=k; S.Format ("%f",k); m_l.AddString(S); } UpdateData(false); } void CDialog1::OnButton2() { int p=1; n=m_1; UpdateData(); for (i=0; i<n; i++) { if (m[i]>0&&m[i]/10<10&&m[i]/10>1) p*=m[i]; } m_2=p; Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 49 UpdateData(false); } void CDialog1::OnButton3() { int k=0; n=m_1; UpdateData(); for (i=0; i<n; i++) { if (fabs(m[i])>100&&m[i]%3==0&&m[i]%7==0) k++; } m_3=k; UpdateData(false); } void CDialog1::OnButton4() { int n=0; n=m_1; UpdateData(); for (i=0; i<n; i++) { if (((m[i]>0&&m[i+1])|(m[i]>0&&m[i+1]<0))&&(m[i]+m[i+1]>m_5)) n=i; } m_4=n; UpdateData(false); } CDialog2.cpp: int n1,m,i1,j,a[5][5]; void CDialog2::OnButton1() { UpdateData(); n1=m_1; Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 50 m=m_2; m_GRID.SetRows(m_1); m_GRID.SetCols(m_2); UpdateData(false); UpdateData(); int k; CString s; srand (time(NULL)); for (i1=0;i1<n1;i1++) { m_GRID.SetRow(i1); for (j=0;j<m;j++) { m_GRID.SetCol(j); k=rand ()%200-100+1; a[i1][j]=k; s.Format ("%d", k); m_GRID.SetText(s); } } UpdateData(false); } void CDialog2::OnButton2() { int summa=0; UpdateData(); for (i1=0; i1<n1; i1++) for (j=0; j<m; j++) { if (a[i1][j]>0) summa=summa+a[i1][j]; } m_3=summa; UpdateData(false); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 51 } void CDialog2::OnButton3() { int max, min,k; CString s; max=a[0][0]; min=a[0][0]; UpdateData(); m_l.ResetContent(); for (i1=0; i1<n1; i1++) for (j=0; j<m; j++) { if (max<a[i1][j]) max=a[i1][j]; if (min>a[i1][j]) min=a[i1][j]; } s.Format ("%d",max); m_l.AddString(s); s.Format ("%d",min); m_l.AddString(s); UpdateData(false); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 52 4.5 Інструкція користувачеві Запускаєте програму. Для роботи з одновимірним масивом, натискаєте на жовту кнопку з намальованим одним рядком. Відкриється діалогове вікно. Для формування масиву з випадкових чисел, необхідно ввести розмірність масиву у вікно редагування під назвою « елементів» і натиснути на кнопку «Заповнити масив з». Масив виведеться в List Box. Для того щоб порахувати добуток всіх додатних чисел масиву, що складаються з двох цифр - натисніть на кнопку «Порахувати», що знаходиться біля Static Text «Добуток “+” з двох цифр». Результат буде виведений у вікно редагування. Для знаходження кількості елементів, значення яких більше 100 і кратні 3 та 7 необхідно натиснути на кнопку «Порахувати», котра знаходиться біля Static Text «К-сть>100 / 3 і 7». Кількість буде виведена у вікні редагування. Щоб вивести номер першої пари елементів з різними знаками, що менше заданого числа, необхідно ввести число у вікно редагування біля Static Text «№ "+-" <». Результат буде виведений у вікні редагування біля того вікна редагування, в яке ви ввели число. Для виходу з програми натисніть кнопку Вихід(див. рис 4.18). Рисунок 4.18 Для роботи з двомірним масивом, натискаєте на жовту кнопку з намальованими двома рядками. Відкриється діалогове вікно. Для формування двовимірного масиву розміром n*m елементів введіть Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 53 розмірність масиву у вікно редагування під назвою «Кількість рядків» і «Кількість ствопчиків» і натисніть на кнопку «Заповнити». Масив виведеться в елементі Microsoft FlexGrid Control. Для того, щоб визначити суми додатних елементів двомірного масиву потрібно натиснути на кнопку «Вивести» і результат будуть виведений у вікні редагування під назвою «Сума +». Для визначення максимального та мінімального елементів масиву необхідно натиснути кнопку «Вивести». Результат буде виведений в List Box під назвою «max min». Для виходу з програми натисніть кнопку Закрити(див. рис 4.19). Рисунок 4.19 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 54 4.6 Контрольний приклад Одновимірний масив Тест 1: 1) Заповнюємо масив з 5 елементів 378.000000 71.000000 178.000000 379.000000 79.000000 2) Добуток додатних елементів: 71 * 709 = 5609 3) Кількість чисел більше 100 та кратних 3 і 7 378 > 100 378 / 3 = 126 378 / 7 = 54 1 число. 4) Вводимо число: 5 5) Номер першої пари сусідніх елементів з різними знаками, сума яких менша заданого числа -379+71=-308 -308<5 №2 Тест 2: 1) Заповнюємо масив з 6 елементів 105.000000 38.000000 14.000000 158.000000 201.000000 338.000000 2) Добуток додатних елементів: 38 = 38 3) Кількість чисел більше 100 та кратних 3 і 7 105 > 100 105 / 3 = 35 105 / 7 = 15 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 55 1 число. 4) Вводимо число: -100 5) Номер першої пари сусідніх елементів з різними знаками, сума яких менша заданого числа -158 + (-201) = -359 -359 < -100 №2 Тест 3: 1) Заповнимо масив з 7 елементів - - - 296.000000 10.000000 147.000000 21.000000 334.000000 - 82.000000 389.000000 2) Добуток додатних елементів: 82 = 82 3) Кількість чисел більше 100 та кратних 3 і 7 |-141| > 100 -141 / 3 = -49 -141 / 7 = -21 1 число. 4) Вводимо число: 100 5) Номер першої пари сусідніх елементів з різними знаками, сума яких менша заданого числа -10 + (-147) = -157 -157 < 100 №1 Двомірний масив Тест 1 1) Створимо масив 5х5 елементів 94 -89 -63 -16 -48 -91 -59 -82 -51 -45 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 56 19 47 50 10 -2 -46 11 37 16 1 94 90 -16 -65 -88 2) Сума додатних елементів 94 + 19 + 47 + 50 +10 + 11 + 17 + 16 + 1 + 94 + 90 = 469 3) Максимальний і мінімальний елементи масиву max = 94 min = -91 Тест 2 1) Створимо масив 7х7 елементів 2) -89 58 -52 -37 46 34 -78 -96 -21 92 87 20 33 -64 64 16 -33 -40 -58 87 -69 -83 -69 -22 62 50 100 -26 -34 -43 -15 -86 -24 -15 61 -38 -41 69 -35 29 37 59 14 4 -5 10 -32 -88 59 2) Сума додатних елементів 58 + 46 + 34 + 92 + 87 + 20 + 33 + 64 + 10 + 16 + 87 + 62 + 50 + 100 + 61 + 69 + 29 + 59 + 37 + 59 + 14 + 4 = 1091 3) Максимальний і мінімальний елементи масиву max = 100 min = -96 Тест 3 1) Створимо масив 10х10 елементів -12 40 94 -96 -81 -88 -59 89 23 97 -55 -21 -65 -46 38 -60 34 7 48 44 35 -26 59 61 80 -99 33 67 -41 3 -36 85 98 92 -67 -12 8 -63 53 68 20 31 33 26 -62 54 -69 29 -18 -83 55 -89 39 68 -45 45 -59 -13 -69 77 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 57 -65 -79 -45 -80 -24 -97 -58 -32 42 38 7 68 91 46 -9 -22 96 -87 78 4 -81 87 85 -50 -63 -45 -77 -74 -64 5 46 -91 -67 26 60 62 -34 -71 19 20 2) Сума додатних елементів 40 + 94 + 89 + 23 + 97 + 38 + 34 + 7 + 48 + 44 + 35 + 59 + 61 + 80 + 33 + 67 + 3 + 85 + 98 + 92 + 8 + 53 + 68 + 20 + 31 + 33 + 26 + 54 + 29 + 55 + 39 + 68 + 45 + 77 + 42 + 38 + 7 + 68 + 91 + 46 + 96 + 78 + 4 + 87 + 85 + 5 + 46 + 26 + 60 + 62 + 19 + 20 = 2613 3) Максимальний і мінімальний елементи масиву max = 98 min = -99 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 58 5 ПРИНЦИПИ ПРОГРАМУВАННЯ ОБ'ЄКТНО-ОРІЄНТОВАНОГО У теорії програмування ООП визначається як технологія створення складного програмного забезпечення, яка заснована на представленні програми у вигляді сукупності об'єктів, кожний з яких є екземпляром певного типу (класу), а класи утворюють ієрархію зі спадкуванням властивостей Основна перевага ООП - скорочення кількості міжмодульних викликів і зменшення обсягів інформації, що передається між модулями, в порівнянні з модульним програмуванням. Це досягається за рахунок більш повної локалізації даних та інтегрування їх з підпрограмами обробки, що дозволяє вести практично незалежну розробку окремих частин (об'єктів) програми. Крім цього, об'єктний підхід пропонує нові технологічні засоби розробки, такі як успадкування, поліморфізм, композиція, наповнення, що дозволяють конструювати складні об'єкти з простіших. У результаті істотно збільшується показник повторного використання кодів, з'являється можливість створення бібліотек об'єктів для різних застосувань, і розробникам надаються додаткові можливості створення систем підвищеної складності. Основний недолік ООП - деяке зниження швидкодії за рахунок складнішої організації програмної системи. В основу ООП покладені такі принципи: абстрагування, обмеження доступу, модульність, ієрархічність, типізація, паралелізм, стійкість. Розглянемо, що являє собою кожний принцип. Абстрагування - процес виділення абстракцій в предметній області завдання. Абстракція - сукупність істотних характеристик деякого об'єкта, які відрізняють його від усіх інших видів об'єктів і, таким чином, чітко визначають особливості даного об'єкта з точки зору подальшого розгляду та аналізу. Відповідно до визначення застосовується абстракція реального предмета істотно залежить від розв'язуваної задачі: в одному випадку нас буде цікавити форма предмету, в іншому вага, у третьому - матеріали, з яких він зроблений, Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 59 у четвертому - закон руху предмета і т.д. Сучасний рівень абстракції передбачає об'єднання всіх властивостей абстракції (як що стосуються стану аналізованого об'єкта, так і визначають його поведінку) в єдину програмну одиницю якийсь абстрактний тип (клас). Обмеження доступу - приховування окремих елементів реалізації абстракції, що не зачіпають істотних характеристик її як цілого. Необхідність обмеження доступу припускає розмежування двох частин в описі абстракції: інтерфейс - сукупність доступних ззовні елементів реалізації абстракції (основні характеристики стану і поведінки); реалізація - сукупність недоступних ззовні елементів реалізації абстракції (внутрішня організація абстракції і механізми реалізації її поведінки). Обмеження доступу в ООП дозволяє розробнику: виконувати конструювання системи поетапно, не відволікаючись на особливості реалізації використовуваних абстракцій; легко модифікувати реалізацію окремих об'єктів, що в правильно організованій системі не зажадає зміни інших об'єктів. Поєднання об'єднання всіх властивостей предмета (складових його стану і поведінки) в єдину абстракцію та обмеження доступу до реалізації цих властивостей отримало назву інкапсуляції. Модульність - принцип розробки програмної системи, що передбачає реалізацію її у вигляді окремих частин (модулів). При виконанні декомпозиції системи на модулі бажано об'єднувати логічно пов'язані частини, по можливості забезпечуючи скорочення кількості зовнішніх зв'язків між модулями. Принцип успадкований від модульного програмування, дотримання його спрощує проектування і налагодження програми. Ієрархія - ранжирована або упорядкована система абстракцій. Принцип ієрархічності припускає використання ієрархії при розробці програмних систем. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 60 У ООП використовуються два види ієрархії. Ієрархія «ціле / частина» - показує, що деякі абстракції включені у розглянуту абстракцію як її частини, наприклад, лампа складається з цоколя, нитки розжарювання і колби. Цей варіант ієрархії використовується в процесі розбиття системи на різних етапах проектування (на логічному рівні - при декомпозиції предметної області на об'єкти, на фізичному рівні - при декомпозиції системи на модулі і при виділенні окремих процесів у мультипроцесної системі). Ієрархія «загальне / приватне» - показує, що деяка абстракція є окремим випадком іншої абстракції, наприклад, «обідній стіл конкретний вид столу», а «столи - конкретний вид меблів». Використовується при розробці структури класів, коли складні класи будуються на базі більш простих шляхом додавання до них нових характеристик і, можливо, уточнення наявних. Один з найважливіших механізмів ООП - успадкування властивостей, в ієрархії загальне/приватне. Спадкування - таке співвідношення між абстракціями, коли одна з них використовує структурну або функціональну частину іншої або кількох інших абстракцій (відповідно просте і множинне успадкування). Типізація - обмеження, що накладається на властивості об'єктів і перешкоджає взаємозамінності абстракцій різних типів (або сильно звужуюче можливість такої заміни). У мовах з жорсткою типізації ¬ їй для кожного програмного об'єкта (змінної, підпрограми, параметра і т. д.) оголошується тип, який визначає безліч операцій над відповідним програмним об'єктом. Розглянуті нижче мови програмування на основі Паскаля використовують сувору, а на основі С-середню ступінь типізації. Використання принципу типізації забезпечує: раннє виявлення помилок, пов'язаних з неприпустимими операціями над програмними об'єктами (помилки виявляються на етапі компіляції програми при перевірці допустимості виконання даної операції над програмним об'єктом); спрощення документування; Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 61 можливість створення більш ефективного коду. Тип може зв'язуватися з програмним об'єктом статично (тип об'єкта визначений на етапі компіляції - раннє зв'язування) і динамічно (тип об'єкта визначається тільки під час виконання програми - пізніше зв'язування). Реалізація пізнього зв'язування в мові програмування дозволяє створювати змінні - покажчики на об'єкти, що належать різним класам (поліморфні об'єкти), що істотно розширює можливості мови. Паралелізм - властивість декількох абстракцій одночасно перебувати в активному стані, тобто виконувати деякі операції. Існує цілий ряд завдань, розвязання яких вимагає одночасного виконання деяких послідовностей дій. До таких завдань, наприклад, відносяться завдання автоматичного управління декількома процесами. Реальний паралелізм досягається лише при реалізації завдань такого типу на багатопроцесорних системах, коли є можливість виконання кожного процесу окремим процесором. Системи з одним процесором імітують паралелізм за рахунок поділу часу процесора між завданнями управління різними процесами. Залежно від типу використовуваної операційної системи (одно-або мультипрограмній) поділ часу може виконуватися або розробляється системою (як в МS DOS), або використовуваної ОС (як у системах Windows). Стійкість - властивість абстракції існувати в часі незалежно від процесу, який породив даний програмний об'єкт, та / або в просторі, переходячи з адресного простору, в якому він був створений. Розрізняють: тимчасові об'єкти, що зберігають проміжні результати деяких дій, наприклад обчислень; локальні об'єкти, що існують всередині підпрограм, час життя яких обчислюється від виклику підпрограми до її завершення; глобальні об'єкти, що існують поки програма завантажена в пам'ять; зберігаються об'єкти, дані яких зберігаються зовнішньої пам'яті між сеансами роботи програми. у файлах Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 62 Всі зазначені вище принципи в тій чи іншій мірі реалізовані в різних версіях об'єктно-орієнтованих мов. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 63 6 ЗАВДАННЯ №4 6.1 Постановка завдання Розробка інтерфейсу і реалізації класу під назвою ryd з використанням технології об'єктно-орієнтованого програмування. Створити конструктор з параметром, за умовчанням і деструктор. Вирахувати вираз. 6.2 Інтерфейс класу LaninDlg.h: class ryd //Створюємо клас ryd { public: ryd() {itsN=1;itsX=0.00;} //конструктор з параметром ryd(int iN,double iX); //конструктор без параметру ~ryd(); //деструктор int GetN(); void SetN(int N); double GetX(); void SetX(double X); double summ(); double proizv(); private: int itsN; double itsX; }; Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 64 6.3 Реалізація класу LaninDlg.cpp #include "math.h" – підключаємо математичну бібліотеку ryd::ryd(int iN,double iX) { itsN=iN; itsX=iX; } ryd::~ryd() { } int ryd::GetN() { return itsN; } void ryd::SetN(int N) { itsN=N; } double ryd::GetX() { return itsX; } void ryd::SetX(double X) { itsX=X; } double ryd::summ() { int k; double s=0; for(k=1;k<=itsN;k++) { s=s+((2*k-1)*tan(k*itsX)+sqrt(fabs(k*k*itsX))); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 65 } return s; } double ryd::proizv() { int k; double p=1; for(k=1;k<=itsN;k++) { p=p*((2*k-1)*tan(k*itsX)+sqrt(fabs(k*k*itsX))); } return p; } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 66 6.4 Проектування форми Створимо діалог. Видалимо Static Text “TODO…” та кнопку Cancel. Перенесемо на форму чотири Static Text, чотири Edit Box та два Button(див. рис 6.1). Рисунок 6.1 Після цього відредагуємо діалог наступним чином: чотирьом Static Text задамо назви «N», «X», «S=», «P=», два Button назвемо «Вирахувати», а Button OK перейменуємо на EXIT(див. рис 6.2). . Рисунок 6.2 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 67 6.5 Програмний код void CLaninDlg::OnButton1() { UpdateData(); ryd Lanin; double s,p; Lanin.SetN(m_1); Lanin.SetX(m_2); s=Lanin.summ(); p=Lanin.proizv(); m_3=s; m_4=p; UpdateData(false); } void CLaninDlg::OnButton2() { UpdateData(); ryd Lanin(m_1,m_2); double s,p; s=Lanin.summ(); p=Lanin.proizv(); m_3=s; m_4=p; UpdateData(false);} Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 68 6.6 Інструкція користувачеві Запускаємо програму, в діалоговому вікні, що відкрилося, заносимо значення в «N» та «X», натискаємо на кнопку Вирахувати. Відповідь виведеться в двох вікнах редагування: «Сума» і «Добуток»(див. рис 6.3). Рисунок 6.3 6.7 Контрольний приклад Тест 1 X=3 N=5 Сума: 5 2k 1 ctg (k * 3) k 2 * 3 = 10,55 k 1 Добуток: 5 2k 1 ctg(k * 3) k 2 * 3 = 28,63 k 1 Тест 2 X=7 N=4 Сума: 4 2k 1 ctg(k * 7) k 2 * 7 = 39,46 k 1 Добуток: Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 69 4 2k 1 ctg(k * 7) k 2 * 7 = 245,41 k 1 Тест 3 X=2 N = 64 Сума: 64 2k 1 ctg(k * 2) k 2 * 2 = 4849,89 k 1 Добуток: 64 2k 1 ctg(k * 2) k 2 * 2 = 2,31 k 1 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 70 7 ЗАВДАННЯ №5 7.1 Постановка завдання Створіть перевантажену функцію (ДІАЛОГ 1) і шаблон для функції (ДІАЛОГ 2). Створити функцію SV об’єма шару (4/3R3) та об’єму циліндра (R2*h). 7.2 Проектування форми Створимо меню для діалогу і додамо ще один діалог, як описано вище. На головному діалозі розмістимо чотири Edit Box, чотири Static Text, один Button і видалимо кнопку Cancel та Static Text(див. рис 7.1). Рисунок 7.1 Далі перейдемо до редагування першого діалогу. Задамо Static Text назви «R», «H», «Vшару», «Vциліндра», дамо назву Button «Вирахувати», а для Button “OK” змінимо назву на «Вийти»(див. рис 7.2). Рисунок 7.2 Після цього приступимо до другого діалогу. Перенесемо на форму шість Static Text, шість Edit Box, два Button і видалимо кнопку Cancel(див. рис 7.3). Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 71 Рисунок 7.3 Тепер приступимо до редагування діалогу. Задамо Static Text назви «R1», «H1», «R2», «H2», «Результат:» двічі і двічі задамо назву для двох Button: «Вирахувати» (див. рис 7.4). Рисунок 7.4 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 72 7.3 Перевантажена функція С++ дозволяє визначити декілька функцій з одним і тим же ім'ям, якщо ці функції мають різні набори параметрів (щонайменше різні типи параметрів). Ця особливість називається перевантаженням функції. При виклику переобтяженої функції компілятор С++ визначає відповідну функцію шляхом аналізу кількості, типів і порядку проходження аргументів у виклику. Перевантаження функції зазвичай використовується для створення декількох функцій з однаковим ім'ям, призначених для виконання схожих завдань, але з різними типами даних. Перевантажені функції розрізняються компілятором за допомогою їх сигнатури – комбінації імені функції і типів її параметрів. Компілятор кодує ідентифікатор кожної функції по числу і типу її параметрів, щоб мати можливість здійснювати надійне скріплення типів. Надійне скріплення типів гарантує, що викликається належна функція і що аргументи узгоджуються з параметрами. При використання перевантажених функцій потрібно з обережністю задавати початкові значення їх параметрів. Приклад: double SV (double r) {return(4.0/3.0*3.14*r*r*r); } double SV (double r, double h) {return(3.14*r*r*h); } void CLaninDlg::OnButton1() { {UpdateData(); m_shar=SV(m_r); m_cyl=SV(m_r,m_h); UpdateData(false); } } void CLaninDlg::On1() Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 73 { CMyDlg dial; dial.DoModal(); } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 74 7.4 Шаблон функції Перевантажені функції зазвичай використовуються для виконання схожих операцій над різними типами даних. Якщо операції ідентичні для кожного типу, це можна виконати компактніше і зручно, використовуючи шаблони функцій. Досить написати одне єдине визначення шаблону функції. Ґрунтуючись на типах аргументів, вказаних у викликах цієї функції, С++ автоматично генерує різні функції для відповідної обробки кожного типу. Таким чином, визначення єдиного шаблону визначає ціле сімейство рішень. Всі визначення шаблонів функцій починаються з ключового слова template, за яким слідує список формальних параметрів функції, ув'язнений в кутові дужки (<) і (>). Кожен формальний тип параметра передує службовим словом class. Формальні типи параметрів – це вбудовані типи або типи, визначувані користувачем. Вони використовуються для завдання типів аргументів функції, для завдання типів повертаного значення функції і для оголошення змінних усередині тіла функції. Після шаблону слідує звичайний опис функції. Приклад визначення шаблон функцій, що обчислюють абсолютні значення числових величин різних типів: template <class type> type abs (type x) { return x>0 ? x: -х; } Шаблон сімейства функцій складається з двох частин – заголовка шаблону: template <список_параметрів_шаблону> І із звичайного визначення функції. Імена параметрів шаблону можуть використовуватися і в тілі визначення функції для позначення типів локальних об'єктів. По суті, механізм шаблонів функцій дозволяє автоматизувати підготовку визначень переобтяжених функцій. При використанні шаблонів вже немає необхідності готувати заздалегідь всі варіанти функцій з переобтяженим ім'ям. Компілятор автоматично, аналізуючи виклики функцій в тексті програми, формує необхідні визначення саме Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 75 для таких типів параметрів, які використані в зверненнях. Подальша обробка виконується так само, як і для переобтяжених функцій. Можна вважати, що параметри шаблону функцій є формальними параметрами, а типи тих параметрів, які використовуються в конкретних зверненнях до функції, служать фактичними параметрами шаблону. Саме по ним виконується параметричне налаштування і з урахуванням цих типів генерується конкретний текст визначення функції. Перерахуємо основні властивості параметрів шаблону. 1. Імена шаблону мають бути унікальними у всьому визначенні шаблону. 2. Список параметрів шаблону не може бути порожнім, оскільки при цьому втрачається можливість параметризації, і шаблон функцій стає звичайним визначенням конкретної функції. 3. У списку параметрів шаблону функції може бути декілька параметрів. Кожен з них повинен починатися службовим словом class. Наприклад, допустимий такий заголовок шаблону: template <class type1, class type2> Відповідно, невірний заголовок: template <class type1, type2, type3> 4. Неприпустимо використовувати в заголовку шаблону параметри з однаковими іменами, тобто помилковий такий заголовок: template <class t, class t, class t> 5. Ім'я параметра шаблону має у визначуваній шаблоном функції всі права імені типу, тобто з його допомогою можуть спеціалізуватися формальні параметри, визначатися тип повертаного функцією значення і типи будь-яких об'єктів, локалізованих в тілі функції. Ім'я параметра шаблону видно у всьому визначенні і приховує інші використання того ж ідентифікатора в області, глобальній по відношенню до даному шаблону функції. Всі параметри шаблону функцій мають бути обов'язково використані в специфікаціях параметрів визначення функції. Визначувана за допомогою шаблону функція може мати будь-яку кількість формальних параметрів, що не параметризуються. Може не параметризуватися і повертане функцією Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 76 значення. При використанні шаблонів функцій можливе перевантаження, як шаблонів, так і функцій. Можуть бути шаблони з однаковими іменами, але різними параметрами. Або за допомогою шаблону може створюватися функція з таким же ім'ям, що і явно певна функція. У обох випадках «розпізнавання» конкретного виклику виконується по сигнатурі, тобто по типах, порядку і кількості фактичних параметрів. Приклад: template<class T> T SV1(T r,T h) {return(3.14*r*r*h);} void CMyDlg::OnButton1() { { UpdateData(); m_1=SV1(m_r1,m_h1); UpdateData(false); } } void CMyDlg::OnButton2() { { UpdateData(); m_2=SV1(m_r2,m_h2); UpdateData(false); } } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 77 7.5 Інструкція користувачеві Для роботи з перевантаженою функцією відкрийте головний діалог, задайте значення вікнам редагування під назвою «R» і «H». Після цього натисніть на кнопку під назвою «Обчислити». Відповідь буде відображена у вікнах редагування під назвою «Vшару» і «Vциліндра»(див. рис 7.5). Рисунок 7.5 – Головне вікно додатку Для роботи з шаблоном функції слід натиснути на меню «Завдання» на головному діалозі і вибрати пункт меню «Завдання 1». Задайте значення вікнам редагування під назвами «R1», «H1», «R2» і «H2». Після цього слід натиснути на кнопку під назвою «Обчислити». Відповідь буде відображена у вікнах редагування під назвою «Результат» (див. рис 7.6). Рисунок 7.6 – Вікно Завдання №1 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 78 7.6 Контрольний приклад Перевантаження функцією: Тест 1 R=3 H=5 Vшару = 4/3*3,14*33 = 113 Vциліндра = 3,14*32*5 = 141 Тест 2 R=2 H = 10 Vшару = 4/3*3,14*23 = 33 Vциліндра = 3,14*22*10 = 125 Тест 3 R = 100 H = 78 Vшару = 4/3*3,14*1003 = 4186666 Vциліндра = 3,14*1002*78 = 2449200 Шаблон функції: Тест 1 R = 21 H = 15 3,14*212*15 = 20771 3,14*212*15 = 20771,1 Тест 2 R=7 H = 20 3,14*72*20 = 3077 3,14*72*20 = 3077,2 Тест 3 R=1 H=2 3,14*12*2 = 6 3,14*12*2 = 6,28 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 79 8 ЗАВДАННЯ №6 8.1 Постановка завдання Скласти базовий клас Array, в якому описані дані: динамічний одновимірний масив і кількість елементів, що задається користувачем; конструктор, для ініціалізації кількості елементів і виділення пам'яті під них, деструкція, а також функція VvodMas VividMas. Успадкований клас Array1 від класу Array з конструктором і функцією pr для розрахунку добутку всіх елементів. Успадкований клас Array2 від класу Array1 з конструктором і функцією SumPN для пошуку суми додатних та від’ємних елементів. 8.2 Проектування форми Спершу створимо додаток, заснований на діалоговому вікні як описано вище. Далі перейдемо до створення класів. Для цього виберемо в меню Insert пункт New Class(див. рис. 8.1). Рисунок 8.1 У вікні, що відкрилося, виберемо тип класу Generic Class і задамо ім’я Array(див. рис. 8.2). Таким же чином, створимо класи Array1 та Array2, вказавши відповідні імена. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 80 Рисунок 8.2 Перейдемо до проектування форми. Видалимо Static Text “TODO” та кнопку Cancel. Розмістимо на формі чотири Static Text, два Edit, два List Box і три Button(див. рис. 8.3). Рисунок 8.3 Відредагуємо форму. Змінимо назви Static Text на «Кількість елементів масиву», «МАСИВ», «Добуток елементів», «Сума + та -». Для Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 81 першого Button задамо назви «Заповнити», двом Button - назву «Вивести», Button «OK» перейменуємо на «Вихід»(див. рис. 8.4). Рисунок 8.4 8.3 Базовий клас Array.h: class Array { public: Array(){N=0;} Array(int); virtual ~Array(); int getN() const {return N;} void setN(int nn); void F(); void VvodMas(int, int); int VivodMas(int); protected: int * MAS; int N; }; Array.cpp: Array::Array(int n) { Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 82 MAS=new int[n]; for(int i=0; i<n; i++) MAS[i]=0; } Array::~Array() { delete []MAS; } void Array::VvodMas(int ii, int cc) { MAS[ii]=cc; } int Array::VivodMas(int ii) { return MAS[ii]; } void Array::F() { MAS=new int[N]; } void Array::setN(int nn) { N=nn; } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 83 8.4 Спадкові класи Array1.h: #include "Array.h" class Array1 : public Array { public: Array1(){} virtual ~Array1(); int pr(); }; Array1.cpp: Array1::~Array1() { } int Array1::pr() { int p=1; for(int i=0;i<N;i++) p*=MAS[i]; return p; } Array2.h: #include "Array1.h" class Array2: public Array1 { public: Array2(){} virtual ~Array2(); int SumP(); int SumN(); }; Array2.cpp: Array2::~Array2() Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 84 { } int Array2::SumP() { int sp=0; for(int i=0;i<N;i++) { if (MAS[i]>0) sp+=MAS[i]; } return sp; } int Array2::SumN() { int sm=0; for(int i=0;i<N;i++) { if (MAS[i]<0) sm+=MAS[i]; } return sm; } Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 85 8.5 Програмний код int i; Array2 c; void CLaninDlg::OnButton1() { CString s,s1=" "; int k=0; m_l.ResetContent(); srand(time(NULL)); UpdateData(); c.setN(m_1); c.F(); for(i=0;i<m_1;i++) { k=-rand()%20+10; c.VvodMas(i,k); s.Format("%d",k);s1=s1+s+" "; } m_l.AddString(s1); UpdateData(false); } void CLaninDlg::OnButton2() { UpdateData(); m_2=c.pr(); UpdateData(false); } void CLaninDlg::OnButton3() { CString s; m_3.ResetContent(); s.Format("%d",c.SumP()); m_3.AddString(s); s.Format("%d",c.SumN()); Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 86 m_3.AddString(s); } 8.6 Інструкція користувачеві Запускаєте програму. Для створення масиву введіть кількість елементів у вікно редагування під назвою «Кількість елементів масиву» на натисніть кнопку «Заповнити». У вікні редагування «МАСИВ» з’явиться масив. Для розрахунку добутку всіх елементів масиву натисніть кнопку Вивести, що знаходиться навпроти вікна редагування «Добуток елементів», і результат з’явиться у цьому вікні. Для розрахунку суму додатних та від’ємних елементів масиву натисніть кнопку Вивести, що знаходиться навпроти вікна редагування «Сума + та -», і результат з’явиться у цьому вікні. Для виходу з додатку натисніть кнопку Вихід(див. рис. 8.5). Рисунок 8.5 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 87 8.7 Контрольний приклад Тест 1: 1) Заповнюємо масив з 5 елементів 10 -8 5 9 -1 2) Знаходимо добуток усіх елементів 10 * (-8) * 5 * 9 * (-1) = 3600 3) Знаходимо суму додатних та від’ємних елементів 10 + 5 + 9 = 24 -8 + (-1) = -9 Тест 2: 1) Заповнюємо масив з 10 елементів -3 -1 -5 -2 -1 1 -2 5 1 -2 2) Знаходимо добуток усіх елементів (-3) * (-1) * (-5) * (-2) * (-1) * 1 * (-2) * (5) * 1 * (-2) = -600 3) Знаходимо суму додатних та від’ємних елементів 1+5+1=7 (-3) + (-1) + (-5) + (-2) + (-1) + (-2) + (-2) = -16 Тест 3: 1) Заповнюємо масив з 14 елементів -6 9 -2 6 -2 10 4 4 -3 1 -1 -8 8 -4 2) Знаходимо добуток усіх елементів -6 * 9 * (-2) * 6 * (-2) * 10 * 4 * 4 * (-3) * 1 * (-1) * (-8) * 8 * (-4) = 159252480 3) Знаходимо суму додатних та від’ємних елементів 9 + 6 + 10 + 4 + 4 + 1 + 8 = 42 -6 + (-2) + (-2) + (-3) + (-1) + (-8) + (-4) = -26 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 88 ВИСНОВКИ Мова програмування Microsoft Visual C++ на сьогоднішній день є однією з найпопулярніших мов програмування в світі. Visual C++ - це надзвичайно потужний пакет, що об’єднує в собі компілятор, відладчик, профайлер, редактор ресурсів та інші компоненти. На Visual C++ можна писати для MSOffice, писати обробники баз MSAccess, легко працювати з Windows NT, MS SQL Server. Популярність цієї мови обумовлена ще й потужними візуальними засобами розробки інтерфейсу користувача. Висока продуктивність роботи – ще одна перевага Visual C++. Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 89 ЛІТЕРАТУРА 1. Александреску А. Современное проектирование на С++. Серия C++ In-Depth, т.3. — Москва: Издательский дом «Вильямс», 2002 2. Бадд Т. Объектно-ориентированное программирование в действии/Пер. с англ.– СПб.: Питер, 1997 3. Буч Г. Объектно-ориентированный анализ и проектирование с примерами на С++.— М: Бином, 1998 4. Вандевурд Д., Джосаттис Н. Шаблоны С++: справочник разработчика/Пер. с англ. — М.: Издательский дом «Вильямс», 2003 5. Голуб А. И. С и С++. Правила программирования. — М: БИНОМ, 1996 6. Красикова И.Е. Красиков И.В. С++. Просто как дважды два. — М.: Изд-во Эксмо, 2005 7. Коплиен Дж. Программирование на С++ . — СПб: ПИТЕР, 2005 8. Страуструп Б. Дизайн и эволюция С++: Пер.с англ.– М.: ДМК Пресс; СПб.: Питер, 2006 9. Штерн В. Основы С++. Методы программной инженерии. — Москва: Лори, 2003 10. М. Эллис, Б. Строуструп. Справочное руководство по языку C++ с комментариями: Пер. с англ. - Москва: Мир, 1992 11. Стенли Б. Липпман. C++ для начинающих: Пер. с англ. 2тт. Москва: Унитех; Рязань: Гэлион, 1992 12. К. Джамса. Учимся программировать на языке C++: Пер. с англ. - Москва: Мир, 1997 13. В.А. Скляров. Язык C++ и объектно-ориентированное программирование: Справочное издание. - Минск: Вышэйшая школа, 1997 14. Х. Дейтел, П. Дейтел. Как программировать на C++: Пер. с англ. - Москва: ЗАО "Издательство БИНОМ", 1998 Арк. Змн. . Арк. № докум. Підпис Дата Схема прогрпми 90