Содержание
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
Общая постановка задания
Выполнить упражнение из раздела «Функции и файлы«, разместив описание структуры в заголовочном файле, а определения функций и главную функцию программы — в двух отдельных файлах. |
Образец выполнения (вариант №7)
Условие задачи
Для хранения данных о планшетных сканерах описать структуру вида, описанного в варианте $1$. Написать функцию, которая записывает в бинарный файл данные о сканере из приведенной структуры. Структура файла: в первых двух байтах размещается значение типа int, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах. Написать функцию, которая вводит данные о сканере с клавиатуры в структуру типа scan_info, и если данные об этом сканере отсутствуют в файле, помещают содержимое структуры в конец файла; в противном случае выдает соответствующее сообщение. Привести пример программы, создающей файл с данными о сканерах (данные вводятся из текстового файла) — $6-8$ записей и дополняющей файл записями о $2-3$ сканерах, вводимых с клавиатуры. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается. |
Реализация задачи на языке С++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #ifndef SCAN_H #define SCAN_H // описание сущности "Планшетный сканер" struct scan_info { char model[ 25 ]; // наименование модели int price; // цена double x_size; // горизонтальный размер области сканирования double y_size; // вертикальный размер области сканирования int optr; // оптическое разрешение int grey; // число градаций серого }; // максимальная длина строковых данных (например, имя файла) #define MAX 100 #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include "scan.h" // ввод данных с клавиатуры void Input_scan_info_from_keyboard( struct scan_info* const scan ) { printf( "\nВведите наименование модели: " ); gets_s( scan -> model, 24 ); fflush( stdin ); printf( "Введите цену (целое число): " ); scanf( "%d", &scan -> price ); fflush( stdin ); printf( "Введите горизонтальный размер области сканирования: " ); scanf( "%lf", &scan -> x_size ); fflush( stdin ); printf( "Введите вертикальный размер области сканирования: " ); scanf( "%lf", &scan -> y_size ); fflush( stdin ); printf( "Введите оптическое разрешение (целое число): " ); scanf( "%d", &scan -> optr ); fflush( stdin ); printf( "Введите число градаций серого (целое число): " ); scanf( "%d", &scan -> grey ); fflush( stdin ); } // проверка, что заданный сканер уже есть в бинарном файле // 0 - нету; 1 - есть size_t Is_scan_in_binary_file( const char* const name_file, const struct scan_info* const scan ) { #define EPS 0.0001 // точность для сравнения вещественных чисел // хранит информацию о текущем сканере, считанном из бинарного файла struct scan_info tmp; // количество сканеров, хранящихся в файле short int scaner_count; // счетчик для сканеров short int iscan; // для работы с бинарным файлом FILE* fbin = fopen( name_file, "rb" ); // сначала считываем количество сканеров, хранящихся в бинарном файле fread( &scaner_count, sizeof ( short int ), 1, fbin ); // начинаем поиск сканера в заданном бинарном файле for ( iscan = 0; iscan < scaner_count; iscan++ ) { if ( fread( &tmp, sizeof ( struct scan_info ), 1, fbin ) > 0 ) { if ( ( strcmp( scan -> model, tmp.model ) == 0 ) && ( scan ->price == tmp.price ) && ( fabs( scan -> x_size - tmp.x_size ) <= EPS ) && ( fabs( scan -> y_size - tmp.y_size ) <= EPS ) && ( scan -> optr == tmp.optr ) && ( scan -> grey == tmp.grey ) ) return 1; } } fclose( fbin ); return 0; } // добавление информации о новом сканере в заданный бинарный файл void Add_scan_to_binary_file( const char* const name_file, const struct scan_info* scan ) { short int scanner_count; FILE* fbin = fopen( name_file, "rb+" ); fread( &scanner_count, sizeof( short int ), 1, fbin ); scanner_count++; rewind( fbin ); fwrite( &scanner_count, sizeof( short int ), 1, fbin ); fclose( fbin ); fbin = fopen( name_file, "ab+" ); fwrite( scan, sizeof( struct scan_info ), 1, fbin ); fclose( fbin ); } // инициализация бинарного файла количеством сканеров в количестве 0 штук void Init_binary_file( const char* const name_file ) { short int scanner_count = 0; FILE* fbin = fopen( name_file, "wb" ); fwrite( &scanner_count, sizeof( short int ), 1, fbin ); fclose( fbin ); } // чтение данных о сканерах из текстового файла и сохранение их в бинарном файле void Scanners_from_text_to_binary_file( const char* const name_binary_file ) { char name_text_file[ MAX ]; FILE* ftext; struct scan_info scanner; // перед началом работы запрашиваем имя текстового файла с данными о сканерах printf( "\nВведите имя входного текстового файла с информацией о сканерах: " ); gets_s( name_text_file, MAX - 1 ); fflush( stdin ); ftext = fopen( name_text_file, "r" ); if ( ! ftext ) { printf( "\nОшибка открытия входного текстового файла с данными о сканерах! Программа аварийно завершается.\n\n" ); system( "pause" ); exit( EXIT_FAILURE ); } // читаем все данные о сканерах из текстового файла while ( ! feof( ftext ) ) { memset( scanner.model, 0, 25 ); fgets( scanner.model, 24, ftext ); scanner.model[ strlen( scanner.model ) - 1 ] = 0; fscanf( ftext, "%d", &scanner.price ); fscanf( ftext, "%lf", &scanner.x_size ); fscanf( ftext, "%lf", &scanner.y_size ); fscanf( ftext, "%d", &scanner.optr ); fscanf( ftext, "%d", &scanner.grey ); // добавляем информацию о текущем сканере в конец заданного бинарного файла Add_scan_to_binary_file( name_binary_file, &scanner ); fgetc( ftext ); fgetc( ftext ); } fclose( ftext ); printf( "Входные данные о сканерах успешно считаны из текстового файла и записаны в бинарный файл." ); } // вывод информации о заданном сканере на экран void Print_scaner_on_screen( const struct scan_info* const scan, const size_t number ) { printf( "%3u%20s%11d%18.2lf%16.2lf%12d%20d\n", number, scan -> model, scan -> price, scan -> x_size, scan -> y_size, scan -> optr, scan -> grey ); } // чтение данных о сканерах из заданного бинарного файла и вывод на экран void Read_data_from_binary_file( const char* const name_file, const char* const message ) { FILE* fbin = fopen( name_file, "rb" ); short int scaners_count, iscan; fread( &scaners_count, sizeof( short int ), 1, fbin ); // "рисуем" шапку таблицы printf( message ); printf( "---------------------------------------------------------------------------------------------------------\n" ); printf( " # Наименование Цена Горизонталь Вертикаль Оптика Оттенки серого \n" ); printf( "---------------------------------------------------------------------------------------------------------\n" ); for ( iscan = 0; iscan < scaners_count; iscan++ ) { struct scan_info tmp; if ( fread( &tmp, sizeof ( tmp ), 1, fbin ) > 0 ) Print_scaner_on_screen( &tmp, iscan + 1 ); } printf( "---------------------------------------------------------------------------------------------------------\n" ); fclose( fbin ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <stdio.h> // для консольного ввода-вывода #include <stdlib.h> // служебные функции и константы #include <locale.h> // для русификации диалогов // подключаем заголовочный файл с описание структуры данных "Сканер" #include "scan.h" // ввод данных с клавиатуры void Input_scan_info_from_keyboard( struct scan_info* const scan ); // проверка, что заданный сканер уже есть в бинарном файле // 0 - нету; 1 - есть size_t Is_scan_in_binary_file( const char* const name_file, const struct scan_info* const scan ); // добавление информации о новом сканере в заданный бинарный файл void Add_scan_to_binary_file( const char* const name_file, const struct scan_info* scan ); // инициализация бинарного файла количеством сканеров в количестве 0 штук void Init_binary_file( const char* const name_file ); // чтение данных о сканерах из текстового файла и сохранение их в бинарном файле void Scanners_from_text_to_binary_file( const char* const name_binary_file ); // вывод информации о заданном сканере на экран void Print_scaner_on_screen( const struct scan_info* const scan, const size_t number ); // чтение данных о сканерах из заданного бинарного файла и вывод на экран void Read_data_from_binary_file( const char* const name_file, const char* const message ); // главная функция программы (точка входа) int main( void ) { char name_file[ MAX ]; struct scan_info scan; // русификация диалогов программы setlocale( LC_ALL, "Russian" ); // перед началом работы запрашиваем имя бинарного файла, с которым будем работать printf( "Введите имя бинарного файла для хранения информации о сканерах: " ); gets_s( name_file, MAX - 1 ); fflush( stdin ); // инициализируем бинарный файл "нулем" Init_binary_file( name_file ); // читаем данные из текстового файла и сохраняем в бинарном файле Scanners_from_text_to_binary_file( name_file ); Read_data_from_binary_file( name_file, "\n\nИнформация о сканерах из текстового файла:\n" ); Input_scan_info_from_keyboard( &scan ); if ( Is_scan_in_binary_file( name_file, &scan ) == 1 ) printf( "\nСканер с такими характеристиками уже есть в бинарном файле! Вставка не производится.\n" ); else { Add_scan_to_binary_file( name_file, &scan ); printf( "\nИнформация о сканере успешно добавлена в конец бинарного файла.\n" ); Read_data_from_binary_file( name_file, "\nОбновленная информация о сканерах из бинарного файла:\n" ); } Input_scan_info_from_keyboard( &scan ); if ( Is_scan_in_binary_file( name_file, &scan ) == 1 ) printf( "\nСканер с такими характеристиками уже есть в бинарном файле! Вставка не производится.\n" ); else { Add_scan_to_binary_file( name_file, &scan ); printf( "\nИнформация о сканере успешно добавлена в конец бинарного файла.\n" ); Read_data_from_binary_file( name_file, "\nОбновленная информация о сканерах из бинарного файла:\n" ); } // после работы удаляем бинарный файл с диска компьютера remove( name_file ); // задержка программы, чтобы у пользователя была возможность просмотреть результаты printf( "\n\n" ); system( "pause" ); return EXIT_SUCCESS; } |
Результаты работы программы
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
Добавить комментарий