Мова програмування С++
У другому рядку розміщено команду (директиву) препроцесору, що забезпечує включення до програми засобів зв’язку зі стандартними потоками вводу і виводу даних. Вказані засоби містяться у файлі під назвою iostream. h (мнемоніка: «і» (input) — ввід; «output» — вивід; «stream» — потік; «head» — заголовний). Рядок, що починається з «#», обробляється препроцесором перед компіляцією програми. Файл… Читати ще >
Мова програмування С++ (реферат, курсова, диплом, контрольна)
Дипломна робота
Мова програмування С++
Зміст
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++ (Сі-плюс-плюс) — універсальна мова програмування високого рівня з підтримкою декількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної. Розроблена Б’ярном Страуструпом (англ. Bjarne Stroustrup) в AT&T Bell Laboratories (Мюррей-Хілл, Нью-Джерсі) у 1979 році та названа «Сі з класами». Страуструп перейменував мову у C++ у 1983 р. Базується на мові Сі. Визначена стандартом ISO/IEC 14 882:2003.
1.1 СТРУКТУРА ПРОГРАМИ
Розглянемо програму, що виводить на екран монітора фразу «Ласкаво просимо до С++!»:
Приклад 1.
// Welcome. cpp — ім'я файла з програмою
# include
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 етапи обробки:
препроцесорне перетворення тексту програми;
компіляція;
компоновка (редагування звязків чи складання).
Після цих 3 етапів формується машинний код програми, що виконується.
Задачею препроцесора є перетворення (доповнення) тексту програми до початку її компіляції. Правила препроцесорної обробки визначаються програмістом за допомогою директив препроцесора. Директива починається з «#» (дієс, шарп). Наприклад,
1) #define — визначає правила заміни в тексті:
#define ZERO 0.0
Це означає, що кожне використання у програмі імені ZERO буде замінюватися на 0.0.
2) #include< імя заголовного файла > - передбачена для залучення до тексту програми тексту файлу з каталогу «Заголовних файлів» INCLUDE, які постачаються разом зі стандартними бібліотеками. Кожна бібліотечна функція чи обєкт С++ має відповідний опис в одному з заголовних файлів (наприклад, iostream.h, stdio.h, conio.h, math.h). Список заголовних файлів визначається стандартом мови. Використання директиви include не підєднує відповідну стандартну бібліотеку, а лише дозволяє долучити до тексту програми описи із зазначеного заголовного файлу. В нашому випадку препроцесор обробляє директиву #include і під'єднує до вихідного тексту програми засоби для обміну з дисплеєм. Далі файл передається на компіляцію, у ньому виявляються синтаксичні помилки, які потрібно усунути програмістові. Після безпомилкової компіляції текст програми перекладається компілятором на машинну мову, далі отримуємо об'єктний файл з розширенням *.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 ФУНКЦІЇ ВВОДУ/ВИВОДУ МОВИ С
У мові С++ немає вбудованих засобів вводу/виводу — вони здійснюються за допомогою функцій, типів та об'єктів, що містяться у стандартних бібліотеках. Використовується два способи: функції, успадковані з мови С та об'єкти С++.
Основні функції вводу/виводу в стилі С, опис яких міститься у заголовному файлі :
р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
#define PI 3.1 415 926
void main ()
{
int number=5, cost=11 000, 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); /* «&» відсутній при зазначенні масиву символів */
Для зміни кольору тексту використовують функції із файла: clrscr () — очищує екран; textcolor(Колір) — задає колір символів; textbackground (Колір) — встановлює колір фону. Вивід тексту на екран здійснюється за допомогою функції cprintf(), яка використовується аналогічно printf(). Зверніть увагу на те, що перехід на початок нового рядка у цій функції здійснюється за допомогою комбінації «nr».
Колір можна задати за допомогою цілої або іменованої константи, перелік яких наводиться у таблиці 2.2.
Таблиця 2.2
Колір | Константа | Значення константи | |
Чорний | BLACK | ||
Синій | BLUE | ||
Зелений | GREEN | ||
Червоний | RED | ||
Фіолетовий | MAGENTA | ||
Сірий | GREY | ||
Блакитний | LIGHTBLUE | ||
Помаранчевий | LIGHTRED | ||
Жовтий | YELLOW | ||
Білий | WHITE | ||
2.2 ФУНКЦІЇ ВВОДУ/ВИВОДУ ТА МАНІПУЛЯТОРИ МОВИ С++
А ось як виглядає програма вводу/виводу з використанням бібліотеки класів С++:
Приклад 2.
# include
void main ()
{ int i;
cout<< «Введіть ціле числоn»;
//об'єкт для вводу з клавіатури і >>розміщення у потік виводу
cin>> i;
cout<< «Ви ввели число"<< i <<�"дякую!»;
}
Для форматного виводу у С++ використовуються маніпулятори, для використання яких до програми потрібно підключити заголовний файл :
setw (int) — встановлює максимальну ширину поля виводу чисел та рядків (не символів);
setprecision (int) — встановлює максимальну кількість цифр дробової частини для дійсних чисел з фіксованою крапкою;
setiosflags (ios:showpoint | ios:fixed) — вивід дійсних чисел з фіксованою крапкою;
setiosflags (ios:left) або setiosflags (ios:right) — вирівнювання по лівому або правому полю;
endl — при виводі включає у потік символ нового рядка, еквівалентний «n» (його опис міститься у файлі iostream. h).
Маніпулятори спрямовуються в потік виводу, аналогічно тому, як це зроблено у прикладі 3:
Приклад 3.
# include
#include
void main ()
ios:fixed);
cout<<<
Результат виводу (позначає пробіл):
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 біт | 0.. 255 | ||
сhar | Цілий довжиною не менше 8 біт | — 128.. 127 | ||
unsigned int | Без знаковий цілий | 0.. 65 535 | ||
short int (short) | Короткий цілий | — 32 768.. 32 767 | ||
unsigned short | Беззнаковий короткий цілий | 0.. 65 535 | ||
int | Цілий | — 32 768.. 32 767 | ||
unsigned long | Беззнаковий довгий цілий | 0.. 4 294 967 295 | ||
long int (long) | Довгий цілий | — 214 748 348.. 2 147 483 647 | ||
float | Дійсний одинарної точності | 3.4Е-38.. 3.4Е+38 | ||
double | Дійсний подвійної точності | 1.7Е-308.. 1.7Е+308 | ||
long double | Дійсний максимальної точності | 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, а звільнені розряду обнуляються, 10 000 — код 16) | |
>> | Зсув вправо бітового представлення значення правого цілочисельного операнда на кількість розрядів, рівну значенню правого операнда | |
Порозрядні операції | ||
& | Порозрядна кон’юнкція (І) бітових представлень значень цілочисельних операндів | |
| | Порозрядна диз’юнкція (АБО) бітових представлень значень цілочисельних операндів | |
^ | Порозрядне виключне АБО бітових представлень значень цілочисельних операндів | |
Операції порівняння | ||
< | Менше, ніж | |
> | Більше, ніж | |
<= | Менше або рівне | |
>= | Більше або рівне | |
= = | Рівне | |
≠ | Не рівне | |
Логічні бінарні операції | ||
&& | Кон’юнкція (І) цілочисельних операндів або відношень, цілочисельний результат (0) або (1) | |
|| | Диз’юнкція (АБО) цілочисельних операндів або відношень, цілочисельний результат (0) або (1) (умова 0<1) | |
Тернарна операція | ||
Умовна операція | ||
? : | Вираз1? Вираз2: Вираз3; Першим вираховується значення Виразу1. Якщо воно істинне, тоді обчислюється значення Виразу2, яке стає результатом. Якщо при обчисленні Виразу1 одержуємо 0, тоді в якості результату береться значення Виразу3. Наприклад: х<0? -x: x; //обчислюється абсолютна величина x. | |
Таблиця 3.3. Пріоритет виконання операцій
Ранг | Операції | Напрямок виконання | |
() (виклик функції), [], ->, «.» | >>> | ||
!, ~, +, — (унарні), ++, —, *, (тип), sizeof, (new, delete — Сі++) | <<< | ||
.*, ->* - Сі++ | >>> | ||
*, /, % (бінарні) | >>> | ||
+, — (бінарні) | >>> | ||
<<, >> | >>> | ||
<, <=, =>, > | >>> | ||
==, ≠ | >>> | ||
& (порозрядна) | >>> | ||
^ | >>> | ||
| (порозрядна) | >>> | ||
&& (логічна) | >>> | ||
|| (логічна) | >>> | ||
?: (тернарна) | <<< | ||
=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=,>>= | <<< | ||
" ," (кома) | >>> | ||
Основні матичні функції мови С/С++, опис яких міститься у файлі , наведені у таблиці 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=½(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=½ (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="<<�"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<=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. Будь-який вираз можна опускати, залишаючи натомість "; «.
Приклади використання циклу з параметром:
Зменшення параметра:
for (n=10; n>0; n—)
{ <�тіло циклу>}
Зміна кроку коректування:
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)
{ <�тіло циклу>}
Можна використовувати декілька виразів ініціалізації або модифікації:
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 ОПЕРАТОРИ ПЕРЕХОДУ
Оператори переходу виконують безумовну передачу управління.
goto < мітка> - оператор безумовного переходу. Керування передається оператору з даною міткою:
<�мітка>: оператор;
В мові С мітка не декларується.
break — оператор перериває цикл або перемикач, управління передається на перший наступний оператор;
while (умова)
{< оператори>
if (<�вираз-умова>) break;
<�оператори>}.
Тобто оператор break доцільно використовувати, коли умову продовження ітерації потрібно перевіряти в тілі циклу.
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;
A | A | |||
«A» рядок (2 байти) | `A' символ (1байт) | |||
Рис. 8.1.
Рядок розміщується у масиві або за допомогою операції вводу з клавіатури, або за допомогою ініціалізації.
Приклади:
char s1[10]="string1″; // масив символів з десяти елементів
char s3[]={`s','t','a',`r','t',''}; // масив з 6 елементів типу char
сhar *s4="string4″; // вказівник-змінна на рядок
char *s="String5″; // виділяється 8 байтів для рядка
char *sss=new char[10]; /* виділяється динамічна пам’ять під 10 елементів типу char*/
strcpy (sss,"Thanks");// у цю область пам’яті копіюється рядок.
8.2 ФУНКЦІЇ ВВОДУ/ВИВОДУ ПРИ РОБОТІ З РЯДКАМИ
Для вводу і виводу символьних даних у бібліотеці мови С (файл) визначені наступні функції:
int getchar () — здійснює введення одного символу з вхідного потоку і повертає один байт інформації (символ) у вигляді значення типу int. Це робиться для розпізнавання ситуації, коли при зчитуванні буде досягнуто кінець файлу.
int putchar (int c) — розміщує в стандартний вихідний потік символ c.
Приклад:
# include
void main ()
{char c, d;
c=getchar (); putchar (c);
d=getchar (); putchar (d);
}
char* gets (char*s) — зчитує рядок s із стандартного потоку до появи символу `n', сам символ `n' у рядок не заноситься. Повертає вказівник на цей рядок.
int puts (const char* s) — записує рядок у стандартний потік виводу, додаючи в кінці рядка символ `n', у випадку вдалого завершення повертає значення більше або рівне 0 і від'ємне значення у випадку помилки.
Також для вводу/виводу рядка можна використовувати функції scanf/printf, відповідно, задавши специфікатор формату %s:
# include
void main (){
const int n=10;
char s[n];
scanf («%s», s); printf («%s», s);}
Ім'я масиву є вказівником-константою на початок рядка, тому не слід застосовувати операцію взяття адреси (&), що зазвичай використовується з функцією вводу scanf. Ввід буде здійснюватися до першого символу пропуску. Для того щоб ввести рядок, який складається з декількох слів, використовується специфікатор %c (символи) із зазначенням у ньому максимальної кількості символів, що вводяться, наприклад:
scanf («%10c», s);
При виводі рядка на екран можна в специфікації %s зазначити кількість символів, які відводяться під рядок:
printf («%15s», s);
Функції вводу/виводу мови С++, описані у заголовному файлі <iostream.h>:
cin>>s; //ввід рядка зі стандартного потоку до появи першого пропуску.
При введенні, наприклад, рядка «Ваня Іванов» в рядок s буде записано лише перше слово рядка, а саме «Ваня».
cout<
Якщо потрібно ввести рядок, який складається з декількох слів, в одну рядкову змінну, використовують методи getline або get класу istream, об'єктом якого є cin. Виклик цього методу здійснюється наступним чином: після імені об'єкту cin ставиться крапка, за якою записується ім'я методу:
#include
int main ()
{const in n=80;
char s[n];
cin.getline (s, n); cout<
cin.get (s, n); cout<< s}
Метод getline зчитує з вхідного потоку n-1 символів або менше (якщо символ переводу рядка зустрінеться раніше) і записує їх у рядкову змінну s. Символ переводу рядка також зчитується (видаляється) з вхідного потоку, але не записується у рядкову змінну, замість нього розміщується завершальний ''. Якщо в рядку вихідних даних більше за n-1 символів, наступне введення буде виконуватися з того ж рядка, починаючи з першого символу, що не був зчитаний.
Метод get працює аналогічно, але залишає в потоці символ переводу рядка. До рядкової змінної додається завершальний ''.
8.3 СПЕЦІАЛЬНІ ФУНКЦІЇ ДЛЯ РОБОТИ З РЯДКАМИ ТА СИМВОЛАМИ
Для рядків не визначено операцій присвоювання, додавання, порівняння, оскільки рядок не є основним типом даних. Для роботи з рядками використовуються спеціальні бібліотечні функції, опис яких міститься у файлі <string.h>. Деякі з цих функцій наведено у таблиці 8.1:
Таблиця 8.1 Функції стандартної бібліотеки для роботи з рядками — файл <string.h>
Прототип функції | Короткий опис та використання | Пояснення | |
unsigned strlen(const char*s); | Обчислює довжину рядка s. strlen (s); | Повертає фактичну довжину рядка, не враховуючи нуль-символ | |
int strcmp(const char*s1, const char *s2); | Порівнює рядки s1 і s2. strcmp (s1, s2); | Якщо s1s1 — результат додатний. | |
int strncmp(const char*s1, const char *s2, n); | Порівнює перші n символів рядків s1 і s2. strncmp (s1, s2, n); | Якщо n (s1)s1 — результат додатний. | |
char*strcpy(char*s1, const char*s2); | Копіює символи рядка s2 у рядок s1. strcpy (s1, s2); | Нуль-символ при цьому теж включається | |
char*strncpy(char*s1, const char*s2, int n); | Копіює n символів рядка s2 у рядок s1. strncpy (s1,s2,n); | Кінець рядка відкидається. Якщо нуль-символ у вихідному рядку зустрінеться раніше, копіювання припиняється, а решта символів рядка доповнюються `'-ми. | |
char*strcat(char*s1, const char*s2); | Дописує рядок s2 до рядка s1. strcat (s1, s2); | Перший символ s2 записується на місце нуль-символу рядка s1. До результуючого s1 додається `'. | |
char*strncat(char*s1, const char*s2, size_t n); | Дописуються перші n символів рядка s2 до рядка s1. strncat (s1,s2,5); | n-символів рядка s2 записується до s1, починаючи з місця нуль-символу s1. | |
char* strсhr(char*s, int ch) | Шукає символ ch у рядку s. strchr (s, ch); | Повертає вказівник на перше входження символу в рядок справа. Якщо його немає - повертається NULL | |
char* strrev(char *s1) | Змінює порядок символів у рядку s1 на протилежний. strrev (s1, s2); | Дзеркальне відображення рядка s1. | |
char *strstr(char*s1, char*s2) | Шукає підрядок у рядку. strstr (s1, s2); | Пошук першого входження s2 у s1. В разі вдалого пошуку повертається вказівник на елемент з s1, з якого починається s2, інакше — NULL. | |
char *strtok(char*s1, char*s2) |