Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на С++ в среде разработки Qt Creator. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
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
...
...
...
...
... ....
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]