Название: Мова програмування С++
Вид работы: дипломная работа
Рубрика: Информатика и программирование
Размер файла: 92.09 Kb
Скачать файл: referat.me-135764.docx
Краткое описание работы: Характеристика методів та етапів створення простих програм на мові програмування С++. Особливості структури та порядку запуску програми. Функції вводу і виводу та маніпулятори мови С++. Робота з одновимірними масивами. Символьна інформація та рядки.
Мова програмування С++
Дипломна робота
Мова програмування С++
Зміст
1. Створення простих програм на С++
1.1 Структура програми
1.2 Етапи виконання програми
1.3 Порядок запуску програми
2. Форматний ввід/вивід у мові С/С++
2.1 Функції вводу/виводу мови С
2.2 Функції вводу/виводу та маніпулятори мови С++
3. Лінійні програми на С++
3.1 Стандартні типи даних мови С++
3.2. Операції мови С++
4. Основні оператори мови С++
4.1 Складові оператори
4.2 Оператори розгалуження
4.3 Оператори циклу
4.4 Оператори переходу
5. Вказівними та операції над ними
5.1 Поняття вказівника
5.2 Дії над вказівниками
6. Робота з одновимірними масивами
6.1 Статичні та динамічні масиви
6.2 Рядки, як одновимірні масиви
7. Двовимірні масиви
8. Символьна інформація та рядки
8.1 Збереження символьної інформації
8.2 Функції вводу/виводу для роботи з рядками
8.3 Спеціальні функції для роботи з рядками та символами
9. Функції користувача
9.1 Функції: визначення, опис, виклик
9.2 Передача масивів у функцію
9.3 Перевантаження функцій у С++
9.4 Функції зі змінною кількістю параметрів
10. Структури
Список літератури
1. Створення простих програм на С++
C++ (Сі-плюс-плюс) — універсальна мова програмування високого рівня з підтримкою декількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної. Розроблена Б'ярном Страуструпом (англ. BjarneStroustrup) в AT&T Bell Laboratories (Мюррей-Хілл, Нью-Джерсі) у 1979 році та названа «Сі з класами». Страуструп перейменував мову у C++ у 1983 р. Базується на мові Сі. Визначена стандартом ISO/IEC 14882:2003.
1.1 СТРУКТУРА ПРОГРАМИ
Розглянемо програму, що виводить на екран монітора фразу “Ласкаво просимо до С++!”:
Приклад 1.
// Welcome.cpp – ім’я файла з програмою
# include <iostream.h>
void main ()
{ cout << ” Ласкаво просимо до С++! n”;
}
Результат виконання програми:
Ласкаво просимо до С++!
У першому рядку програми міститься однорядковий коментар, що починається з символу “//”, який вказує, що після цього символу йде однорядковий коментар. Коментарі не викликають ніяких дій комп’ютера і ігноруються компілятором С++, а лише допомагають іншим людям читати і зрозуміти Вашу програму.
У другому рядку розміщено команду (директиву) препроцесору, що забезпечує включення до програми засобів зв’язку зі стандартними потоками вводу і виводу даних. Вказані засоби містяться у файлі під назвою iostream.h (мнемоніка: “і” (input) – ввід; “output” – вивід; “stream” – потік; “head” - заголовний). Рядок, що починається з ”#”, обробляється препроцесором перед компіляцією програми. Файл iostream.h повинен бути залучений для всіх програм, що виводять дані на екран монітора або вводять дані з клавіатури .
Третій рядок є заголовком функції з іменем main . Будь-яка програма на С++ повинна містити лише одну функцію з таким іменем. Саме з неї починається виконання програми. void – специфікатор типу, який вказує, що функція main в даному прикладі не повертає ніякого значення. Круглі дужки після main потрібні в зв’язку з форматом (синтаксисом) заголовка будь-якої функції. В них розміщується список параметрів. У нашому прикладі параметри не потрібні.
Тіло будь-якої функції повинно починатися і закінчуватися фігурними дужками, між якими знаходиться послідовність описів, операторів і визначень. Кожен оператор, визначення чи опис повинні закінчуватися крапкою з комою.
Рядок
cout << ” Ласкаво просимо до С++! n”;
є командою комп’ютеру надрукувати на екрані рядок символів, що записаний у лапках. Повний рядок, включаючи cout, операцію ”<<”, рядок ”Ласкаво просимо до С++! n” і крапку з комою “;”, називається оператором. Всі вводи і виводи в С++ виконуються над потоками символів. Таким чином потік символів Ласкаво просимо до С++! спрямовується до об’єкта стандартного потоку виводу cout , який пов’язаний з екраном. Вже зараз слід відмітити одну з принципових особливостей мови С++, яку називають перевантаженням або розширенням дії стандартних операцій. Операція ”<<” називається операцією „розмістити у потік” лишень у тому випадку, коли зліва від неї знаходиться ім’я об’єкта cout . Інакше пара символів “<< ” означає бінарну операцію зсуву вліво. Символи правого операнда зазвичай виводяться так само, як вони виглядають між лапками.
Слід зазначити, що символи ”n” не виводяться на екран . Комбінацію символів, що починаються з позначки оберненого Стеша (””), називають знаком переходу або escape-символом. Керуюча послідовність ” n” означає перехід на початок нового рядка. Цей символ в лапках може знаходитися будь-де в рядку, при цьому послідовність символів, що знаходиться за ним, виводитиметься з нового рядка. Тобто результат виконання операції
cout << ” Ласкаво просимо nдо С++! n”;
матиме вигляд:
Ласкаво просимо
до С++!
1.2 ЕТАПИ ВИКОНАННЯ ПРОГРАМИ
Вихідна програма, підготовлена на мові С++ у вигляді текстового файлаз розширенням *.срр (welcome.cpp), проходить 3 етапи обробки:
1) препроцесорне перетворення тексту програми;
2) компіляція;
3) компоновка (редагування зв¢язків чи складання).
Після цих 3 етапів формується машинний код програми, що виконується.
Задачею препроцесора є перетворення (доповнення) тексту програми до початку її компіляції. Правила препроцесорної обробки визначаються програмістом за допомогою директив препроцесора. Директива починається з ”#” (¢дієс¢, ¢шарп¢). Наприклад,
1) #define - визначає правила заміни в тексті:
#define ZERO 0.0
Це означає, що кожне використання у програмі імені ZERO буде замінюватися на 0.0.
2) #include< ім¢я заголовного файла> - передбачена для залучення до тексту програми тексту файлу з каталогу “Заголовних файлів” INCLUDE , які постачаються разом зі стандартними бібліотеками. Кожна бібліотечна функція чи об¢єкт С++ має відповідний опис в одному з заголовних файлів (наприклад, iostream.h, stdio.h, conio.h, math.h ). Список заголовних файлів визначається стандартом мови. Використання директиви include не під¢єднує відповідну стандартну бібліотеку, а лише дозволяє долучити до тексту програми описи із зазначеного заголовного файлу. В нашому випадку препроцесор обробляє директиву #include <iostream.h> і під’єднує до вихідного тексту програми засоби для обміну з дисплеєм. Далі файл передається на компіляцію, у ньому виявляються синтаксичні помилки, які потрібно усунути програмістові. Після безпомилкової компіляції текст програми перекладається компілятором на машинну мову, далі отримуємо об’єктний файл з розширенням *.obj .Підключення об ¢єктних кодів файлів з визначеннями необхідних стандартних функцій і об¢єктів з бібліотеки відбувається на етапі компоновки, тобто після компіляції. У об¢єктному коді створюваної програми ніби замуровуються дірки за допомогою кодів стандартних функцій. Хоча в заголовних файлах містяться всі описи стандартних функцій, до коду програми залучаються лише функції й об¢єкти, які використовуються в програмі.
Після компоновки утворюється модуль програми з розширенням *.ехе .
Отже, в нашому випадку, виконавши директиви, препроцесор сформує повний текст програми, компілятор створить об’єктний файл welcome.obj , за замовчуванням обравши для нього зазначене ім’я, а компоновщик (редактор зв’язків Linker) доповить програму бібліотечними функціями, наприклад, для роботи з об’єктом cout і побудує модуль welcome.exe , запустивши, який ми одержуємо на екрані бажану фразу. Схема етапів виконання програми наведена на рис. 1.1.
1.3 ПОРЯДОК ЗАПУСКУ ПРОГРАМИ
1. Відкрийте нове вікно редагування (File > New) і надайте йому ім’я Welcome (File > Save As);
2. У новому вікні наберіть текст програми, що наводиться у Прикладі 1.
3. Відкомпілюйте програму (Compile > Compile або (Alt+F9 )). В разі повідомлень про помилку, перевірте текст програми і усуньте невідповідності. Щоразу, вносячи зміни у вихідний текст програми, зберігайте файл (File > Save або F2 ). Після чого змінену програму слід відкомпілювати;
4. Запуск відкомпільованої програми здійснюється за командою (Run > Run або Ctrl+F9 ). Якщо з моменту останньої компіляції вихідний код було модифіковано, ця команда виконає послідовно компіляцію і компоновку. Результат виконання програми можна переглянути, натиснувши комбінацію клавіш Alt+F5 .
2. Форматний ввід/вивід у мові С/С++
2.1 ФУНКЦІЇ ВВОДУ/ВИВОДУ МОВИ С
У мові С++ немає вбудованих засобів вводу/виводу – вони здійснюються за допомогою функцій, типів та об’єктів, що містяться у стандартних бібліотеках. Використовується два способи: функції, успадковані з мови С та об’єкти С++.
Основні функції вводу/виводу в стилі С, опис яких міститься у заголовному файлі <stdio.h> :
рrintf (<керуючий рядок>, <список аргументів>);
Керуючий рядок береться у лапки і вказує компілятору вигляд інформації, що виводиться. Вона може містити специфікації перетворення і керуючи або escape-символи.
Специфікація перетворення має такий вигляд:
% <прапор > <розмір поля . точність > специфікація ,
де прапор може набувати наступних значень:
- вирівнювання вліво числа, що виводиться (за замовчуванням виконується вирівнювання вправо);
+ виводиться знак додатного числа;
розмір поля – задає мінімальну ширину поля, тобто довжину числа. Якщо ширини поля недостатня, автоматично виконується його розширення;
точність – задає точність числа, тобто кількість цифр його дробової частини;
специфікація вказує на вигляд інформації, що виводиться. У таблиці 2.1 наведено основні формати функції друку.
Таблиця 2.1
Формат | Тип інформації, що виводиться |
%d | десяткове ціле число |
% і | для виведення цілих чисел зі знаком (printf (“a=%i”, -3)); |
%u | для виводу беззнакових цілих чисел (printf(“s=%u”, s)) |
%c | один символ |
%s | рядок символів |
%e | число з плаваючою крапкою (експоненційний запис) |
%f | число з плаваючою крапкою (десятковий запис) (printf(“b=%fn, c=%fn, d=%fn”, 3.55, 82.2, 0.555 )); |
%u | десяткове число без знака |
Керуючий рядок може містити наступні керуючі символи:
n – перехід на новий рядок;
t – горизонтальна і v – вертикальна табуляція;
b – повернення назад на один символ;
r – повернення на початок рядка;
a – звуковий сигнал;
” –лапки;
? – знак питання;
\ - зворотний слеш.
Список аргументів - об¢єкти, що друкуються (константи, змінні). Кількість аргументів та їх типи повинні відповідати специфікаціям перетворення в керуючому рядку.
Приклад 1.
#include <stdio.h>
#define PI 3.1415926
void main()
{
int number=5, cost=11000, s=-777;
float bat=255, x=12.345;
printf ("%d студентів з¢їло %f бутербродів.n", number, bat);
printf ("Значення числа pi рівне%f.n", pi);
printf ("Вартість цієї машини %d%sn", cost,"у.е");
printf ("x=%-8.4f s=%5d%8.2f ", x, s, x);
}
В результаті виконання останньої функції printf () на екрані буде виведено:
х=12.3450 s= -777 12.34
Функція scanf передбачена для форматного вводу інформації довільного вигляду. Загальний вигляд функції:
scanf (<керуючий рядок>, < список адрес>);
На відміну від функції виводу printf (), scanf () використовує у списку адреси змінних, для одержання яких перед іменем змінної ставиться символ ”&”, що позначає унарну операцію одержання адреси. Для вводу значень рядкових змінних символ ”&” не використовується. При використанні формату %s рядок вводиться до першого пропуску. Вводити дані можна як в одному рядку через пропуск, так і в різних рядках.
Дану особливість ілюструє відповідна частина програми:
int course;
float grant;
char name[20];
printf ( "Вкажіть ваш курс, стипендію, ім¢я n");
scanf ( "%d%f", &course, &grant);
scanf ( "%s", name); /* ”&” відсутній при зазначенні масиву символів */
Для зміни кольору тексту використовують функції із файла <conio.h> : clrscr() – очищує екран; textcolor (Колір) – задає колір символів; textbackground (Колір) – встановлює колір фону. Вивід тексту на екран здійснюється за допомогою функції cprintf (), яка використовується аналогічно printf (). Зверніть увагу на те, що перехід на початок нового рядка у цій функції здійснюється за допомогою комбінації ”nr”.
Колір можна задати за допомогою цілої або іменованої константи, перелік яких наводиться у таблиці 2.2.
Таблиця 2.2
Колір | Константа | Значення константи |
Чорний | BLACK | 0 |
Синій | BLUE | 1 |
Зелений | GREEN | 2 |
Червоний | RED | 4 |
Фіолетовий | MAGENTA | 5 |
Сірий | GREY | 8 |
Блакитний | LIGHTBLUE | 9 |
Помаранчевий | LIGHTRED | 12 |
Жовтий | YELLOW | 14 |
Білий | WHITE | 15 |
2.2 ФУНКЦІЇ ВВОДУ/ВИВОДУ ТА МАНІПУЛЯТОРИ МОВИ С++
А ось як виглядає програма вводу/виводу з використанням бібліотеки класів С++:
Приклад 2.
# include <iostream.h>
void main()
{ int i;
cout<< “Введіть ціле числоn”;
//об’єкт для вводу з клавіатури і >>розміщення у потік виводу
cin>> i;
cout<< “Ви ввели число”<< i <<”дякую!”;
}
Для форматного виводу у С++ використовуються маніпулятори, для використання яких до програми потрібно підключити заголовний файл <iomanip.h>:
setw(int) – встановлює максимальну ширину поля виводу чисел та рядків (не символів);
setprecision(int) – встановлює максимальну кількість цифр дробової частини для дійсних чисел з фіксованою крапкою;
setiosflags(ios::showpoint | ios::fixed) – вивід дійсних чисел з фіксованою крапкою;
setiosflags(ios::left) або setiosflags(ios::right) – вирівнювання по лівому або правому полю;
endl – при виводі включає у потік символ нового рядка, еквівалентний “n” (його опис міститься у файлі iostream.h).
Маніпулятори спрямовуються в потік виводу, аналогічно тому, як це зроблено у прикладі 3:
Приклад 3.
# include<iostream.h>
#include <iomanip.h>
void main()
{float d=52.28679;
float f= 410.0;
cout<< setprecision(3);
cout<<setiosflags(ios::showpoint | ios::fixed);
cout<<setw(12)<<d<<endl<<setw(12)<<f<<endl;
}
Результат виводу ( позначає пробіл):
52.287
410.000
У даному прикладі маніпулятори точності та фіксації крапки спрямовуються у потік виводу одноразово, тоді як ширину поля виводу необхідно встановлювати для кожного значення.
3. Лінійні програми на С++
3.1 СТАНДАРТНІ ТИПИ ДАНИХ МОВИ С++
Всі об¢єкти (змінні, масиви тощо), з якими працює програма в С/С++, необхідно визначати або описувати. Найпростіша форма визначення змінної:
<тип> <список імен змінних>;
При оголошенні об¢єкти можна ініціалізувати (задавати початкове значення).
Наприклад: int j=10, m(3), n;
float c(-1.3), l=-10.23, f1;
Оголошення повідомляють компілятору про властивості та імена об¢єктів і функцій. Змінні можуть змінювати свої значення. При наданні значення змінній у комірці пам¢яті, яка відводиться під неї, розміщується код цього значення. Доступ до значення цієї змінної можливий через ім¢я змінної, а доступ до ділянки пам¢яті здійснюється за її адресою. Розмір ділянки пам¢яті, що відводиться змінній, визначається її типом. Перелік базових типів даних наведено у таблиці 3.1.
Таблиця 3.1
Тип даних | Назва | Розмір, біт | Діапазон значень | |
unsigned char | Беззнаковий цілий довжиною не менше 8 біт | 8 | 0 . . 255 | |
сhar | Цілий довжиною не менше 8 біт | 8 | -128 . . 127 | |
unsigned int | Без знаковий цілий | 16 | 0 . . 65535 | |
short int (short) | Короткий цілий | 16 | -32768 . . 32767 | |
unsigned short | Беззнаковий короткий цілий | 16 | 0 . . 65535 | |
int | Цілий | 16 | -32768 . . 32767 | |
unsigned long | Беззнаковий довгий цілий | 32 | 0 . . 4294967295 | |
long int (long) | Довгий цілий | 32 | -214748348 . . 2147483647 | |
float | Дійсний одинарної точності | 32 | 3.4Е-38 . . 3.4Е+38 | |
double | Дійсний подвійної точності | 64 | 1.7Е-308 . . 1.7Е+308 | |
long double | Дійсний максимальної точності | 80 | 3.4Е-4932 . . 1.1Е+4932 |
3.2 ОПЕРАЦІЇ МОВИ С++
Позначки операцій – це один або декілька символів, що визначають дію над операндами. Операції поділяють на унарні, бінарні та тернарні за кількістю операндів, які беруть участь в операції (таблиця 3.2).
Таблиця 3.2.
Операція | Короткий опис |
Унарні операції | |
& | Операція одержання адреси операнда |
* | Звернення за адресою (розіменування) |
- | Унарний мінус – змінює знак арифметичного операнда |
~ | Порозрядове інвертування внутрішнього двійкового коду (побітове заперечення) |
! | Логічне заперечення (НЕ) значення операнда. Цілочисельний результат 0 (якщо операнд ненульовий, тобто істинний) або 1 (якщо операнд нульовий, тобто хибний). Таким чином: !1 дорівнює 0; !2 дорівнює 0; !(-5)=0; !0 дорівнює 1. |
++ | Інкремент (збільшення на одиницю): Префіксна операція (++х) збільшує операнд на 1 до його використання. Постфіксна операція (х++) збільшує операнд на 1 після його використання. int m=1, n=2; int a=(m++)+n; // a=3, m=2, n=2 int b=m+(++n);// b=6, m=2, n=3 |
- - | Декремент (зменшення на одиницю): Префіксна операція (--х) зменшує операнд на 1 до його використання. Постфіксна операція (х--) зменшує операнд на 1 після його використання. |
sizeof | Обчислення розміру (в байтах) об¢єкта того типу, який має операнд. Має дві форми: 1) sizeof (вираз); sizeof(1.0); // Результат - 8, Дійсні константи за замовчуванням мають тип double; 2) sizeof (тип) sizeof (char); // Результат – 1. |
Бінарні операції | |
Арифметичні операції | |
+ | Бінарний плюс (додавання арифметичних операндів) |
- | Бінарний мінус (віднімання арифметичних операндів) |
Мультиплікативні | |
* | Добуток операндів арифметичного типу |
/ | Ділення операндів арифметичного типу (якщо операнди цілочисельні, абсолютне значення результату заокруглюється до цілого, тобто 20/3 дорівнює 6) |
% | Одержання залишку від ділення целочисельних операндів (13%4 = 1) |
Операції зсуву (визначені лише для цілочисельних операндів) | |
<< | Зсув вліво бітового представлення значення лівого цілочисельного операнда на кількість розрядів, рівну значенню правого операнда (4<<2 дорівнює 16, т.я. код 4 100, а звільнені розряду обнуляються, 10000 – код 16) |
>> | Зсув вправо бітового представлення значення правого цілочисельного операнда на кількість розрядів, рівну значенню правого операнда |
Порозрядні операції | |
& | Порозрядна кон’юнкція (І) бітових представлень значень цілочисельних операндів |
| | Порозрядна диз’юнкція (АБО) бітових представлень значень цілочисельних операндів |
^ | Порозрядне виключне АБО бітових представлень значень цілочисельних операндів |
Операції порівняння | |
< | Менше, ніж |
> | Більше, ніж |
<= | Менше або рівне |
>= | Більше або рівне |
= = | Рівне |
!= | Не рівне |
Логічні бінарні операції | |
&& | Кон’юнкція (І) цілочисельних операндів або відношень, цілочисельний результат (0) або (1) |
|| | Диз’юнкція (АБО) цілочисельних операндів або відношень, цілочисельний результат (0) або (1) (умова 0<x<1 мовою С++ записується як 0<x && x<1) |
Тернарна операція | |
Умовна операція | |
? : | Вираз1 ? Вираз2 : Вираз3; Першим вираховується значення Виразу1. Якщо воно істинне, тоді обчислюється значення Виразу2, яке стає результатом. Якщо при обчисленні Виразу1 одержуємо 0, тоді в якості результату береться значення Виразу3. Наприклад: х<0 ? -x : x ; //обчислюється абсолютна величина x. |
Таблиця 3.3. Пріоритет виконання операцій
Ранг | Операції | Напрямок виконання |
1 | () (виклик функції), [], ->, "." | >>> |
2 | !, ~, +, - (унарні), ++, --, *, (тип), sizeof, (new,delete – Сі++) | <<< |
3 | .* , ->* - Сі++ | >>> |
4 | *, /, % (бінарні) | >>> |
5 | +, - (бінарні) | >>> |
6 | <<, >> | >>> |
7 | <, <=, =>, > | >>> |
8 | ==, != | >>> |
9 | & (порозрядна) | >>> |
10 | ^ | >>> |
11 | | (порозрядна) | >>> |
12 | && (логічна) | >>> |
13 | || (логічна) | >>> |
14 | ?: (тернарна) | <<< |
15 | =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=,>>= | <<< |
16 | "," (кома) | >>> |
Основні матичні функції мови С/С++, опис яких міститься у файлі <math.h>, наведені у таблиці 3.4.
Таблиця 3.4
Матичний запис | Функція | Пояснення | Приклад |
arccos x | acos | Повертає арккосинус кута, рівного х радіан | acos(x); |
arcsin x | asin | Повертає арксинус аргументу х в радіанах | asin(x); |
arctg x | atan | Повертає арктангенс аргументу х в радіанах | atan(x); |
аrctg(x/у) | atan2 | Повертає арктангенс відношення параметрів х та у в радіанах | atan2(x, y); |
- | ceil | Заокруглює дійсне значення х до найближчого більшого цілого і повертає його як дійсне | ceil(x); |
cosx | cos | Повертає косинус кута, рівного х радіан | cos(x); |
chx=1/2(ex +e-x ) | cosh | Повертає гіперболічний косинус аргументу, рівного х радіан | cosh(x); |
ex | exp | Повертає результат піднесення числа е до степені х | exp(x); |
|x| | fabs | Повертає модуль дійсного числа х | fabs(x); |
- | floor | Заокруглює дійсне число до найближчого меншого числа і повертає результат як дійсний | floor(x); |
- | fmod | Повертає залишок ділення х на у. Аналогічна операції %, але працює з дійсними числами | fmod(x, y); |
ln x | log | Повертає значення натурального логарифму х | log(x); |
lg x | log10 | Повертає значення десяткового логарифму х | log10(x); |
xy | pow | Вираховує значення числа х у степені у | pow(x, y); |
sinx | sin | Повертає синус кута, рівного х радіан | sin(x); |
sh x=1/2 (ex -e-x ) | sinh | Повертає гіперболічний синус кута, рівного х радіан | sinh(x); |
![]() |
sqrt | Визначає корінь квадратний числа х | sqrt(x); |
tg x | tan | Повертає тангенс кута, рівного х радіан | tan(x); |
tgh x | tanh | Повертає гіперболічний тангенс кута, рівного х радіан | tanh(x); |
Таблиця 3.5 Операції присвоювання
Операція | Пояснення | Приклад |
= | Присвоїти значення виразу-операнду з правої частини операнду лівої частини | Р=10.5-3*х |
*= | Присвоїти операнду лівої частини добуток значень обох операндів | Р*=2 еквівалентно Р=Р*2 |
/= | Присвоїти операнду лівої частини результат від ділення значення лівого операнда на значення правого | Р/=(2.2-х) еквівалентно Р=Р/(2.2-х) |
%= | Присвоїти лівому операнду залишок від ділення цілочисельного значення лівого операнда на цілочисельне значення правого операнда | Р%=3 еквівалентно Р=Р%3 |
+= | Присвоїти операнду лівої частини суму значень обох операндів | А+=В еквівалентно А=А+В |
-= | Присвоїти операнду лівої частини різницю значень лівого і правого операндів | Х-=3.4-у еквівалентно Х=Х-(3.4-у) |
4. Основні оператори мови С++
4.1 СКЛАДОВІ ОПЕРАТОРИ
Складовий оператор – це два або більше оператори, що повинні виконуватися у певній частині програми як один оператор. До складових операторів належать власне складовий оператор та блок. В обох випадках - це послідовність операторів, розміщених у фігурних дужках. Блок відрізняється від складового оператора наявністю в його тілі оператора визначення об’єкту (змінної, константи, масиву тощо).
Наприклад:
{n++; summa+=n;}//це складовий оператор
{int n=0; n++;summa+=n;} //це блок
4.2 ОПЕРАТОРИ РОЗГАЛУЖЕННЯ
Оператор умовного переходу if використовується для спрямування ходу програми за однією з гілок обчислень в залежності від певної умови.
Загальна форма запису:
if (умова) оператор1;
else оператор2;
Наприклад, для знаходження коренів квадратного рівняння використовується запис:
if (d>=0)
{x1=(-b-sqrt(d))/(2*a);
x2=(-b+sqrt(d))/(2*a);
cout<< “nx1=”<<x1<<“x2=”<<x2;
}
else cout<<“nРозв¢язку немає”;
Якщо оператор1 та/або оператор2 містять два або більше операторів, їх беруть у фігурні дужки {} , тобто вони є складовими. Оператор if перевіряє істинність чи хибність умови. Якщо умова справджується (не рівна 0), тоді виконується оператор1 , інакше, при хибності умови (==0), виконується оператор2 .
Другу частину оператора (else оператор2; ) можна опускати. Така його форма має назву “скороченої ”. Тоді у випадку хибності умови, керування передається до оператора, що йде услід за умовним оператором.
Якщо оператор1 і оператор2 в свою чергу є операторами if , вони є вкладеними .
Загальний вигляд вкладеного оператора if: if (умова1) оператор1;
else if (умова2) оператор2;
else оператор3;
В якості умов у мовах С/С++ використовуються стандартні операції відношення : < , <= , > , >= , != , == . Пари наведених символів не можна відокремлювати чи переставляти.
Для об’єднання в умові декількох умов використовуються логічні операції. Наведемо їх перелік в порядку спадання пріоритету: ! (заперечення або логічне НІ), && (кон’юнкція або логічне І), || (диз’юнкція або логічне АБО). Між позначками && та || не дозволяються пробіли.
Наприклад: 0<x&&x<=100
((!x)&&(y>0)||((z==1)&&(k>0))
Оператор вибору switch подібний до умовного оператора if, проте у ньому замість виразу-умови використовується вираз, результатом якого може бути декілька цілочисельних значень, кожне з яких, вимагає виконання свого оператора. Отже, програму можна спрямувати більше ніж у двох напрямках.
Загальна форма запису оператора вибору:
switch (вираз)
{ case consnant1: оператори; break;
сase consnantN: оператори;break;
default: оператори; },
де consnant1…consnantN - цілі або символьні константи. При виконанні оператора switch, обраховується вираз, записаний після switch і його значення послідовно порівнюється з константами, записаними після case. При першому ж співпаданні виконуються оператори, позначені даною міткою. Якщо виконувані оператори не містять оператор переходу break , далі виконуватимуться оператори усіх наступних варіантів. Якщо значення виразу, записаного після switch, не співпало з жодною константою, виконуватимуться оператори після мітки default , яка не є обов’язковою.
4.3 ОператорИ циклУ
Цикл з параметром for:
Основна форма запису:
for (вираз_1; вираз_2; вираз_3 ) оператор;
де вираз_1 – ініціалізація початкового значення параметру циклу;
вираз_2 – перевірка умови на продовження циклу;
вираз_3 – зміна параметру циклу з кожною ітерацією (корекція);
оператор – тіло циклу, простий або складовий оператор.
Цикл продовжується до тих пір, поки вираз_3 не стане рівним 0. Будь-який вираз можна опускати, залишаючи натомість “ ; ”.
Приклади використання циклу з параметром:
1) Зменшення параметра:
for ( n=10; n>0; n--)
{ <тіло циклу>}
2) Зміна кроку коректування:
for ( n=2; n>60; n+=13)
{ <тіло циклу>}
3)Корекція може здійснюватися не лише за допомогою додавання чи віднімання:
for ( d=100.0; d<150.0;d*=1.1)
{ <тіло циклу>}
for (x=1;y<=75;y=5*(x++)+10)
{ <тіло циклу>}
5) Можна використовувати декілька виразів ініціалізації або модифікації:
for (x=1, y=0; x<10;x++,y+=x)
{ <тіло циклу>}.
Цикл з передумовою while:
Основна форма запису:
while (умова)
оператор;
де оператор – це простий, складовий або порожній оператор.
Цикл виконується до тих пір, поки умова приймає значення “true”, тобто вираз у дужках повертає ненульовий результат. У циклі з передумовою спочатку перевіряється істинність умови, а потім виконується оператор тіла циклу. Тому цикл while не виконується жодного разу, якщо від початку умова буде хибною.
Цикл з післяумовою do – while:
Основна форма запису:
do
оператор;
while (умова);
де оператор – це простий, складовий чи порожній оператор.
Тіло циклу виконується до тих пір, поки умова справджується. Оскільки в циклі do–while умова перевіряється в кінці, оператор тіла циклу виконуватиметься хоча б один раз.
Для запобігання безкінечності циклу в тілі циклів while та do–while потрібно передбачити зміну параметрів, які входять до умови.
4.4 ОПЕРАТОРИ ПЕРЕХОДУ
Оператори переходу виконують безумовну передачу управління.
1) goto < мітка> - оператор безумовного переходу. Керування передається оператору з даною міткою:
<мітка>: оператор;
В мові С мітка не декларується.
2) break - оператор перериває цикл або перемикач, управління передається на перший наступний оператор;
while (умова)
{< оператори>
if (<вираз-умова>) break;
<оператори>}.
Тобто оператор break доцільно використовувати, коли умову продовження ітерації потрібно перевіряти в тілі циклу.
2) continue – припинення поточної і перехід до наступної ітерації циклу. Використовується, коли тіло циклу містить розгалуження.
3) return – здійснює повернення результату з тіла функції.
5. Вказівники та операції над ними
5.1 ПОНЯТТЯ ВКАЗІВНИКА
Кожна змінна у програмі - це об’єкт, який володіє ім’ям і значенням. Після визначення змінної з ініціалізацією всі звернення у програмі до неї за іменем замінюються компілятором на адресу іменованої області оперативної пам’яті, в якій зберігається значення змінної (Рис. 5.1). Програміст може визначити власні змінні для збереження адрес областей пам’яті. Такі змінні називають вказівниками .
int a=10;
![]() |
Рис. 5.1.
Вказівник визначається наступним чином:
< тип > * < ідентифікатор > < ініціалі затор > ;
Приклад 1.Визначення вказівників
int* pa=&a;// вказівник ра містить значення адреси змінної а
float *ptr (NULL); // Нульовий вказівник на об’єкт типу float
char*p; // Неініціалізований вказівник на об’єкт типу char
Значення адреси змінної одержується за допомогою унарної операції ”&”.
Для доступу до комірки пам’яті, виділеної під змінну через вказівник до останнього, слід застосувати унарну операцію розіменування ”*”.
Приклад 2. Непряма адресація через вказівник
int x=2; //змінна типу int
int *y =&x;// вказівник на елемент даних типу int
*y=1; // через вказівник до поля x вноситься значення 1,
//тобто x=1
p=new char(12);
В останньому операторі прикладу 2 неініціалізований вказівник р , описаний у прикладі 1, асоціюється з ділянкою у динамічній пам’яті під змінну типу char, до якої заноситься значення 12.
5.2 ДІЇ НАД ВКАЗІВНИКАМИ
Приклад 3: Дії над вказівниками
int a=5;
int *p=&a, *p2, *p2; p2=p1=p;
++p1; p2+=2;
cout<<“a=”<<a;
cout<<” p=”<<*p<<” p=”<<p<<” p1=”<<p1<<” p2=”<<p2;
Результат виконання:
a=5, *p=5, p=FFC8, p1=FFCC, p2=FFD0.
Конкретні значення адрес залежать від низки причин: архітектури комп’ютера, типу і розміру оперативної пам’яті тощо.
З арифметичних операцій між вказівниками дозволена лише операція віднімання.
Різницею двох вказівників одного типу є відстань між двома областями пам’яті, кратна довжині (в байтах) об’єкта того типу, якому відповідає вказівник. Різниця однотипних вказівників, що адресують суміжні об’єкти, за абсолютною величиною рівна одиниці. Адреси змінних позначаються цілочисельними 16-ковими константами.
Ті змінні, визначення яких розміщені в програмі поруч, займають суміжні ділянки пам’яті, проте розміщення об’єктів у пам’яті є оберненим в порівнянні з їх взаємним розташуванням у визначеннях тексту програми.
До вказівника дозволено додавати і віднімати цілочисельну константу (k). При цьому він пересувається між ділянками пам’яті на величину k*(sizeof(type)).
6. Робота з одновимірними масивами
6.1 СТАТИЧНІ ТА ДИНАМІЧНІ МАСИВИ
Масив – це кінцева послідовність даних одного типу. Кожен елемент масиву має однакове ім’я – ім’я масиву, і відрізняється індексом (ціле число), за яким здійснюється доступ до елемента масиву. Індекси масивів у С/С++ починаються з 0. У програмі одновимірний масив оголошується наступним чином:
<тип> <ім’я масиву> [розмір] <ініціалізація>; ,
де розмір – кількість елементів одновимірного масиву.
Після визначення ім’я масиву стає вказівником-константою, значення якого є незмінним і становить адресу першого (нульового) елемента масиву.
За способом розміщення масиви поділяються на статичні та динамічні. Розмір статичного масиву можна задавати константою або константним виразом. Оскільки ділянка у оперативній пам’яті під масив задається на етапі компіляції і її розмір визначається типом елементів масиву та їх кількістю, розмірність масиву повинна бути визначена у тексті програми, а не підчас її виконання. Для визначення масиву змінного розміру використовується механізм динамічного виділення пам’яті.
Наприклад:
- оголошення одновимірного масиву з п’яти елементів цілого типу:
int a[5];
- динамічне виділення пам’яті під 10 цілочисельних елементів:
int*m=new int [10];
Враховуючи те, що ім¢я масиву є вказівником, зрозумілим стає зміст останньої операції: вказівникові на int m присвоюється початкова адреса ділянки пам¢яті, виділеної у динамічній області під 10 цілочисельних елементів.
Перевагою динамічних масивів є те, що їх розмірність може бути змінною, тобто у програмі можна працювати з масивами довільного розміру, не вносячи змін до тексту програми. Проте, динамічні масиви не можна ініціалізувати при визначенні і вони за замовчуванням не заповнюються нулями.
Натомість ініціалізацію статичних масивів можна здійснювати при їх визначенні. При цьому слід зауважити, що у С/С++ не перевіряється вихід індексу за межі масиву.
Наприклад:
double d[] = {1, 2, 3, 4, 5};
float f[10]={1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0};
При поєднанні визначення масиву з ініціалізацією його розмірність у квадратних дужках можна не вказувати. Довжину масиву компілятор визначить за кількістю значень, наведених у фігурних дужках.
Для звернення до елементів масивів використовуються два способи, наприклад до 4-го (по порядку) елемента масиву a можна звернутися як a[3] або *(a+3) . Останнє звернення базується на факті, що ім’я масиву є одночасно вказівником на його нульовий елемент, а зміщення вказівника у пам’яті відбувається на величину індексу помножену на розмір типу елементів масиву у байтах.
Пам’ять, зарезервовану під динамічний масив за допомогою new[ ], потрібно звільняти оператором delete [] <ім¢я массиву>.
Отже, якщо кількість елементів масиву відома до виконання програми, краще використовувати статичний масив, розмірність якого позначити як значення іменованої константи. Якщо розмірність масиву необхідно задавати в процесі виконання програми (до введення його елементів), то доцільно створювати динамічний масив.
6.2 РЯДКИ, ЯК ОДНОВИМІРНІ МАСИВИ СИМВОЛІВ
У мовах С/С++ немає окремого типу даних “рядок символів”, подібно до типу string у алгоритмічній мові PASCAL. Тому робота з рядками реалізована шляхом використання одновимірних масивів типу char. Рядок символів – це одновимірний масив типу char, останнім елементом якого є нульовий байт. Нульовий байт – це байт, кожен біт якого рівний нулю, при цьому для нульового байта визначена символьная константа ¢