- •Методичні поради до користУВання практикумом
- •Послідовність виконання робіт
- •Виконання самостійної роботи для підготовки до лабораторній роботі
- •Методика проведення лабораторної роботи
- •Приклад оформлення титульної сторінки звіту
- •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)
Void pause (int p) //заголовок функції
(
if (p=0){gotoxy(8,wherey()+1); //установка курсору
cout<<” ESC-вихід у ОС, інша клавіша – продовження роботи”;};
int c = getch(); //читання з клавіатури
if (ESC == c){ //При натиснення клавіші ESC
exit (1); }; //Повернення в ОС при натисненні клавіші, крім ESC
if (0 == c) с = getch();
if (p>2) clrscr();// очищення екрана
} //кінець опису pause (паузи)
#endif
Функція pause має три модифікації залежності від значення аргументу int р: припинення програми з наступним продовженням заповнення екрану (p>1), припинення з наступним очищенням екрану (p=1), припинення з пояснюючим написом у нижній частини екрану й наступним очищенням екрану (p=0). Для переривання виконання програми слід застосувати клавішу ESC, а для продовження – іншу будь-яку клавішу.
Розглянемо функцію pause більш детально. Початок координат текстової графіки прив’язано до символу у лівому верхньому куту екрану. Вбудована функція gotoxy(x, y) переміщує курсор у крапку з координатами x, y. Поточне розташування курсору можна визначити за допомогою функції: x=wherex(); y=wherey(); Функція wherex та wherey не мають аргументів.
При виклику функції pause з нульовим аргументом (р=0) курсор встановлюється на восьму позицію по горизонталі (по вісі х) та на наступний за поточний рядок по вертикалі (по вісі у). Зверніть увагу на те, що другий аргумент при виклику gotoxy визначає повертаємо значення іншої функції (wherey) у сполученні з арифметичною дією. Аргументом функції може бути повертаємо значення іншої функції.
Далі операція cout<< виводить пояснювальний напис. При виклику pause с іншими аргументами (p>0), вміст напису потрібно знати на пам'ять. Функція getch зупиняє виконання програми. Після натиснення клавіші зчитується введений одиночний символ та повертається його код. Коли натискується клавіша ESC, функція exit (1) завершує програму та повертає користувача в ОС. При натисненні іншої клавіші – програма продовжує виконання. Чистку екрана здійснює функція clrscr.
Розглянемо приклад використання pause у програмі зведення цілих чисел в цілу позитивну ступінь.
// файл PART1\1_26.cpp
//Використання текстової графіки
#include “c:\CPP\SUBPROG\\roll.h”
#include “c:\CPP\SUBPROG\\ roll_txt.h”
double pwr(int, unsigned); //прототип
main() {clrscr();
cout<<” ввести значення ступеня >30 ”;
int mn; cun>>mn; pause(0);
cout<<” число число у ступені ”<<mn;
i=1; //використання глоб. I
while(mn>0){ cout<<”\n “<<i<<”
<<pwr(I, m); // зведення в ступень з виводом на екран
if(0==i%10){ /* зупинка малюнку через кожні 10 рядків*/
){ cout<<”\nESC-вихід у ОС, інша кл. – продовження роботи\n”;
pause(4);} i++;}; //кінець циклу
pause(0); //для помилкового mn
return 0;}
//зведення цілого числа i в цілу ступень mn
double pwr(int i, unsigned mn);
{ double a=1; //автомат. приведення типу
For (int j=2; j<=mn; j++) a*=1;
return a; }
Оглядові запитання
При якій умові відбувається округлення при виконанні арифметичної операції?
Чому ділення на 0 не дозволяється?
Що виконує функцію pause?
Які три модифікації залежності від значення аргументу int р має функція pause?
Для чого застосовується клавіша ESC?
Для чого використовуються коментарі? Які типи коментарів вам відомі?
Яка функція здійснює чистку екрана?
Що робить функція getch?
Лабораторна робота № 10. Область дії і час життя змінних
Мета:
Здобути навики використання середовища розробки мови C++, створити проект, що пояснює область дії і час життя змінних, здобути навички написання програм.
Короткі теоретичні відомості до роботи.
Кожна базова змінна крім атрибутів: ім’я, тип розмір, значення, може мати і інші атрибути, що задають їм область дії та час життя. Для визначення цих атрибутів в С++ є чотири специфікації класу пам’яті, що визначені ключовими словами: auto (автоматичний), register (регістровий), extern (зовнішній), static (статистичний).
Область дії змінної є область програми, де можна посилатися на її ідентифікатор. Область життя (існування) - область програми, при виконанні якої змінна існує у пам’яті комп’ютера. Ці області не завжди співпадають.
auto та register використовуються для оголошення змінних з локальним часом життя. Такі змінні створюються у блоці з фігурними дужками в момент їх оголошення й зникають при виході із блоку. Спеціфікатор auto встановлюється за замовчуванням й в явному вигляді застосовується рідко (наприклад , auto float p;). Спеціфікатор register вказує компілятору зберегти змінну у високошвидкісному регістрі, але компілятор може це проігнорувати. Автоматичний клас пам’яті - економить пам’ять, тому що локальні змінні створюються у блоку та при виході із цього блоку знищуються.
Клас пам’яті extern використовується для оголошення змінних з глобальним часом життя. Пам’ять для них виділяється у момент оголошення та зберігається до закінчення програми. Після їх оголошення на них може посилатися будь-яка функція. Спеціфікатор extern для глобальних змінних, такий як auto для локальних. Він встановлюється за замовчуванням.
Всередині блоку перевага відається місцевій локальній змінні. Наприклад, коли змінна int I оголошена глобальною, то повторне оголошення всередині блоку задає вже іншу, локальну, змінну з тим же ідентифікатором, а доступ до глобальної змінної переривається до виходу із блока. Тож правило переваги “внутрішній змінній ” перед “зовнішній” дотримується для локальних змінних, що оголошені у вкладених блоках.
Локальні змінні з атрибутом static доступні тільки у тому блоці, де вони оголошені, але зберігаються до кінця виконання програми.
У широкому сенсі функція теж є змінною, по визначенню класу extern. Оголошення функції – запис її прототипу обов’язково до першого виклику. Аргументи функції – локальні змінні для блока-функції.
При використані глобальних змінних всередині функції треба пам’ятати, що при некоректному складанню програми виклик цієї функції може змінити їх значення.
Для пояснення дії атрибута static розглянемо варіант функції ch (chance – випадок): “генератор випадкових чисел” з прототипом: double ch().
Функція повертає псевдовипадкове число в інтервалі (-1, 1). Локальна змінна mn у тілі забезпечена атрибутом пам’яті static. При першому виклику функції mn задається числом (mn =5). У процесі виконання значення mn змінюється, та отримує нове значення, яке зберігається до наступного виклику функції.
При цьому змінна mn повз функції ch недоступна. Функція записана у файлі SUBPROG\ch.cpp та оформлена як бібліотечна у списку roll.h. Розглянемо програму з багаторазовим викликом ch та результат її виконання.
/*файл SUBPROG\ch.cpp – Генератор випадкових чисел від -1 до 1*/
double ch( )
{static double mn=5; /* при наступнім використані функція «пам’ятає»
попереднє значення mn*/
double k, mn1;
k=3125*mn;
mn1=(k-floor(k/67108864)*67108864);
mn=mn1;
return(mn1/33554432-1); }
Коли в опису програми ch задати інше початкове значення m, то отримуємо інший ряд випадкових чисел. Так у наступній програмі використовувана структура повторення do/while, в котрій спочатку виконується тіло циклу, а потім перевіряється умова. Варіант для граничного значення i=11.
// файл PART1\1_28.cpp
//Виклик генератора випадкових чисел
#include “c:\CPP\SUBPROG\\roll.h”
#include “c:\CPP\SUBPROG\\ roll_txt.h”
double pwr(int, unsigned); //прототип
main() {clrscr(); //очистка екрана
i=1; //використання глоб. i із roll.h
do{i++; cout<<”\n”<<i<<’ ‘<<ch();}while(i<11);
cout<<”\n кінець задачі “;
pause(0); //пауза з написом
return 0;}
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ
В С++ є операція ::, яка в середині блоку дає доступ до глобальної змінної (тільки до глобальної) при наявності локальної «тезки». Наприклад, i=::i; Локальна i присвоює значення глобальної i.
Використаємо цю операцію для побудови модифікації ch, яка виключає призначення початкового значення mn в тілі функції. Розглянемо бібліотечну функцію chmn, в котрій початкове значення mn присвоюється від однойменної глобальної змінної: static double mn=::mn;
Для її використання спочатку оголошують глобальну змінну mn та ініціалізують її до першого виклику chmn. Функція записана у файлі SUBPROG\ chmn.cpp та оформлена як бібліотечна у списку roll.h.
/*файл SUBPROG\chmn.cpp – Генератор випадкових чисел від -1 до 1
з використанням глоб. змінною mn*/
double chmn( )
{static double mn=::mn; /* початкове значення mn присвоюється від однойменної глобальної змінної mn */
double k, mn1;
k=3125*mn;
mn1=(k-floor(k/67108864)*67108864);
mn=mn1;
return(mn1/33554432-1); }
Для наочності початкове значення mn вибираємо таке ж (mn=5). Цикл виклику поділений на дві частини, між котрими змінюється значення глобальної mn, що не змінює результат.
// файл PART1\1_30.cpp
//Виклик генератора випадкових чисел
#include “c:\CPP\SUBPROG\\roll.h”
#include “c:\CPP\SUBPROG\\ roll_txt.h”
main() {clrscr(); //очистка екрана
i=1; mn=5 //використання глоб. i із roll.h
do{i++; cout<<”\n”<<i<<’ ‘<<chmn ();}while(i<6);
mn=13; cout<<”\n”<<”переривання циклу”;
do{i++; cout<<”\n”<<i<<’ ‘<<chmn ();}while(i<11);
cout<<”\n кінець задачі “;
pause(0); return 0;}
РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ chmn
ФУНКЦІЇ.
Перерахуємо вже розглянуті властивості функцій:
Функція є програмним блоком.
Функція може бути виконана, як у вигляді підпрограми (1_16), так і у вигляді самостійної функції, яка може використовуватися у будь-якій програмі (1_21).
Функція може мати або не мати аргументи та значення, яке повертається.
Прототип функції слугує її оголошенням. Спочатку йде прототип або опис функції, а потім перший виклик функції.
У тілі функції може бути інша функція (1_23, 1_25).
При виклику функції аргументом може бути виклик іншої функції (1_25) або арифметичний вираз (1_22).
ПЕРЕВАНТАЖЕННЯ ФУНКЦІЙ
Змінні мають тип, який при дії з ними треба враховувати. Для функцій визначені типи значень,що повертаються, та типи аргументів.
Т
аблиця
1.2. Варіанти прототипів
Коли при виклику функції застосувати аргумент непередбаченого типу, компілятор може зробити спробу привести типи по своїм правилам (але на це не стоїть надіється) або зафіксує помилку. С++ дозволяє визначити декілька функцій з одним й тим же ім’ям, але з різним набором аргументів, що має назву перевантаження функцій.
Приклад. У стандартній бібліотеці є три окремих функцій для визначення абсолютних значень трьох типів:
