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

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

Соседние файлы в папке Выполненая работа