Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на С++ в среде разработки Qt Creator. Учебно-методическое пособие
.pdf
61
4
В качестве исходного предложения задать арифметическое
выражение, записанное на языке С.
Проверить, соблюдается ли баланс открывающихся и
закрывающихся скобок. Если равенство соблюдается, то
вывести соответствующее сообщение, в противном случае
вывести количество открывающихся и закрывающихся скобок.
5
Создать новое предложение из гласных букв исходного.
6
В заданном предложении найти слово, в котором
максимальное количество буквы 'а'. Вывести сколько раз буква
'а' встречается в этом слове.
7
Сформировать числовой массив N, элементы которого
указывают длину каждого слова в исходном предложении.
8
Сформировав новый массив В из исходного предложения,
поставив перед каждым словом знак '?’,
9
Составить новое предложение, содержащее первые буквы
каждого слова исходного предложения.
10
В каждом слове заданного предложения поменять местами
первую букву и последнюю.
11
Указать, сколько раз первый символ первого слова встречается
в заданном предложении.
12
В заданном предложении найти самое короткое слово.
13
В заданном предложении заменить все запятые на «!», не
создавая нового массива. Вывести преобразованный текст, а
также количество удаленных запятых.
14
В заданном предложении заменить все строчные латинские
буквы прописными.
15
Определить, есть ли в заданном предложении цифры, посчитать
сколько их.
16
Создать новое предложение из исходного, поставив в новом
предложении в конце каждого слова точку и каждое слово
записать с большой буквы.
17
Собрать новое предложение из последних символов слов
исходного текста.
18
В заданном предложении поменять местами последнюю букву
предыдущего слова с первой буквой следующего слова.
19
Сформировать числовой массив N, элементы которого
указывают количество гласных букв в каждом слове исходного
предложения.

62
20
Сформировать числовой массив N, элементы которого
указывают количество букв ‘o’ в каждом слове исходного
предложения.
Содержание отчета
1. Номер и тема лабораторной работы.
2. Вариант задания.
3. Результаты подготовки:
- схема алгоритма обработки предложения,
- программа на заданном алгоритмическом языке.
4. Итоги работы программы:
- результаты расчета с текстовыми комментариями.
5. Ответы на контрольные вопросы
Показать отчет преподавателю.
Контрольные вопросы
1. Описание символьных данных и строк на языке С++.
2. Встроенные функции языка С++, используемые для обработки строк.
3. Кодирование символьной информации.

63
Лабораторная работа № 8
СОЗДАНИЕ И ОБРАБОТКА ТЕКСТОВЫХ ФАЙЛОВ
Цель работы: приобретение навыков разработки алгоритмов обработки
файлов. Закрепление понятий базовых структур цикл, разветвление.
Подготовка к лабораторной работе:
1. Повторить следующие вопросы:
• Понятие файла.
• Способ описания файла.
• Стандартные функции для работы с файлами.
• С помощью какой функции осуществляется подготовка файла для
чтения?
• С помощью каких функций выполняется чтение данных из файла?
• Как распознать конец файла данных?
2. В соответствии с индивидуальным заданием составить схему алгоритма и
программу на языке С++.
Текстовые и бинарные файлы
Файлы позволяют пользователю считывать большие объемы данных
непосредственно с диска, не вводя их с клавиатуры. Существуют два
основных типа файлов: текстовые и двоичные.
С точки зрения программиста файл представляет собой потенциально
бесконечную ленту записей какого-либо размера. Однако видны не все
записи одновременно, а только их часть, как будто смотрим на ленту через
воображаемое окно, называемое указателем (не путать с указателем FILE *).
В языке С принято считать, что размер окна равен одному байту. При
считывании или записи указатель перемещается по ленте. В конце файла
находится так называемый признак конца файла, обозначаемый в языке С
константой EOF.
Числовые данные, которыми оперирует программа, хранятся в памяти
ЭВМ с том формате, который предусмотрен типом этих данных. Например,
для переменной целого типа int выделяются 4 байта. Данные хранятся в
дополнительном коде. При выводе значения переменной на экран она
переводится в текстовый, понятный человеку вид, то есть в
последовательность символов. Точно так же и в файле, значение переменной
может храниться либо в двоичном виде (как в памяти ЭВМ), либо в
текстовом, как последовательность символов. В связи с этим файлы делятся

