
- •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з
Int inp_int(int n, const char* inf); // Прототип функции для ввода целочисленных значений с проверкой
char* inp_date(char* date); // Прототип функции для ввода даты с проверкой
bool check_date(char* date); // Прототип функции для проверки корректности введенной даты
float inp_float(float temp, const char* inf); // Прототип функции для ввода вещественных значений с проверкой
char* inp_char(char* temp, const char* inf, int size); // Прототип функции для ввода символов с проверкой
char* inp_charsymbol(char* temp, const char* inf, int size); // Прототип функции для ввода символов с проверкой на наличие символов
char* inp_telephone(char* temp, const char* inf, int size); // Прототип функции для ввода номера телефона с проверкой
char* inp_filename(const char* inf); // Прототип функции для ввода имени файла с проверкой
void cursor_off_on(bool inf); // Прототип функции для включения/выключения курсора
bool check_char(char* temp); // Прототип функции для проверки корректности введенных символов
bool check_charsymbol(char* temp); // Прототип функции для проверки наличия символов в введенных данных
bool check_telephone(char* temp); // Прототип функции для проверки корректности введенного номера телефона
char* delete_space(char* temp, int size); // Прототип функции для удаления пробелов из введенной строки
struct rekagent input(); // Прототип функции для ввода структуры
char* InputStr(int size); // Прототип функции для ввода строки определенного размера
int isdigit(char ch); // Прототип функции для проверки, является ли символ цифрой
int ispunct(char ch); // Прототип функции для проверки, является ли символ знаком препинания
#endif // Конец условного включения заголовочного файла INPUT_H
В функциях ввода файла Input.c находится следующие функции:
ввода и проверки данных типа int - int inp_int(int n, const char* inf);
ввода даты - char* inp_date(char* date);
проверки даты - bool check_date(char* date);
проверка номера телефона - char* inp_telephone(char* temp, const char* inf, int size);
ввода и проверки данных типа float - float inp_float(float temp, const char* inf);
ввода данных типа char - char* inp_char(char* temp, const char* inf, int size);
ввода и проверки имени файла - char* inp_filename(const char* inf);
включения и отключения мигающей каретки в консоли - void cursor_off_on(bool inf);
проверки данных типа char - bool check_char(char* temp);
удаление лишних пробелов из массива типа char - char* delete_space(char* temp, int size);
функция отображения и скрытия курсора на экране.
Листинг файла Input.c предоставлен ниже:
#include <Windows.h>
#include "rekagent.h"
#include "Input.h"
#include "stdio.h"
struct rekagent input(){
SetConsoleCP(1251); // Устанавливаем кодовую страницу ввода для консоли
SetConsoleOutputCP(1251); // Устанавливаем кодовую страницу вывода для консоли
struct rekagent z; // Создаем структуру rekagent для ввода данных
z.numzakaza = 0; // Инициализируем поля структуры значением по умолчанию
strcpy(z.lico, "");
strcpy(z.manager, "");
strcpy(z.gorod, "");
strcpy(z.telephone, "");
z.p_servicenumber = 0;
z.p_money = 0;
strcpy(z.date, "");
z.numzakaza = inp_int(z.numzakaza, "Введите номер заказа :"); // Вводим значение поля numzakaza с помощью функции inp_int и сохраняем в структуре z
strcpy(z.lico, inp_charsymbol(z.lico, "Введите юридическое или физическое лицо :", mem25)); // Вводим значение поля lico с помощью функции inp_charsymbol и сохраняем в структуре z
strcpy(z.manager, inp_charsymbol(z.manager, "Ответственный за заказ :", mem25)); // Вводим значение поля manager с помощью функции inp_charsymbol и сохраняем в структуре z
strcpy(z.gorod, inp_char(z.gorod, "Город :", mem25)); // Вводим значение поля gorod с помощью функции inp_char и сохраняем в структуре z
strcpy(z.telephone, inp_telephone(z.telephone, "Номер телефона :", mem25)); // Вводим значение поля telephone с помощью функции inp_telephone и сохраняем в структуре z
z.p_servicenumber = inp_float(z.p_servicenumber, "Количество услуг:"); // Вводим значение поля p_servicenumber с помощью функции inp_float и сохраняем в структуре z
z.p_money = inp_float(z.p_money, "Сумма услуг(руб.):"); // Вводим значение поля p_money с помощью функции inp_float и сохраняем в структуре z
strcpy(z.date, inp_date(z.date)); // Вводим значение поля date с помощью функции inp_date и сохраняем в структуре z
return z; // Возвращаем заполненную структуру z}
char* InputStr(int size){
char* str = (char*)malloc(sizeof(char) * size); // Выделяем память под строку размером size
fgets(str, size, stdin); // Считываем строку из стандартного ввода
str[strlen(str) - 1] = '\0'; // Удаляем символ новой строки из конца строки
return str; // Возвращаем указатель на считанную строку}
int isdigit(char ch){
return '0' <= ch && ch <= '9'; // Функция, проверяющая, является ли символ цифрой
}
int ispunct(char ch){
return ch == ',' || ch == '-' || ch == '!' || ch == '?' || ch == '.' || ch == ':' || ch == ';'; // Функция, проверяющая, является ли символ знаком пунктуации}
/*Проверка ввода переменных типа int*/
int inp_int(int n, const char* inf){
while (1){
printf("%s\n", inf); // Вывод информационного сообщения на экран
char* num = InputStr(mem25); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - mem25
int n = atoi(num); // Преобразование строки в целое число с помощью функции atoi()
int size = strlen(num); // Определение длины введенной строки
if (n == 0 && (size != 1 || size == 1 && num[0] != '0')) // Проверка, что введенное значение не равно 0, и что строка не содержит только символ '0' (неправильный ввод)
printf("Похоже вы неправильно ввели информацию. Повторите попытку.\n"); // Вывод сообщения об ошибке
else return n; // Возврат введенного значения типа int}}
/*Проверка ввода телефона*/
char* inp_telephone(char* temp, const char* inf, int size){
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(size); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - size
temp = delete_space(temp, size); // Удаление пробелов из введенной строки с помощью функции delete_space()
while (strcmp(temp, "") == 0 || strcmp(temp, "\0") == 0 || !check_telephone(temp)) // Проверка на пустую строку, строку с нулевым символом или неправильный формат номера телефона с помощью функции check_telephone(){
printf("%s\n", "Похоже вы неправильно ввели номер телефона. Ввод совершается через 8 и должно содержать 11 символов.\nПовторите попытку. Пример: 89999882296"); // Вывод сообщения об ошибке
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(size); // Повторный ввод строки
temp = delete_space(temp, size); // Удаление пробелов из введенной строки}
return temp; // Возврат введенной строки с номером телефона}
bool check_telephone(char* temp){
int i = 0, count = 0; // Инициализация переменных для цикла и подсчета ошибок
while (temp[i]) // Пока не достигнут конец строки{
if (!isdigit(temp[i]) || temp[0] != '8' || strlen(temp) != 11) // Проверка, что символы в строке являются цифрами, первый символ равен '8' и длина строки равна 11
count++; // Увеличение счетчика ошибок
i++; // Переход к следующему символу}
if (count == 0) // Если количество ошибок равно 0, то номер телефона введен корректно
return true;
else
return false; // В противном случае, номер телефона введен некорректно}
/*Проверка ввода переменных типа char c символами*/
char* inp_charsymbol(char* temp, const char* inf, int size){
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(size); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - size
temp = delete_space(temp, size); // Удаление пробелов из введенной строки с помощью функции delete_space()
while (strcmp(temp, "") == 0 || strcmp(temp, "\0") == 0 || !check_charsymbol(temp)) // Проверка на пустую строку, строку с нулевым символом или наличие цифровых символов в строке с помощью функции check_charsymbol(){
printf("Похоже вы неправильно ввели информацию. Повторите попытку.\n"); // Вывод сообщения об ошибке
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(size); // Повторный ввод строки
temp = delete_space(temp, size); // Удаление пробелов из введенной строки}
return temp; // Возврат введенной строки с информацией}
bool check_charsymbol(char* temp){
int i = 0, count = 0; // Инициализация переменных для цикла и подсчета цифровых символов
while (temp[i] != '\0' && temp[i]) // Пока не достигнут конец строки{
if (isdigit(temp[i])) // Проверка, является ли текущий символ цифровым
count++; // Увеличение счетчика цифровых символов
i++; // Переход к следующему символу}
if (count == 0) // Если количество цифровых символов равно 0, то информация введена корректно
return true;
else
return false; // В противном случае, введена некорректная информация}
/*Проверка ввода переменных типа char*/
char* inp_char(char* temp, const char* inf, int size){
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(size); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - size
temp = delete_space(temp, size); // Удаление пробелов из введенной строки с помощью функции delete_space()
while (strcmp(temp, "") == 0 || strcmp(temp, "\0") == 0 || !check_char(temp)) // Проверка на пустую строку, строку с нулевым символом или наличие цифровых или пунктуационных символов в строке с помощью функции check_char(){
printf("Похоже вы неправильно ввели информацию. Повторите попытку.\n"); // Вывод сообщения об ошибке
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(size); // Повторный ввод строки
temp = delete_space(temp, size); // Удаление пробелов из введенной строки}
return temp; // Возврат введенной строки с информацией}
bool check_char(char* temp){
int i = 0, count = 0; // Инициализация переменных для цикла и подсчета цифровых и пунктуационных символов
while (temp[i] != '\0' && temp[i]) // Пока не достигнут конец строки{
if (isdigit(temp[i]) || ispunct(temp[i])) // Проверка, является ли текущий символ цифровым или пунктуационным
count++; // Увеличение счетчика цифровых и пунктуационных символов
i++; // Переход к следующему символу}
if (count == 0) // Если количество цифровых и пунктуационных символов равно 0, то информация введена корректно
return true;
else
return false; // В противном случае, введена некорректная информация}
char* delete_space(char* temp, int size){
int i = 0; // Инициализация переменной для цикла
while (temp[i] != '\0' && temp[i]) // Пока не достигнут конец строки{
if (temp[0] == ' ' || temp[0] == '\n' || temp[0] == '\r' || temp[0] == '\t') // Проверка, является ли текущий символ пробелом, символом новой строки, возврата каретки или символом табуляции
for (i = 0; i < sizeof(temp); i++) // Если да, то сдвиг всех символов влево на одну позицию, для удаления пробела или другого символа{
temp[i] = temp[i + 1];}
i++; // Переход к следующему символу}
return temp; // Возврат строки без пробелов или других символов}
/*Проверка ввода имени файла*/
char* inp_filename(const char* inf)
{
printf("%s\n", inf); // Вывод информационного сообщения на экран
char* temp = InputStr(mem25); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - mem25
while (!temp) // Если строка не введена{
printf("Похоже вы неправильно ввели информацию. Повторите попытку.\n"); // Вывод сообщения об ошибке
printf("%s\n", inf); // Вывод информационного сообщения на экран
temp = InputStr(mem25); // Повторный ввод строки}
return temp; // Возврат введенной строки с информацией}
/*Проверка ввода переменных типа float*/
float inp_float(float temp, const char* inf){
while (1) // Бесконечный цикл{
printf("%s\n", inf); // Вывод информационного сообщения на экран
char* num = InputStr(mem25); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - mem25
float n = atof(num); // Преобразование введенной строки в значение типа float
int size = strlen(num); // Определение длины введенной строки
if (n == 0 && (size != 1 || size == 1 && num[0] != '0')) // Проверка на корректность ввода числа, не допускается ввод "0" или чисел, состоящих только из нулей
printf("Похоже вы неправильно ввели информацию. Повторите попытку.\n"); // Вывод сообщения об ошибке
else return n; // Возврат введенного числа типа float}}
/*Проверка ввода даты*/
char* inp_date(char* date){
printf("%s\n", "Введите дату :"); // Вывод информационного сообщения на экран
printf("%s\n", "ГГГГ.ММ.ДД"); // Формат ожидаемой даты
date = InputStr(mem25); // Ввод строки с помощью функции InputStr(), ожидаемая длина строки - mem25
while (strcmp(date, "") == 0 || strcmp(date, "\0") == 0 || !check_date(date)) // Проверка на корректность ввода даты, путем сравнения со строками "" и "\0" (пустые строки) и вызова функции check_date() для проверки формата даты{
printf("Похоже вы неправильно ввели информацию. Повторите попытку.\n"); // Вывод сообщения об ошибке
printf("%s\n", "Введите дату :"); // Вывод информационного сообщения на экран
printf("%s\n", "ГГГГ.ММ.ДД"); // Формат ожидаемой даты
date = InputStr(mem25); // Повторный ввод строки}
return date; // Возврат введенной даты}
/*Проверка правильности даты*/
bool check_date(char* date){
int year = 0, month = 0, day = 0, count = 0; // Объявление и инициализация переменных year, month, day, count
for (int i = 0; i < 5; i++) // Цикл перебора первых 5 символов в строке date
{
if (isdigit(date[i])) count++; // Проверка, является ли символ цифрой, и увеличение счетчика count, если да}
if (count != 4) return false; // Если count не равен 4, то возвращается значение false, так как ожидается 4 цифры для года
count = 0; // Сброс счетчика count
for (int i = 0; i < 3; i++) // Цикл перебора следующих 3 символов в строке date{
if (isdigit(date[i + 5])) count++; // Проверка, является ли символ цифрой, и увеличение счетчика count, если да}
if (count < 1 || count > 2) return false; // Если count меньше 1 или больше 2, то возвращается значение false, так как ожидается 1 или 2 цифры для месяца
count = 0; // Сброс счетчика count
for (int i = 0; i < 2; i++) // Цикл перебора последних 2 символов в строке date{
if (isdigit(date[i + 8])) count++; // Проверка, является ли символ цифрой, и увеличение счетчика count, если да}
if (count < 1 || count > 2) return false; // Если count меньше 1 или больше 2, то возвращается значение false, так как ожидается 1 или 2 цифры для дня
day += atoi(&date[8]); // Преобразование символов дня в число и добавление к переменной day
month += atoi(&date[5]); // Преобразование символов месяца в число и добавление к переменной month
year += atoi(&date[0]); // Преобразование символов года в число и добавление к переменной year
if (year < 1990 || year > 2031) return false; // Если год меньше 1990 или больше 2031, то возвращается значение false, так как год должен быть в диапазоне от 1990 до 2031
if (month < 1 || month > 12) return false; // Если месяц меньше 1 или больше 12, то возвращается значение false, так как месяц должен быть в диапазоне от 1 до 12
switch (month){
case 1:
if (day < 1 || day>31) return false; // Проверка дня для января, должен быть в диапазоне от 1 до 31
break;
case 2:
if (year % 100 == 0)
{
if (year % 400 == 0)
{
if (day < 1 || day>29) return false; // Проверка дня для февраля в високосном году, должен быть в диапазоне от 1 до 29
}
else { if (day < 1 || day>28) return false; } // Проверка дня для февраля в невисокосном году, должен быть в диапазоне от 1 до 28}
else{
if (year % 4 == 0) { if (day < 1 || day>29) return false; } // Проверка дня для февраля в високосном году, должен быть в диапазоне от 1 до 29
else { if (day < 1 || day>28) return false; } // Проверка дня для февраля в невисокосном году, должен быть в диапазоне от 1 до 28}
break;
case 3:
if (day < 1 || day>31) return false; // Проверка дня для марта, должен быть в диапазоне от 1 до 31
break;
case 4:
if (day < 1 || day>30) return false; // Проверка дня для апреля, должен быть в диапазоне от 1 до 30
break;
case 5:
if (day < 1 || day>31) return false; // Проверка дня для мая, должен быть в диапазоне от 1 до 31
break;
case 6:
if (day < 1 || day>30) return false; // Проверка дня для июня, должен быть в диапазоне от 1 до 30
break;
case 7:
if (day < 1 || day>31) return false; // Проверка дня для июля, должен быть в диапазоне от 1 до 31
break;
case 8:
if (day < 1 || day>31) return false; // Проверка дня для августа, должен быть в диапазоне от 1 до 31
break;
case 9:
if (day < 1 || day>30) return false; // Проверка дня для сентября, должен быть в диапазоне от 1 до 30
break;
case 10:
if (day < 1 || day>31) return false; // Проверка дня для октября, должен быть в диапазоне от 1 до 31
break;
case 11:
if (day < 1 || day>30) return false; // Если месяц ноябрь (11), проверяем, что день не меньше 1 и не больше 30
break;
case 12:
if (day < 1 || day>31) return false; // Если месяц декабрь (12), проверяем, что день не меньше 1 и не больше 31
break;}
return true; // Возвращаем true, если все проверки пройдены успешно}
/*Функция отображения/скрытия курсора на экране*/
void cursor_off_on(bool inf){
void* handle = GetStdHandle(STD_OUTPUT_HANDLE); // Получаем дескриптор экрана
CONSOLE_CURSOR_INFO structCursorInfo; // Создаем структуру для хранения информации о курсоре
GetConsoleCursorInfo(handle, &structCursorInfo); // Получаем информацию о текущем состоянии курсора
structCursorInfo.bVisible = inf; // Устанавливаем видимость курсора в соответствии с переданным параметром
SetConsoleCursorInfo(handle, &structCursorInfo); // Применяем изменения}
Заголовочный файл отрисовки меню Menu.h содержит следующие строки:
#ifndef MENU_H
#define MENU_H
#pragma once
#include <setjmp.h>
int menu(const char* menuElems[], int size, const char* inf);//меню
int menu_category(const char* menuElems[], int size, const char* inf, jmp_buf env);
int start_menu();
void goto_x_y(short x, short y);
#endif
Функции отрисовки меню и взаимодействия с ним. Функция menu_category отличается от стандартной menu тем, что может вернуть пользователя в главное меню программы при нажатии ESC.
int menu(string menuElems[], int size, string inf);
int menu_category(string menuElems[], int size, string inf, jmp_buf env);
Функция отрисовки стартового меню и взаимодействия с ним.
int start_menu();
Функция перемещения позиции курсора в консоли. Нужна для отрисовки некоторых элементов.
void goto_x_y(short x, short y);
Полный листинг файла Menu.c предоставлен ниже:
#include <conio.h>
#include <Windows.h>
#include "rekagent.h"
#include "Input.h"
#include "Menu.h"
#include "stdio.h"
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
COORD coord;
void GetBufferInfo(COORD* coord){
HANDLE consoleHandle = (STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(consoleHandle, &csbInfo);
coord->X = (csbInfo.srWindow.Right - csbInfo.srWindow.Left + 1);
coord->Y = (csbInfo.srWindow.Bottom - csbInfo.srWindow.Top + 1);}
void goto_x_y(short x, short y){
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD a; a.X = x; a.Y = y;
SetConsoleCursorPosition(consoleHandle, a);}
int menu(const char * menuElems[], int size, const char* inf){
COORD coord1;
GetBufferInfo(&coord);
GetBufferInfo(&coord1);
int pointer = 0;
int code;
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
while (true){
coord1 = coord;
system("cls");
printf("%s\n", inf);
for (int i = 0; i < size / sizeof(menuElems[0]); i++){
if (pointer == i){
printf("*");}
else{
printf(" ");}
printf("%d%s%s\n", i + 1, " - ", menuElems[i]);
coord1.Y++;}
code = _getch();
switch (code){
case Down:{
pointer++;
if (pointer >= size / sizeof(menuElems[0])){
pointer = 0;}
break;}
case Up:{
pointer--;
if (pointer < 0){
pointer = size / sizeof(menuElems[0]) - 1;}
break;}
case Enter:{
SetConsoleCursorPosition(consoleHandle, coord1);
return pointer;}
default:
break;}}}
int menu_category(const char* menuElems[], int size,const char* inf, jmp_buf env){
COORD coord1;
GetBufferInfo(&coord);
GetBufferInfo(&coord1);
int pointer = 0;
int code;
while (true){
coord1 = coord;
system("cls");
printf("%s\n", inf);
for (int i = 0; i < size / sizeof(menuElems[0]); i++){
if (pointer == i){
printf("*");}
else{}
printf("%d%s%s\n", i + 1, " - ", menuElems[i]);
coord1.Y++;}
code = _getch();
switch (code){
case Down:{
pointer++;
if (pointer >= size / sizeof(menuElems[0])){
pointer = 0;}
break;}
case Up:{
pointer--;
if (pointer < 0){
pointer = size / sizeof(menuElems[0]) - 1;}
break;}
case Enter:{
return pointer;}
case Esc:{
longjmp(env,0);}
default:
break;}}}
int start_menu(){
cursor_off_on(FALSE);
const char* main_menu_buttons[] = { "Запуск","Информация","Выход" };
const char* about[] = { "Программа на тему рекламное агентство по дисциплине 'Языки программирования'","Версия 1.0","Студент группы ИФСТ-5з Сейфетдинов Руслан Халимович"};
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
start:
switch (menu(main_menu_buttons, sizeof(main_menu_buttons), "Добро пожаловать в консольную программу рекламного агентства!\n=================================================")){
case 0:
return 0;
case 1:
system("cls");
for (int i = 0; i < 3; i++){
goto_x_y(5 + i * 17, 15 + i);
printf("%s\n", about[i]);}
printf("\n");
goto_x_y(50, 19);
system("pause");
goto start;
case 2:
system("cls");
printf("%s\n", "До свидания");
system("pause");
exit(0);}}
Функции отрисовки заголовка таблицы в файле Output.c Функция header_processing отличается от стандартного header тем, что используется только при выводе результатов обработки.
void header();
void header_proccessing();
Функции вывода элемента на экран. Функция print_processing отличается от стандартного print_on_the_screen тем, что используется только при выводе элементов обработки.
void print_on_the_screen(const struct rekagent* z);
void print_processing(struct rekagent* z);
Функции вывода списка на экран. Функция show_processing отличается от стандартного see_the_information тем, что используется только при выводе списка обработки.
void see_the_information(rekagent* beg, zoo* end);
void show_processing(rekagent* beg);
Листинг заголовка файла Output.h предоставлен ниже:
// Этот файл содержит объявления функций для вывода информации на экран
#ifndef OUTPUT_H
#define OUTPUT_H
#pragma once
#include "rekagent.h"
// Функция вывода на экран информации об одном элементе структуры rekagent
void print_on_the_screen(const struct rekagent z);
// Функция вывода на экран всей информации в списке элементов rekagent
void see_the_information(struct rekagent* beg, struct rekagent* end);
// Функция вывода заголовка для вывода информации на экран
void header();
// Функция вывода заголовка для вывода информации о процессе обработки
void header_proccessing();
// Функция вывода на экран информации об одном элементе в процессе обработки
void print_processing(const struct rekagent z);
// Функция вывода на экран списка элементов в процессе обработки
void show_processing(struct rekagent* beg);
#endif
Листинг файла функций Output.c представлен ниже:
#include <conio.h> // подключение заголовочного файла для работы с клавиатурой
#include <stdio.h> // подключение стандартного заголовочного файла ввода-вывода
#include "rekagent.h" // подключение заголовочного файла с определением структуры "rekagent"
#include "Processing.h" // подключение заголовочного файла с функциями обработки информации
#include "Output.h" // подключение заголовочного файла с функцией вывода информации
#include <Windows.h> // подключение заголовочного файла для работы с Windows API
#include <stdbool.h> // подключение заголовочного файла с логическим типом данных "bool"
/*Просмотр списка */
void see_the_information(struct rekagent* beg, struct rekagent* end)//?{
if (!beg) { printf("%s\n", "Информация отсутствует !"); system("pause"); return; } // если список пустой, выводим сообщение об отсутствии информации и выходим из функции
else{
int key; // переменная для хранения кода клавиши
bool go = false; // флаг для определения продолжения работы со списком
int page, count = 0; // переменные для отображения номера страницы и количества элементов на странице
float page_end; // переменная для хранения числа страниц
if (end->id % print == 0) page_end = end->id / print; // вычисляем количество страниц
else page_end = (end->id / print) + 1;
struct rekagent* temp = beg; // указатель на начало списка
printf("%s\n", "Список заказов рекламного агентства:");
header(); // выводим заголовок таблицы
do // пока список не кончился{
print_on_the_screen(*temp); // выводим информацию об элементе списка на экран
if (temp->next == NULL){
if (temp->id > 13) printf("\n%s", "Для перехода на предыдущую страницу нажмите <-"); // если текущая страница не первая, выводим соответствующее сообщение
else printf("\n%s", "\t\t\t\t\t");
printf("%s%s%f%s%f%s\n", "\t\t\t", "Страница номер ", page_end, " из ", page_end, "\t\t\t\t\t Для выхода нажмите Esc ");
button_end: // метка для выхода из цикла
key = _getch(); // считываем код клавиши
switch (key)
{ // проверяем нажатие клавиши
case Left: // если была нажата клавиша "<-"{
int i = 0;
while (temp->prev != NULL && temp->id != beg->id && temp->prev->id % 13 != 0 ) // переход на предыдущую страницу{
temp = temp->prev;
i++;
}
i = 0;
while (i < 12 && temp->prev != NULL && temp->id!=beg->id) // печать 12 предыдущих элементов списка{
temp = temp->prev;
i++;}
system("cls"); // очистка экрана
printf("%s\n", "Список заказов рекламного агентства:");
header(); // печать заголовка таблицы
break;}
case Esc: // если была нажата клавиша "Esc"
goto end; // переход в конец функции
default:
goto button_end; // переход к обработке нажатия кнопки}}
else // если текущий элемент списка не последний{
if (temp->next && temp->next->id % print == 1) // Если следующий элемент - 14,
// Проверяем, есть ли следующий элемент и делится ли его ID на значение переменной print без остатка.{
page = temp->id / print; // Вычисляем номер текущей страницы.
if (page == page_end) go = true; // Если текущая страница совпадает с последней, то меняем значение переменной go на true.
else // Если текущая страница не является последней,{
if (page == 1) // и номер текущей страницы равен 1, выводим информацию о странице.
printf("%s%s%d%s%f%s\n", "\t\t\t\t\t\t\t", "Страница номер ", page, " из ", page_end, "\t\t\tДля перехода на следующую страницу нажмите ->");
else // иначе также выводим информацию о странице.
printf("%s%s%d%s%f%s\n", "Для перехода на предыдущую страницу нажмите <-\t\t\t", "Страница номер ", page, " из ", page_end, "\t\t\tДля перехода на следующую страницу нажмите ->");
printf("%s\n", "\t\t\t\t\t\t\tДля выхода нажмите Esc ");}
button: // Метка для перехода из оператора switch.
key = _getch(); // Считываем ввод с клавиатуры.
switch (key){
case Right: // Если пользователь нажал правую стрелку на клавиатуре,{
if (temp->next != NULL) // проверяем, что следующий элемент существует,{
temp = temp->next; // переходим к следующему элементу.}
else system("pause"); // Если следующий элемент не существует, то вызываем функцию system("pause").
break; // Завершаем оператор switch.}
case Left: // Если пользователь нажал левую стрелку на клавиатуре,{
if (temp->id != 13) // проверяем, что текущий элемент не является первым в списке,{
int i = 0;
while (i < 2 * print - 1) // переходим на 2 * print - 1 элементов назад.{
temp = temp->prev;
i++;}}
else temp = beg; // Если текущий элемент первый в списке, переходим к началу списка.
break; // Завершаем оператор switch.}
case Esc: // Если пользователь нажал Esc,
goto end; // переходим к метке end.
default: // Если пользователь ввел что-то другое,
goto button; // переходим к метке button.}
system("cls"); // Очищаем экран консоли.
printf("%s\n", "Список заказов рекламного агентства:"); //выводит на экран строку "Список заказов рекламного агентства:"
header(); //вызывает функцию header(), которая выводит заголовок таблицы}
else temp = temp->next; //если следующий элемент не является элементом с id = 14, перемещаем указатель на следующий элемент списка}} while (!go); //повторяем цикл, пока переменная go не станет true
printf("\n");
end:
return; //метка end и возврат из функции}}
/*Заголовок для списка*/