Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование задач с применением структурированных данных. Лабораторный практикум.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Для составления машинных кодов удобно использовать не десятичную, а двоичную систему счисления, содержащую только две цифры, 0 и 1. Таким об­разом, в двоичной системе максимальная цифра 1.
В вычислительных задачах при программировании также могут исполь­зоваться восьмеричные и шестнадцатеричные системами счисления.
Количество цифр, используемых в системе счисления, называется её «ос­нованием». В десятичной системе основание равно десяти, в двоичной системе – двум, в восьмеричной и шестнадцатеричной – соответственно, восьми и шестнадцати.
Перевод чисел из произвольной системы в десятичную систему
Для перевода числа из любой позиционной системы счисления в десятич­ную необходимо использовать развернутую форму числа, заменяя, если это необходимо, буквенные обозначения соответствующими цифрами. Например:
2
1101
=1*23+1*22+0*21+1*20=1310
Перевод чисел из десятичной системы счисления в заданную систему
Для преобразования целых чисел десятичной системы счисления в число любой системы счисления последовательно выполняют деление нацело на ос­нование системы счисления, пока не получат нуль. Числа, которые возникают как остаток от деления на основание системы счисления, представляют собой последовательную запись разрядов числа в выбранной системы счисления от младшего разряда к старшему. Поэтому для записи самого числа остатки от де­ления записывают в обратном порядке.
Пример перевода десятичного числа в двоичную систему счисления при­веден на рис. 1.
Рис. 1. Перевод числа из десятичной системы в двоичную систему
Записывая остатки от деления снизу вверх, получают 111011011.
Проверка:
1*28+1*27+1*26+0*25+1*24+1*23+0*22+1*21+1*20= 1+2+8+16+64+128+256=47510.
51

3.4. Второе задание к лабораторной работе № 3

Задание
Написать консольное приложение, которое предоставляет меню для пере­вода двоичного числа в десятичное, шестнадцатеричного в десятичное, деся­тичного в двоичное и десятичного в шестнадцатеричное. При выборе номера меню осуществить конвертацию введенного числа и вывести результат.
Предполагаемый вид интерфейса программы представлен на рис. 2.
Рис. 2. Предполагаемый вид интерфейса программы
Замечания и рекомендации:
– пользователь должен выходить из программы, выбрав соответствую­щий пункт меню;
– если он выбрал один из вариантов преобразования, то после демонстра­ции результатов программа должна вновь вывести на экран главное меню и вновь предложить выбор действия;
– операции преобразования из одной системы счисления в другую долж­ны быть реализованы с помощью отдельных функций;
– если требуется очистить экран, то можно воспользоваться функцией system(“cls”);
– для преобразования данных из string в int можно воспользоваться функ­цией stoi(), для обратного преобразования – to_string();
– преобразования форматов выводимых данных с помощью спецификато­ров формата, флагов вывода и манипуляторов решением задачи не считаются.
Отчет
Отчет должен содержать титульный лист, вариант задания, текст про­граммы с комментариями, скриншоты результатов работы программы.
52

ЛАБОРАТОРНАЯ РАБОТА № 4

ТЕХНОЛОГИИ РАБОТЫ С ФАЙЛАМИ

4.1. Общие рекомендации по работе с файлами

