Структуры и файлы структур
Автор: klags - • Январь 26, 2023 • Лабораторная работа • 3,984 Слов (16 Страниц) • 167 Просмотры
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
(ГУАП)
КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
Преподаватель
канд. техн. наук, доцент Л.Н. Бариков
Отчёт
по лабораторной работе № 13
по дисциплине ОСНОВЫ ПРОГРАММИРОВАНИЯ
на тему: «Структуры и файлы структур»
Работу выполнил
студент гр. 4143 К.К. Шапокляк
Санкт-Петербург
2023
Вариант № 29
Цель лабораторной работы: изучение структурной организации, способов доступа к элементам и других особенностей структур и файлов структур; изучение стандартных средств языка C/C++ для работы с бинарными файлами; совершенствование навыков процедурного программирования на языке C/C++ при решении задач обработки файлов.
Задание на программирование: используя технологию процедурного программирования разработать программу обработки бинарных файлов структур с числом записей не менее пяти в соответствии с индивидуальным заданием.
Задание: разработать программу, создающую файл записей, содержащий
информацию о телефонном разговоре (код города, номер телефона, дата разговора, продолжительность разговора в минутах, стоимость за минуту в рублях). Реализовать функции добавления новых записей, поиска по дате разговора, сортировки файла по убыванию продолжительности разговора, сортировки файла по возрастанию стоимости разговора за минуту.
Текст программы:
/*Бинарные файлы.
Ввод/вывод с использованием функций библиотек языка C
Программа работы с базой данных "Телефонные звонки"
Создание базы
Добавление новых записей
Просмотр базы
Поиск звонков по дате
Сортировка по убыванию продолжительности разговора
Сортировка в порядке возрастания стоимости звонка в минуту
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define FNAME_I "D:\\bd15.dat" //имя файла с исходной базой
#define FNAME_R "D:\\bd25.dat" //имя файла с результатами поиска
int proverka_file(const char *, const char *) ; //проверка наличия файла
void dobavka(const char *fname) ;
void zag1() ;
void zag2() ;
void prosmotrbd1(const char *fname) ;
void prosmotrbd2(const char *fname) ;
void poiskdate(const char *fname1, const char *fname2) ;
void sort_ub_time(const char *fname) ;
void sort_voz_stoimost(const char *fname) ;
const char PR_R[] = "rb" ; //признак открытия бинарного файла на чтение
const char PR_S[] = "r+b" ; //признак открытия файла на чтение и запись
const char PR_W[] = "wb" ; //признак открытия файла на запись
const char PR_A[] = "ab" ; //признак открытия файла на добавление
typedef struct {char gorod[4] ; //код города
char nomer[10] ; //номер телефона
float stoimost ; //стоимость звонка за минуту (руб.)
int time ; //продолжительность звонка (мин.)
char date[10] ; //дата звонка
}call ;
//main_Begin______________________________________________________________
int main()
{
int var ;
char otv ;
char fname_i[20] = FNAME_I ;
char fname_r[20] = FNAME_R ;
setlocale(LC_ALL,"Russian") ;
for( ; ;)
{//Выбор вида действия
printf("\n Вид действия:\n") ;
printf(" 1 - создание базы данных\n") ;
printf(" 2 - добавление новых записей\n") ;
printf(" 3 - сортировка по убыванию продолжительности разговора\n") ;
printf(" 4 - сортировка звонков по стоимости за минуту\n") ;
printf(" 5 - поиск звонков по дате\n") ;
printf(" 6 - просмотр базы данных\n") ;
printf(" 7 - просмотр базы данных поиска по дате\n") ;
printf(" 8 - завершение задачи\n") ;
printf(" Введите вид действия ->") ;
scanf("%i", &var) ;
switch(var)
{
default:break ;
case 1: if(proverka_file(fname_i, PR_R))
{
printf(" Файл базы данных телефонных звонков с именем ", fname_i) ;
printf(" был создан раньше.\n") ;
printf(" Создаём файл с новым именем? [Y/N] ") ;
while((otv = getchar()) == '\n');
if(otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
{
printf(" Задайте имя создаваемого файла: ") ;
scanf("%s", fname_i) ;
}
else break ;
}
if(!proverka_file(fname_i, PR_W))
{
printf("\n Ошибка открытия файла для записи\n") ;
break ;
}
printf(" Создаем базу ", fname_i, '\n') ;
getchar() ;
dobavka(fname_i) ;
printf("\n Создание файла закончено.\n") ;
if(proverka_file(fname_i, PR_R))
printf(" База данных готова к работе\n") ;
else printf("\n база не создана\n") ;
break ;
case 2: if(proverka_file(fname_i, PR_R))
{
printf(" Файл базы данных телефоннных звонков с именем ", fname_i) ;
printf(" был создан раньше.\n") ;
printf(" Будем добавлять новые записи в него? [Y/N] ") ;
while((otv = getchar()) == '\n');
if(otv == 'N' || otv == 'n' || otv == 'Т' || otv == 'т')
{
printf(" Задайте имя файла другой базы: ") ;
scanf("%s", fname_i) ;
if(!proverka_file(fname_i, PR_R))
{
printf(" Такая база данных не создавалась\n") ;
break ;
}
}
}
printf(" Добавляем записи в файл ", fname_i, '\n') ;
dobavka(fname_i) ;
printf("\n Изменение файла закончено.") ;
break ;
case 3: if(!proverka_file(fname_i, PR_S))
{
printf("\n Ошибка открытия файла для чтения и записи\n") ;
break ;
}
sort_ub_time(fname_i) ;
printf("\n Сортировка по убыванию продолжительности разговора закончена.") ;
break ;
case 4: if(!proverka_file(fname_i, PR_S))
{
printf("\n Ошибка открытия файла для чтения и записи\n") ;
break ;
}
sort_voz_stoimost(fname_i) ;
printf("\n Сортировка по возрастанию стоимости за минуту разговора закончена.") ;
break ;
case 5: if(!proverka_file(fname_i, PR_R))
{
printf("\n Ошибка открытия файла для чтения\n") ;
break ;
}
if(!proverka_file(fname_r, PR_W))
{
printf("\n Ошибка открытия файла для записи\n") ;
break ;
}
poiskdate(fname_i, fname_r) ;
printf("\n Поиск по дате звонка закончен.") ;
break ;
case 6: if(!proverka_file(fname_i, PR_R))
{
printf("\n Ошибка открытия файла для чтения\n") ;
break ;
}
prosmotrbd1(fname_i) ;
break ;
case 7: if(!proverka_file(fname_r, PR_R))
{
printf("\n Ошибка открытия файла для чтения\n") ;
break ;
}
prosmotrbd2(fname_r) ;
break ;
case 8: return 0 ;
}
}
}
//Добавление новых элементов в базу данных
void dobavka(const char *fname)
{char otv ;
call zvonok ;
FILE *baza ;
baza = fopen(fname, PR_A) ;
rewind(baza) ;
do
{
printf("\n Код города? ") ;
scanf("%s", &zvonok.gorod) ;
printf("Номер телефона? ") ;
scanf("%s", &zvonok.nomer) ;
printf("Стоимость звонка за минуту? (руб.) ") ;
scanf("%g", &zvonok.stoimost) ;
printf("Продолжительность? (мин.) ") ;
scanf("%i", &zvonok.time) ;
printf("Дата? ") ;
scanf("%s", &zvonok.date) ;
fwrite(&zvonok, sizeof(zvonok), 1, baza) ;
printf("\n Продолжать?[Y/N]") ;
while((otv = getchar()) == '\n');
}
while(otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н') ;
fclose(baza) ;
return ;
}
//Вывод заголовка при просмотре исходного файла
void zag1()
{
int i ;
printf("\n") ;
for(i = 1; i <= 66; i++)
printf("-") ;
printf("\n") ;
printf("|%15s|%15s|%10s|%18s|%24s|\n", "Код города ", "Номер телефона",
"Дата разг.", "Продолжит. (мин.)", "Стоимость за мин. (руб.)") ;
for(i = 1; i <= 66; i++)
printf("-") ;
return ;
}
//Вывод заголовка при просмотре файла поиска по дате
void zag2()
{
int i ;
printf("\n") ;
for(i = 1; i <= 66; i++)
printf("-") ;
printf("\n") ;
printf("|%15s|%15s|%10s|%18s|%24s|\n", "Дата разг. ", "Код города",
"Номер телефона","Продолжит. (мин.)", "Стоимость за мин. (руб.)") ;
for(i = 1; i <= 66; i++)
printf("-") ;
return ;
}
//Просмотр базы данных телефонных звонков
void prosmotrbd1(const char *fname)
{
int i ;
call zvonok ;
FILE *baza ;
baza = fopen(fname, PR_R) ;
printf("\n База данных телефонных звонков") ;
zag1() ;
while(fread(&zvonok, sizeof(zvonok), 1, baza) > 0)
{printf("\n|%15s|%15s|%10s|%18i|%24g|", zvonok.gorod, zvonok.nomer,
zvonok.date, zvonok.time, zvonok.stoimost) ;
}
printf("\n") ;
for(i = 1; i <= 66; i++)
printf("-") ;
fclose(baza) ;
return ;
}
//Просмотр базы данных телефонных звонков по требуемой дате
void prosmotrbd2(const char *fname)
{
int i ;
call zvonok ;
FILE *baza ;
baza = fopen(fname, PR_R) ; //открываем файл на чтение
printf("\n База данных звонков по дате разговора:") ;
zag2() ;
while(fread(&zvonok, sizeof(zvonok), 1, baza) > 0)
{printf("\n|%15s|%15s|%14s|%18i|%24g|", zvonok.date, zvonok.gorod,
zvonok.nomer, zvonok.time, zvonok.stoimost) ;
}
printf("\n") ;
for(i = 1; i <= 66; i++)
printf("-") ;
fclose(baza) ;
return ;
}
//Поиск звонков по запрашиваемой дате
void poiskdate(const char *fname1, const char *fname2)
{
char date[11] ;
call zvonok ;
FILE *in, //исходный файл
*out ; //файл результатов поиска
in = fopen(fname1, PR_R) ; //открываем файл на чтение
out = fopen(fname2, PR_W) ; //открываем файл на запись
printf("\n Дата поиска разговора(-ов)? ") ;
scanf("%s", &date) ;
while(fread(&zvonok, sizeof(zvonok), 1, in) > 0)
if(strncmp(zvonok.date, date, 11) == 0)
fwrite(&zvonok, sizeof(zvonok), 1, out) ;
fclose(out) ;
fclose(in) ;
return ;
}
//Сортировка по убыванию продолжительности разговора
void sort_ub_time(const char *fname)
{
int i ;
int fl ;
call ppp, zvonok ;
FILE *baza ;
baza = fopen(fname, PR_S) ; //открываем файл на чтение и запись
do
{
rewind(baza) ;
fl = 0 ;
for(i = 0; fread(&zvonok, sizeof(zvonok), 1, baza) > 0; i += sizeof(zvonok),
fseek(baza, i, SEEK_SET))
{
if(fread(&ppp, sizeof(zvonok), 1, baza) > 0)
{
if(zvonok.time < ppp.time)
{
fseek(baza, i, SEEK_SET) ; //позиция i от начала файла
fwrite(&ppp, sizeof(zvonok), 1, baza) ;
fwrite(&zvonok, sizeof(zvonok), 1, baza) ;
fl = 1 ;
}
}
}
}
while(fl) ;
fclose(baza) ;
return ;
}
//Сортировка по возрастанию цены звонка за минуту
void sort_voz_stoimost(const char *fname)
{
int i ;
int fl ;
call ppp, zvonok ;
FILE *baza ;
baza = fopen(fname, PR_S) ; //открываем файл на чтение и запись
do
{
rewind(baza) ;
fl = 0 ;
for(i = 0; fread(&zvonok, sizeof(zvonok), 1, baza) > 0; i += sizeof(zvonok),
fseek(baza, i, SEEK_SET))
{
if(fread(&ppp, sizeof(zvonok), 1, baza) > 0)
{
if(zvonok.stoimost > ppp.stoimost)
{
fseek(baza, i, SEEK_SET) ; //позиция i от начала файла
fwrite(&ppp, sizeof(zvonok), 1, baza) ;
fwrite(&zvonok, sizeof(zvonok), 1, baza) ;
fl = 1 ;
}
}
}
}
while(fl) ;
fclose(baza) ;
return ;
}
//проверка наличия физического файла
int proverka_file(const char *fname, const char *pr)
{//Открываем файл
if(!(fopen(fname, pr))) //файл не существует
return(0) ;
return(1) ;
}
...