
- •Void dellete_all(struct rekagent* beg);
- •Void change(struct rekagent* beg, struct rekagent* end, int id_num);//корректировка
- •Int inp_int(int n, const char* inf); // Прототип функции для ввода целочисленных значений с проверкой
- •Void header() //определение функции header(){
- •Void print_on_the_screen(const struct rekagent z) // Объявление функции вывода элемента на экран с параметром структуры rekagent
- •Void sort_replace(struct rekagent* left, struct rekagent* right, struct rekagent* temp){
- •Заключение
- •Список использованных источников
- •Бити нияу мифи ифст – 5з
Void change(struct rekagent* beg, struct rekagent* end, int id_num);//корректировка
// Это завершающая директива препроцессора для закрытия условия #ifndef, начатого в начале файла.
#endif
В функциях корректировки файла Change.c находится директивы и одна функция отрисовки меню корректировки и корректировки элемента списка редактирует элемент по введенному id, листинг файла с комментариями представлен ниже:
#include <Windows.h> // Подключение заголовочного файла Windows.h, который содержит функции для работы с операционной системой Windows.
#include "rekagent.h" // Подключение пользовательского заголовочного файла rekagent.h
#include "Menu.h" // Подключение пользовательского заголовочного файла Menu.h
#include "Input.h" // Подключение пользовательского заголовочного файла Input.h
#include "Output.h" // Подключение пользовательского заголовочного файла Output.h
#include "stdio.h" // Подключение стандартного заголовочного файла stdio.h
/*Функция корректировки*/
void change(struct rekagent* beg, struct rekagent* end, int id_num)
{
SetConsoleCP(1251); // Установка кодовой страницы ввода консоли на 1251
SetConsoleOutputCP(1251); // Установка кодовой страницы вывода консоли на 1251
if (beg != 0){
int number = 0; // Объявление переменной number типа int
char templ_lico[mem25], templ_manager[mem25], templ_gorod[mem25], templ_telephone[mem25], data[mem25]; // Объявление массивов символов
float servicenumber = 0, money = 0; // Объявление переменных типа float
strcpy(templ_lico, ""); // Копирование пустой строки в массив символов templ_lico
strcpy(templ_manager, ""); // Копирование пустой строки в массив символов templ_manager
strcpy(templ_gorod, ""); // Копирование пустой строки в массив символов templ_gorod
strcpy(templ_telephone, ""); // Копирование пустой строки в массив символов templ_telephone
strcpy(data, ""); // Копирование пустой строки в массив символов data
const char* change_menu[] = { // Объявление массива указателей на символьные строки
"Номер заказа",
"Юридическое или физическое лицо",
"Ответственный менеджер",
"Город",
"Номер телефона",
"Количество услуг",
"Сумма услуг(руб.)",
"Дата заказа"};
HANDLE ChangeHandle = GetStdHandle(STD_OUTPUT_HANDLE); // Получение дескриптора стандартного выходного потока консоли
struct rekagent* temp = beg; // Объявление указателя на структуру rekagent и инициализация его значением указателя на начало списка beg
while (temp){
if (temp->id == id_num) // Если поле id структуры temp равно переданному id_num{
switch (menu(change_menu, sizeof(change_menu), "Что вы хотите поменять ? "))
// Вызывается функция menu() с передачей ей аргументов change_menu (вероятно, это массив опций меню), sizeof(change_menu) (размер массива change_menu) и строкового сообщения "Что вы хотите поменять ? ". Результат функции используется как аргумент для внешнего switch-оператора.{
// Устанавливается цвет текста в консоли, используя функцию SetConsoleTextAttribute(). Вероятно, в данном случае устанавливается цвет текста в малиновый (Magenta) на белом фоне (White).
case 0:
system("cls");
cursor_off_on(TRUE);
number = inp_int(number, "Введите номер заказа :");
temp->numzakaza = number;
system("cls");
printf("%s%d\n", "Номер заказа был изменён на ", number);
printf("%s\n", "Отредактированный элемент : ");
header();
print_on_the_screen(*temp);
break;
// Если значение, возвращаемое функцией menu(), равно 0, выполняется указанный блок кода.
case 1:
system("cls");
cursor_off_on(TRUE);
strcpy(temp->lico, inp_charsymbol(templ_lico, "Юридическое или физическое лицо :", mem25));
system("cls");
printf("%s%s\n", "Юридическое или физическое лицо изменено на ", temp->lico);
printf("%s\n", "Отредактированный элемент :");
header();
print_on_the_screen(*temp);
break;
// Если значение, возвращаемое функцией menu(), равно 1, выполняется указанный блок кода.
case 2:
system("cls");
cursor_off_on(TRUE);
strcpy(temp->manager, inp_charsymbol(templ_manager, "Ответственный менеджер :", mem25));
system("cls");
printf("%s%s\n", "Ответственный менеджер изменен на ", temp->manager);
printf("%s\n", "Отредактированный элемент :");
header();
print_on_the_screen(*temp);
break;
// Если значение, возвращаемое функцией menu(), равно 2, выполняется указанный блок кода.
case 3:
system("cls");
cursor_off_on(TRUE);
strcpy(temp->gorod, inp_char(templ_gorod, "Введите город :", mem25));
system("cls");
printf("%s%s\n", "Город изменён на ", temp->gorod);
printf("%s\n", "Отредактированный элемент :");
header();
print_on_the_screen(*temp);
break;
// Если значение, возвращаемое функцией menu(), равно 3, выполняется указанный блок кода.
case 4:
system("cls"); // Очистка экрана
cursor_off_on(TRUE); // Скрытие курсора
strcpy(temp->telephone, inp_telephone(templ_telephone, "Номер телефона :", mem25)); // Ввод нового номера телефона и сохранение его в структуре
system("cls"); // Очистка экрана
printf("%s%s\n", "Номер телефона изменён на ", temp->telephone); // Вывод информации о измененном номере телефона
printf("%s\n", "Отредактированный элемент :"); // Вывод заголовка для отредактированного элемента
header(); // Вывод заголовка таблицы
print_on_the_screen(*temp); // Вывод отредактированного элемента на экран
break;
// Если значение, возвращаемое функцией menu(), равно 5, выполняется указанный блок кода.
case 5:
system("cls"); // Очистка экрана
servicenumber = inp_float(servicenumber, "Количество услуг :"); // Ввод нового количества услуг и сохранение его в структуре
temp->p_servicenumber = servicenumber; // Сохранение нового значения количества услуг в структуре
system("cls"); // Очистка экрана
printf("%s%f\n", "Количество услуг изменёно на ", temp->p_servicenumber); // Вывод информации о измененном количестве услуг
printf("%s\n", "Отредактированный элемент :"); // Вывод заголовка для отредактированного элемента
header(); // Вывод заголовка таблицы
print_on_the_screen(*temp); // Вывод отредактированного элемента на экран
break;
// Если значение, возвращаемое функцией menu(), равно 6, выполняется указанный блок кода.
case 6:
system("cls"); // Очистка экрана
cursor_off_on(TRUE); // Скрытие курсора
money = inp_float(money, "Сумма услуг(руб.) :"); // Ввод новой суммы услуг и сохранение ее в структуре
temp->p_money = money; // Сохранение нового значения суммы услуг в структуре
system("cls"); // Очистка экрана
printf("%s%f\n", "Сумма услуг изменена на ", temp->p_money); // Вывод информации о измененной сумме услуг
printf("%s\n", "Отредактированный элемент :"); // Вывод заголовка для отредактированного элемента
header(); // Вывод заголовка таблицы
print_on_the_screen(*temp); // Вывод отредактированного элемента на экран
break;
// Если значение, возвращаемое функцией menu(), равно 7, выполняется указанный блок кода.
case 7:
system("cls"); // Очистка экрана
cursor_off_on(TRUE); // Скрытие курсора
strcpy(temp->date, inp_date(data)); // Ввод новой даты и сохранение ее в структуре
system("cls"); // Очистка экрана
printf("%s%s\n", "Дата была изменена на ", temp->date); //Выводит на экран сообщение о том, что дата была изменена на новое значение, которое содержится в поле date структуры temp.
printf("%s\n", "Отредактированный элемент :");// Выводит на экран заголовок "Отредактированный элемент :" для указания на то, что следующая информация будет относиться к отредактированному элементу.
header(); // Вызывает функцию header(), которая, вероятно, выводит на экран заголовок таблицы с описанием полей структуры.
print_on_the_screen(*temp); //Вызывает функцию print_on_the_screen() и передает ей значение структуры temp через указатель на структуру.
break; //Прерывает текущий блок case внутри switch и переходит к выполнению следующей инструкции после switch.}
break; //Прерывает текущий цикл while и переходит к выполнению следующей инструкции после цикла.}
else // Если условие внутри if не выполняется, то выполняется эта часть кода, которая перемещает указатель temp на следующий элемент в очереди.{
temp = temp->next;}}}
else // Если нет элементов в очереди, то выводит на экран сообщение о невозможности использования функции.{
printf("%s\n", "Невозможно использовать функцию ! Отсутствуют элементы очереди!");}
cursor_off_on(FALSE); // Вызывает функцию cursor_off_on() с аргументом FALSE для включения отображения курсора на экране.}
В заголовочном файле Fileworks.h используется для объявления функции работы с файлами, а точнее для чтения из файла и для записи в файл, листинг файла представлен ниже:
// Файловый заголовочный файл FILEWORKS_H, используется для объявления функций работы с файлами
#ifndef FILEWORKS_H
#define FILEWORKS_H
#pragma once
// Объявление функции read_file для чтения из файла
// принимает аргументы: указатель на строку с именем файла (filename),
// указатель на указатель на структуру rekagent, представляющую начало списка (beg),
// указатель на указатель на структуру rekagent, представляющую конец списка (end)
// Возвращает целочисленное значение
int read_file(const char* filename, struct rekagent** beg, struct rekagent** end);
// Объявление функции write_in_file для записи в файл
// принимает аргументы: указатель на строку с именем файла (filename),
// указатель на структуру rekagent, представляющую данные для записи в файл (temp)
// Возвращает целочисленное значение
int write_in_file(const char* filename, struct rekagent* temp);
#endif
В функциях ввода файла Fileworks.c находится следующие функции:
включение необходимых заголовочных файлов и библиотек;
функция считывания информации из файла;
функция записи информации в файл.
Листинг файла представлен ниже:
#include <stdio.h> // Включение стандартной библиотеки ввода/вывода
#include <Windows.h> // Включение библиотеки Windows для работы с консольными функциями
#include <stdlib.h> // Включение стандартной библиотеки общего назначения
#include "rekagent.h" // Включение пользовательского заголовочного файла "rekagent.h" для использования его структур
#include "Queue.h" // Включение пользовательского заголовочного файла "Queue.h" для использования функций очереди
HANDLE FileworksHandle; // Объявление переменной типа HANDLE для работы с файлами
int read_file(const char* filename, struct rekagent** beg, struct rekagent** end)
{
FileworksHandle = GetStdHandle(STD_OUTPUT_HANDLE); // Получение дескриптора стандартного вывода консоли
SetConsoleTextAttribute(FileworksHandle, (WORD)((Magenta << 4) | White)); // Установка цвета текста в консоли
char type[] = ".data"; // Объявление и инициализация массива символов "type" с содержимым ".data"
int count=0; // Объявление и инициализация переменной "count" со значением 0 для подсчета считанных записей из файла
if (strstr(filename, type) != NULL) // Если подстрока ".data" содержится в имени файла{
struct rekagent temp; // Создание временной структуры "rekagent" для считывания данных из файла
const char* file = filename; // Присвоение имени файла указателю "file"
FILE* fin = fopen(file, "rb"); // Открытие файла для чтения в бинарном режиме
if (!fin) // Если не удалось открыть файл{
printf("%s%s%s\n", "Файл ", filename, " не найден!"); // Вывод сообщения о неудаче открытия файла
system("pause"); // Ожидание нажатия клавиши перед завершением программы
return 1; // Возврат значения 1, указывающего на ошибку}
else // Иначе{
while (fread(&temp.numzakaza, sizeof(int), sizeof(temp.numzakaza), fin)) // Чтение значения поля "numzakaza" из файла{
fread(&temp.lico, sizeof(char), mem25, fin); // Чтение значения поля "lico" из файла
fread(&temp.manager, sizeof(char), mem25, fin); // Чтение значения поля "manager" из файла
fread(&temp.gorod, sizeof(char), mem25, fin); // Чтение значения поля "gorod" из файла
fread(&temp.telephone, sizeof(char), mem25, fin); // Чтение значения поля "telephone" из файла
fread(&temp.date, sizeof(char), mem25, fin); // Чтение значения поля "date" из файла
fread(&temp.p_servicenumber, sizeof(float), sizeof(temp.p_money), fin); // Чтение значения temp.p_servicenumber из файла fin размером sizeof(float) байт, считываемых sizeof(temp.p_money) раз.
if (*beg == 0) // Если указатель на начало списка равен нулю (не инициализирован).{
*beg = add_first(temp); // Вызов функции add_first(temp) для создания первого элемента списка и присваивание его адреса указателю *beg.
*end = *beg; // Присваивание указателю *end адреса первого элемента списка.}
else//иначе{
*end = add(*end, temp); // Вызов функции add(*end, temp) для добавления элемента temp в конец списка и присваивание указателю *end адреса этого элемента.}
count++; // Увеличение счетчика count на единицу.}}
fclose(fin); // Закрытие файла fin.}
else // Иначе (если расширение файла не .data){
struct rekagent d; // Создание структуры rekagent с именем d.
FILE* fin = fopen(filename, "r"); // Открытие файла filename в режиме чтения и присваивание его указателя FILE* переменной fin.
if (!fin) { printf("%s%s%s\n", "Файл ", filename, " не найден!"); system("pause"); return 1; } // Если файл не удалось открыть, выводится сообщение об ошибке и возвращается значение 1.
char str[512]; // Создание массива символов размером 512 байт с именем str.
while (fgets(str, sizeof(str), fin)) // Чтение строки из файла fin в массив str размером sizeof(str) байт.{
if (strlen(str) == 0 || str[0]=='\n') // Если длина считанной строки равна 0 или первый символ - символ новой строки, то выход из цикла.
break;
str[strlen(str) - 1] = '\0'; strcpy(d.lico, str); // Удаление символа новой строки из считанной строки и копирование её в поле d.lico структуры d.
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; strcpy(d.manager, str); // Аналогичные действия для остальных полей структуры d.
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; strcpy(d.gorod, str); // Считываем строку из файла, обрезаем символ новой строки, копируем в поле gorod структуры d
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; strcpy(d.telephone, str); // Считываем строку из файла, обрезаем символ новой строки, копируем в поле telephone структуры d
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; strcpy(d.date, str); // Считываем строку из файла, обрезаем символ новой строки, копируем в поле date структуры d
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; d.numzakaza = atoi(str); // Считываем строку из файла, обрезаем символ новой строки, преобразуем в целое число и записываем в поле numzakaza структуры d
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; d.p_servicenumber = atoi(str); // Считываем строку из файла, обрезаем символ новой строки, преобразуем в целое число и записываем в поле p_servicenumber структуры d
fgets(str, sizeof(str), fin); str[strlen(str) - 1] = '\0'; d.p_money = atoi(str); // Считываем строку из файла, обрезаем символ новой строки, преобразуем в целое число и записываем в поле p_money структуры d
if (*beg == 0) // Если список ещё не создан{
*beg = add_first(d); // Создаём список, вызывая функцию add_first и записывая результат в указатель на начало списка beg
*end = *beg; // Устанавливаем указатель на конец списка end на начало списка beg}
else // Иначе{
*end = add(*end, d); // Добавляем структуру d в конец списка, вызывая функцию add, и записываем результат в указатель на конец списка end}
count++; // Увеличиваем счетчик записей}
fclose(fin); // Закрываем файл, открытый для чтения
} // Заканчиваем цикл while
printf("%s%s\n", "Считана информация из файла ", filename); // Выводим информацию о том, что информация считана из файла
printf("%s%d\n", "Считано следущее количество записей :", count); // Выводим количество считанных записей
return 0; // Возвращаем значение 0 в случае успешного выполнения}
/* Запись в файл */
int write_in_file(const char* filename, struct rekagent* temp)
{
FileworksHandle = GetStdHandle(STD_OUTPUT_HANDLE); // Получаем дескриптор консоли для работы с текстовыми атрибутами
SetConsoleTextAttribute(FileworksHandle, (WORD)((Magenta << 4) | White)); // Устанавливаем цвет текста в консоли
char type[] = ".data"; // Создаем массив символов type, содержащий ".data"
if (strstr(filename, type) != NULL) // Если в имени файла содержится ".data"{
const char* file = filename; // Присваиваем имя файла указателю file
FILE* fout = fopen(file, "wb"); // Открываем файл для записи в двоичном режиме
if (!fout) { // Если не удалось открыть файл
printf("%s%s%s\n", "Невозможно открыть файл ", filename, " для записи"); // Выводим сообщение об ошибке
system("pause"); // Останавливаем выполнение программы
return 1; // Возвращаем значение 1, указывающее на ошибку}
else { // Иначе{
struct rekagent* templ = temp; // Создаем указатель на структуру и присваиваем ему значение указателя на переданную структуру temp
while (templ) // Пока указатель на структуру не равен NULL{
fwrite(&templ->numzakaza, sizeof(int), sizeof(templ->numzakaza), fout); // Записываем значение поля numzakaza в файл
fwrite(&templ->lico, sizeof(char), mem25, fout); // Записываем значение поля lico в файл
fwrite(&templ->manager, sizeof(char), mem25, fout); // Записываем значение поля manager в файл
fwrite(&templ->gorod, sizeof(char), mem25, fout); // Записываем значение поля gorod в файл
fwrite(&templ->telephone, sizeof(char), mem25, fout); // Записываем значение поля telephone в файл
fwrite(&templ->date, sizeof(char), mem25, fout); // Записываем значение поля date в файл
fwrite(&templ->p_servicenumber, sizeof(float), sizeof(templ->p_servicenumber), fout); // Записываем значение поля p_servicenumber в файл
fwrite(&templ->p_money, sizeof(float), sizeof(templ->p_money), fout); // Записываем значение поля p_money в файл
templ = templ->next; // Переходим к следующей структуре в списке}}
fclose(fout); // Закрываем файл, открытый для записи}
else{
FILE* fout = fopen(filename, "w"); // Открываем файл для записи в текстовом режиме
if (!fout) { printf("%s%s%s\n", "Невозможно открыть файл ", filename, " для записи"); system("pause"); return 1; } // Если не удалось открыть файл, выводим сообщение об ошибке и возвращаем значение 1
while (temp) // Пока список не закончился{
fprintf(fout, "%s\n%s\n%s\n%s\n%s\n%u\n%f\n%f\n",
temp->lico, temp->manager, temp->gorod, temp->telephone, temp->date,
temp->numzakaza, temp->p_servicenumber, temp->p_money); // Записываем значения полей структуры в файл с помощью функции fprintf
temp = temp->next; // Переходим к следующей структуре в списке}
fclose(fout); // Закрываем файл, открытый для записи}
printf("%s%s\n", "Данные сохранены в файле: ", filename); // Выводим сообщение о том, что данные сохранены в файле
return 0; // Возвращаем значение 0 в случае успешного выполнения}
В заголовочном файле Input.h содержится необходимые для работы директивы и многочисленные прототипы функций, листинг файла представлен ниже:
#ifndef INPUT_H // Защита от множественного включения заголовочного файла INPUT_H
#define INPUT_H
#pragma once // Оптимизация компиляции за счет пропуска повторного включения файла
#include <stdbool.h> // Включение стандартной библиотеки bool