5 13ЛР инфа
.docxЛабораторная работа №13
Структуры и файлы структур
Цель лабораторной работы: изучение структурной организации, способов доступа к элементам и других особенностей структур и файлов структур; изучение стандартных средств языка C/C++ для работы с файлами; совершенствование навыков процедурного программирования на языке C/C++ при решении задач обработки файлов.
Задание на программирование: используя технологию процедурного программирования разработать программу обработки файлов структур с числом записей не менее пяти в соответствии с индивидуальным заданием.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание.
2) Построить схему алгоритма решения задачи с использованием функций создания, добавления новых элементов, просмотра, сортировки файла по числовому и строковому полю, поиска данных в файле.
3) Сформулировать условие поиска данных в файле и организовать поиск по условию с сохранением найденных записей в новом файле.
4) Составить спецификации функций.
5) Составить программу на языке C/C++.
6) Предусмотреть в программе возможность выбора варианта действия с помощью меню.
7) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов. Обеспечить одновременный показ на экране содержимого исходного и результирующего файлов.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, спецификации функций, текст программы, контрольные примеры.
Формулировка задания:
(Вариант №20)
|
Автоинспекция
|
|
|
|
|
|
Марка машины |
Цвет |
Номер |
Год выпуска |
Владелец |
Текст программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <locale.h>
#define FNAME_I "D:\\bd1.dat"
using std::cout;
using std::cin;
using std::endl;
int proverka_file(char *fname, const char *) ;
void dobavka(char *fname) ;
void zag1() ;
void prosmotrbd1(char *fname) ;
void sort_name(char *fname) ;
void sort_god(char *fname) ;
const char PR_R[] = "r" ;
const char PR_S[] = "r+" ;
const char PR_W[] = "w" ;
const char PR_A[] = "a" ;
typedef struct {char name[15] ;
char color[15] ;
unsigned int number ;
int year ;
char owner[10] ;
}trip ;
int main()
{int var ;
char otv ;
char fname_i[20] = FNAME_I ;
setlocale(LC_ALL,"Russian") ;
for( ; ;)
{
cout << "\n Вид действия:" << endl ;
cout << " 1 - создание базы данных" << endl ;
cout << " 2 - добавление новых записей" << endl ;
cout << " 3 - сортировка по марке" << endl ;
cout << " 4 - сортировка по году выпуска" << endl ;
cout << " 5 - просмотр базы данных" << endl ;
cout << " 6 - завершение задачи" << endl ;
cout << " Введите вид действия ->" ;
cin >> var ;
switch(var)
{default:break ;
case 1: if(proverka_file(fname_i, PR_R))
{cout << " База данных автоинспекции с именем "<< fname_i ;
cout << " была создана раньше." << endl ;
cout << " Создаём файл с новым именем? [Y/N] " ;
cin >> otv ;
cin.get() ;
if(otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
{cout << " Задайте имя создаваемого файла: " ;
cin >> fname_i ;
}
else break ;
}
if(!proverka_file(fname_i, PR_W))
{cout << "\n Ошибка открытия файла для записи" << endl ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
}
cout << " Создаем базу " << fname_i << endl ;
dobavka(fname_i) ;
cout << "\n Создание файла закончено." << endl ;
if(proverka_file(fname_i, PR_R))
cout << " База данных готова к работе" << endl ;
else cout << "\n база не создана" << endl ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
case 2: if(proverka_file(fname_i, PR_R))
{cout << " База данных автоинспекции с именем "<< fname_i ;
cout << " была создана раньше." << endl ;
cout << " Будем добавлять новые записи в неё? [Y/N] " ;
cin >> otv ;
cin.get() ;
if(otv == 'N' || otv == 'n' || otv == 'Т' || otv == 'т')
{cout << " Задайте имя файла другой базы: " ;
cin >> fname_i ;
if(!proverka_file(fname_i, PR_R))
{cout << " Такая база данных не создавалась" << endl ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
}
}
}
cout << " Добавляем записи в файл " << fname_i << endl ;
dobavka(fname_i) ;
cout << "\n Изменение файла закончено." ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
case 3: if(!proverka_file(fname_i, PR_S))
{cout << "\n Ошибка открытия файла для чтения и записи" << endl ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
}
sort_name(fname_i) ;
cout << "\n Сортировка закончена." ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
case 4: if(!proverka_file(fname_i, PR_S))
{cout << "\n Ошибка открытия файла для чтения и записи" << endl ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
}
sort_god(fname_i) ;
cout << "\n Сортировка закончена." ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
case 5: if(!proverka_file(fname_i, PR_R))
{cout << "\n Ошибка открытия файла для чтения" << endl ;
cout << " Для продолжения нажмите Enter->" ; getchar() ;
break ;
}
prosmotrbd1(fname_i) ;
cout << "\n Для продолжения нажмите Enter->" ; getchar() ;
break ;
case 6: return 0 ;
}
}
}
void dobavka(char *fname)
{char otv ;
trip excur ;
FILE *baza ;
baza = fopen(fname, PR_A) ;
rewind(baza) ;
do
{cout << "\n Марка машины? " ;
cin >> excur.name ;
cout << " Цвет? " ;
cin >> excur.color ;
cout << " Номер? " ;
cin >> excur.number ;
cout << " Год выпуска? " ;
cin >> excur.year ;
cout << " Владелец? " ;
cin >> excur.owner ;
fwrite(&excur, sizeof(excur), 1, baza) ;
cout << "\n Продолжать?[Y/N]" ;
cin >> otv ;
cin.get() ;
}
while(otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н') ;
fclose(baza) ;
}
void zag1()
{int i ;
cout << "\n" ;
for(i = 1; i <= 65; i++)
cout << "-" ;
cout << endl ;
cout << "| Марка машины |" << " Цвет |" << " Номер |"
<< " Год |" << " Владелец |" << endl ;
for(i = 1; i <= 65; i++)
cout << "-" ;
}
void prosmotrbd1(char *fname)
{int i ;
trip excur ;
FILE *baza ;
baza = fopen(fname, PR_R) ;
cout << "\n База данных автоинспекции" ;
zag1() ;
rewind(baza) ;
while(fread(&excur, sizeof(excur), 1, baza) > 0)
{cout << "\n|" ;
cout.width(15) ; cout << excur.name << "|" ;
cout.width(15) ; cout << excur.color << "|" ;
cout.width(10) ; cout << excur.number << "|" ;
cout.width(5) ; cout << excur.year << "|" ;
cout.width(14) ; cout << excur.owner << "|" ;
}
cout << "\n" ;
for(i = 1; i <= 65; i++)
cout << "-" ;
fclose(baza) ;
}
void sort_name(char *fname)
{int i ;
int fl ;
trip ppp, excur ;
FILE *baza ;
baza = fopen(fname, PR_S) ;
do{rewind(baza) ;
fl = 0 ;
for(i =0; fread(&excur, sizeof(excur), 1, baza) > 0; i += sizeof(excur), fseek(baza, i, SEEK_SET))
{if(fread(&ppp, sizeof(excur), 1, baza) > 0)
{if(strncmp(excur.name, ppp.name, 15) > 0)
{fseek(baza, i, SEEK_SET) ;
fwrite(&ppp, sizeof(excur), 1, baza) ;
fwrite(&excur, sizeof(excur), 1, baza) ;
fl = 1 ;
}
}
}
}
while(fl) ;
fclose(baza) ;
}
void sort_god(char *fname)
{int i ;
int fl ;
trip ppp, excur ;
FILE *baza ;
baza = fopen(fname, PR_S) ;
do{rewind(baza) ;
fl = 0 ;
for(i =0; fread(&excur, sizeof(excur), 1, baza) > 0; i += sizeof(excur),
fseek(baza, i, SEEK_SET))
{if(fread(&ppp, sizeof(excur), 1, baza) > 0)
{if(excur.year > ppp.year)
{fseek(baza, i, SEEK_SET) ;
fwrite(&ppp, sizeof(excur), 1, baza) ;
fwrite(&excur, sizeof(excur), 1, baza) ;
fl = 1 ;
}
}
}
}
while(fl) ;
fclose(baza) ;
}
int proverka_file(char *fname, const char *pr)
{
if((fopen(fname, pr)) == NULL)
return(0) ;
return(1) ;
}
Скриншот контрольного примера выполнения программы