За замовчуванням усі файли відкриваються в текстовому режимі
Щоб закрити файл, використовується функція-член close (). 11.4. Зразок виконання роботи Завдання. Потрібно розробити програму, яка визначає, скільки разів трапилося задане слово в текстовому файлі. Текст не містить перенесень слів. Максимальна довжина рядка у файлі невідома. Визначимо слово в тексті як послідовність алфавітно-цифрових символів, після яких слідує або знак пунктуації, або роздільник. Як роздільники можуть виступати один або декілька пропусків, один або декілька символів табуляції '\t' і символ кінця рядка '\n'. Для зберігання заданого слова (воно вводиться з клавіатури) визначимо змінну word типу string. Оскільки максимальна довжина рядка у файлі невідома, читатимемо файл послівно, розміщуючи чергове прочитане слово в змінній curword типу string. Таке читання можна реалізувати за допомогою операції > >, яка у разі операнда типу string ігнорує всі роздільники, що передують поточному слову, і прочитує символи поточного слова в змінну curword, доки не трапиться черговий роздільник. Очевидно, що " пізнання" поточного слова повинне здійснюватися з урахуванням можливої наявності після нього одного із знаків пунктуації. Для вирішення цього завдання визначимо глобальну функцію bool equal(const string & cw, const string & w); яка повертає значення true, якщо поточне слово cw співпадає із заданим словом w з точністю до знаку пунктуації, або false – інакше. Маючи таку функцію, дуже просто скласти алгоритм основного циклу: ● прочитати чергове слово; ● якщо воно співпадає із заданим словом w (з точністю до знаку пунктуації), то збільшити на одиницю значення лічильника count. Зверніть увагу на реалізацію функції equal() і, зокрема, на використання операції складання для додавання в кінець рядка w одного із знаків пунктуації. #include " stdafx.h" #include < fstream> #include < string> #include < iostream> #include < conio.h> #include < stdlib.h>
using namespace std;
bool equal(const string& cw, const string& w) { char punct[] ={'.', ', ', '? ', '! '};
if(cw == w) return true; for(int i = 0; i< sizeof(punct); ++i) if(cw ==w+punct[i]) return true; return false; }
int main() { string word, curword; setlocale(LC_ALL, " Ukrainian"); cout < < " Введiть слово для пошуку: "; cin > > word; ifstream fin(" infile.txt", ios:: in); if(! fin) { cout < < " Помилка вiдкриття файлу." < < endl; return 1; }
int count = 0; while(! fin.eof()) { fin > > curword; if(equal(curword, word)) count++; } cout < < " Кiлькiсть входжень слова: " < < count < < endl; cout< < " Натиснiть будь-яку клавiшу! "; while(! kbhit());
}
Рис. 1. Реалізація програми і вміст текстового файлу, з якого зчитувалась інформація 11.5. Індивідуальні завдання Варіант 1. Потрібно розробити програму, яка прочитує з текстового файлу три речення і виводить їх в зворотному порядку. Варіант 2. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки речення, що містять задане з клавіатури слово. Варіант 3. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки рядки, що містять двозначні числа. Варіант 4. Потрібно розробити програму, яка прочитує англійський текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран слова, що починаються з голосних букв. Варіант 5. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить його на екран, міняючи місцями кожні два сусідні слова. Варіант 6. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки речення, що не містять ком. Варіант 7. Потрібно розробити програму, яка зчитує текст з файлу і визначає, скільки в ньому слів, що складаються не більше ніж з чотирьох букв. Варіант 8. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки цитати, тобто речення, поміщені в лапки. Варіант 9. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки речення, що складаються із заданої кількості слів. Варіант 10. Потрібно розробити програму, яка прочитує англійський текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран слова тексту, що починаються з голосних букв і закінчуються голосними буквами. Варіант 11. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки рядки, що не містять двозначні числа. Варіант 12. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран тільки речення, що починаються з тире, перед яким можуть слідувати тільки пробільні символи. Варіант 13. Потрібно розробити програму, яка прочитує англійський текст з файлу, що знаходиться на диску у певному каталозі, і виводить його на екран, замінивши кожну першу букву слів, що починаються з голосної букви, на прописну. Варіант 14. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить його на екран, замінивши цифри від 0 до 9 на слова " нуль", " один"... " дев'ять", починаючи кожне речення з нового рядка. Варіант 15. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, знаходить щонайдовше слово і визначає, скільки разів воно трапилося в тексті. Варіант 16. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран спочатку питальні, а потім окличні речення. Варіант 17. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить його на екран, після кожного речення додаючи, скільки разів трапилося в ньому задане з клавіатури слово. Варіант 18. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран все його речення в зворотному порядку. Варіант 19. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран спочатку речення, що починаються з однобуквених слів, а потім всі інші. Варіант 20. Потрібно розробити програму, яка зчитує текст з файлу, що знаходиться на диску у певному каталозі, і виводить на екран речення, що містять максимальну кількість знаків пунктуації. 11.6. Контрольні запитання 1. Як відбувається зв’язування і відокремлення потоку з файлом? 2. Який потік необхідно відкрити для роботи з файловими операціями? 3. Яка функція використовується для відкриття і закриття файлу і які параметри вона має? 4. В якому режимі відкриваються файли за замовчуванням? 5. Як перевірити чи відкритий потік і файл? 6. Яка функція використовується для отримання кількості зчитаних символів за останню операцію? 7. Як працює оператор > > при зчитуванні рядків? 8. Яка різниця між функцією get() i getline()? 9. Яка функція використовується для запису вмісту файлових буферів на диск і як вона працює? 10. Як можна перевірити статус введення-виведення? 11. Які функції використовуються для отримання доступу до вмісту файлу в довільному порядку (не послідовно байт за байтом)? Лабораторна робота №12. Стандартна бібліотека шаблонів STL, контейнери та ітератори МЕТА РОБОТИ: засвоїти технологію узагальненого об’єктного програмування з використанням бібліотеки стандартних шаблонів (STL) мови C++ для роботи з вбудованими і користувацькими типами даних. 12.1. Програма роботи 12.1.1. Отримати завдання. 12.1.2. Написати програми відповідних класів, основну та відповідні допоміжні функції, згідно з вказівками до виконання роботи. 12.1.3. Підготувати власні коректні вхідні дані (вказати їх формат і значення) і проаналізувати їх. 12.1.4. Оформити електронний звіт про роботу та захистити її. 12.2. Вказівки до виконання роботи 12.2.1. Студент, згідно з індивідуальним номером, вибирає своє завдання з розд. 12.5 і записує його до звіту. 12.2.2. Оголошення класу (структури), основну та відповідні допоміжні функції необхідно запрограмувати так, як це показано у розд. 12.4. 12.2.3. Власних вхідних даних необхідно підготувати не менше двох комплектів. Їхні значення мають бути коректними, знаходитися в розумних межах і відповідати тим умовам, які стосуються індивідуального завдання. 12.2.4. Звіт має містити такі розділи: ● мету роботи та завдання з записаною умовою задачі; ● коди всіх використовуваних.h і.ccp файлів, а також пояснення до них; ● результати реалізації програми; ● діаграма класів і варіантів використання; · висновки, в яких наводиться призначення програми, обмеження на її застосування і можливі варіанти удосконалення, якщо такі є. 12.3. Теоретичні відомості STL забезпечує загальцільові, стандартні класи й функції, які реалізують найбільш популярні й широко використовувані алгоритми й структури даних. STL будується на основі шаблонів класів, і тому вхідні в неї алгоритми й структури застосовні майже до всіх типів даних. Склад STL. Ядро бібліотеки утворять три елементи: контейнери, алгоритми й і тератори. Контейнери (containers) – це об'єкти, призначені для зберігання інших елементів. Наприклад, вектор, лінійний список, множина. Асоціативні контейнери (associative containers) дозволяють за допомогою ключів отримати швидкий доступ до значень, що зберігаються в них. У кожному класі-контейнері визначений набір функцій для роботи з ними. Наприклад, список містить функції для вставки, видалення й злиття елементів. Ітератори (iterators) – це об'єкти, які стосовно контейнера відіграють роль покажчиків. Вони дозволяють одержати доступ до вмісту контейнера приблизно так само, як покажчики використовуються для доступу до елементів масиву. З ітераторами можна працювати так само, як з вказівниками. До них можна застосувати операції *, инкремента, декремента. Типом ітератора оголошується тип iterator, що визначений у різних контейнерах.
Існує п'ять типів ітераторів: 1. Ітератори введення (input_iterator) підтримують операції рівності, разыменования й инкремента. ==,! =, *i, ++i, i++, *i++ Спеціальним випадком ітератора введення є istream_iterator. 2. Ітератори виведення (output_iterator) підтримують операції разыменования, припустимі тільки з лівої сторони присвоювання, і инкремента. ++i, i++, *i=t, *i++=t Спеціальним випадком ітератора виводу є ostream_iterator. 3. Односпрямовані Ітератори (forward_iterator) підтримують всі операції ітераторів уведення/виводу й, крім того, дозволяють без обмеження застосовувати присвоювання. ==,! =, =, *i, ++i, i++, *i++ 4. Двонаправлені Ітератори (biderectional_iterator) мають всі властивості forward-ітераторів, а також мають додаткову операцію декремента (--i, i--, *i--), що дозволяє їм проходити контейнер в обох напрямках. 5. Ітератори довільного доступу (random_access_iterator) мають всі властивості biderectional-ітераторів, а також підтримують операції порівняння й адресної арифметики, тобто безпосередній доступ по індексі. i+=n, i+n, i-=n, i-n, i1-i2, i[n], i1< i2, i1< =i2, i1> i2, i1> =i2 В STL також підтримуються зворотні Ітератори (reverse iterators). Зворотними ітераторами можуть бути або двонаправлені Ітератори, або Ітератори довільного доступу, але мають послідовність у зворотному напрямку. На додачу до контейнерів, алгоритмів та ітераторів в STL підтримується ще кілька стандартних компонентів. Головними серед них є розподільники пам'яті, предикати й функції порівняння. У кожного контейнера є визначений для нього розподільник пам'яті (allocator), що управляє процесом виділення пам'яті для контейнера. За замовчуванням розподільником пам'яті є об'єкт класу allocator. Можна визначити власний розподільник. У деяких алгоритмах і контейнерах використовується функція особливого типу, називана предикатом. Предикат може бути унарним і бінарним. Значення, що повертає: істина або неправда. Точні умови одержання того або іншого значення визначаються програмістом. Тип унарних предикатів UnPred, бінарних – BinPred. Тип аргументів відповідає типу об'єктів, що зберігаються в контейнері. Визначено спеціальний тип бінарного предиката для порівняння двох елементів. Він називається функцією порівняння (comparison function). Функція повертає істину, якщо перший елемент менше другого. Типом функції є тип Comp. Особливу роль в STL грають об'єкти-функції. Об'єкти-функції (це екземпляри класу, у якому визначена операція «круглі дужки» (). У ряді випадків зручно замінити функцію на об'єкт-функцію. Коли об'єкт-функція використовується як функція, то для її виклику використовується operator (). Класи-контейнери. В STL визначені два типи контейнерів: послідовності й асоціативні. Ключова ідея для стандартних контейнерів укладається в тім, що коли це представляється розумним, вони повинні бути логічно взаємозамінними. Користувач може вибирати між ними, ґрунтуючись на міркуваннях ефективності й потреби в спеціалізованих операціях. Наприклад, якщо часто потрібен пошук по ключу, можна скористатися map (асоціативним масивом). З іншого боку, якщо переважають операції, характерні для списків, можна скористатися контейнером list. Якщо додавання й видалення елементів часто проводиться в кінці контейнера, варто подумати про використання черги queue, черги із двома кінцями deque, стека stack. За замовчуванням користувач повинен використати vector; він реалізований, щоб добре працювати для самого широкого діапазону завдань. Ідея обігу з різними видами контейнерів і, у загальному випадку, з усіма видами джерел інформації – уніфікованим способом веде до поняття узагальненого програмування. Для підтримки цієї ідеї STL містить множина узагальнених алгоритмів. Такі алгоритми рятують програміста від необхідності знати подробиці окремих контейнерів. В STL визначені наступні класи-контейнери (у кутових дужках зазначені заголовні файли, де визначені ці класи):
|