Цель лабораторной работы - освоение технологий написания программ,
работающих с файлами.
Файл – набор байтов, имеющий имя и сохраненный на некотором нако­пителе. Под именем файла понимается не только его название, но и расшире­ние. Например, файлы file.txt и file.dat имеют разное имя, хотя название одина­ково. Существует такое понятие, как полное имя файла – это имя файла, в кото­рое добавлена директория его хранения. Например, полное имя файла: D:\docs\file.txt.
Основные операции работы с файлами – это открытие, закрытие, чтение, запись.
Для работы с файлами необходимо подключить заголовочный файл <fstream>.
Файловый ввод/вывод аналогичен стандартному вводу/выводу, единствен­ное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout, то для организации файлового ввода/вывода достаточно создать собствен­ные объекты, которые можно использовать аналогично операторам cin и cout.
Использование файлов в программе предполагает следующие операции:
– создание потока;
– открытие потока и связывание его с файлом;
– обмен (ввод/вывод);
– закрытие файла.
Первую и вторую операции можно объединить, то есть в одной строке со­здать поток и связать его с файлом:
ifstream f("in.txt");
В данном случае файл связан с входным потоком, т.е. открыт для чтения.
Чтобы открыть файл для записи, необходимо открыть его, связав с вы­ходным потоком:
ofstream g("out.txt");
Чтобы считать данные из файла (например, если в нем записаны целые числа, которые можно добавить в массив) можно сделать следующее:
int i = 0;
while (!f.eof())
{
f >> mas[i];
i++;
}
53
Функция eof() функция eof() определяет, достигнут ли конец файла (true –
Константа
Значение
ios::in
открыть файл для чтения
ios::out
открыть файл для записи
ios::ate
при открытии переместить указатель в конец файла
ios::app
открыть файл для записи в конец файла
ios::trunc
удалить содержимое файла, если он существует
ios::nocreate
если файл не существует, выдать ошибку
ios::noreplace
если файл существует, выдать ошибку
ios::binary
открытие файла в двоичном режиме
конец файла достигнут, false – конец файла не достигнут).
Чтобы записать элементы массива в файл можно воспользоваться следу­ющим методом:
for (int i = 0; i < k; i++)
g << mas[i] << endl;
Чтобы закрыть файл, можно воспользоваться функцией close():
f.close();
При работе с файлами возможны различные ошибочные ситуации.
Например, в программу передано имя несуществующего файла или в имени допущена ошибка. В этом случае ничего не произойдёт вообще. Файл не будет найден, а значит и прочитать его не возможно. Поэтому компилятор про­игнорирует строки, где выполняется работа с файлом. В результате корректно завершится работа программы, но ничего, на экране показано не будет. В С++ предусмотрена функция is_open(), которая возвращает целые значения: 1 — ес- ли файл был успешно открыт, 0 — если файл открыт не был.
Режимы открытия файлов устанавливают характер использования фай­лов. Для установки режима в классе ios_base предусмотрены константы, кото­рые определяют режим открытия файлов. Возможные режимы открытия фай­лов приведены в табл. 9.
Таблица 9
Режимы открытия файлов
Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции или |, например:
ios::out | ios::trunc
Например, это очистка файла от данных и его открытие файла для записи.
54
Объекты класса ofstream, при работе с файлами по умолчанию содержат
ФИО
Курс
Группа
Матема­тика
Программи­рование
Физика
Средний балл
режимы открытия файлов ios::out | ios::trunc. То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи.
Объекты класса ifstream, связываясь с файлом, имеют по умолчанию ре- жим открытия файла ios::in — файл открыт только для чтения.
Режим открытия файла ещё называют термином флаг. В табл. 9 приведен не весь список флагов.
Между флагами (режимами открытия) ate и app есть сходство и различие. Они перемещают указатель в конец файла, но флаг app позволяет производить запись, только в конец файла, а флаг ate просто переставляет флаг в конец фай­ла и не ограничивает места записи.

4.2. Первое задание для лабораторной работы № 4

Задание
Разработать консольное приложение, которое:
-считывает из входного файла (in.txt) последовательность целых чисел;
-преобразует считанную последовательность в массив целых значений;
-сортирует по возрастанию полученный массив пузырьковым методом;
-записывает полученную отсортированную последовательность в выход-
ной файл (out.txt).
Отчет
Отчет должен содержать титульный лист, вариант задания, текст про­граммы с комментариями, скриншоты результатов работы программы.

4.3. Пример программы для работы с файлами структур