64
на двоичные (бинарные) и текстовые. При работе с бинарными файлами
операции чтения и записи не требуют никакого преобразования данных, а
при работе с текстовыми файлами требуется преобразовывать данные из
текстового или в текстовый вид.
Работа с текстовыми файлами в стиле C++
Текстовыми называются файлы, состоящие из любых символов. Они
организуются по строкам, каждая из которых заканчивается символом
«конца строки». Конец самого файла обозначается символом «конца файла».
При записи информации в текстовый файл, просмотреть который можно с
помощью любого текстового редактора, все данные преобразуются к
символьному типу и хранятся в символьном виде.
В двоичных файлах информация считывается и записывается в виде блоков
определенного размера, в которых могут храниться данные любого вида и
структуры.
Для работы с файлами используются специальные типы данных,
называемые потоками. Поток ifstream служит для работы с файлами в
режиме чтения, а ofstream в режиме записи. Для работы с файлами в режиме
как записи, так и чтения служит поток fstream.
В программах на C++ при работе с текстовыми файлами необходимо
подключать заголовочные файлы iostream и fstream.
Для того чтобы записывать данные в текстовый файл можно
воспользоваться любым текстовым редактором, например, блокнотом, а
можно написать собственную программу. Для этого необходимо:
1) описать переменную типа ofstream;
2) открыть файл с помощью функции open;
3) вывести информацию в файл;
4) обязательно закрыть файл.
Для считывания данных из текстового файла, необходимо:
1) описать переменную типа ifstream;
2) открыть файл с помощью функции open;
3) считать информацию из файла, при считывании каждой порции данных
необходимо проверять, достигнут ли конец файла;
4) закрыть файл.
Запись информации в текстовый файл
Как было сказано ранее, для того чтобы начать работать с текстовым файлом,
необходимо описать переменную типа ofstream. Например, так:
ofstream F;

65
Будет создана переменная F для записи информации в файл. На следующем
этапе файл необходимо открыть для записи. В общем случае оператор
открытия потока будет иметь вид:
F.open(«file», mode);
Здесь F — переменная, описанная как ofstream,
file — полное имя файла на диске,
mode — режим работы с открываемым файлом.
Обратите внимание на то, что при указании полного имени файла нужно
ставить двойной слеш. Для обращения, например к
файлу accounts.txt, находящемуся в папке sites на диске D, в программе
необходимо указать: D:\\sites\\accounts.txt.
Файл может быть открыт в одном из следующих режимов:
• ios::in — открыть файл в режиме чтения данных; режим является режимом
по умолчанию для потоков ifstream;
• ios::out — открыть файл в режиме записи данных (при этом информация о
существующем файле уничтожается); режим является режимом по
умолчанию для потоков ofstream;
• ios::app — открыть файл в режиме записи данных в конец файла;
• ios::ate — передвинуться в конец уже открытого файла;
• ios::trunc — очистить файл, это же происходит в режиме ios::out;
• ios::nocreate — не выполнять операцию открытия файла, если он не
существует;
• ios::noreplace — не открывать существующий файл.
Параметр mode может отсутствовать, в этом случае файл открывается в
режиме по умолчанию для данного потока.
После удачного открытия файла (в любом режиме) в переменной F будет
храниться true, в противном случае false. Это позволит проверить
корректность операции открытия файла.
Открыть файл (в качестве примера возьмем файл D:\\sites\\accounts.txt) в
режиме записи можно одним из следующих способов:
1
2
3
4
5
6
7
8
9
10
//первый способ
ofstream F;
F.open(«D:\\sites\<strong>\</strong>accounts<strong>.</strong>txt», ios::out);
//второй способ, режим ios::out является режимом по умолчанию
//для потока ofstream
ofstream F;
F.open(«D:\\game\\noobs.txt»);
//третий способ объединяет описание переменной и типа поток
//и открытие файла в одном операторе
ofstream F («D:\\game\\noobs.txt», ios::out);

