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

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 и возврат из функции}}

/*Заголовок для списка*/

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