Задание. Написать программу, которая осуществит ввод и вывод данных в файл, состоящий из структур. Структура содержит следующие поля:
– ФИО студента;
– курс;
– группа;
– оценка по математике;
– оценка по программированию;
– оценка по физике.
Вывести на экран файл структур в виде таблицы следующего вида:
Средний балл рассчитать по всем трем оценкам.
55
Для удобства пользователя организовать вывод на экран меню, которое содержит следующие пункты:
– ввод данных;
– вывод данных;
– выход из программы.
Листинг программы на языке С++ приведен ниже.
#include <fstream>
#include <string>
#include <iomanip>
#include <Windows.h>
#include <iostream>
using namespace std;
//Описание структуры со сведениями о студенте
struct stud {
char fio[30];
int kurs;
char gruppa[10];
int math, prog, fiz;
};
//Функции, используемые в программе
void menu(); // Функция вывода на экран меню
int vvod(); // Функция ввода данных в файл
int vivod(); // Функция вывода данных из файла на экран
void hline(); // Функция прорисовки горизонтальной линии
//Основная программа
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int num = 0; //Переменная для хранения номера
//пункта меню,
// выбранного пользователем
//Цикл обработки действий пользователя
while (num != 3)
{
menu();
cin >> num;
switch (num) {
case 1: vvod(); break;
case 2: vivod(); break;
case 3: break;
default: cout << "неверный вариант выбора" << endl;
56
endl;
}
}
return 0;
}
//Функция вывода на экран меню
void menu()
{
cout << "\n МЕНЮ\n";
cout << "1. Ввод данных" << endl;
cout << "2. Вывод данных" << endl;
cout << "3. Выход" << endl;
cout << "Введите номер пункта меню для дальнейшей работы" <<
}
//Функция ввода данных в файл
int vvod()
{
stud st; //Структура, использующаяся как буфер
// при записи в файл
//Попытка открытия файла для записи (добавления)
// данных в файл
ofstream f("stud.dat", ios::app|ios::binary);
if (!f)
ofstream f("stud.dat", ios::out|ios::binary);
if (!f)
{
cout << "Ошибка открытия файла" << endl;
return 1;
}
int n;
cout << "Введите количество добавляемых записей = ";
cin >> n;
//Ввод данных для записи в файл
for (int i = 0; i < n; i++)
{
cout << "Введите ФИО студента" << endl;
while (cin.get()!='\n');
cin.getline(st.fio,30);
cout << "Введите курс" << endl;
cin >> st.kurs;
cout << "Введите группу" << endl;
while (cin.get() != '\n');
cin.getline(st.gruppa,10);
57
cout << "Введите оценку по математике" << endl;
cin >> st.math;
cout << "Введите оценку по программированию" << endl;
cin >> st.prog;
cout << "Введите оценку по физике" << endl;
cin >> st.fiz;
f.write((char*)&st, sizeof(st));
}
//Завершение работы с файлом
f.close();
return 0;
}
//Функция вывода данных из файла на экран
int vivod()
{
stud st; //Структура, использующаяся как буфер при запи-
си в файл
//Открытие файла для чтения
ifstream f("stud.dat", ios::in | ios::binary);
if (!f)
{
cout << "Ошибка открытия файла" << endl;
return 1;
}
//Вывод шапки таблицы
cout << " Студенты" << endl;
hline();
cout << "| ФИО | Курс | Группа | Матем. | Прог. | Физ. |
Ср.балл |" << endl;
hline();
float sr_ball; //Переменная для расчета среднего балла
//Вывод данных из файла в таблицу
while (!f.eof())
{
f.read((char*)&st, sizeof(st)); //Считывание записи из файла
if (!f.eof())
{
sr_ball = (st.fiz + st.math + st.prog) / 3.0;
cout << "| " << setw(20) << st.fio;
cout << " | " << setw(4) << st.kurs;
58
cout << " | " << setw(8) << st.gruppa;
Индекс
товара
Наименование
Сорт
Кол-во
Цена
Стоимость
Итого
cout << " | " << setw(6) << st.math;
cout << " | " << setw(5) << st.prog;
cout << " | " << setw(4) << st.fiz;
cout << " | " << setiosflags(ios::fixed) <<
setprecision(2) << setw(8) << sr_ball << " |" << endl;
}
}
//Отчеркивание нижней границы таблицы
hline();
//Завершение работы с файлом
f.close();
return 0;
}
void hline()
{
const int m = 77; //Ширина таблицы в символах
for (int j = 0; j < m; j++)
cout << "-";
cout << endl;
}

4.4. Второе задание для лабораторной работы № 4

Задание
Создать программу, работающую с файлом структур. Реализовать ввод
данных в файл и вывод данных из файла в виде таблицы. Выбор действий поль­зователя должен осуществляться с помощью меню. Варианты заданий приведе­ны ниже.
Отчет
Отчет должен содержать титульный лист, вариант задания, текст про-
граммы с комментариями, скриншоты результатов работы программы.
1. Создать файл из структур, каждая из которых содержит следующие по­ля: индекс товара, наименование, сорт, количество, цена. Рассчитать стоимость товара и вывести данные из файла в виде следующей таблицы:
Товарная ведомость
59
2. Создать файл из структур, каждая из которых содержит следующие по-
Код
книги
Название
книги
Кол-во проданных
экземпляров
Цена
Выручка
от продажи
Итого
Номер
счета
ФИО
Сумма
денег
Годовой итог
в процентах
в рублях
Итого
Табельный
номер
ФИО
Расценка за деталь
Количество
Стоимость
Итого
ФИО
Шифр
Дисциплина
Общее
занятий
Кол-во про-
занятий
Процент
мости
Итого
ля: код книги, название книги, количество проданных экземпляров, цена. Рас­считать выручку от продажи книг и вывести данные из файла в виде следую­щей таблицы:
Продажа книг
3. Создать файл из структур, каждая из которых содержит следующие по-
ля: номер счета, ФИО вкладчика, сумма денег на вкладе, годовой процент. Рас­считать годовой процент в рублях и вывести данные из файла в виде следую­щей таблицы:
Справка о годовом проценте
4. Создать файл из структур, каждая из которых содержит следующие по-
ля: табельный номер, ФИО, расценка за деталь, количество уже сделанных де­талей. Рассчитать стоимость сделанных деталей и вывести данные из файла в виде следующей таблицы:
Ведомость на оплату
5. Создать файл из структур, каждая из которых содержит следующие по-
ля: ФИО студента, шифр группы, наименование дисциплины, общее количе­ство занятий, количество пропущенных занятий. Рассчитать процент посещае­мости и вывести данные из файла в виде следующей таблицы:
Справка о посещаемости
студента
группы
60
кол-во
пущенных
посещае-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]