Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование задач с применением структурированных данных. Лабораторный практикум.pdf
X
- •ВВЕДЕНИЕ
- •ОБРАБОТКА МАССИВОВ ДАННЫХ С ПРИМЕНЕНИЕМ ФУНКЦИЙ
- •1.1. Общие рекомендации по работе с динамическими массивами
- •1.2. Пример программы для работы с динамическими массивами
- •1.3. Первое задание к лабораторной работе № 1
- •1.4. Общие рекомендации по использованию функций
- •ЛАБОРАТОРНАЯ РАБОТА № 2
- •ПРОГРАММНАЯ ОБРАБОТКА СТРОК И СТРУКТУР
- •2.1. Общие рекомендации по работе со строками
- •1.5. Пример программы для работы с функциями
- •1.6. Второе задание к лабораторной работе № 1
- •1.8. Третье задание к лабораторной работе № 1
- •2.2. Пример программы для работы со строками
- •2.3. Первое задание к лабораторной работе № 2
- •2.4. Общие рекомендации по работе с данными типа string
- •2.5. Второе задание к лабораторной работе № 2
- •2.6. Общие рекомендации по работе со структурами
- •2.7. Пример программы для работы со структурами
- •2.8. Третье задание к лабораторной работе № 2
- •Итого
- •Итого
- •Итого
- •Итого
- •Итого
- •Итого
- •Итого
- •Итого
- •ПРОГРАММНЫЕ МЕТОДЫ РАБОТЫ
- •С ЦЕЛОЧИСЛЕННЫМИ ДАННЫМИ
- •3.1. Общие рекомендации
- •3.2. Первое задание к лабораторной работе № 3
- •3.3. Системы счисления и перевод чисел из одной системы в другую
- •3.4. Второе задание к лабораторной работе № 3
- •ЛАБОРАТОРНАЯ РАБОТА № 4
- •ТЕХНОЛОГИИ РАБОТЫ С ФАЙЛАМИ
- •4.1. Общие рекомендации по работе с файлами
- •4.2. Первое задание для лабораторной работы № 4
- •4.3. Пример программы для работы с файлами структур
- •4.4. Второе задание для лабораторной работы № 4
- •ЛАБОРАТОРНАЯ РАБОТА № 5
- •МЕТОДЫ СОРТИРОВКИ И ИХ ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
- •5.1. Общие рекомендации по реализации методов сортировки
- •5.2. Задания к лабораторной работе № 5
- •ЛАБОРАТОРНАЯ РАБОТА № 6
- •ЛИНЕЙНЫЕ СПИСКИ
- •6.2. Пример программы работы с линейным списком
- •6.3. Задания к лабораторной работе № 6
- •ЛАБОРАТОРНАЯ РАБОТА № 7
- •ПРОГРАММНОЕ СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ КЛАССОВ
- •7.1. Общие рекомендации по работе с классами
- •7.2. Пример программы реализации класса
- •7.3. Задания к лабораторной работе № 7
- •ЛАБОРАТОРНАЯ РАБОТА № 8
- •РАБОТА С РОДИТЕЛЬСКИМИ И ДОЧЕРНИМИ КЛАССАМИ
- •8.2. Пример программы с виртуальными функциями
- •8.3. Виртуальные функции и абстрактные классы
- •8.4. Задания к лабораторной работе № 8
- •ЛАБОРАТОРНАЯ РАБОТА № 9
- •РАБОТА С КОНТЕЙНЕРНЫМИ КЛАССАМИ И МОДУЛЯМИ
- •9.1. Общие сведения о контейнерных классах и векторах
- •9.2. Общие сведения о модулях
- •9.3. Пример программы на С++
- •9.4. Задания к лабораторной работе № 9
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК

Для составления машинных кодов удобно использовать не десятичную, а
двоичную систему счисления, содержащую только две цифры, 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
кол-во
пущенных
посещае-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
