- •Міністерство освіти і науки україни
- •Розділ 1. Арифметичні основи обчислювальних машин
- •1.1. Позиційні системи числення. Переведення числа з однієї системи числення в іншу
- •1.2. Форма представлення чисел. Кодування чисел
- •1.3. Арифметичні операції над двійковими числами. Машинні одиниці інформації
- •Контрольні питання
- •Завдання
- •Розділ 2. Основи алгоритмізації обчислювальних процесів
- •2.1. Поняття і властивості алгоритму
- •2.2. Засоби представлення алгоритмів
- •2.3. Типи алгоритмічних процесів. Приклади
- •Контрольні питання
- •Завдання
- •3.1. Загальна характеристика програми
- •3.3. Кроки для створення та виконання програми
- •3.4. Змінні та константи
- •3.5. Директиви препроцесора
- •Контрольні питання
- •Розділ 4. Введення-виведення даних
- •4.1. Об’єкт виведення даних cout
- •4.2. Функція виведення даних printf
- •4.3. Об’єкт введення даних cin
- •4.4. Функція введення даних scanf
- •Контрольні питання
- •5.2. Операції відношення
- •5.3. Логічні операції
- •5.4. Додаткові операції
- •5.5. Порозрядні операції
- •Контрольні питання
- •Завдання Лінійний обчислювальний процес
- •1. Визначити значення функції y
- •2. Геометричні завдання
- •Розгалужений обчислювальний процес
- •1. Визначити значення функції y
- •3. Перевірити, чи міститься точка з заданими координатами усередині заштрихованої області.
- •Розділ 6. Організація циклів
- •6.1. Організація арифметичних циклів з використанням оператору for
- •6.2. Організація ітераційних циклів з передумовою while та післяумовою do...While
- •6.3. Оператори switch та goto
- •Контрольні питання
- •Завдання Арифметичний цикл
- •Вкладені цикли
- •Ітераційний цикл
- •Суміщення розгалуженого та циклічного процесів
- •Розділ 7. Зовнішні пристрої та символьне введення/виведення. Рядкові, числові функції та функції роботи з датою та часом
- •7.1. Загальна концепція та функції символьного введення-виведення
- •7.2. Символьні функції
- •7.3. Рядкові функції
- •7.4. Числові функції
- •7.5. Функції роботи з датою та часом
- •Контрольні питання
- •Завдання
- •Розділ 8. Вказівки, посилання та масиви
- •8.1. Вказівки
- •8.2. Посилання
- •8.3. Одновимірні масиви
- •8.4. Багатовимірні масиви
- •8.5. Символьні масиви
- •Контрольні питання
- •Завдання Одновимірні масиви
- •Двовимірні масиви
- •Розділ 9. Робота з функціями
- •9.1. Засоби створення функцій
- •9.2. Видимість змінних
- •9.3. Параметри функції та передача значень
- •9.4. Передача масивів в якості параметрів функцій
- •9.5. Функції та вказівки
- •9.6. Перевантаження та шаблони функцій
- •Контрольні питання
- •Завдання
- •Розділ 10. Рекурсивне програмування
- •10.1. Основні поняття рекурсії. Визначення факторіалу числа
- •10.2. Приклади рекурсій
- •Контрольні питання
- •Розділ 11. Робота з файлами
- •11.1. Робота з текстовими та бінарними файлами
- •Можливі режими доступу
- •11.2. Довільний доступ у файлах
- •11.3. Файли потокового введення/виведення з використанням структури file.
- •Контрольні питання
- •Завдання
- •Розділ 12. Структури
- •12.1. Загальна характеристика структури
- •12.2. Масиви структур
- •12.3. Використання масивів, як елементів структур
- •3. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:
- •Контрольні питання
- •Завдання
- •Розділ 13. Об’єднання та інші типи даних. Обробка виключних ситуацій
- •13.1. Об’єднання
- •13.2. Перелічені типи даних (enum)
- •13.3. Бітові поля
- •13.4. Обробка виключних ситуацій
- •Контрольні питання
- •Розділ 14. Динамічні структури даних
- •14.1. Стек
- •14.2. Черга
- •14.3. Лінійний список
- •Контрольні питання
- •Завдання
- •Розділ 15. Типові методи сортування масивів
- •15.1. Бульбашкове сортування (bubble sort)
- •15.2. Сортування за допомогою вибору (choice sort)
- •15.3. Сортування вставками (insert sort)
- •15.4. Сортування Шелла
- •15.5. Швидке сортування (quick sort)
- •Контрольні питання
- •Завдання
- •Розділ 16. Чисельне диференціювання та інтегрування
- •16.1. Методи правих та центральних різниць чисельного диференціювання
- •16.2. Методи прямокутників, трапецій, Сімпсона (парабол) чисельного інтегрування
- •Контрольні питання
- •Завдання Чисельне диференціювання
- •Чисельне інтегрування
- •Розділ 17. Чисельні методи розв’язання алгебраїчних рівнянь
- •17.1. Метод половинного ділення (дихотомія)
- •17.2. Метод Ньютона (метод дотичних)
- •17.3. Метод Рибакова
- •Контрольні питання
- •Завдання
- •Розділ 18. Чисельні методи розв’язання системи лінійних алгебраїчних рівнянь
- •18.1. Визначник. Дії над матрицями. Обчислення оберненої матриці
- •18.2. Метод оберненої матриці.
- •18.3. Метод Крамера
- •18.4. Метод Гауса
- •Контрольні питання
- •Завдання
- •1. Розв’язати систему алгебраїчних рівнянь.
- •2. Обчислити добуток матриць.
- •3. Розв’язати матричні рівняння.
- •Список літератури
11.2. Довільний доступ у файлах
Більшість файлів складаються з фіксованого числа записів. Це дозволяє звернутися до будь-якого запису.
Якщо файл створюється та в нього записуються дані, а потім його необхідно скорегувати, тобто виконати операції введення-виведення, необхідно його відкривати таким чином:
fp.open("nam.txt", ios::in | ios::out);
if(!fp)
. . .
У випадку якщо файлу не існує він не буде створюватись та змінна fp буде дорівнювати нулю.
Якщо такі ж дії виконуються з бінарним файлом, тоді
fp.open("nam.txt",ios::in|ios::out|ios::binary);
. . .
Використання функції seekg().
Ця функція забезпечує зчитування даних, починаючи з будь-якого місця файлу.
Формат:
fs_obj. seekg(long_num, origin);
long_num – число байтів у файлі, які треба пропустити, тобто зчитування або запис даних виконується з заданої позиції.
Оскільки файли даних мають великий розмір, необхідно оголосити long_num з типом long int.
origin – є значенням, що повідомляє С++, звідки необхідно почати пропускати байти, зазначені в long_num. Ця змінна може приймати одне з трьох значень:
Режим |
Опис |
іos::beg іos::cur ios::end |
Початок файла Поточна позиція курсору Кінець файла |
Індикатори режиму ios::beg, ios::cur, ios::end визначені в файлі <iostream>
Для того щоб визначити поточну позицію курсору в файлі використовується функція tellg(), яка повертає значення типу long.
Приклад 1.
Файл читається двічі, перший раз для виведення на екран, другий - на принтер.
#include <iostream>
#include <fstream>
using namespace std;
ifstream in_file;
ofstream scr;
ofstream prn;
void main()
{
char in_char;
in_file.open("name.txt", ios::in);
if(!in_file)
{
cout << "\nПомилка відкриття файлу\n";
exit(0);
}
scr.open("CON", ios::out);
while(in_file.get(in_char))
scr << in_char;
scr.close();
in_file.clear();
in_file.seekg(0L, ios::beg);
prn.open("LPT1", ios::out);
while(in_file.get(in_char))
prn << in_char;
prn.close();
}
Після виведення вмісту файлу на екран дисплею ("CON") вказівка переводиться на кінець файлу та виникає біт помилки ios::eofbit, що дорівнює 1. Для того щоб продовжити роботу з файлом потоку, необхідно скинути цей біт. Робиться це за допомогою функції clear(), яка скидує всі біти помилок файлового потоку.
Приклад 2.
Замінити літери i та q, що займають у тексті файлу 9 і 17 позиції на букву X.
#include <fstream>
using namespace std;
fstream fp;
void main()
{
char ch;
fp.open("alph.txt", ios::out);
for(ch = 'a'; ch <= 'z'; ch++)
fp << ch;
fp.seekg(8L, ios::beg);
fp << 'X';
fp.seekg(16L, ios::beg);
fp << 'X';
fp.close();
}
Вміст файлу alph.txt буде виглядати наступним чином:
abcdefghXjklmnopXrstuvwxyz
Приклад 3.
Прочитати файл alph.txt із попереднього прикладу і вивести на екран в зворотньому порядку.
#include <iostream>
#include <fstream>
using namespace std;
ifstream fp;
void main()
{
int ctr;
char inchar;
fp.open("alph.txt", ios::in);
fp.seekg(-1L, ios::end);
for(ctr = 0; ctr <= 25; ctr++)
{
fp >> inchar;
fp.seekg(-2L, ios::cur);
cout << inchar;
}
fp.close();
}
Результат виконання програми:
zyxwvutsrXponmlkjXhgfedcba
Використання додаткових функцій роботи з файлами.
read(char* array, int count) – зчитує кількість байтів, визначуваних у count в масив array.
write(char* array, int count) – записує масив із кількістю даних count у файл.
int remove(char* filename) – видаляє файл з ім’ям filename.
Приклади програм роботи з файлами
Приклад 1. Записати масив у файл ot.txt, прочитати його і вивести на екран.
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
int i;
int mas[10] = {1,20,300,4,50,600,7,80,900,10};
int vix[10];
fstream file;
file.open("ot.txt", ios::out|ios::binary);
file.write((char*)mas,sizeof(mas));
file.close();
file.open("ot.txt", ios::in|ios::binary);
file.read((char*)vix,sizeof(vix));
file.close();
for (i = 0; i < 10; i++)
cout << vix[i] << " ";
}
Для запису масиву до файлу використовується функція write, якій треба передати вказівку типу (char*) та кількість байтів, які треба записати у бінарному режимі. Отже, вказівку масиву mas треба привести до типу вказівки (char*), а у якості кількості байтів передати sizeof(mas) (40 байтів). Зчитування відбувається аналогічним чином з використанням функції read.
Приклад 2. Записати масив у файл ot.txt, прочитати елемент масиву з заданим номером і вивести на екран.
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
int n_el,zn_el;
int mas[10] = {100,200,3,4,5,6,700,8,9,10};
fstream file;
file.open("ot.txt", ios::out|ios::binary);
file.write((char*)mas,sizeof(mas));
file.close();
cout << "Введіть номер елемента -> ";
cin >> n_el;
n_el *= sizeof(zn_el);
file.open("ot.txt", ios::in|ios::binary);
file.seekg(n_el, ios::beg);
file.read((char*)&zn_el,sizeof(zn_el));
cout <<"\n" << zn_el;
file.close();
}
Приклад 3. Записати масив по рядкам у файл ot.txt, прочитати і вивести на екран кожний рядок.
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
int i;
char *mas[3]={"Сидоров","Петров","Іванов"};
fstream file;
file.open("ot.txt", ios::out);
for (i = 0; i < 3; i++)
file<< mas[i] << "\n";
file.close();
char st[100];
file.open("ot.txt", ios::in);
file.seekg(0L, ios::beg);
for (i = 0; i < 3; i++)
{
file.getline(st, 100);
cout << st << "\n";
}
file.close();
}