- •Як описуються цілі числа?
- •Порядкове читання вводу.
- •Що робить функція-член get ()?
- •Клас string.
- •Створення структури.
- •Що робить оператор enum?
- •Як робиться перерахування значень?
- •1. Змінна і змінна показника.
- •Копіювання рядка із масиву.
- •Використання операцій new та delete.
- •13. Отримання простору пам’яті.
- •Комбіновані операції присвоювання
- •Вирази відношень
- •Аналіз умови циклу:
- •Логічні оператори.
- •Простий файловий ввід-вивід символьної інформації.
- •Деякі основні факти, що використовують cout у консольному виводі.
- •Файловий ввід.
- •Як вказати діапазон елементів у масиві?
- •Як зробити передачу адреси замість передачі самої структури?
- •Використання посилальних аргументів.
- •Аргументи, що визначаємо за замовчуванням.
- •Перевантаження функції.
- •Моделі пам’яті і простір імен - Окрема компіляція програм
- •Директива #include.
- •Об’ява структур.
- •Довгочасність існування області зберігання, області видимості та компоновки.
- •Область видимості і зв’язування.
- •Автоматична довгочасність збереження.
- •Автоматичні змінні та стек.
- •Регістрові змінні.
- •П’ять видів змінних
- •Мовне зв’язування, котре дотикається функції.
Копіювання рядка із масиву.
Для копіювання рядка із масиву animal у знову виділений простір потрібно застосувати бібліотечну функцію strcpy ().
strcpy (ps, animal); //скопіювати новий рядок в нове сховище
Функція strncpy () ще приймає третій аргумент – максимальну кількість копійованих символів. Однак, при цьому потрібно мати на увазі, шо коли ця функція копіює вказану кількість символів та не досягає кінця рядка, то вона не додає нульовий символ. Тому застосовувати її треба так:
strncpy (food, “a picnic basket filled with many goodies”, 19);
food[19] = ‘\0’;
Цей код копіює до 19 символів, а потім встановлює в останній елемент масиву нульовий символ. Коли рядок коротше 19 символів, то strncpy () додає нульовий символ раніше, позначивши їм дійсний кінець рядка
Для копіювання рядка в масив застосовуйте strcpy () або strncpy (), а не операцію присвоєння.
Правило: коли ідентифікатор є ім’я структури, то використовуйте точку, а коли ідентифікатор є показником на структуру, то використовуйте стрілку.
Використання операцій new та delete.
Припустимо, що є приклад програми, який використовує new та delete для управління розміщенням рядкового вводу з клавіатури. У програмі використаємо функцію getname (), котра повертає показник на вхідний рядок. Ця функція читає ввід у великій тимчасовий масив (буфер), а потім використовує new з вказівкою відповідного розміру, щоб виділити фрагмент пам’яті точно такого розміру, щоб розташувати вхідний рядок. Після цього функція повертає показник на цій блок. Такий підхід економить великий об’єм пам’яті у програмі, яка читає велику кількість рядків.
Припустимо, що програма повинна прочитати 1000 рядків, самий довгий з них складає 79 символів довжини, але більшість рядків значно коротше. Коли застосувати масиви char для збереження рядків, то буде потрібно 1000 масиві по 80 символів кожний.
В якості альтернативи можна створити масив із 1000 показників на char і застосувати new для виділення такого об’єма пам’яті, скільки потрібно для кожного рядка. Це економить десятки тисяч байт
13. Отримання простору пам’яті.
Функція getname () використовую cin для розміщення введеного слова у масив temp. Далі вона звертається до new для виділення пам’яті, достатньої до цього слова. New передається рядок strlen (temp) + 1 символів. Після отримання простору пам’яті getname () викликає стандартну бібліотечну функцію strcpy (), щоб скопіювати рядок temp у виділену пам’ять. Функція getname () гарантує потрібний розмір виділеної пам’яті. У кінці функція повертає pn адресу копії рядка.
С++ пропонує три способи керування пам’яттю для даних в залежності від методу її виділення: автоматичне сховище, статистичне сховище та динамічне сховище, яке іноді називають вільним сховищем або кучею. Об’єкти даних, що виділені цими способами, відрізняються один від одного тим, наскільки довго вони існують.
Автоматичне сховище визначає, що звичайні змінні створюються автоматично при виклику їх функцій і вилучаються при їх завершені. Є два способи зробити змінні статичними: об’явити їх поза функції і при використані об’яві змінної за допомогою ключового слова static:
static double fee = 56.50
Динамічне сховище дозволяє, використовуючи операції new і delete, виділити пам’ять в одній функції і звільнити в іншій.
ЛЕКЦІЯ 11.
Введення у цикл for
Цикл for застосовується для виконання операторів, що повторюються визначену кількість разів. Структура циклу for такова:
for (i = 0; i<5; i++) //заголовок циклу
тіло циклу
return 0; //кінець циклу
Цей цикл має керуючу змінну і, котра спочатку присвоює значення 0:
i = 0; //це ініціазізуюча частина циклу
Потім програма перевіряє умову:
i<5; //коли умова вірна, то виконується перший оператор тіла циклу
cout <<” C++ знає цикли.\n”; //оператор у даному тілі циклу єдиний
Після першого виконання тіла циклу, керуюча змінна збільшує своє значення на +1:
i++ //ця операція має назву інкремент
Цикл повторюється до тих пір, аж поки значення керуючої змінної і не буде дорівнювати 5. Після цього перевірка дає хибний результат і програма переходить до наступного оператору, наступному за циклом.
Для перевірки керуючої змінної можна використовувати будь- який вираз, який С++ приведе до типу bool.
Цикл закінчується. Коли керуюча змінна і досягне значення 0.
Цикл for є циклом з вхідною умовою, яка перевіряється перед кожним кроком цикла. Цикл ніколи не виконує тіло циклу, коли умова не виконується, тобто повертає false (0). Позиція “перевірки умови перед циклом’ допомагає оберегти програму від проблем. У програмі тіло циклу складається з одного оператора, але воно може мати багато операторів, а також вбудовані оператори циклу.
У С++ стиль розміщення пробілів між for і наступними дужками, а також пропуск пробілю між іменем функції і наступними за ними дужками.
2. Оператори if і while та cout.
Інші оператори, такі як if і while, трактуються аналогічно for. Це підкреслює різницю між керуючим оператором і викликом функції. А також загальноприйнята практика заключається в постачанні тіла функції відступом, щоб виділити його візуально.
У С++ допускаються вирази типу:
x =(y = 4) + 3; //відповідь х = 7
x = y = z = 0; //присвоює 0 починаючи з права на ліво, спочатку z = 0.
Зазвичай cout перетворює значення bool в int перед тим, як відобразити їх, але виклик функції cout.setf(ios::boolalpha) встановлює прапорець, який інструктує cout ввідображати true і false замість 1 і 0.
3. Коли оператор стає виразом?
Любій вираз стає оператором, коли до нього додається точка з комою (;). Правило: оператор = вираз + точка з комою.
4. Побудувати програму, яка обчислює перші 16 факторіалів.
Факторіал кожного числа дорівнює добутку (множенню) цього числа на факторіал попереднього числа. Нуль факторіал 0! Дорівнює 1. Потім 1! Дорівнює 1*0!, тобто теж 1. Далі, 2! = 2*1! =2, а 3! = 3*2! = 6 і так далі. Програма використовує один цикл для обчислення значень послідовних факторіалів, розміщуючи їх у масив. Потім вона використовує другий цикл для відображення результатів, а також дає уявлення застосування зовнішньої об’яви для значень.
//prog027.cpp -- ще про цикл for
#include <iostream>
using namespace std;
const int ArSize = 16 //приклад зовнішньої об’яви
int main ()
{
double factorials[ArSize];
factorials[1] = factorials[0] = 1.0;
// int i;
for (int i = 2; i < ArSize; i++)
factorials[i] = i * factorials[i - 1];
for (i = 0; i < ArSize; i++)
cout << i <<”! = “<< factorials[i] << end1;
return 0;
}
Розглянемо результат програми.
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! =5040
8! = 40320
9! = 362880
10! = 3.6288e +006
11! = 3.99168e +007
12! = 4.79002e+008
13! = 6.22702e+009
14! = 8.71783e+010
15! = 1.30767e+012
Значення факторіалів збільшується швидко!
Обмеження виразу i < ArSize відображає той факт, що індекси елементів масиву знаходяться у межах від 0 до ArSize – 1. Програма використовує const для створення символьного уявлення (ArSize) розміру масиву. Зверніть увагу, що об’ява змінної ArSize типу const int зовні тіла функції main (). Це робить ArSize частиною зовнішніх даних, що дозволяє будь якої функції програми використовувати ArSize.
Засоби у циклі for.
Зміна кроку циклу. Замість збільшення або зменшення лічильника керуючої змінної на одиницю (і++ або і--) можна використати оновлюючий вираз лічильника на вибраний користувачем крок (і = і + by, де by – це значення крок). Крок може відповідати і такому виразу: і = і*і + 5.
У середину рядка за допомого циклу for. У цьому прикладі можна використовувати або клас string, або масив char, тому що обидва значення індексна останнього символу рядка змінної і, включаючи нульовий символ. Щоб виконувати зворотній відлік, програма застосовує операцію декрименту (- -) для зменшення поточного індексу масиву на кожному кроці циклу. Програма використовує операцію порівняння “,більш або рівно (>=), щоб перевіряти, досяг лі цикл першого елементу дозволяють застосувати нотацію масиву для доступу до індивідуальних символів рядка. Метод size класу string повертає кількість символів у рядок; цикл використовує це значення у виразу ініціалізації для присвоєння.
ЛЕКЦІЯ 12.
1. Префікса версія мови С++
С++ має версію префікса, яка задається перед операндом ++х. Тобто, нотація а++ визначає використовувати поточне значення а при обчислені виразу, а потім збільшити а на одиницю. Аналогічно, нотація ++а визначає спочатку збільшити а на одиницю, а потім її використовувати. Наприклад:
int x = 5; //змініть х, потім присвоїти його у, де у = 6 і х = 6
int y = ++x; //присвоїть у, потім змініть z, у = 5, z = 6
Правила інкрименту і декрименту відповідають правилам арифметики показників. Коли pt вказує на перший елемент масиву, то ++pt змінює його так, що він після цього вказує на другий його елемент.
У С++ операція + = додане значення двох операндів і присвоює результат лівому операнду. Наприклад, і + = х може виглядати так: і = і + х. Лівий операнд повинний бути таким. Щоб йому можна було присвоїти значення, наприклад, змінною, елементом масиву, членом структури або елементом даних, отриманого через розименовання показника.
Кожна арифметична операція має відповідну операцію присвоювання .
