
- •12. Класи пам'яті даних 100
- •13. Робота з файлами 106
- •14. Посилання 111
- •Склад мови
- •Алфавіт мови
- •Лексеми
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Символьні рядки
- •Знаки операцій, роздільники, коментарі
- •Типи даних
- •Класифікація типів даних
- •Цілочислові типи
- •Дійсні типи
- •Оголошення змінних і констант
- •Переліки
- •Структура програми
- •Функція main
- •Область дії змінної
- •Введення і виведення даних
- •Функції стандартної математичної бібліотеки
- •Вирази і операції
- •Поняття виразу, операнда, операції
- •Порядок виконання операцій
- •Арифметичні операції
- •Порозрядні операції
- •Операції порівняння
- •Логічні операції
- •Операції присвоєння
- •Умовна операція
- •Операція визначення розміру sizeof
- •Узгодження типів у виразах
- •Умовні оператори
- •Оператори
- •Умовний оператор if
- •Оператор вибору switch
- •Оператори циклу
- •Цикл з параметром. Оператор for
- •Цикл з передумовою. Оператор while
- •Цикл з постумовою. Оператор do while
- •Оператори переходу
- •Використання псевдовипадкових чисел
- •Одновимірні масиви
- •Багатовимірні масиви
- •Символьні рядки
- •Вказівники
- •Оголошення вказівника, операції, пов’язані з вказівниками
- •Адресна арифметика
- •Void – вказівники, типізація вказівників
- •Звертання до елементів масивів через вказівники
- •Масиви символьних рядків і масиви вказівників
- •Динамічне виділення пам’яті
- •Структури і об’єднання
- •Оголошення і ініціалізація структур
- •Звертання до елементів структур
- •Перейменування типів
- •Об’єднання
- •Поля бітів
- •Директиви препроцесора
- •Призначення директив препроцесора
- •Директива включення #include
- •Директиви макропідстановок #define I #undef
- •Директиви умовної компіляції
- •Директиви #ifdef, #ifndef
- •Функції
- •Структура функції
- •Виклик функцій. Прототипи функцій
- •Взаємодія фактичних і формальних параметрів функцій
- •Inline – функції
- •Масиви і символьні рядки як параметри функцій
- •Використання кваліфікатора const в оголошеннях параметрів
- •Багатовимірні масиви як параметри функцій
- •Опрацювання структур у функціях
- •Вказівники на функції
- •Рекурсивні функції
- •Класи пам'яті даних
- •Клас пам'яті, час існування і видимість об’єкта
- •Область дії глобальних і локальних змінних
- •Специфікатори класів пам'яті
- •Специфікатори глобальних змінних
- •Багатофайлові програми
- •Робота з файлами
- •Звертання до файлів
- •Послідовний запис до файлу і послідовне читання з файлу
- •Файли з довільним доступом
- •Посилання
- •Призначення посилань
- •Передача аргументів функцій як посилань
Цикл з передумовою. Оператор while
Оператор while має такий синтаксис:
while ( вираз ) оператор;
де вираз – довільний вираз, що задає умову виконання циклу, оператор – довільний оператор мови, зокрема блок, що формує тіло циклу.
Оператор працює наступним чином:
обчислюється значення виразу, тобто перевіряється умова виконання циклу;
якщо значення виразу дорівнює нулю, тобто умова хибна, то виконання циклу завершується, управління передається оператору, наступному за while;
якщо значення виразу ненульове, тобто умова істинна, то виконується оператор тіла циклу;
відбувається повернення до пункту 1 для наступної перевірки умови виконання циклу.
Наведемо приклад програми, яка виводить на екран числа від 0 до 10.
#include <iostream>
using namespace std;
int main(){
int i;
i = 0;
while ( i < 10 ) {
cout << i << endl;
i++;
}
}
На мал. 6.3 наведена блок – схема роботи цієї програми і блок – схема роботи оператора while.
Мал. 6.3. Блок – схема роботи і приклад використання оператора while
На відміну від оператора for, в операторі while немає окремих виразів для ініціалізації змінних циклу і їх зміни. Ці дії, якщо вони необхідні, виконуються перед циклом або всередині циклу.
Знайдемо максимальне значення функції на інтервалі від 0 до Пі, при цьому будемо використовувати оператор while.
#include <iostream>
using namespace std;
int main(){
const double X1 = 0.;
const double X2 = 3.14159;
double xmax, fmax, d, t, f;
xmax = X1;
fmax = sin( pow( X1, 2 ) ) + pow( cos( X1 ), 2 );
d = 1e-3;
t = X1 + d;
while ( t <= X2 ) {
f = sin( pow( t, 2 ) ) + pow( cos( t ), 2 );
if ( fmax < f ) {
xmax = t;
fmax = f;
}
t += d;
}
cout << xmax << " : " << fmax << endl;
}
Знайдемо значення факторіалу з допомогою оператора while.
#include <iostream>
using namespace std;
int main(){
int n = 5, f = 1;
while ( n )
f *= n--;
cout << f << endl;
}
Приклад програми. Користувач вводить послідовність цілих чисел. Кількість чисел заздалегідь не відома, ознакою кінця вводу чисел є нуль. Знайти кількість чисел, максимальне значення, суму і добуток чисел.
#include <iostream>
using namespace std;
int main(){
setlocale(LC_ALL, "");
int num = 0; // Кількість чисел
int sum = 0; // Сума чисел
int pro = 1; // Добуток чисел
int max = 0; // Найбільше число
int n;
cin >> n;
while ( n ) {
++num;
sum += n;
pro *= n;
if ( n > max ) max = n;
cin >> n;
}
cout << "Кількість\t" << num << endl;
cout << "Сума\t" << sum << endl;
cout << "Добуток\t" << pro << endl;
cout << "Найбільше\t" << max << endl;
}
Розглянемо особливості роботи з дійсними числами. Знайдемо найменше число, яке при додаванні до одиниці буде більшим одиниці.
#include <iostream>
using namespace std;
int main() {
double t = 1;
while ( 1 + t / 2 > 1 )
t /= 2;
cout << t << endl;
}
Цикл з постумовою. Оператор do while
Синтаксис оператора такий:
do
оператор
while ( вираз );
Оператор – це довільний оператор мови програмування С++, в тому числі блок операторів, який формує тіло циклу. Вираз – довільний вираз, що задає умову виконання циклу. В цьому операторі спочатку виконується тіло циклу, після цього здійснюється перевірка умови продовження циклу. Блок – схема роботи оператора і приклад його використання наведені на мал. 6.4.
Мал. 6.4. Блок схема і приклад використання оператора do while
Приклад програми. Користувач вводить послідовність цілих чисел. Кількість чисел заздалегідь не відома, ознакою кінця вводу чисел є нуль. Знайти суму чисел.
#include <iostream>
using namespace std;
int main() {
int t, s = 0;
do {
cin >> t;
s += t;
} while ( t != 0 );
cout << s << endl;
}
Знайти перше нульове значення
функції
для значень х більше нуля. Будемо
шукати перше значення функції, яке
знаходиться «на відстані» допустимої
помилки від нуля, тобто
.
#include <iostream>
using namespace std;
int main() {
double f; // Значення функції
double d = 1e-5; // Крок зміни х
double x = 0.; // Поточне значення х
double e = 1e-5; // Допустима помилка розрахунків
do {
f = sin( pow( x, 2. ) ) + pow( cos( x ), 2. );
x += d;
} while ( f < -e || f > e );
cout << "x = " << x << endl; // 1.78519
cout << "f = " << f << endl; // 1.02908e-006
}
Знайти перше нульове значення функції для значень х більше нуля. Будемо знаходити два значення функції – для поточного і наступного значень х. Якщо знак цих двох значень функції буде різним, тобто перше додатне, друге – від’ємне, або навпаки, то між цими двома значеннями х функція переходе через нуль.
#include <iostream>
using namespace std;
int main() {
double f1, f2; // Значення функції для x i x+d
double d = 1e-5; // Крок зміни х
double x = 0.; // Поточне значення х
do {
f1 = sin( pow( x, 2. ) ) + pow( cos( x ), 2. );
f2 = sin( pow( x + d, 2. ) ) + pow( cos( x + d ), 2. );
x += d;
} while ( ( f1 > 0 && f2 > 0 ) || ( f1 < 0 && f2 < 0 ) );
cout << "x = " << x << endl; // 1.78519
cout << "f1 = " << f1 << endl; // 1.02908e-006
cout << "f2 = " << f2 << endl; // -3.04804e-005
}