Визначення та ініціалізація об’єктів даних
Тепер, щоб заволодіти увагою користувача, виконан-ним короткий тест. Ми відобразимо два числа з числової послідовності і запропонуємо користувачеві вгадати сле-дмуть значення в послідовності. наприклад,
The values 2,3 from two consecutive elements of a numerical sequence. What is the next value?
Ці значення - третій і четвертий елементи з послідовно-вательності Фібоначчі: 1, 1, 2, 3, 5, 8, 13 і т. Д. Послідовно-ність Фібоначчі починається з двох елементів - одиниць. Кожен наступний елемент це сума двох попередніх-чих.
Якщо користувач введе 5, ми привітаємо його і спитаємо, чи хоче він спробувати іншу числову послідовник-ність. Будь-яке інше введене значення - невірно, і ми запитаємо користувача, чи хоче він поворожити ще.
Щоб підтримати інтерес до програми, ми збережемо поточний рахунок, заснований на відношенні правильних відпові-тов до числа спроб.
Програма потребує, щонайменше, в п'яти об'єктах: об'єкті строкового класу для збереження імені пользовате-ля, трьох цілих об'єктах класу для запам'ятовування по черзі спроб, числа спроб, числа успішних спроб, і об'єкт класу чисел з плаваючою точкою для запам'ятовування рахунку.
Для визначення об'єктів даних ми повинні ввести імена і тип даних. Імена можуть бути будь-якими комбінаціями-ями букв, цифр, підкреслень. Букви чутливі до регістру. Кожне з імен user_name, User_name, uSeR_nAmE і user_Name відноситься до різних об'єктів.
Ім'я не повинно починатися з цифри. Наприклад, l_name неправильно, name_l - правильно. Також ім'я не повинно со-впадати з ключовими словами мови. Наприклад, delete - ключове слово мови, так що ми не повинні використовувати його в нашій програмі. (Це пояснює, чому оператор видалення символу з строкового класу - це erase (), а не deleted).
Кожен об'єкт повинен бути свого типу даних. Ім'я об'єкта дозволяє нам звернутися до нього безпосередньо. Тип даних визначає область значень, що зберігаються об'єктом, і кількість пам'яті, необхідної для запам'ятовуючи-ня цього значення.
Ми бачили визначення user_name в попередньому поділу-ле. Перенесемо той же визначення в нову програму:
#include
Клас - програмно-певний тип даних. С ++ так-же підтримує безліч вбудованих типів даних: бу-леви, цілі, з плаваючою точкою і символьні. Ключові слова, асоційовані з кожним з них, дозволяють нам визначити тип даних. Наприклад, для запам'ятовування зна-ня, введеного користувачем, ми визначимо об'єкт ціле-го типу:
Int - ключове слово мови визначає, що об'єкт usr_val - цілого типу. Обидва об'єкти: число спроб, зроблений-них користувачем і число правильних відповідей, - об'єкти цілого типу. Різниця тільки в тому, що ми б хотіли дати їм початкове значення «О». Ми можемо вивести кожне на від-ділову рядок:
Int num_.trіes = 0; int num_right = 0;
Або визначити їх в одному рядку через кому:
Int num_tries = 0, num_right = 0;
Загалом, краще дотримуватися правила не започатковано-вать об'єкт даних, навіть якщо значення тільки позначає, що об'єкт не має корисного значення зовсім. Я не ініціати-лу usr_val, тому що значення буде отримано безпосередньо з призначеного для користувача введення перш, ніж програма якось використовує об'єкт.
Альтернативний варіант ініціалізації - використовувати так званий конструкційний синтаксис
Int num_.tries (0);
Чому є два ініціалізацій синтаксису? Гірше того, чому я зараз про це говорю? Що ж, подивимося, чи відповідає моє пояснення на обидва питання.
Використання оператора присвоювання для Ініціалізація-ції прийшло з мови С. Воно добре працює з об'єктами даних вбудованих типів і класами об'єктів, які можуть бути ініційовані єдиним значенням, наприклад строковим класом:
String sequence_name = "Fibonacci";
Однак даний спосіб не такий гарний для класу об'єктів, які вимагають декількох значень для ініціалізації, як, наприклад, клас стандартної бібліотеки комплексних чисел, де кожне вимагає двох значень: перше - для дей-ствительность частини, друге - для уявної. Альтернативний конструкційний синтаксис був введений для підтримки мно-гозначной ініціалізації:
#include
Дивна нотація дужок, наступна за complex, означаючи-ет, що клас комплексних чисел - клас шаблонів. Клас шаблонів дозволяє нам визначати клас без специфіка-ції типу даних одного або всіх членів класу.
Клас комплексних чисел, наприклад, складається з двох чле-нів об'єкта даних. Хтось думає реальну частину чис-ла, другий - уявну. Ці члени повинні бути числами типу даних з плаваючою точкою, але якого? С ++ підтримує три типи чисел з плаваючою точкою: одиничної точності, що подаються ключовим словом float; подвійної точності, представленої ключовим словом double; і розширеної
Точності, представленої двома ключовими словами long double.
Механізм класу шаблонів дозволяє програмісту від-кладивает визначення типу даних, використовуючи клас шаблонів. Це дає йому можливість вставити «заглушку», яку пізніше він заповнить реальним типом даних. У попередньому прикладі використовувався вибір даних типу класу комплек-сних чисел double.
Що ж, можливо, з'являється більше питань, ніж напів-чає відповідей. Це відбувається від того, що шаблони, під дер-жива С ++, двох ініціалізацій синтаксисів для вбудованих типів даних. Коли вбудовані типи даних і програмно певний клас типів мають різний ініці- алізаціонний синтаксис, неможливо написати шаблон, ко-торий підтримує і вбудований клас, і клас типу даних. Уніфікація синтаксису спрощує розробку шаблонів. На жаль, розкриття синтаксису призводить до появи ще більшої плутанини!
Рахунок користувача повинен бути значенням з плаваючою точкою, оскільки виникає нецілим відношення. Ми визна-ділимо його типом double:
Double usr_score = 0,0;
Нам також потрібно зберегти місце для відповідей користування земельними діл-теля yes / по: Make another try? Try another sequence?
Ми можемо зберегти відповіді користувача в символьному об'єкті даних:
Cout «" Try another sequence? Y / N? "; cin »usr_more;
Ключове слово char відноситься до символьного типу. Символ окаймляется апострофами, позначаючи 'а', '7', '; 'І т. Д. Неко-торие спеціальні вбудовані символьні позначення при-ведені нижче (їх іноді називають ескейп послідовності):
n 'newline (новий рядок) "t" tab (табуляція) "