Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Структуры и файлы структур

Автор:   •  Январь 26, 2023  •  Лабораторная работа  •  3,984 Слов (16 Страниц)  •  174 Просмотры

Страница 1 из 16

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

  1. федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

(ГУАП)

КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ

Преподаватель

канд. техн. наук, доцент                                                Л.Н. Бариков

Отчёт

по лабораторной работе № 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) ;
}

...

Скачать:   txt (17.7 Kb)   pdf (615.7 Kb)   docx (482.1 Kb)  
Продолжить читать еще 15 страниц(ы) »
Доступно только на Essays.club