- •«Московский государственный технический университет гражданской авиации»
- •Лабораторная работа №5 Разработка программ с использованием функций для обработки массивов арифметических и символьных данных.
- •Цель лабораторной работы
- •1.2. Теоретические сведения Создание динамических массивов
- •Массивы указателей
- •Создание двумерного динамического массива с помощью динамического массива указателей.
- •Определение динамического двумерного массива
- •Указатель на массив. Многомерные массивы динамической памяти.
- •Определение типа массива
- •Определение типа указателя на массив
- •Основные виды обработки массивов.
- •1.3 Задание на выполнение лабораторной работы
- •1.4 Порядок выполнения работы
- •1.5. Пример выполнения лабораторной работы
- •Схемы алгоритмов функций
- •Текст программы
- •1.6. Контрольные вопросы
- •1.7. Варианты заданий лабораторной работы
- •2. Лабораторная работа № 6 Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор return.
- •2.1 Цель лабораторной работы
- •2.2. Теоретические сведения Рекурсивные функции
- •Указатели на функции
- •Массивы указателей на функции
- •Определение типа указателя на функцию
- •Указатель на функцию - параметр функции
- •2.3 Задание на выполнение лабораторной работы
- •2.4 Порядок выполнения работы
- •2.5 Пример выполнения лабораторной работы
- •Текст программы
- •2.6 Контрольные вопросы
- •2.7. Варианты заданий лабораторной работы
- •3 Лабораторная работа № 7
- •3.1 Цель лабораторной работы
- •3.2 Теоретические сведения Структура как совокупность данных
- •3.3 Задание на выполнение лабораторной работы
- •3.4 Порядок выполнения работы
- •3.5 Пример выполнения лабораторной работы
- •Текст программы
- •3.6 Контрольные вопросы
- •3.7 Варианты заданий лабораторной работы
- •4. Лабораторная работа № 8 Классы и объекты. Создание и разрушение объектов пользовательского класса, статических и динамических.
- •4.1 Цель лабораторной работы
- •4.2. Теоретические сведения Объектно-ориентированный подход к программированию.
- •Понятие класса
- •Объявление функции вне и внутри тела класса
- •Конструктор
- •Массивы объектов статических и динамических
- •Деструктор
- •Указатели на компоненты-функции
- •4.3 Задание на выполнение лабораторной работы
- •4.4 Порядок выполнения работы
- •Методические указания
- •4.5 Контрольные вопросы
- •4.6 Варианты задания
- •5. Список литературы
- •Содержание
- •1. Лабораторная работа № 5
- •1.1. Цель лабораторной работы 3
- •1.2. Теоретические сведения 3
- •4.1. Цель лабораторной работы 38
- •4.2. Теоретические сведения 38
3.3 Задание на выполнение лабораторной работы
- Даны сведения о некоторых объектах, обладающих несколькими разнотипными характеристиками;
- Создать текстовой файл, в который поместить исходные данные.
- Определить структурный тип для представления данных в программе;
- Разработать структуру программы, схемы алгоритмов и программу обработки структурных данных конкретного варианта.
3.4 Порядок выполнения работы
1) Сформировать файл с исходными данными в соответствии с вариантом задания. В каждой строке файла должны располагаться записи характеристик одного из объектов данных.
2) Определить в соответствии с данными структурный тип.
3) Определить внешний массив структур данного типа.
4) Разработать алгоритмы и определить функции:
- подсчета количества записей (строк) в файле данных;
- удаления пробелов в начале и в конце символьных строк;
- ввода данных файла в массив структур;
- вывода строк шапки таблицы;
- вывода данных массива структур в файл результатов в виде таблицы;
- поиска и вывода элементов массива структур, поиск производить по одному признаку.
5) В главной функции произвести вызов функций.
6) Файл результатов должен содержать таблицу структурных данных, а также результаты поиска структур в массиве структур.
7) Провести отладку и тестирование программы.
8) Оформить и защитить отчет по лабораторной работе.
3.5 Пример выполнения лабораторной работы
Даны сведения об автомобилях: марка, цвет, цена, страна изготовитель, максимальная скорость. Исходные данные для создания массива структур поместить в файл данных (auto.txt) в виде, представленном на рис. 7.
Исходные данные для поиска по марке автомобиля показаны на рис.8 (файл poisk.txt).
Рисунок 7. Файл с исходными данными auto.txt
Рисунок 8. Файл с исходными данными poisk.txt
Текст программы
#include <iostream>
#include <windows.h>
#include <fstream>
#include <iomanip>
using namespace std;
ofstream fout; // определяется выходной файловый поток
ifstream fin; // определяется входной файловый поток
struct avto {
char mark [15]; //марка автомобиля;
char color [50]; //цвет;
double price; //цена;
char place [100]; //страна изготовитель;
unsigned int spid; //максимальная скорость;
};
avto B [10]; //объявляется массив из 10 структур типа avto
char sh [][256] = {" Автомобили ",
"|==============|=============|==========|=======================|======================|",
"|Марка |Цвет |Цена | Страна изготовитель | Максимальная скорость|",
"|==============|=============|==========|=======================|======================|",
"|------------------------|----------------------|-----------------|---------------------------------------|--------------------------------------|"
};
double s; //переменная для суммарной стоимости автомобилей
//------------Удаление пробелов вначале и в конце строки - параметра--------
void filtr (char* str) {
int x;
int xl = 0, // номер первого символа строки
xr = strlen(str)-1; //номер последнего символа строка
while (str[xl] == ' ') xl++;
while (str[xr] == ' ') xr--;
for (x = xl; x <= xr; x++)
str [x - xl] = str[x];
str [x - xl] = '\0';}
//---------------------Вывод строк шапки таблицы-------------------------
void psh () {
for (int i = 0; i<4; i++)
fout << sh [i] << endl;
}
//------------Определение количества записей в файле данных--------------
int number (char*filename) {
int n = 0; // счетчик записей;
char T [255]; // массив буфер;
fin.open (filename); //открытие файла данных;
if (!fin) {cout << "Ошибка при открытии файла данных";
system ("pause");
exit (0);
}
while (!fin.eof()) { //пока не достигли конца файла данных
fin.getline (T, 255); n++; //считываем строку файла, увеличиваем n
}
fin.close (); // закрываем файл данных;
return n; //возвращаем количество строк файла;
}
//---------------Ввод данных из файла и заполнение массива структур-----------
void vvod (avto B [10], int n, double & s, char*filename) {
//параметры: 1) массив структур, 2) количество записей в файле данных,
//3) ссылка для передачи суммарной стоимости, 4) строка - имя файла данных
int i; s = 0;
char T [80]; //массив буфер;
fin.open (filename); //открытие файла данных;
if (!fin) {cout << "Ошибка при открытии файла данных";
system ("pause"); exit (0);}
for (i = 0; i <n; i++) { //цикл считывания данных из файла в массив
fin.get (B[i]. mark, 15); filtr(B[i]. mark); //считывается марка автомобиля;
fin>>B[i].color>>B[i].price>>B[i].spid; //считывается цвет, цена, скорость;
fin.getline (B[i]. place, 99); filtr(B[i]. place); // страна изготовитель;
s += B[i]. price; // подсчитывается суммарная цена всех автомобилей;
} //из потока извлекается символ перехода на новую строку
fin.close ();
}
//-------------------------------Вывод массива структур--------------------------------
void vivod (avto B [10], int n) {
int i;
for (i = 0; i<n; i++)
fout << '|' << setw (14) << B[i]. mark << '|' << setw (13) << B[i]. color << '|'
<< setw (10) << B[i]. price << '|' << setw (23) << B[i]. place << '|' << setw (22)
<< B[i]. spid << '|' << endl;
fout <<sh [1] <<endl << "Суммарная стоимость автомобилей: " <<s;
}
//-----------------------Поиск по марке автомобиля----------------------------------
void poisk (avto *p, int n) {
//параметры: адрес первого элемента массива структур и кол-во
//заполненных структур в массиве
char name [20]; // строка для поискового признака;
fin.open ("poisk.txt"); //открытие файла данных для поиска;
if (!fin) {cout << "Ошибка открытия файла данных для поиска";
system("pause"); exit (0);}
fout << "\n\n Поиск по марке автомобиля \n";
while (!fin.eof()){ // пока не конец файла;
fin.getline (name, 20); //считываем из файла поисковый признак;
filtr (name);
if (!strcmp (name, "")){ //если это пустая строка
fout << "\nНет данных";
continue; //к следующей итерации цикла while;
}
//в противном случае
for (int i = 0; i <n; i++) //перебираем структуры из массива структур
if (strcmp (p[i]. mark, name) = = 0) { //если есть совпадение
fout << "\n|" << setw (10) << p[i]. mark << '|' << setw (8) << p[i]. color
<<'|'<< setw (9) << p[i]. price << '|' << setw (14) << p[i]. place
<<'|' << setw (13) << p[i]. spid << '|';
goto m;
}
//если перебрали все структуры массива, и совпадения не было
fout << "\n Марка " <<name << " не найдена";
m:;
} //тело цикла while
fin.close ();
}
int main () {
SetConsoleCP (1251);
SetConsoleOutputCP (1251);
fout.open ("r.cpp"); // создание и открытие файла результатов;
if (!fout) {cout << "Ошибка открытия файла результатов"; exit (0);}
//вызовы функций:
int n = number ("avto.txt"); //количество записей в файле;
vvod (B, n, s, "avto.txt");
psh ();
vivod (B, n);
poisk (B, n);
fout.close ();
return 0;
}
На рис. 9 представлен файл результатов программы (r.cpp)
Рисунок 9. Файл результатов r.cpp
