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

5 13ЛР инфа

.docx
Скачиваний:
13
Добавлен:
16.04.2021
Размер:
179.64 Кб
Скачать

Лабораторная работа №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) ;

}

Скриншот контрольного примера выполнения программы

10

Соседние файлы в предмете Основы программирования