66
После открытия файла в режиме записи будет создан пустой файл, в который
можно будет записывать информацию.
Если вы хотите открыть существующий файл в режиме дозаписи, то в
качестве режима следует использовать значение ios::app.
После открытия файла в режиме записи, в него можно писать точно так же,
как и на экран, только вместо стандартного устройства
вывода cout необходимо указать имя открытого файла.
Например, для записи в поток F переменной a, оператор вывода будет иметь
вид:
F<<a;
Для последовательного вывода в поток G переменных b, c, d оператор
вывода станет таким:
G<<b<<c<<d;
Закрытие потока осуществляется с помощью оператора:
F.close();
В качестве примера рассмотрим следующую задачу.
Задача 1
Создать текстовый файл D:\\sites\\accounts.txt и записать в него n
вещественных чисел.
Решение
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
setlocale (LC_ALL, «RUS»);
int i, n;
double a;
//описывает поток для записи данных в файл
ofstream f;
//открываем файл в режиме записи,
//режим ios::out устанавливается по умолчанию
f.open(«D:\\sites\\accounts.txt», ios::out);
//вводим количество вещественных чисел
cout<<«n=»; cin>>n;
//цикл для ввода вещественных чисел
//и записи их в файл
for (i=0; i<n; i++)
{
cout<<«a=»;

67
23
24
25
26
27
28
29
30
31
//ввод числа
cin>>a;
f<<a<<«\t«;
}
//закрытие потока
f.close();
system(«pause»);
return 0;
}
Чтение информации из текстового файла
Для того чтобы прочитать информацию из текстового файла, необходимо
описать переменную типа ifstream. После этого нужно открыть файл для
чтения с помощью оператора open. Если переменную назвать F, то первые
два оператора будут такими:
1
2
ifstream F;
F.open(«D:\\sites\\accounts.txt», ios::in);
После открытия файла в режиме чтения из него можно считывать
информацию точно так же, как и с клавиатуры, только вместо cin нужно
указать имя потока, из которого будет происходить чтение данных.
Например, для чтения данных из потока F в переменную a, оператор ввода
будет выглядеть так:
F>>a;
Два числа в текстовом редакторе считаются разделенными, если между ними
есть хотя бы один из символов: пробел, табуляция, символ конца строки.
Хорошо, когда программисту заранее известно, сколько и какие значения
хранятся в текстовом файле. Однако часто известен лишь тип значений,
хранящихся в файле, при этом их количество может быть различным. Для
решения данной проблемы необходимо считывать значения из файла
поочередно, а перед каждым считыванием проверять, достигнут ли конец
файла. А поможет сделать это функция F.eof(). Здесь F — имя потока
функция возвращает логическое значение: true или false, в зависимости от
того достигнут ли конец файла.
Следовательно, цикл для чтения содержимого всего файла можно записать
так:
1
2
3
4
5
6
7
//организуем для чтения значений из файла, выполнение
//цикла прервется, когда достигнем конец файла,
//в этом случае F.eof() вернет истину
while (!F.eof())
{
//чтение очередного значения из потока F в переменную a
F>>a;

68
8
9
//далее идет обработка значения переменной a
}
Для лучшего усвоения материала рассмотрим задачу.
Задача 2
В текстовом файле D:\\game\\accounts.txt хранятся вещественные числа,
вывести их на экран и вычислить их количество.
Решение
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
int main()
{
int n=0;
float a;
fstream F;
//открываем файл в режиме чтения
F.open(«D:\\sites\\accounts.txt»);
//если открытие файла прошло корректно, то
if (F)
{
//цикл для чтения значений из файла; выполнение цикла прервется,
//когда достигнем конца файла, в этом случае F.eof() вернет истину.
while (!F.eof())
{
//чтение очередного значения из потока F в переменную a
F>>a;
//вывод значения переменной a на экран
cout<<a<<«\t«;
//увеличение количества считанных чисел
n++;
}
/ /закрытие потока
F.close();
//вовод на экран количества считанных чисел
cout<<«n=»<<n<<endl;
}
//если открытие файла прошло некорректно, то вывод
//сообщения об отсутствии такого файла
else cout<<» Файл не существует»<<endl;
return 0;
}

69
Использование функции getline
getline можно использовать, как для построчного ввода информации в файл
например,
cin.getline(c, 256));
так и для вывода ее оттуда, например,
f.getline(c, 256);
где переменная с – это массив типа char.
Вот код программы, демонстрирующий использование этой функции:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int i, k=0;
char c[256];
fstream f;
f.open("noobs.txt", ios::in);
while (!f.eof())
{
f.getline(c, 256);
k++;
}
cout<<"В файле "<<k<<" строк(а/и)";
f.close();
return 0;
}
Порядок выполнения работы
1. Получить допуск к работе у преподавателя (показать домашние
заготовки).
2. Загрузить среду Qt или Visual Studio.
3. Ввести текст программы.
4. Провести отладку программы.
5. Выполнить программу, провести анализ результатов и убедившись в
правильности решения, предъявить их преподавателю для проверки.
6. Занести результаты расчета в отчет.

70
7. Выйти из среды.
Задание к лабораторной работе
В соответствии с вариантом задания разработать программу обработки
текстового файла.
Исходный текстовый файл можно создать с помощью, например,
программы Блокнот и поместить его в папку проекта среды Qt .
Рекомендуется вначале занести в первую строку файла количество записей,
а затем последовательно все записи, причем текстовые поля вводить в
отдельной строке, а числовые – можно в одной через пробел.
Например, содержимое файла, который будет включать записи о 7
студентах – фамилия, группа, 5 оценок, записанные в файл так:
7
Иванов
МИ-18
4 5 3 4 4
Петров
МК-19
3 3 3 3 3
…..
Таблица 7 - Статистика заболеваемости по школе
Болезнь
Количество больных
Январь
Февраль
Март
Апрель
Май
Июнь
Грипп 12132
9
54
12
3
...
...
... .....
...
...
Таблица 8 - Прирост населения в крупных городах СНГ
Город
Прирост населения, в тыс. чел.
2016
2017
2018
2019
2020
Москва
5560
49
63
Донецк
-1-10
-8
-5
... ...
...
...
...
Таблица 9 - Средняя успеваемость
ФИО
студента
Успеваемость (средний балл)
1 семестр
2 семестр
3 семестр
4 семестр
.
10 семестр
Иванов
5
4,8
3,7
4,5 .4
...
...
...
...
... ....
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
