Файл: Методические указания по выполнению лабораторных работ Для обучающихся (очная форма обучения) по направлению подготовки 09. 03. 03 Прикладная информатика.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 141
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
2.
Метод хорд работает аналогично методу половинного деления, но отрезок [a, b] делится точкой с не пополам. Проведём хорду АВ, где А(а, f(a)), B(b, f(b)), а точка С(с, 0) получается при пересечении этой хорды с осью абсцисс. Формулу для с вывести нетрудно, используя уравнение прямой АВ и подставив в него у =0
Вариант 2
1. Описать рекурсивную функцию Root(a, b,
), которая методом деления отрезка пополам находит с точностью
корень уравнения f(x) = 0 на отрезке [а, b] (считать, что
> 0, а < b, f(a) · f(b) < 0 и f(x)- непрерывная и монотонная на отрезке [а, b]).
2. Составить программу вычисления наибольшего общего делителя двух натуральных чисел.
Вариант 3
1. Составить рекурсивную функцию для перевода данного натурального числа в
р-ичную систему счисления (2
р
9).
2. Последовательность многочленов определяется рекуррентными соотношениями: Т
0
(x) =
1,
Т
1
(x) = x,
Т
n
(x) = 2хТ
n-1
(x) – Т
n-2
(x).
Написать рекурсивную функцию, вычисляющую Т
n
(x)
Вариант 4
1.
Описать рекурсивную функцию hord(a, b,
), которая методом хорд находит с точностью
корень уравнения f(x) = 0 на отрезке [а, b] (считать, что
> 0, а < b, f(a) · f(b) < 0 и f(x)
– непрерывная и монотонная на отрезке [а, b]). Метод хорд работает аналогично методу половинного деления, но отрезок [a, b] делится точкой с не пополам. Проведём хорду АВ, где
А(а, f(a)), B(b, f(b)), а точка С(с, 0) получается при пересечении этой хорды с осью абсцисс.
Формулу для с вывести нетрудно, используя уравнение прямой АВ и подставив в него у =0.
2. Возьмём целое число 16. Разделим на 4, получим 4. Опять разделим на 4, получим 1. Если складывать промежуточные результаты подобных операций, то сумма стремится к определённому числу. Написать подпрограмму получения суммы для любого целого числа N.
Вариант 5
1. Составить рекурсивную функцию для перевода данного натурального числа в
р-ичную систему счисления (2
р
9).
2. Составить программу нахождения числа, которое образуется из данного натурального числа при записи его цифр в обратном порядке. Например, для числа 1234 получаем ответ 4321.
66
Вариант 6
1. Дана символьная строка, представляющая собой запись натурального числа в
р-ичной системе счисления (2
р
9). Составить программу перевода этого числа в десятичную систему счисления
2. Составить программу нахождения числа, которое образуется из данного натурального числа при записи его цифр в обратном порядке. Например, для числа 1234 получаем ответ 4321.
Вариант 7
1. Найдите сумму цифр заданного натурального числа.
2. Написать рекурсивную функцию для вычисления N-го числа Фибоначчи.
Вариант 8
1
. Подсчитать количество цифр в заданном натуральном числе.
2. Составить программу вычисления суммы: 2! + 4! + … + n! (n
20, n - четное).
Вариант 9
1.
Вычислить элементы последовательности, определенной следующим образом: a(1) = 1, a(n) = n – a(a(n-1)), n>1 2. Написать рекурсивную функцию нахождения цифрового корня натурального числа (число от 1 до 9). Для нахождения цифрового корня необходимо сложить все цифры числа. Если полученное число не является однозначным, процесс продолжается.
Вариант 10
1.
Написать рекурсивную процедуру для вычисления значений полинома
Лежандра порядка n в точке x. Полиномы Лежандра определяются следующим образом:
P
0
(x) = 1,
P
1
(x) = x,
P
n
(x) = ((2n – 1)P
n-1
(x) – (n-1)P
n-2
(x)) /n,
2. Написать рекурсивную функцию нахождения цифрового корня натурального числа (число от 1 до 9). Для нахождения цифрового корня необходимо сложить все цифры числа. Если полученное число не является однозначным, процесс продолжается
Контрольные вопросы:
1.
Рекурсивные функции?
2.
Пример, определение факториала, в виде рекурсивной функции?
3.
Базовый вариант рекурсивной функции?
4.
Факториал(5) цепь вызовов?
5.
Приме рекурсивной функции, число Фибоначчи?
67
Лабораторная работа №1.11
ФАЙЛОВЫЕ ПОТОКИ
Цель работы: получить практические навыки написания и отладки программ с файловыми потоками.
1.
Краткая теория
Файл – это поименованная порция информации. Файлы необходимы для долговременного хранения данных (и программ), и являются самой простой формой связи между программами: файл, записанный одной программой, может прочитать другая программа.
Использование файлов в программе возможно только при выполнении следующих операций:
создание потока;
открытие файла и связывание его с потоком;
обмен (ввод/вывод) закрытие файла;
уничтожение потока.
Файловый поток является обычной переменной в программе, которая имеет область видимости и время жизни в соответствии с объявлением. Эта переменная не имеет никакого отношения к файлам на диске — необходимо как-то указать, что объявленная переменная связана с некоторым файлом. Эта связь осуществляется по имени файла либо при создании потока, либо при открытии файла.
Если после выполнения некоторой операции поток находится в состоянии good, то это хорошая ситуация: во время предыдущей операции не произошло никаких непредвиденных событий и может быть выполнена следующая операции ввода/вывода. В остальных случаях следующая операция выполнена не будет. Состояние eof может возникнуть только при операции чтения. Для стандартного потока ввода это состояние возникает при вводе комбинации клавиш+.
Текстовые и двоичные файлы
Текстовые файлы отличаются двумя свойствами: 1. файлы делятся на строки, и конец строки отмечается специальным символом «new line» (новая строка), роль которого
68 в системе ввода/вывода С++ играет ‘\n’; 2. при вводе чисел выполняется преобразование из символьного вида во внутренний формат (вспомните функцию atoi); при выводе чисел — из внутреннего формата в символьный; Двоичные файлы на строки не делятся, и при вводе/выводе никаких преобразований не делается. При операции записи в двоичный файл попадает ровно столько байтов, сколько записываемый объект занимает в памяти.
Например, целое число, записанное в двоичный файл, займет на диске sizeof(int) байтов.
Для ввода и вывода в бинарный файл мы можем воспользоваться методами read/write
Произвольный доступ к файлам
Суть произвольного доступа заключается в том, что мы можем произвольно перемещать указатель чтения/записи по файлу не перечитывая все промежуточные данные.
Для этого имеется набор методов для потоков чтения и записи, где суффикс g означает
«get», а суффикс p - «put». Методы произвольного доступа в потоке
Таблица 1.
Методы произвольного доступа в потоке
Класс
Метод
Действие
ifstream seekg(pos)
Устанавливает текущую позицию чтения в pos seekg(offs, org)
Перемещает текущую позицию чтения на offs байтов, отсчитывая от одной из трех позиций org: ios::beg, ios::cur, ios::end tellg()
Возвращает текущую позицию чтения потока ofstream seekp(pos)
Устанавливает текущую позицию записи в pos seekp(offs, org)
Перемещает текущую позицию записи на offs байтов, отсчитывая от одной из трех позиций org tellp()
Возвращает текущую позицию записи в поток
2.
Методические указания
Написать программу, последовательно выполняющую перечисленные ниже задачи.
Предусмотреть печать приглашения на ввод (строки, поясняющей пользователю, какие действия от него ждет программа) и информативный вывод данных.
Задание 1. Сформировать последовательность чисел. Длина последовательности чисел задается пользователем. Последовательность генерируется случайным образом или вводится с клавиатуры по желанию пользователя. При вводе или генерации
69 последовательность записать в файл Input.txt.
Задание длины последовательности выполнить в отдельной функции с проверкой допустимости значения. Для заполнения файла создать перегруженные функции-предикаты (типа bool). Результат функции: 1 — файл создан, 0 — файл не создан. Параметр функции для ввода с клавиатуры: n - длина последовательности, символьный массив с именем файла Параметры функции для заполнения случайными числами: символьный массив с именем файла, n - длина последовательности; a, b — диапазон чисел. Задание 2 выполняется, если создание файла прошло успешно.
Задание 2. Вывести созданный файл на экран. В качестве параметра функции использовать символьный массив, например, void Print_f (char Name[]). Пример вызова функции:
Print_f(“Input.txt”).
Задание 3. Выполнить индивидуальное задание согласно выданному варианту. Данные из текстового файла записать в бинарный файл.
Для выполнения задания 3 создать функцию, возвращающую количество элементов файла
Output.txt или -0, если файл не создался. Параметры функции – входной и выходной потоки
Задание 4. Написать функцию для вывода бинарного файла на экран. В качестве параметра функции использовать символьный массив.
3. Задания для самостоятельного решения
Вариант 1. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле g те компоненты файла f, которые являются четными.
Вариант 2. Записать в файл f 100 натуральных чисел, полученных с помощью генератора случайных чисел. Получить в файле g все компоненты файла f, которые являются простыми числами.
Вариант 3. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле g все компоненты файла f, которые делятся на m и не делятся на n (числа m и n вводятся с клавиатуры).
Вариант 4. Записать в файл N целых чисел, полученных с помощью генератора случайных чисел. Подсчитать количество пар противоположных чисел среди компонент этого файла.
Вариант 5. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Из файла f получить файл g, исключив повторные вхождения чисел.
Вывести файл g на экран.
Вариант 6. Записать в файл N произвольных натуральных чисел. Переписать в другой файл те элементы, которые кратны k. Вывести полученный файл на экран.
Вариант 7. Заполнить файл N действительными числами, полученными с помощью генератора случайных чисел. Найти сумму минимального и максимального элементов этого файла.
Вариант 8. Заполнить файл f целыми числами, полученными с помощью генератора
70 случайных чисел. Найти количество удвоенных нечетных чисел среди компонент файла.
Вариант 9. Записать в файл f N натуральных чисел. Получить в другом файле все компоненты файла f, кроме тех, которые кратны k. Вывести полученный файл на экран.
Вариант 10. Записать в файл f N целых чисел, полученных с помощью генератора случайных чисел. Заполнить файл g числами, которые являются произведениями соседних компонент файла f.
Вариант 11. Заполнить файл f натуральными числами, полученными с помощью генератора случайных чисел. Найти количество квадратов нечетных чисел среди компонент.
Вариант 12. Записать в файл прямого доступа N действительных чисел. Найти наибольшее из значений модулей компонент с нечетными номерами.
Вариант 13. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Из файла f получить файл g, исключив повторные вхождения чисел.
Порядок следования чисел сохранить.
Вариант 14. Записать в файл N действительных чисел. Найти разность первой и последней компонент файла.
Вариант 15. Заполнить файл f натуральными числами, полученными с помощью генератора случайных чисел. Найти среди компонент квадраты четных чисел.
Вариант 16. Записать в файл последовательного f доступа n первых натуральных четных чисел. Создать новый файл из тех компонент исходного файла, сумма цифр которых больше четырех, но меньше девяти.
Контрольные вопросы:
1. Файлы это?
2. Операции при использовании файлов в программе?
3. Файловый поток?
4. Выполнение некоторой операции good?
5. Состояние eof?
6. Текстовые файлы?
7. Двоичные файлы?
8. Произвольный доступ к файлам?
71
Лабораторная работа № 1.12
ОБРАБОТКА ТЕКСТОВОЙ ИНФОРМАЦИИ
Цель работы: получить практические навыки написания и отладки программ с классом string.
1.
Краткая теория
Потоковый ввод/вывод дисковых файлов
Для работы с дисковыми файлами необходимо подключение заголовочного файла , содержащего наборы специальных классов: ifstream - для ввода, ofstream - для вывода, fstream - для чтения и записи данных в один и тот же файл. Чтобы получить возможность работать с дисковым файлом, нужно открыть его с указанием режима доступа, который определяется значением константы open-mode класса ios. Режим доступа Стандарт
Действие app нет открывает файл для до записи ate(atend) да при открытии файла устанавливает файловый указатель на конец файла binary(bin) да открыть файл в двоичном представлении in да открыть файл для чтения (ввода) nocreate нет если файл не существует, то новый файл не создается Режим доступа Стандарт Действие noreplace нет если файл уже существует, файл не перезаписывается out да открыть файл для записи (вывода) trunc нет
Открывает и усекает существующий файл. Новая информация замещает существующую
Текстовые файлы Создание и запись. Для создания текстового файла определяют объект класса ofstream и передают конструктору класса имя дискового файла в качестве первого параметра и режим доступа в качестве второго параметра: ofstream out_file(“Out.txt”, ios::out); Можно объявить константу, определяющую режим открытия файла, например: const ios::open_mode=ios::out | ios::app; После того, как предпринималась попытка открыть файл, следует убедиться в том, что файл открыт и готов для записи (или перезаписи): if (! out_file) { cerr<<”Error: unable to write to out.txt”<<="" textarea="">
При работе с текстовыми файлами наиболее часто встречаются четыре действия: посимвольное чтение посимвольная запись построчное чтение построчная запись
Посимвольное чтение текста. Функция get(), которая является методом istream, применяется для посимвольного чтения текстового файла (см. примеры 1,2).
Пример 1. Посимвольное чтение файла и вывод его на экран.
# include
# include using namespace std; int main()
{ char sym; ifstream in_file (“Input_file.txt”, ios::in); if (! in_file) { cerr<<”Error input file”< } while (in_file) { in_file.get(sym); cout< } cout<}
Посимвольная запись текста.
Функция put(), которая является методом ostream, позволяет осуществлять посимвольную запись данных в текстовый файл.
72
Пример 2.
# include
# include
# include using namespace std; void main()
{ string guote = “Зорко одно лишь сердце. Самого главного глазами не увидишь. А. де Сент
Экзюпери”; ofstream out_file (“Out_file.txt”, ios::out); if (! out_file) { cerr<<”Error output file”< } for (int i=0; i}
Построчное чтение файла
Обычно построчное чтение и запись файлов работают быстрее посимвольных действий. Для чтения строки из файла воспользуемся функцией getline(), которая является методом класса ifstream. Функция читает строку (в том числе и разделители), пока не встретит символ новой строки ‘\n’, помещая ее в буфер (первый аргумент функции).
Максимальный размер буфера задается как второй аргумент функции (см. пример 3).
Пример 3. Максимальный размер буфера задается как второй аргумент функции
# include
# include using namespace std; void main()
{ const int LEN=80; char BUF[LEN]; ifstream in_file (“Input_file.txt”, ios::in); if (! in_file) { cerr<<”Error input file”<} while (in_file) { in_file.getline(BUF,LEN); cout<}
}
Построчная запись текста
Записываемые строки являются не объектами класса string, а строками типа *char, завершающимися символом ‘\n’. Признак конца файла Признак конца файла приходится искать в файлах, открытых для чтения. Этот признак устанавливается в тот момент, когда в файле не осталось больше данных, которые можно считать. Признак конца файла анализируется в выражении вида while (! In_file.eof()) { … } Для этой цели нельзя пользоваться циклом do { … } while (! In_file.eof()), поскольку файл может оказаться пустым. Однако проверка на конец файла не анализирует ошибки, которые могут встретиться в процессе чтения файла. Для проверки как конца файла, так и наличия ошибок при его чтении пользуются условием выхода из цикла: while (In_file.good()) { … } Оператор цикла while (In_file) { … } выполняется до тех пор, пока нет ошибок, в том числе и конца файла (EOF). Имена файлов и аргументы командной строки
73
Пример 4. Подстрочная запись текста
# include
# include
# include using namespace std; void main()
{ ofstream out_file (“Out_file.txt”, ios::out); if (! out_file) { cerr<<”Error output file”<} out_file<<”Я не знаю, где встретиться\n”; out_file<<”Нам придется с тобой,\n”; out_file<<”Глобус крутится-вертится,\n”; out_file<<”Словно шар голубой\n”;
}
В приведенных выше примерах были использованы файлы с фиксированными именами.
Однако более удобны программы, в которых имена файлов для чтения или записи можно ввести с клавиатуры или задать в качестве аргументов командной строки.
Метод хорд работает аналогично методу половинного деления, но отрезок [a, b] делится точкой с не пополам. Проведём хорду АВ, где А(а, f(a)), B(b, f(b)), а точка С(с, 0) получается при пересечении этой хорды с осью абсцисс. Формулу для с вывести нетрудно, используя уравнение прямой АВ и подставив в него у =0
Вариант 2
1. Описать рекурсивную функцию Root(a, b,
), которая методом деления отрезка пополам находит с точностью
корень уравнения f(x) = 0 на отрезке [а, b] (считать, что
> 0, а < b, f(a) · f(b) < 0 и f(x)- непрерывная и монотонная на отрезке [а, b]).
2. Составить программу вычисления наибольшего общего делителя двух натуральных чисел.
Вариант 3
1. Составить рекурсивную функцию для перевода данного натурального числа в
р-ичную систему счисления (2
р
9).
2. Последовательность многочленов определяется рекуррентными соотношениями: Т
0
(x) =
1,
Т
1
(x) = x,
Т
n
(x) = 2хТ
n-1
(x) – Т
n-2
(x).
Написать рекурсивную функцию, вычисляющую Т
n
(x)
Вариант 4
1.
Описать рекурсивную функцию hord(a, b,
), которая методом хорд находит с точностью
корень уравнения f(x) = 0 на отрезке [а, b] (считать, что
> 0, а < b, f(a) · f(b) < 0 и f(x)
– непрерывная и монотонная на отрезке [а, b]). Метод хорд работает аналогично методу половинного деления, но отрезок [a, b] делится точкой с не пополам. Проведём хорду АВ, где
А(а, f(a)), B(b, f(b)), а точка С(с, 0) получается при пересечении этой хорды с осью абсцисс.
Формулу для с вывести нетрудно, используя уравнение прямой АВ и подставив в него у =0.
2. Возьмём целое число 16. Разделим на 4, получим 4. Опять разделим на 4, получим 1. Если складывать промежуточные результаты подобных операций, то сумма стремится к определённому числу. Написать подпрограмму получения суммы для любого целого числа N.
Вариант 5
1. Составить рекурсивную функцию для перевода данного натурального числа в
р-ичную систему счисления (2
р
9).
2. Составить программу нахождения числа, которое образуется из данного натурального числа при записи его цифр в обратном порядке. Например, для числа 1234 получаем ответ 4321.
66
Вариант 6
1. Дана символьная строка, представляющая собой запись натурального числа в
р-ичной системе счисления (2
р
9). Составить программу перевода этого числа в десятичную систему счисления
2. Составить программу нахождения числа, которое образуется из данного натурального числа при записи его цифр в обратном порядке. Например, для числа 1234 получаем ответ 4321.
Вариант 7
1. Найдите сумму цифр заданного натурального числа.
2. Написать рекурсивную функцию для вычисления N-го числа Фибоначчи.
Вариант 8
1
. Подсчитать количество цифр в заданном натуральном числе.
2. Составить программу вычисления суммы: 2! + 4! + … + n! (n
20, n - четное).
Вариант 9
1.
Вычислить элементы последовательности, определенной следующим образом: a(1) = 1, a(n) = n – a(a(n-1)), n>1 2. Написать рекурсивную функцию нахождения цифрового корня натурального числа (число от 1 до 9). Для нахождения цифрового корня необходимо сложить все цифры числа. Если полученное число не является однозначным, процесс продолжается.
Вариант 10
1.
Написать рекурсивную процедуру для вычисления значений полинома
Лежандра порядка n в точке x. Полиномы Лежандра определяются следующим образом:
P
0
(x) = 1,
P
1
(x) = x,
P
n
(x) = ((2n – 1)P
n-1
(x) – (n-1)P
n-2
(x)) /n,
2. Написать рекурсивную функцию нахождения цифрового корня натурального числа (число от 1 до 9). Для нахождения цифрового корня необходимо сложить все цифры числа. Если полученное число не является однозначным, процесс продолжается
Контрольные вопросы:
1.
Рекурсивные функции?
2.
Пример, определение факториала, в виде рекурсивной функции?
3.
Базовый вариант рекурсивной функции?
4.
Факториал(5) цепь вызовов?
5.
Приме рекурсивной функции, число Фибоначчи?
67
Лабораторная работа №1.11
ФАЙЛОВЫЕ ПОТОКИ
Цель работы: получить практические навыки написания и отладки программ с файловыми потоками.
1.
Краткая теория
Файл – это поименованная порция информации. Файлы необходимы для долговременного хранения данных (и программ), и являются самой простой формой связи между программами: файл, записанный одной программой, может прочитать другая программа.
Использование файлов в программе возможно только при выполнении следующих операций:
создание потока;
открытие файла и связывание его с потоком;
обмен (ввод/вывод) закрытие файла;
уничтожение потока.
Файловый поток является обычной переменной в программе, которая имеет область видимости и время жизни в соответствии с объявлением. Эта переменная не имеет никакого отношения к файлам на диске — необходимо как-то указать, что объявленная переменная связана с некоторым файлом. Эта связь осуществляется по имени файла либо при создании потока, либо при открытии файла.
Если после выполнения некоторой операции поток находится в состоянии good, то это хорошая ситуация: во время предыдущей операции не произошло никаких непредвиденных событий и может быть выполнена следующая операции ввода/вывода. В остальных случаях следующая операция выполнена не будет. Состояние eof может возникнуть только при операции чтения. Для стандартного потока ввода это состояние возникает при вводе комбинации клавиш
Текстовые и двоичные файлы
Текстовые файлы отличаются двумя свойствами: 1. файлы делятся на строки, и конец строки отмечается специальным символом «new line» (новая строка), роль которого
68 в системе ввода/вывода С++ играет ‘\n’; 2. при вводе чисел выполняется преобразование из символьного вида во внутренний формат (вспомните функцию atoi); при выводе чисел — из внутреннего формата в символьный; Двоичные файлы на строки не делятся, и при вводе/выводе никаких преобразований не делается. При операции записи в двоичный файл попадает ровно столько байтов, сколько записываемый объект занимает в памяти.
Например, целое число, записанное в двоичный файл, займет на диске sizeof(int) байтов.
Для ввода и вывода в бинарный файл мы можем воспользоваться методами read/write
Произвольный доступ к файлам
Суть произвольного доступа заключается в том, что мы можем произвольно перемещать указатель чтения/записи по файлу не перечитывая все промежуточные данные.
Для этого имеется набор методов для потоков чтения и записи, где суффикс g означает
«get», а суффикс p - «put». Методы произвольного доступа в потоке
Таблица 1.
Методы произвольного доступа в потоке
Класс
Метод
Действие
ifstream seekg(pos)
Устанавливает текущую позицию чтения в pos seekg(offs, org)
Перемещает текущую позицию чтения на offs байтов, отсчитывая от одной из трех позиций org: ios::beg, ios::cur, ios::end tellg()
Возвращает текущую позицию чтения потока ofstream seekp(pos)
Устанавливает текущую позицию записи в pos seekp(offs, org)
Перемещает текущую позицию записи на offs байтов, отсчитывая от одной из трех позиций org tellp()
Возвращает текущую позицию записи в поток
2.
Методические указания
Написать программу, последовательно выполняющую перечисленные ниже задачи.
Предусмотреть печать приглашения на ввод (строки, поясняющей пользователю, какие действия от него ждет программа) и информативный вывод данных.
Задание 1. Сформировать последовательность чисел. Длина последовательности чисел задается пользователем. Последовательность генерируется случайным образом или вводится с клавиатуры по желанию пользователя. При вводе или генерации
69 последовательность записать в файл Input.txt.
Задание длины последовательности выполнить в отдельной функции с проверкой допустимости значения. Для заполнения файла создать перегруженные функции-предикаты (типа bool). Результат функции: 1 — файл создан, 0 — файл не создан. Параметр функции для ввода с клавиатуры: n - длина последовательности, символьный массив с именем файла Параметры функции для заполнения случайными числами: символьный массив с именем файла, n - длина последовательности; a, b — диапазон чисел. Задание 2 выполняется, если создание файла прошло успешно.
Задание 2. Вывести созданный файл на экран. В качестве параметра функции использовать символьный массив, например, void Print_f (char Name[]). Пример вызова функции:
Print_f(“Input.txt”).
Задание 3. Выполнить индивидуальное задание согласно выданному варианту. Данные из текстового файла записать в бинарный файл.
Для выполнения задания 3 создать функцию, возвращающую количество элементов файла
Output.txt или -0, если файл не создался. Параметры функции – входной и выходной потоки
Задание 4. Написать функцию для вывода бинарного файла на экран. В качестве параметра функции использовать символьный массив.
3. Задания для самостоятельного решения
Вариант 1. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле g те компоненты файла f, которые являются четными.
Вариант 2. Записать в файл f 100 натуральных чисел, полученных с помощью генератора случайных чисел. Получить в файле g все компоненты файла f, которые являются простыми числами.
Вариант 3. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле g все компоненты файла f, которые делятся на m и не делятся на n (числа m и n вводятся с клавиатуры).
Вариант 4. Записать в файл N целых чисел, полученных с помощью генератора случайных чисел. Подсчитать количество пар противоположных чисел среди компонент этого файла.
Вариант 5. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Из файла f получить файл g, исключив повторные вхождения чисел.
Вывести файл g на экран.
Вариант 6. Записать в файл N произвольных натуральных чисел. Переписать в другой файл те элементы, которые кратны k. Вывести полученный файл на экран.
Вариант 7. Заполнить файл N действительными числами, полученными с помощью генератора случайных чисел. Найти сумму минимального и максимального элементов этого файла.
Вариант 8. Заполнить файл f целыми числами, полученными с помощью генератора
70 случайных чисел. Найти количество удвоенных нечетных чисел среди компонент файла.
Вариант 9. Записать в файл f N натуральных чисел. Получить в другом файле все компоненты файла f, кроме тех, которые кратны k. Вывести полученный файл на экран.
Вариант 10. Записать в файл f N целых чисел, полученных с помощью генератора случайных чисел. Заполнить файл g числами, которые являются произведениями соседних компонент файла f.
Вариант 11. Заполнить файл f натуральными числами, полученными с помощью генератора случайных чисел. Найти количество квадратов нечетных чисел среди компонент.
Вариант 12. Записать в файл прямого доступа N действительных чисел. Найти наибольшее из значений модулей компонент с нечетными номерами.
Вариант 13. Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Из файла f получить файл g, исключив повторные вхождения чисел.
Порядок следования чисел сохранить.
Вариант 14. Записать в файл N действительных чисел. Найти разность первой и последней компонент файла.
Вариант 15. Заполнить файл f натуральными числами, полученными с помощью генератора случайных чисел. Найти среди компонент квадраты четных чисел.
Вариант 16. Записать в файл последовательного f доступа n первых натуральных четных чисел. Создать новый файл из тех компонент исходного файла, сумма цифр которых больше четырех, но меньше девяти.
Контрольные вопросы:
1. Файлы это?
2. Операции при использовании файлов в программе?
3. Файловый поток?
4. Выполнение некоторой операции good?
5. Состояние eof?
6. Текстовые файлы?
7. Двоичные файлы?
8. Произвольный доступ к файлам?
71
Лабораторная работа № 1.12
ОБРАБОТКА ТЕКСТОВОЙ ИНФОРМАЦИИ
Цель работы: получить практические навыки написания и отладки программ с классом string.
1.
Краткая теория
Потоковый ввод/вывод дисковых файлов
Для работы с дисковыми файлами необходимо подключение заголовочного файла , содержащего наборы специальных классов: ifstream - для ввода, ofstream - для вывода, fstream - для чтения и записи данных в один и тот же файл. Чтобы получить возможность работать с дисковым файлом, нужно открыть его с указанием режима доступа, который определяется значением константы open-mode класса ios. Режим доступа Стандарт
Действие app нет открывает файл для до записи ate(atend) да при открытии файла устанавливает файловый указатель на конец файла binary(bin) да открыть файл в двоичном представлении in да открыть файл для чтения (ввода) nocreate нет если файл не существует, то новый файл не создается Режим доступа Стандарт Действие noreplace нет если файл уже существует, файл не перезаписывается out да открыть файл для записи (вывода) trunc нет
Открывает и усекает существующий файл. Новая информация замещает существующую
Текстовые файлы Создание и запись. Для создания текстового файла определяют объект класса ofstream и передают конструктору класса имя дискового файла в качестве первого параметра и режим доступа в качестве второго параметра: ofstream out_file(“Out.txt”, ios::out); Можно объявить константу, определяющую режим открытия файла, например: const ios::open_mode=ios::out | ios::app; После того, как предпринималась попытка открыть файл, следует убедиться в том, что файл открыт и готов для записи (или перезаписи): if (! out_file) { cerr<<”Error: unable to write to out.txt”<<="" textarea="">
При работе с текстовыми файлами наиболее часто встречаются четыре действия: посимвольное чтение посимвольная запись построчное чтение построчная запись
Посимвольное чтение текста. Функция get(), которая является методом istream, применяется для посимвольного чтения текстового файла (см. примеры 1,2).
Пример 1. Посимвольное чтение файла и вывод его на экран.
# include
# include
{ char sym; ifstream in_file (“Input_file.txt”, ios::in); if (! in_file) { cerr<<”Error input file”<
Посимвольная запись текста.
Функция put(), которая является методом ostream, позволяет осуществлять посимвольную запись данных в текстовый файл.
72
Пример 2.
# include
# include
# include
{ string guote = “Зорко одно лишь сердце. Самого главного глазами не увидишь. А. де Сент
Экзюпери”; ofstream out_file (“Out_file.txt”, ios::out); if (! out_file) { cerr<<”Error output file”<
Построчное чтение файла
Обычно построчное чтение и запись файлов работают быстрее посимвольных действий. Для чтения строки из файла воспользуемся функцией getline(), которая является методом класса ifstream. Функция читает строку (в том числе и разделители), пока не встретит символ новой строки ‘\n’, помещая ее в буфер (первый аргумент функции).
Максимальный размер буфера задается как второй аргумент функции (см. пример 3).
Пример 3. Максимальный размер буфера задается как второй аргумент функции
# include
# include
{ const int LEN=80; char BUF[LEN]; ifstream in_file (“Input_file.txt”, ios::in); if (! in_file) { cerr<<”Error input file”<
}
Построчная запись текста
Записываемые строки являются не объектами класса string, а строками типа *char, завершающимися символом ‘\n’. Признак конца файла Признак конца файла приходится искать в файлах, открытых для чтения. Этот признак устанавливается в тот момент, когда в файле не осталось больше данных, которые можно считать. Признак конца файла анализируется в выражении вида while (! In_file.eof()) { … } Для этой цели нельзя пользоваться циклом do { … } while (! In_file.eof()), поскольку файл может оказаться пустым. Однако проверка на конец файла не анализирует ошибки, которые могут встретиться в процессе чтения файла. Для проверки как конца файла, так и наличия ошибок при его чтении пользуются условием выхода из цикла: while (In_file.good()) { … } Оператор цикла while (In_file) { … } выполняется до тех пор, пока нет ошибок, в том числе и конца файла (EOF). Имена файлов и аргументы командной строки
73
Пример 4. Подстрочная запись текста
# include
# include
# include
{ ofstream out_file (“Out_file.txt”, ios::out); if (! out_file) { cerr<<”Error output file”<
}
В приведенных выше примерах были использованы файлы с фиксированными именами.
Однако более удобны программы, в которых имена файлов для чтения или записи можно ввести с клавиатуры или задать в качестве аргументов командной строки.
1 2 3 4 5 6 7