Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Змішування рядкового та числового вводу



Змішування числового і рядкового введення може призводити до проблем. Розглянемо приклад простої програми в лістингу 6:

Результат виконання програми:

Ви так і не отримали можливості ввести адресу. Проблема в тому, що коли cin читає рік, то залишає символ нового рядка, згенерований натисканням <Enter>, у вхідній черзі. Потім cin.getline() читає символ нового рядка просто як порожній рядок, після чого привласнює масиву address нульову рядок. Щоб виправити це, потрібно перед читанням адреси прочитати і відкинути символ нового рядка. Це може бути зроблено декількома способами, включаючи виклик get() без аргументів або з аргументом char. Ці виклики можна виконати окремо:

Або ж можна зчепити виклик, скориставшись тим фактом, що вираз cin>>year повертає об'єкт cin:

Якщо внести одне з таких виправлень до лістингу 6, програма стане працювати правильно:

Клас string

У стандарті ISO/ANSI C++ 98 бібліотека C++ була розширена за рахунок додавання класу string. Тож відтепер замість використання символьних масивів для зберігання рядків можна застосовувати змінні типу string (або, користуючись термінологією C++, об'єкти). Як ви побачите, клас string простіше у використанні, ніж масив, і до того ж пропонує більш природне уявлення рядка як типу.

Для роботи з класом string в програмі потрібно включити заголовковий файл string. Клас string є частиною простору імен std, тому ви повинні вказати директиву using або оголошення або ж посилатися на клас як std::string. Визначення класу приховує природу рядка як масиву символів і дозволяє трактувати його як звичайну змінну. У лістингу 7 проілюстровані деякі подібності та відмінності між об'єктами string і символьними масивами:

Приклад виконання програми:

З цього прикладу ви повинні зробити висновок, що у багатьох відношеннях об'єкт string можна використовувати так само, як символьний масив.

  • Об'єкт string можна ініціалізувати рядком у стилі С.

· Щоб зберегти клавіатурний ввід в об'єкті string, можна використовувати СІП.

  • Для відображення об'єкта string можна застосовувати cout.
  • Можна використовувати нотацію масивів для доступу до індивідуальних символам, що зберігаються в об'єкті string.

Головна відмінність між об'єктами string і символьними масивами, продемонстрована в лістингу 7, полягає в тому, що об'єкт string оголошується як звичайна змінна, а не масив:

Проектне рішення, покладене в основу класу, дозволяє програмі автоматично обробляти зміну розміру рядків. Наприклад, оголошення str1 створює об'єкт string нульової довжини, але при читанні введення в str2 програма автоматично його збільшує:

Це робить використання об'єкта string більш зручним і безпечним порівняно з масивом. Концептуально важливим є те, що масив рядків - це колекція одиниць зберігання окремих символів, що служать для збереження рядка, а клас string - єдина сутність, що представляє рядок.

Ініціалізація рядків в С++ 11

Як і можна було очікувати, C++ 11 дозволяє здійснювати спискову ініціалізацію для рядків у стилі С і об'єктів string:

Присвоювання, конкатенація та додавання

Деякі операції з рядками клас string виконує простіше, ніж це можливо у випадку символьних масивів. Наприклад, просто привласнити один масив іншому не можна. Однак один об'єкт string цілком можна присвоїти іншому:

Клас string спрощує комбінування рядків. За допомогою операції + можна скласти два об'єкти string разом, а за допомогою операції += Можна додати рядок до існуючого об'єкту string. Відносно попереднього коду у нас є такі можливості:

У лістингу 8 наведено відповідний приклад. Зверніть увагу, що складати і додавати до об'єктів string можна як інші об'єкти string, так і рядки в стилі С.

Лістинг 8. strtype.cpp

Згадайте, що керуюча послідовність \" представляє подвійні лапки, використовувану як літеральний символ, а не обмежувач рядка. Нижче показано виведення програми з лістингу 8:

Лекція 3

Структури

Припустимо, вам необхідно зберігати інформацію про баскетболіста. Ви хочете зберігати його ім'я, зарплату, зріст, вагу, середню результативність, відсоток влучень, результативних передач і т.п. Вам знадобиться деяка форма даних, яка могла б зберігати всю цю інформацію як єдине ціле. Масив тут не підійде. Хоча масив може зберігати кілька елементів, але всі вони повинні бути одного типу. Тобто один масив може зберігати 20 цілих чисел, інший - 10 чисел з плаваючою точкою, проте масив не може зберігати цілі значення в одних елементах і значення з плаваючою точкою - в інших.

Задовольнити вашу потребу в спільному зберіганні всієї інформації про баскетболіста може структура C++. Структура - більш універсальна форма даних, ніж масив, тому що одна структура може зберігати елементи більш ніж одного типу. Це дозволяє уніфікувати подання даних за рахунок збереження всієї інформації, пов'язаної з баскетболістом, в одній змінній типу структури. Якщо ви хочете відслідковувати інформацію про цілу команду, то можете скористатися масивом структур. Тип структури - це ще й сходинка до підкорення бастіону об'єктно-орієнтованого програмування C++ - класу. Вивчення структур наблизить вас до серця ООП на мові C++.

Структура – це визначений користувачем тип з оголошенням, що описує властивості даних типу. Після визначення типу можна створювати змінні цього типу. Тобто створення структури - процес, що складається з двох частин. Спочатку визначається опис структури, в якому перераховуються і називаються типи даних, що зберігаються в структурі. Потім створюються структурні змінні, або, інакше кажучи, структурні об'єкти даних, які слідують за планом, заданим оголошенням.

Наприклад, припустимо, що компанія Bloataire, Inc. бажає створити тип даних, що описує лінійку її продуктів - різного роду надувних предметів. Зокрема, тип повинен включати найменування продукту, його обсяг в кубічних футах, а також роздрібну ціну. Ось опис структури, що відповідає цим потребам:

Ключове слово struct вказує на те, що цей код визначає план структури. Ідентифікатор inflatable - ім'я, або дескриптор, цієї форми, тобто ім'я нового типу. Таким чином, тепер можна створювати змінні типу inflatable точно так само, як створюються змінні типу char або int. Далі між фігурними дужками знаходиться список типів даних, які міститимуться в структурі. Кожен елемент списку - це оператор оголошення. Тут допускається використовувати будь-які типи C++, включаючи масиви та інші структури. У цьому прикладі застосовується масив char, який підходить для зберігання рядка, потім йде один елемент типу float і один - типу double. Кожен індивідуальний елемент у списку називається членом структури, так що структура inflatable має три члена (мал. 5). Висловлюючись коротко, визначення структури описує характеристики типу - в даному випадку типу inflatable.

Мал. 5. Частини опису структури

Після визначення структури можна створювати змінні цього типу:

Якщо ви знайомі зі структурами в мові С, то відзначите (можливо, із задоволенням), що C++ дозволяє відкинути ключове слово struct при оголошенні структурних змінних:

У C++ дескриптор структури використовується в точності як ім'я фундаментального типу. Ця зміна підкреслює, що оголошення структури визначає новий тип. Крім того, воно виключає пропуск слова struct зі списку причин видачі повідомлень про помилки компілятором.

За умови, що змінна hat має тип inflatable, для доступу до її окремих членів використовується операція належності або членства (.).

Наприклад, hat.volume посилається на член структури з ім’ям volume, a hat.price - на член з ім’ям price. Аналогічно, vincent.price - це член price змінної vincent. Коротше кажучи, імена членів дозволяють посилатися на члени структур майже так само, як індекси - на елементи масивів. Оскільки член price оголошений як double, члени hat.price і vincent.price є еквівалентами змінним типу double і можуть бути використані точно так само, як будь-яка інша змінна типу double. Коротше кажучи, hat є структурою, але hat.price відноситься до типу double. До речі, метод, застосовуваний для доступу до функції-члену класу на кшталт cin.getline() походить від методу доступу до змінних-членів структури, таким як vincent.price.




©2015 studopedya.ru Все права принадлежат авторам размещенных материалов.