- •Методичні поради до користУВання практикумом
- •Послідовність виконання робіт
- •Виконання самостійної роботи для підготовки до лабораторній роботі
- •Методика проведення лабораторної роботи
- •Приклад оформлення титульної сторінки звіту
- •2. Побудова структурних блок-схем алгоритмів
- •3. Процедурне програмування
- •Void pause (int p) //заголовок функції
- •Int abs1(int I) // для цілих чисел
- •1) Int abs (int); 2) double fabs (double); 3) long labs (long);
- •Int dd[4][6]; //двовимірний масив
- •4. Техніка показників
- •Void fun(double [ ]);
- •Void fun(double array[ ]) {…..}
- •Void deg(double [], unsigned, unsigned);
- •Void deg(double array[], unsigned size, unsigned mn);
- •Void fr(int [], unsigned, int []);
- •Void fr(int ms[], unsigned size, int ms1[]);
- •Void sort(int [], const unsigned, int (*)(int, int));
- •Void sort(int array[], const unsigned k, int (*var)(int, int));
- •If ((var)(array[k], array[I]))
- •Initialize(); Sc r(15);
- •Initialize(); Scr(15);
- •Void tarabar(string text[])
- •Idkln dkln 5
- •Idkln гджу -122
- •3_14.Exe лисиця бачить сир
- •3_14.Exe пробіл
- •Зведенна таблиця використання показників
- •4. Об’єктно-оріентоване програмування
- •Void swop(client &a, client &b);
- •Void sort(client c[ ], unsigned k, int ind);
- •Void fun1(int);
- •Void Client::swop(int, int j)
3. Процедурне програмування
Лабораторна робота № 3. Ознайомлення з середовищем розробки Microsoft Visual C++ 6.0
Мета роботи.
Здобути навики використання середовища розробки Microsoft Visual C++6.0, створити проект, що містить консольну програму, ознайомитися зі структурою проекту Visual C++, структурою консольної програми, здобути навички написання, компіляції, виправлення помилок та відлагоджування програм.
Короткі теоретичні відомості до роботи.
Закон України - Про надання в Україні мові програмування C++ статусу офіційної. Цей Закон відповідно до статей 10 та 22 Конституції України визначає статус мови програмування C++ в Україні як офіційної мови, що застосовується поряд із державною мовою, та забезпечує її вільне використання з врахуванням потреб чисельного та багатонаціонального населення України.
Інтегроване середовище розробки (IDE) Visual Studio надає набір інструментів, які допомагають у створенні та зміні коду, а також у виявленні та виправлення помилок. При написанні програми на Visual C + + за допомогою
Visual Studio першим етапом є вибір типу проекту. Для кожного типу проекту
Visual Studio встановлює параметри компілятора і генерує стартовий код.
Створення нового проекту:
1. У меню Файл виберіть команду Створити.
2. В діалоговому вікні створення потрібно обрати закладку створення проекту.
3. В області Типи проектів виберіть пункт Консольна програма Win32
(Win32 Console Application).
4. Введіть назву проекту (наприклад lab3) та місце розміщення проекту (можна перейти до каталогу, в який потрібно зберегти проект або прийняти місце розташування за замовчуванням).
5. Для запуску майстра додатків Win32 натисніть кнопку ОК.
6. У полі вибору типу програми виберіть параметр простий проект (simple application) та натисніть кнопку Готово.
В результаті виконання всіх вище згаданих операцій буде створено проект з файлами (наприклад lab1.cpp).
Використання оглядача робочого простору (Workspace Explorer).
Оглядач робочого простору спрощує роботу з файлами, класами та іншими ресурсами, включеними до рішення. За допомогою оглядача простору спрощує можна додавати, видаляти або доступатися до файлів які входять до проекту, створювати, переглядати класи та функції. За замовчуванням Workspace містить дві закладки на яких відображається дерево проектів з усіма проектами та файлами, які входять до проектів (FileView) та дерево класів та глобальних функцій (ClassView). Якщо розкрити всі гілки дерева файлів тоді можна отримати уявлення про всі складові проекту. У випадку якщо при створенні проекту було введено назву lab3 тоді у файлі lab3.cpp міститься генерований текст програми:
#include "stdafx.h"
int main(int argc, char* argv[])
{
return 0;
}
Написання програмного коду
Для написання програмного коду використовується вбудований в інтегроване середовище редактор коду.
Структура програми
Програма на мові C++ складається з препроцесора директив, вказівок компілятору, оголошень змінних та/або констант, оголошень і визначень функцій.
Оголошення змінної
Оголошення змінної задає ім'я та атрибути змінної. Атрибутами змінної можуть бути тип, кількість елементів (для масивів), специфікація класу пам'яті, а також ініціалізатори. Ініціалізатор - це константа відповідного типу, що задають значення, яке надається змінній при створенні.
Оголошення змінної має наступний синтаксис:
[<специфікація класу пам'яті>] <тип> <ім'я> [= <ініціалізатор>]
[, <ім'я> [= <ініціалізатор>] ... ];
Приклади оголошення змінних
int x; // Оголошення змінної цілого типу без ініціалізатора double
double y = exp(1); // Змінна речовинного типу ініціалізується числом e.
int a, b = 0; // exp (x) - функція, обчислюються ex.
У мові С++ немає обмежень на кількість символів в імені. Однак деякі частини реалізації (зокрема, компоновщик) недоступні автору компілятора, і вони іноді накладають такі обмеження.
Константи
В С++ введена концепція визначаються користувачем констант для вказівки на те, що значення не можна змінити безпосередньо. Це може бути корисно в декількох відносинах. Наприклад, багато об'єкти не змінюються після ініціалізації; використання символічних констант призводить до більш зручним у супроводі коду, ніж застосування літералів безпосередньо в тексті програми; покажчики часто використовуються тільки для читання, але не для запису; більшість параметрів функцій читаються, але не перезаписуються.
Для того, щоб оголосити об'єкт константою, в оголошення потрібно додати ключове слово const. Так як константі не можна присвоювати значення, вона повинна бути ініціалізувати.
const int a = 100; // a є константою
const int b[] = {1, 2, 3, 4, 5}; // Всі b[i] є константами
const int c; // Помилка – відсутній ініціалізатор
Типовим є використання констант як розміру масивів і ярликів в інструкції case. Відзначимо, що const модифікує тип, тобто обмежує можливе використання об'єкта, але не вказує спосіб розміщення константного об'єкту. Простим і типовим використанням константи є той випадок, коли значення константи відомо під час компіляції і під неї не потрібно виділення пам'яті. Для масиву констант, як правило, вимагається виділення пам'яті, так як, у загальному випадку, компілятор не в змозі визначити, до якого елементу масиву відбувається звернення до вираженні.
Оголошення typedef
Оголошення, що починається з ключового слова typedef, вводить нову назву для типу, не для змінної цього типу. Метою такого оголошення є призначення короткого синоніма для часто використовуваного типу. Наприклад, при частому застосуванні unsigned char можна ввести синонім uchar. typedef unsigned char uchar; // Тепер uchar – синонім для unsigned char Імена, що вводяться за допомогою typedef, є синонімами, а не новими типами. Отже, старі типи можна використовувати разом з їх синонімами.
Якщо потрібні різні типи з однаковою семантикою або з однаковим уявленням, потрібно використовувати перерахування або класи.
Компіляція, повідомлення про помилки, виправлення помилок та запуск програми.
Для того щоб відкомпілювати проект потрібно вибрати пункт меню Build\Build <назва проекту> або F7 після чого на закладці Build у вікні Output (яке за замовчуванням знаходиться в нижній частині середовища розробки) буде відображатися інформація про хід процесу компіляції. Якщо в програмному коді відсутні помилки тоді в результаті компіляції отримуємо повідомлення:
Compiling...
Lab3.cpp
Linking...
lab1.exe - 0 error(s), 0 warning(s)
Якщо все ж таки в програмному коді є помилки тоді на закладці Build у вікні Output буде вміщуватися опис помилок (назва файлу та рядок в якому присутня помилка, код помилки та короткий опис помилки) та повідомлення про те, що створити файл lab1.exe не вдалося, як наприклад:
Compiling...
Lab3.cpp
D:\lab3\lab3.cpp(10) : error C2143: syntax error : missing
';' before 'return'
Error executing cl.exe.
lab1.exe - 1 error(s), 0 warning(s)
Подвійне натискання на повідомленні про помилку на закладці Build у вікні Output призводить до відкриття файлу з помилкою та встановленні курсору у рядок з помилкою.
Після виправлення помилок та вдалої компіляції можна запустити створений файл на виконання, для чого потрібно вибрати пункт меню
Build\Execute <назва проекту> або Ctrl+F5.
Налагодження програмного коду.
Налагодження – етап, який присутній при написанні будь-якої досить складної програми який є необхідним у випадку, якщо в результаті виконання програми було отримано неочікуваний результат або поведінка програми в цілому є незрозумілою. Призначення даного етапу полягає у тому, що програміст локалізує місце знаходження помилок у програмі шляхом аналізу змінних та порядку виконання команд. Для того, щоб виконувати налагодження потрібно запустити програму в режимі налагодження, це можна зробити за допомогою пункту меню Build\Start Debug\Go або F5.
В даному режимі можна виконувати кожен рядок програми крок за кроком, встановлювати точки зупинки програми,заходити всередину функцій, переглядати значення змінних, регістрів, стеку тобто всього того, що потрібно для перевір-ки коректності написаного програмного коду:
1. При досягненні програмою рядка з встановленою точкою зупинки виконання програми тимчасово припиняється (програма знаходиться в режимі призупинення виконання). Рядок коду, який виконується в даний момент відмічено жовтою стрілкою ліворуч від рядка.
2. Щоб дізнатися поточне значення змінної наведіть на неї курсор, ім'я змінної та її значення, відобразиться у вікні спливаючі підказки. Для того, щоб переглянути значення за змінної у вікні Watch можна виділити змінну і перетягнути її в дане вікно. Як приклад налагодження програми можна навести наступну послідовність дій:
1. Відкрити файл, що містить можливі логічні помилки.
2. Встановити точки зупинки в рядках де потрібно виконувати налагодження (встановити або видалити в поточному рядку точку зупинки можливо за допомогою клавіші F9). Ліворуч від рядка з встановленою точкою зупинки з'являється зафарбоване червоним кольором коло.
3. Запустити програму в режимі налагодження.
4. Після зупинки виконання в точці зупинки переглянути значення потрібних змінних на закладках Auto або Watch.
5. Продовжити виконання програми в покроковому режимі (F10 – Step Over або F11 – Step Into), якщо є необхідність перевірки послідовності виконання команд або до наступної точки зупинки (F5).
6. Якщо виникає потреба в зупинці виконання програми потрібно натиснути сполучення клавіш SHIFT + F5.
Порядок виконання роботи.
1. Створити проект що містить консольну програму Win32.
2. Об’явити та про ініціювати декілька змінних основних базових типів.
3. Написати декілька виразів (5–7) в яких використовуються операції над змінними вказані у варіантах до роботи (табл. 1).
4. Відкомпілювати програму та виправити помилки у разі їх наявності.
5. Виконати програму в покроковому режимі перевіривши значення всіх змінних у процесі, пересвідчившись у правильності роботи програми (в коментарі до кожного рядку записати очікуване значення змінної).
6. Додати до програми алгоритм обчислення суми послідовності значень математичного виразу Y заданого в табл. 2 при заданому діапазоні значень аргументу X. Сума повинна включати лише ті значення функції Y, які відповідають певній умові згідно варіанту. При виконанні завдання обов’язкове використання умовних операторів та операторів циклу.
7. Виконати програму в покроковому режимі перевіривши значення всіх
змінних у процесі виконання програми та пересвідчившись у
правильності роботи програми.
У програмах мови С++ використовується найбільш часто розширення .cpp. Наведемо приклад програми, яку треба виконати на комп’ютері і яка «вітає світ», тобто виводить на екран рядок-привітання (Hello, World!).
// prog001.cpp – вивід повідомлення на екран
#include <iostream> //директива препроцесора
using namespace std; //опис стає видимим
int main() //головна функція
{ //початок тіла функції
cout<<"Hello, World!"; //повідомлення
return 0; //завершення функції main()
} //кінець тіла функції
Варіанти до роботи.
Таблиця 1. Варіанти до пункту № 3.
Таблиця 2. Варіанти до пункту 6.
Оглядові запитання
Що таке модулі програми на мові С++?
Що виконує наступна директива препроцесора? #include <iostream>
Що виконує наступний оператор? using namespace std;
Який оператор можна використовувати, щоб надрукувати фразу “Hello!” та перейти на новий рядок?
Який оператор можна застосовувати, щоб присвоїти змінної типу цілого числа з іменем cheeses?
Який оператор можна використовувати, щоб присвоїти змінної cheeses значення 76?
Який оператор можна використовувати, щоб зчитати значення, що введені з клавіатури, та присвоїти його змінної cheeses?
Який оператор можна використовувати, щоб надрукувати фразу “У нас є X сортів cheese”, у котрій значення змінної cheese замінює Х?
Що можна казати про функції наступних їх прототипів? int froop (double t); void rattle (int n); int prune (void);
У яких випадках не використовується ключове слово return при визначені функції?
Лабораторна робота № 4. Арифметичні та логічні операції у С++.
Мета роботи.
Здобути навики використання середовища розробки мови C++, створити проект, що містить арифметичні та логічні операції, здобути навички написання таких програм.
Короткі теоретичні відомості до роботи.
Програма на мові С++ записується в текстовий файл з розширенням .cpp, наприклад, progr.cpp.В іменах файлів не слід використовувати нелатинські літери. Власний алгоритм розташовується у фігурних дужках {} після виразу main (), у якому круглі дужки вказують, що це - програмний блок, який має назву – функція, у даному випадку з іменем main. Програма може складатися не із однієї функції, але main (головна) присутня завжди. З неї починається виконання програми. Алгоритм програми має назву тіло функції і завжди заключний у фігурні дужки. Окрема фраза алгоритму закінчується знаком ;. Функція main завжди завершується виразом return 0; , який свідчить, що програма завершена.
Перша операція нашої програми: cout<<“****початок****”; - виводить на екран монітора символьний рядок (текст якого розміщується у подвійних лапки).
Наступний рядок – це об’ява. Позначення I, j, k, f є іменами змінних, або ідентифікаторами. Слово, що стоїть поперед ідентифікаторів, визначає тип даних і має назву спеціфікатором типу. Наприклад, int визначає, що I, j, k, f - цілі числа. Далі I та j присвоюється значення 2. Безпосереднє привласнення значення ідентифікатора при об’яві називається ініціалізацією, що демонструють оголошення:
double d=.751; де змінна d - числа з плаваючою точкою типу double.
сhar f = ‘ &’; де символьна змінна f - типу сhar .
Символ полягає в одинарні лапки, рядок символів - у подвійні. Ціла і дробова частини числа розділяються крапкою. Рядок
cout<<“\n”<<“i=“<<i<<“\n”<<“j=“<<j<<‘ ‘
<<“d=”<<d<<“\n”<<“f=“<<f;
Послідовно виводяться на екран значення I, j, d, f (спеціальний вивід).
Команда \n – почати вивід з нового рядка.
Пробіл у одинарних лапках розділяє пробілом виведені знаки або рядки.
Операція I=N дається поперед функції main, як вказівку препроцесору
#define N 12 , яка робить заміну N на 12 і далі робиться присвоєння змінній I значення 12.
Операція cin>>k; зупиняє виконання програми для введення з клавіатури значення змінній k. Після натискання на клавішу Enter присвоюється змінній k відповідне значення.
Директива препроцесору #include<iostream, h> - включає у програму вбудовані у мову С++ функції вводу-виводу
Рядки, що починаються з символу #, обробляються поперед компіляції власної програми.
Програма повинна бути написана зрозуміло для користувача. Кожна програма повинна починатися з коментаря, в якому міститься назва файлу і його призначення. Коментарі всередині програми повинні допомагати її розумінню. Програма повинна бути розділена на логічні блоки відступами, пробілами, коментарями. Ідентифікатори повинні відповідати загально прийнятим математичним позначенням. Букви i, j, k, l, m, n бажано використовувати для позначення цілих чисел.
//Файл 1\1_01.cpp
#include <iostream, h> //заголовочний файл
#define N 12 //заміна N на 12
main () {
cout<<”*****початок*****”;
int i, j, k, l; //об’ява
i=j=2 //присвоєння
double d=.526; //об’ява зі ініціалізацією
char f=’&’ //об’ява зі ініціалізацією
cout<<“\n”<<“i=“<<i<<“\n”<<“j=“<<j<<‘ ‘
<<“d=”<<d<<“\n”<<“f=“<<f; /*вивід на монітор
I=N; //використання директиви #define
cout<<“\n”<<“I=”<<I; /*вивід значення змінної N
cout<<“\n”<<“ввід цілого числа k”;
cin>>k; /*ввід з клавіатури
cout<<“k=”<<k; //вивід k
cout<<“\n”<<“i+j“<<i+j<<‘ ‘<<“d+k=“<<(d+k)
<<“ ^^ кінець ^^”;
return 0; /*при завершені програма повертає процесору, який її викликав, значення 0 */
} //кінець функції main
Рекомендується, щоб рядок програми не виходив за межи екрану для зручності читання та роздрукування.
Результат виконання програми
Компіляція та виконання програм.
Компілятор Microsoft Visual C++ 6.0 та Microsoft Visual C++NET (2003) практично повністю однакові.
Запустимо компілятор та за допомогою команди File | New … викличемо діалогове вікно New з активною закладкою Projects. У лівій частині вікно слід виділити рядок Win32 Console Application.
У результаті створюється консольний додаток Windows. Праворуч у вікні за допомогою поля Location слід вибрати дисковий каталог, у якому будуть розташовані усі учбові проекти. У полі введення, яке розташовано у правій частині вікна, слід ввести з клавіатури назву проекту (наприклад, –Proj1). Натиснути кнопку ОК і проект створений. Графічним середовищем компілятора автоматично створений однойменний проект дисковий каталог Proj1, у якому розташуються усі допоміжні файли, що обслуговують проект.
Щоб впровадити в проект свій файл з текстом, потрібно знову виконати команду File | New … графічного середовища компілятора Microsoft Visual C++ , але вже з активною закладкою Files, де лівою клавішею миші виділяємо рядок “С++ Source File”. У правій частині вікна у File name вводимо ім’я файлу з розширенням “.cpp”. Натискуємо кнопку ОК и такий файл автоматично створюється в каталогу нашого проекту, а його текст можна вводити з клавіатури.
Фактично права частина головного вікна компілятора є текстовим редактором. Процес компіляції починається з натисканням клавіші F7 (або виконати команду меню Build | Build Proj1.exe) і процес компіляції пішов. Результат компіляції можна подивитися у нижній частині вікна компілятора.
Самим головним є повідомлення про відсутність помилок у процесі компіляції (0 error) і відсутність попереджень (0 warning). Компілятор відповів, що програма написана правильно і створив машинний варіант програми
Але краще запустити програму із графічного середовища компілятора клавішею F5, як відлагоджувальний варіант машинної програми, що розташований в підкаталогу Debug (налагодження). При налагоджені є додаткові можливості по знаходженню помилок та по динамічному спостереженню за значенням змінних.
Наприклад, клавішею F9 поставити маркер зупинку у деякий рядок програми. У цьому випадку програма зупиниться на цьому рядку. Наводячи курсор миші на іменах змінних, можна у спливаючому вікні побачити їх поточні значення, аж до крапки зупину програми.
Щоб після зупинки перейти до наступного рядка достатньо натиснути на клавішу F10. Для початку виконання програми в автоматичному режимі достатньо знову натиснути клавішу F5.
ЕЛЕМЕНТИ МОВИ С++
Множина символів мови С++ включає великі та малі букви латинського алфавіту і цифри. Вони використовуються для формування ідентифікаторів, констант, ключових слів.
Сукупність ключових слів складає словар мови. Усі зарезервовані ключові слова містять тільки малі літери (символи нижнього регістру) й написані на англійській мови. Нелатинський алфавіт можна використовувати тільки у коментарях, між подвійними лапками та для символьних змінних між одинарними лапками.
Пробіл – використовується не тільки в якості роздільника лексем мови, але й як символьний знак. Компілятор не реагує на додаткові пробіли у тексті програми.
С++ використовує знаки арифметичних та логічних операцій
С
енс
обчислення остачі (%) у тому, що автоматично
при діленні цілих чисел здійснюється
округлення, причому, дрібна частина
відкидається.
АРИФМЕТИЧНІ ТА ЛОГІЧНІ ОПЕРАЦІЇ
Іменам змінних відповідають комірки у пам’яті комп’ютера. Коли змінній присвоюється нове значення, то старе значення знищується, а нове записується в комірку пам’яті. У багаточленних арифметичних операціях підтримується той же пріоритет виконання операцій звичайної арифметики. Якщо вираз містить кілька операцій одного пріоритету поспіль, то вони виконуються зліва направо.
Наприклад, у виразі: i=k+d+1/m%n-1; - дії виконуються в такому порядку: множення, ділення, обчислення остачі, додавання, віднімання.
ПРИКЛАДИ СКОРОЧЕНИХ ЗАПИСІВ:
Операції інкрименту та декрименту застосовуються до цілих чисел. Операції з умовами використовують ключове слово if (коли). Наприклад, if (а>b) a+=b;
Коли а>b виконується, тобто умова істинно (true), виконується операція додавання a+=b. Коли умова не виконується, тобто умова хибна (false), операція додавання не виконується.
Умова може складатися не обов’язково із однієї умови. Умова зв’язується знаками логічного додавання && (І) або логічного множення || (АБО).
Наприклад,
if (i==j && k!=5) a=1.5; if (i==j || k!=5) a=1.5;
П
рограма
обчислення арифметичних та логічних
операцій.
У першому випадку необхідно виконати дві умови разом, а у другому – достатньо однієї умови з двох умов. При виконані цих операцій виконується тільки порівняння, а значення самих змінних не змінюється.
Слід пам’ятати, що введення декілька чисел (або символів) виконується послідовно: число, Enter, число, Enter, і так далі.
Оглядові запитання
З яким розширенням записує програму файлу у С++?
Яка функція main ()?
З якої функції починається виконання програми?
Яким виразом завершується завжди функція main?
Які букви бажано використовувати для позначення цілих чисел?
Як впровадити в проект свій файл з текстом?
Як запустити програму із графічного середовища компілятора, як відлагоджувальний варіант машинної програми?
Які С++ використовує знаки арифметичних та логічних операцій?
Яким чином виконуються операцій одного пріоритету?
До яких чисел використовуються операції інкрименту та декрименту?
Які знаки використовуються при написані умови операції розгалуження?
Лабораторна робота № 5. Змінні у С++.
Мета роботи.
Здобути навики використання середовища розробки мови C++, створити проект, що містить різні змінні в операції, здобути навички написання таких програм.
Короткі теоретичні відомості до роботи.
Кожна змінна має ім’я, тип, розмір та значення.
Ім’я змінної (ідентифікатор) є її назва. Тип визначає, яки числа або символи записані у комірки пам’яті під цим ім’ям. Розмір – зв’язаний з об’явою типа, визначає об’єм пам’яті, максимальну величину або точність заданого числа. Значення визначає конкретний вміст числа, що заданий. Ідентифікатор починається з букви, складається з комбінації букв, цифр ти знака підкреслення. Ідентифікатор може присвоювати константу.
Набір базових типів даних в С++ розглядався у першій лекції.
Програмісти за звичаєм використовують скорочену запис типу, для чого іноді відкидають слово int. Тип chair (character – символ) використовується для збереження букви, цифри, або символу із множини символів. При присвоюванні використовуються одинарні лапки. Тип int (integer – ціле число), який служить для збереження цілих чисел, типи float (плаваючий) та double (подвійний) – для збереження чисел з плаваючою крапкою. Беззнакова форма unsigned (sign – знак) дає можливість більш ефективно працювати з цілими числами типа int та з кодами символів типа chair . Форми short (короткий), long (длінній) та unsigned (беззнаковий) дозволяють економно використовувати ресурси комп’ютера.
Для визначення розміру типів використовується ключове слово sizeof , яке допомагає визначити розмір у байтах, що шукається.
Наприклад, double a;
J=sizeof (a); f,j j=sizeof (double);
Цілі числа у С++ представлені у десятковій, восьмирічній, шестнадцатеричній системах числення. Програмісти використовують за звичаєм десяткову систему.
Наведемо приклади напису чисел (10, 132, 32179) у десятковій, восьмирічній, шестнадцатеричній системах числення відповідно:
10 → 012 → 0xа
132 → 0204 → 0xА
32179 → 076663 → 0x7DB3
Числа з плаваючою крапкою у десятковій системі числення можна записати у звичайній формі з роздільною крапкою, або науковою нотацією. Наприклад:
2103ю001 = ю2103001e+4 = 21030/01e-1
-102. =-.102e+3 = -1020.e-1
Приклади об’яви типів з ініціалізацією:
char f=‘5’ , f2=‘$’ , f3=‘1’;
unsigned char p = ‘4’;
Int i=33; short j=-3736; long k=21474066; unsigned l=445; float a=.156;
Double bi=3.e-15; long double cc=-.111. e+40;
Константа задається за допомогою атрибута const (постійний). Наприклад:
const double PI=3.1416;
При спроби змінити значення константи компілятор фіксує помилку.
Розглянемо програму визначення розмірів пам’яті базових типів.
Множина типів даних створює проблеми при виконані операцій з операндами (учасниками операцій) різних типів. Арифметичні дії виконуються над числами одного типу. Тому константи треба перетворювати (привести) до одного типу.
При перетворенні більш «довгого» типу до більш «малого» здійснюється втрата «зайвих» розрядів, тобто втрата інформації. При перетворені – від малого до довгого типу втрати інформації не буває. Перетворення від знакового типу до без знакового веде до втрати знака від'ємного числа. Перетворення символьного типу до численного виявляється код символу, при зворотному перетворенні – повертається символ.
При перетворенні цілого числа з плаваючою крапкою здійснюється втрата точності, тому що ціле число – точне. а число з плаваючою крапкою - наближене. Явне перетворення виконується операцією приведення типу.
Наприклад: int I; double a;
a=(double)I; - ціле число перетворюється у тип double і присвоюється а.
i=(int)a; - число з плаваючою крапкою перетворюється у ціле і присвоюється i. При присвоєні здійснюється неявне перетворення типів. Наприклад, операції: a=I; i=a; повторюють приведені вище явні перетворення.
При виконані арифметичних операцій за замовчуванням здійснюється приведення операндів до найбільш довгого типу із задіяних. Програміст це правіло може порушити, коли виконується явне приведення типів потрібних операндів.
Розглянемо програму, у якій змінюється результат в залежності від перетворення типів окремих чисел та їх суми.
Тип та значення змінних після операції, що «приводяться», не змінюються і далі у програмі вони використовуються у старому значені. Цей ефект пояснюється тим, що у результаті приведення створюється тимчасова змінна, котра і використовується для приведення вже приведеного числа іншій змінній або арифметичній операції, після чого тимчасова змінна знищується.
У тексті програми об’ява повинна передавати першому використані змінні.
КЕРУЮЧІ СТРУКТУРИ МОВИ С++
Будь яка програма може бути написана з використанням трьох керуючих структур: слідування, структури вибору та структури повторення
Структура слідуванням вписана в С++. Поки не вказано іншого, комп’ютер виконує операції одну за одній у тій послідовності, яки були записані програмістом.
С++ містить три типи структур вибору и три типи структур повторення.
СТРУКТУРИ ВИБОРУ
Структура вибору if вже використовувалась при розглядані логічних операцій. Наприклад: if (m==n) cout<<“m рівно n”;
if (m!=n) cout<<“m не рівно n”;
Структура вибору if/else (коли/інакше) дає можливість подвійного вибору. Перепишемо два рядка, що вже розглянуті.
If (m==n) cout<<“m рівно n”;
else cout<<“m не рівно n”;
Коли умова істинна – виконується одна дія, а коли умова хибна – виконується інша дія.
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ
Дія результату вибору може розповсюджуватися на декілька операцій, для чого їх потрібно заключити у фігурні дужки. Наприклад:
If (m==n) {cout<<“m рівно n”; m+++;}
else {cout<<“m не рівно n”; m+=2};
Для множини вибору можна використовувати структури if/else.
Оглядові запитання
Що має кожна змінна?
Що визначає ім’я, тип, розмір та значення змінної?
Що дає беззнакова форма unsigned?
Яке ключове слово використовується для визначення розміру типів, що допомагає визначити розмір у байтах?
У яких системах числення представлені цілі числа у С++?
Як записуються числа з плаваючою крапкою у десятковій системі числення?
Навести приклади об’яви типів з ініціалізацією.
За допомогою якого атрибута задається константа?
Що здійснюється при перетворенні більш «довгого» типу до більш «малого»?
Які три керуючі структури з використовуються при написані будь-яких програм?
Які структури вибору використовуються при логічних операціях?
Лабораторна робота № 6. Програми вибору
Мета;
Здобути навики використання середовища розробки мови C++, створити проект, що містить програми структуру вибору, здобути навички написання таких програм.
Короткі теоретичні відомості до роботи.
П
рограми:
С++ має ще одну умовну операцію (?:), яка близька по структурі до if/else. Наприклад:
unsigned I;
cout<<(i>9 ? “багатозначне число” ;
“однозначне число”);
Перший операнд i>9 є умовою, другий “багатозначне число”містить значення умовного виразу, коли умова істинна, третій “однозначне число” – значення умовного виразу, коли умова хибна. Тому що пріоритет операції виводу cout<< високий, то вираз, який містить умовну операцію, розташований у дужках. Значення умовного виразу може бути діями, що виконуються.
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ
Три варіанта використання операції (?:) показані у програмі, яка розв’язує ту ж задачу, що й попередня. Результат відрізняється тим, що при введенні метки ‘g’ значення, що шукається, виводиться в угл. град., а при іншій метки – в угл. сек. У наступній програмі результати трьох запусків програми показані для меток: g, c и f.
В операцію може входити один операнд (унарна операція, наприклад, i++;) або два операнда (бінарна операція, наприклад, a=b+c;). Остання умовна операція (? :) містить три операнда і є єдиною тернарною операцією С++.
Розглянуті дві програми можна елегантно виконати за допомогою структури множинного вибору switch (перемикач).
Перемикач починається з заголовку, визначаючого ім’я метки, в даному випадку символьної змінної mark.
Тіло перемикача укладено у фігурні дужки. Текст тіла перемикача розділено мітками case. Двокрапка у даному випадку – признак метки.
сhar mark: //об’ява метки
switch (mark) //заголовок
{ //тіло перемикача
case ‘g’:
{ … } break;
case ‘c’:
{ … } break;
default: { … }
} //кінець перемикача
Дія структури switch починається з операції, що стоїть за міткою, значення якої співпадає з наперед заданим й продовжується до найближчого оператора break (переривати), котрий здійснює вихід із тіла перемикача. Фігурні дужки дані для наочності, але їх застосування не обов’язкові.
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ
Коли вираз break; пропущений перед міткою, то операція, що записана після цієї мітки буде виконана. Коли мітка, що введена, не співпадає ні з жодною мітками із передбаченими, то виконується операція після мітки default: (за замовчуванням). При відсутності цієї необов’язкової мітки здійснюється вихід із перемикача. Мітка може бути символьною змінною або цілим числом.
Програма, що буде розглядатися, відміно від попередніх не тільки здійснює вивід величини кута у град. або сек., але й в град.мин.сек. з виділенням цілого числа періодів. У результаті виконання програми показані чотири запуски для міток: g, c, 3 й ?. Тут мітка ?, відміно від попередньої задачі, не передбачена раніше й від її заміни на іншу, але теж не передбачена, результат дії мітки default не зміниться.
Вивід знаку окремо (а не повернення його змінної mg, яка зберігає число цілих градусів) застосований для того, щоб при mg – 0 знак не був втрачений.
Оглядові запитання
Що з’ясовує умовна операція (?:)? Навести приклад цієї умови.
Які три варіанта використовує операція (?:)?
Які ви знаєте одинарну, двійкову та трикову операції?
Яке використовується ключове слово для структури множинного вибору)?
Що таке мітка і для чого вона використовується у програмі?
Для чого використовується оператор break?
У які дужки укладено тіло перемикача?
Опішити структуру команди switch.
Коли застосовується мітка мітки default:?
Лабораторна робота № 7. Структура повторення
Мета:
Здобути навики використання середовища розробки мови C++, створити проект, що містить програми структур повторення, здобути навички написання таких програм.
Короткі теоретичні відомості до роботи.
Структура повторення for (цикл) містить умову у круглих дужках та операцію (тіло циклу), яка повторюється. Наприклад:
int i; double a=5;
for (i=1; i<5; i++) cout<<a*i;
Виконання робиться так: керуюча змінна i присвоює початкове значення 1 і виконується тіло циклу (на екран виводиться множення a*i, що дорівнює 5); значення i збільшується на 1, здійснюється перевірка умови i<5 і так як i=2, то виконується тіло циклу (на екран виводиться число 10); значення i знову збільшується на 1 і так далі. Процес повторення продовжується, аж поки виконується умова i<5. При i=5 процес повторення закінчується. Останнє число, що виводиться на екран, дорівнює 20.
Коли умова завжди хибна (наприклад: (i=1; i<1; i++)), то виконується тільки один цикл для початкового значення керуючої змінної i.
Коли умова завжди істинна (наприклад: (i=1; i>0; i++)), то цикл виконується нескінченно разів.
Тіло циклу може містити багато операцій та інші структури повторення, тобто цикли можуть бути вкладеними один в іншій.
Розглянемо використання циклу типа for для програми, яка виводить на екран таблицю множення.
Внутрішній цикл повністю виконується для кожного значення керуючої змінної j. Для підрахунку кількості виведених чисел використовується лічильник. Ціла змінна І ініціалізується початковим значенням 0 і далі у внутрішньому циклі змінюється автоматично.
Оператори break та continue (продовжувати) змінюють потік управління. Оператор break пропускає наступну за ним частину структури switch та здійснює вихід із перемикача.
У структурах повторення оператор break достроково перериває цикл і здійснює вихід із структури при дотримані даної умови. Наприклад, у програмі, що розглянута, можна як внутрішній цикл з переходом до крапки М, та і зовнішній – з переходом до крапки М1.
Оператор continue викликає пропуск наступних за ним операцій тіла циклу, тобто скорочує тіло циклу з переходом до крапки М2.
Розглянемо програму зі застосуванням оператора continue у наступній програмі.
Структура повторення while (поки) визначає дію, котра повинна повторюватися, поки деяка умова остається істинною. Наприклад,
Int i=5; while (i>0){cout<<‘ ‘; --I;};
Особливістю цієї структури у тому, що спочатку перевіряється умова, а потім виконуються операції тіла циклу. Коли умова завжди хибна, то операції тіла циклу не виконуються. Розглянемо програму обчислення кількості перестановок (m!) із m елементів. Програма демонструє структуру вибору if/else та циклічну типа while.
По визначеною m! – ціле позитивне число, але змінна Р об’явлена типом double. Це пояснюється тим, що m! – довге число при m, яке не розміщується у форматі unsigned long. Така помилка має назву переповнення. Вона не робить перерву виконання програми, але приводить до невірного результату. Тому застосовується формат double з наступним округленням (у даному випадку арифметичним).
Програму можна розглянути для характерних варіантів: m: = -0.5, 0, 15.
Структура повторення do/while (роби, поки) відрізняється від попередньої тим, що спочатку виконуються операції тіла циклу, а потім робиться перевірка умови. Тому перший цикл виконується, навіть коли умова завжди хибна.
Наприклад,
int i=5; do {cout<<i<<’ ‘; --i}while(i>6);
Робота структури do/while розглядається у наступній програмі, де у циклі виводиться керуюча змінна i.
Оглядові запитання
Яку умову містить структура повторення for (цикл)?
Яке діє структура повторення for (цикл)?
Чи може тіло циклу містити багато операцій та інші структури повторення? Коли – так, то поясніть це на прикладах.
Що виконує оператор continue?
Яку дію визначає структура повторення while (поки)?
Яким оператором закінчується програма?
Чим відрізняється структура повторення do/while (роби, поки) від структура повторення while (поки)?
Що виконує оператор cout?
Що виконує оператор cin?
Які типи даних вам знайомі і що вони визначають?
Лабораторна робота № 8. Вбудовані функції
Мета:
Здобути навики використання середовища розробки мови C++, створити проект, що містить програми вбудованих функцій, здобути навички написання таких програм.
Короткі теоретичні відомості до роботи.
Бібліотека функцій, що вбудовані в компілятор С++, складаються з двох частин: стандартних функцій ANSI, який є в мові С, та функцій мови С++.
Кожна функція має прототип. Прототип функції вказує компілятору тип даних, який повертається функцією, кількість, тип та порядок проходження аргументів (параметрів), котрі очікує функція.
Прототипи повідомляють, що кожна із функцій потребує елементи аргументу (х) типу double і повертає значення типу double .
Вбудовані функції поділені на групи. Прототипи функцій кожної групи розміщені в окремому заголовному файлі. Заголовний файл має ім’я та розширення .h Директиву препроцесору поперед функції main має вигляд:
#include < ім’ я.h>
Прототипи згаданих раніш функцій floor та fabs включені у заголовочний файл math.h.
Перш ніж викликати (застосувати) будь-яку функцію треба перевірити, для яких типів даних вона розроблена та в який заголовний файл включена.
Для вбудованих функцій потрібно переглянути заголовні файли у директорії компілятора INCLUDE або скористатися довідником ( у тому числі help компілятора).
Помилки виклику функції фіксуються компілятором.
ФУНКЦІЯ-ПІДПРОГРАМА
Функція-підпрограма є програмним блоком, який повторюється у програмі або в різних програмах. Перетворимо програму PART1\1-14 так, щоб власний розрахунок m! виділити в окрему функцію-підпрограму з ім’ям fact (factorial – факторіал). Підбираючи функції потрібно переконається, що воно не зустрічається в заголовних файлах, включених в програму.
Прототип функція-підпрограма обов’язково повинний бути визначений до того місця, де функція буде використовувана, хоча сама вона може бути описана й після. Прототип грає роль оголошення функції за аналогією з оголошенням змінної. У кінці прототипу крапка з комою необов’язкова. Прототип може бути оголошеним в тілі іншої функції. Опис функції складається із заголовку та тіла функції, яка описує сам алгоритм. Повернення значення у тілі функції визначається ключовим словом return.
Функція може мати тільки одне повертаємо значення. Після фігурних дужок, які оточують тіло функції, крапка з комою не ставиться. Функція не може бути описана у тілі іншої функції.
Перетворена програму з підпрограмою fact розглянемо у програмі PART1\1-16.
Розглянемо деякі особливості нашої функції-підпрограми:
Значення змінної m у функції main після закінчення роботи підпрограми-функції остається незмінним. Так як у тілі функції дія виконується з тимчасовою копією змінної, яка після виходу із підпрограми знищується;
Змінна Р, що оголошена всередині підпрограми, і змінна з тим ж ім’ям у функції main – різні змінні, що діють в всередині своєї функції (свого блоку).
У списку аргументів прототипу можна не вказувати ідентифікатор (m), тому що компілятору потрібний тільки тип змінної, але для програміста запис з ідентифікатором буває зручна, а в складних випадках – практично потрібна.
Написана підпрограма «прив’язана» до конкретної програми. Наступний крок – перетворення підпрограми fact у функцію, яку можна використовувати в будь який програмі. Для цього її потрібно записати в окремий файл та включити в потрібну програму директивою #include.
Для діючого програміста доцільно організувати власну бібліотеку функцій.
ОРГАНІЗАЦІЯ РОБОЧОГО ПРОСТОРУ В КОМП’ЮТЕРІ
Для організації робочого простору створимо спеціальну директорію (папку) з ім’ям СРР та вкладеними в неї директоріями (Рис. 1):
BOX (коробка) – для програм та їх варіантів, що розроблені;
CURRENT(поточний) – для поточною роботою з програмою;
SUBPROG (підпрограма) – для розміщення бібліотеки програміста;
CLASS – для розміщення бібліотеки класів;
UTIL – для розміщення службових програм;
PART!, PART2, … - для розміщення програм прикладів з лекцій курсу.
Рис. 1. Директорія
СРР
Рис.2. Директорія
CURRENT
Рис. 3. Директорія
SUBPROG
БІБЛІОТЕКА ПРОГРАМІСТА
Розглянемо варіант організації власної бібліотеки, коли кожна бібліотечна функція у своєму окремному програмному файлі записана в SUBPROG (рис. 3). Ім’я файлу і ім’я записаної в нього функції послідовно одна за одниною «з точки зору компілятора» ніяк не пов’язані, але для зручності програміста їх імена повинні співпадати або бути близькими по напису.
Розширення цих файлів - .cpp, як й в інших програмах С++. Наприклад, функція fact записана у файл SUBPROG\fact.cpp.
Файли типу roll (список) є за призначенням аналогами заголовочих файлів компілятора та містять прототипи відповідних функцій, константи і так далі. Крім того, у них включені директиви на включення у програму функцій, що описані.
Усі бібліотечні функції доцільно поділити на групи:
Функції, що найчастіше використовуються у програмах, файл roll.h,
Функції текстової графіки, файл roll_txt.h,
Функції точкової графіки, файл roll_gr.h,
Інші функції, що використовуються порівняно рідко, спеціалізовані й т.п.
Вміст списку SUBPROG\roll.h у наступній програмі файлу SUBPROG\roll.h.
У файлі rull.h розміщені глобальні змінні, котрі об’являються поза будь-якої функції та області дії котрих розповсюджується на усю програму, включаючи функції-підпрограми. У нашому випадку ідентифікатори i, j, k, l, m, n, num пропонуються використовувати для цілих чисел. Глобальна змінна mn об’явлена адресно для певної функції.
Введенні глобальні константи – змінні, які оснащені атрибутом const й тому ініціалізовані безпосередньо при об’яві (PI, C, C_). Такі константи змінювати до кінця програми неможливо.
Заголовочні файли оформлюються наступними директивами препроцесора:
#ifndef ROLL
#define ROLL
………………
#endif
Таке сполучення директив запобігає повторні включення директив-компонентів, що істотно для великих програм при множині заголовних файлів. Ім’я (у даному випадку ROLL) можна вибирати будь-яке, але не слід використовувати його ще раз в будь-якій якості у своїх програмах.
Застосуємо для розрахунку алгебраїчних сполук (перестановки, розміщення Amn, поєднання Cmn із m елементів по n) перетворену у бібліотечну функцію fact, записану у файл SUBPROG\fact.cpp, з прототипом double fact(int), який об’явлений у файлі SUBPROG\roll.h .
AMN=m(m-1)(m-2)…(m-(n-1))=m!/(m-n)!
Cmn=m!/n!/(m-n)!
Оглядові запитання
З яких двох частин складаються бібліотечні функцій, що вбудовані в компілятор С++?
На що вказує прототип функції?
Як виглядають директиви препроцесору поперед функції main?
Що визначає функція main?
Що таке функція-підпрограма? Для чого вона застосовується?
Яку роль грає прототип функції?
З чого складається опис функції?
Чи ставиться після фігурних дужок, які оточують тіло функції, крапка з комою?
Опішити деякі особливості функції-підпрограми?
Як перетворити підпрограму у функцію?
Що таке .cpp?
На які групи доцільно поділити бібліотечні функції?
Що таке глобальні змінні та константи?
Лабораторна робота № 9. Вбудовані функції (продовження)
Мета:
Здобути навики використання середовища розробки мови C++, створити проект, що містить програми вбудованих функцій, здобути навички написання таких програм.
Короткі теоретичні відомості до роботи.
Розглянемо програму розрахунку з’єднань.
/* файл PART!\1_22 – Обчислення розміщень
і сполучень з бібліотечною функцією fact*/
#include “c:\ CPP\SUBPROG\roll.h” /*включення бібл.. функції*/
main () {
cout<<”\nввести m ”;
cin>>m; cout<<”m=”<<m;
cout<<”\nввести n”;
cin>>n; cout<<”n=”<<n;
double Pm, Amn, Cmn, Pn
Pm= fact(m); Pm= fact(n); //виклик функції
cout<<”\n\nПерестановки: Pm=”<<Pm<<” Pn=”<<Pn;
Cmn= fact(m)/ fact(n)/ fact(m-n); //увага: Cm0=1
cout<<”\nСполучень: Cmn=”<< Cmn;
Amn= Pm/fact(m-n); //увага: Amm=m!
cout<<”\nРозміщень: Amn=”<<Amn;
cout<<”\nПеревірка: Amn=Cmn*Pn: ”;
double k=(Amn-Cmn*Pn)/Amn*100;
cout<<”Помилка=”<<k<<”%”;
cout<<\n кінець задачі “;
return 0;}
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ
Змінні m та n у програмі не обов’язкові, тому що застосовані глобальні оголошення в roll.h. Змінна k оголошена як double для того, щоб після розрахунку розміщень оцінити відносну помилку: k=(Amn-Cmn*Pn)/Amn*100
Застосування k – цілої змінної привело б до автоматичного округлення шляхом відкидання дробової частини числа.
Аргумент функції може бути задані арифметичним виразом (див. виклик fact(m-n))
Результат помилки (k=0%) – на рівні точності чисел типу double.
У будь-який програмі ділення на 0 заборонено, тому що зупиняється виконання програми і комп’ютер вказує на цю помилку.
У нашому випадку ділення на 0 виключається, тому що функція fact ніколи не повертає 0.
Оформимо аналогічно й програму grad – вивід на екран значення кута. Ця функція здійснює дію, але нічого не повертає, тому їй присвоюється тип void (порожній). Аргументи функції: кут (double) та мітка (char).
Таким чином, прототип має вигляд: void grad (double, char);
Виклик функції: grad (а, ‘g’);
Для переводу рад. у град. У функції grad застосована глобальна константа С_ із roll.h. Функція записана у файлі SUBPROG\ grad .cpp, прототип та опис включені в SUBPROG\roll.h.
// файл PART1\1_24.cpp
//Приклад виклику бібл.. функції grad
#include “c:\CPP\SUBPROG\\roll.h”
main() {
cout<<”\nПриклад виклику бібл.. функції grad”;
double a=-6.5;; cout<<”\n”<<a<<” рад. \n”;
grad(a, ‘g’); cout<<” град. \n”;
grad(a, ‘c’); cout<<” сек. \n”;
grad(a, ‘3’); cout<<” період, град., мин., сек. ”;
cout<<”\n кінець задачі ”;
return 0;}
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ
ТЕКСТОВА ГРАФІКА
При виводі на екран символи тексту формуються за допомогою кодів. Функції текстової графіки оголошені у заготовочному файлі бібліотеки conio.h
У власній бібліотеці зробимо розділ текстової графіки: файл SUBPROG\roll_txt.h, та включимо в нього заготовочні файли conio.h та process.h, а також спеціально розроблену функцію pause. Опис функції pause розміщений безпосередньо в roll_txt.h.
// файл SUBPROG\roll_txt.h – Включення текстової графіки
#ifndef TXT
#define TXT
#include <conio.h> /*вбудовані функції текстової графіки
#include <process.h> //для функції exit
#defineESC 0x1b //код клавіші ESC
/* функція pause: ПАУЗА ДЛЯ ТЕКСТОВОЇ ГРАФІКИ
ОЧИЩЕННЯ ЕКРАНА Й НАПИСОМ при р=0
ОЧИЩЕННЯ ЕКРАНА, БЕЗ НАПИСА при р=1
БЕЗ ОЧИСКИ ЕКРАНА, БЕЗ НАПИСА при р>0
Вихід у ОС при натисненні клавіші ESC
Продовження роботи при натисненні будь-якої клавіші */
