- •Пояснительная записка
- •1. Цель работы
- •7. Описание переменных главной функции
- •8. Краткое описание алгоритма
- •9. Описание функций
- •Описание функции «confirming»
- •Описание функции «Sort»
- •Описание функции «Newsort»
- •Описание функции «Add»
- •Описание функции «Del»
- •Описание функции «Output_2»
- •Описание функции «save»
- •Описание функции «Load»
- •Описание функции «Seach»
- •10. Иерархическая структура программы
- •12. Набор тестов
- •13. Инструкция для пользователя
- •14. Результаты выполнения программы
- •15. Выводы
Описание функции «Del»
Назначение: функция удаляет элемент из списка.
Прототип: SP*Del(SP*), где тип возвращаемого значенияSP*- указатель на “голову” списка, первый тип параметраSP*- указатель на “голову” списка.
Пример вызова: h1=Del(h1), гдеh1 - указатель на “голову”голову списка.
Описание переменных: описание локальных переменных функцииDelприведено в таблице 10.
Таблица 10. Описание переменных функции Del
Имя переменной |
Тип переменной |
Назначение |
d,k |
int |
Вспомогательные переменные |
p1, p |
SP * |
Переменные указатели |
Описание функции «Output_2»
Назначение: функция выводит информационные поля элементов, расположенных справа и слева от заданного.
Прототип: voidOutput_2(SP*), где первый тип параметраSP* - указатель на “голову” списка.
Пример вызова: Output_2 (h1), гдеh1 - указатель на “голову” списка.
Описание переменных: описание локальных переменных функцииOutput_2 приведено в таблице 11.
Таблица 11. Описание локальных переменных функции Output_2
Имя переменной |
Тип переменной |
Назначение |
k,z |
int |
Вспомогательные переменные |
p, p1, h2, p2 |
SP * |
Вспомогательные переменные |
Описание функции «save»
Назначение: функция сохраняет данные картотеки в файле
Прототип: int*save(SP*), где тип возвращаемого значенияint,первый тип параметраSP*- указатель на “голову” списка.
Пример вызова: check=save(h1), гдеh1 - указатель на “голову” списка.
Описание переменных: описание локальных переменных функции приведено в таблице 12.
Таблица 13. Описание переменных функции save
Имя переменной |
Тип переменной |
Назначение |
name |
char |
Вспомогательные переменные |
Описание функции «Load»
Назначение: функция загружает данные из файла
Прототип: SP*Load(SP*), где тип возвращаемого значенияSP,указатель ” голову” списка, первый тип параметраSP*- указатель на “голову” списка.
Пример вызова: h1=Load(h1), гдеh1 - указатель на “голову” списка.
Описание переменных: описание локальных переменных функции приведено в таблице 13.
Таблица 14. Описание переменных функции save
Имя переменной |
Тип переменной |
Назначение |
*name |
char |
Указатель на первую букву имени файла |
с |
char |
Вспомогательная переменная |
Описание функции «Seach»
Назначение: функция ищет продукты по определенному сочетанию букв,году и рейтингу.
Прототип: voidSeach_1(SP*), где первый тип параметраSP*- указатель на “голову” списка.
Пример вызова: Seach_1(h1), гдеh1 - указатель на “голову” списка.
Описание переменных: описание локальных переменных функции приведено в таблице 14.
Таблица 15. Описание переменных функции Seach_1
Имя переменной |
Тип переменной |
Назначение |
i,l |
int |
Вспомогательные переменные |
s[15] |
char |
Сочетание вводимое пользователем |
ch |
char |
Вспомогательные переменные |
10. Иерархическая структура программы
Free
()
Confirming() fname()
enter() menu()
men() NewSort()
main()
Load()
Add()
Del() Sort()
Output() Seach_1
The_end()
save()
Output_2 Seach_2()
Рис.2.
Иерархическая структура программы
11.Код программы на языке С/С++
// ConsoleApplication16.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "stdio.h"
#include <conio.h>
#include <stdlib.h>
#include <tchar.h>
#include <string.h>
#include <locale>
#include <time.h>
#include <Windows.h>
#include <iostream>
using namespace std;
typedef struct games
{
char name[12]; //Название продукта
int year; //Дата выхода
int rating;//Рейтинг
}MS;
typedef struct list
{
MS info;
struct list* pred;
struct list* next;
}SP;
void menu_seach_1(void); //Подменю поиска
void menu_sort_1(void); //Подменю сортировки
void User_GUIDE(void); //Меню “Пользователю”
void Save_And_Load(void); //Сохранить и загрузить
void menu_seach(void); //Меню поиска
void menu_confiming(void); //Меню обработки
void Notice(void); //Функция подсказки
void menu_enter(void); //Подменю ввода
void output_menu(void); //Подменю вывода
void help(void); //Помощь
void recomend(void); //Рекомендации
void menu(void); //Главное меню
void Screen(void); //Элементы интерфейса
SP* enter(SP*); //ввод данных
void Output(SP*,char*); //вывод данных
SP *confirming(SP*); //создание нового списка
SP *Sort(SP*); //Сортировка
SP *NewSort(SP*,int,int); //Подсортировка
SP *Add(SP*); //добавление элементов
SP *Del(SP*); //удаление элементов
void Output_2(SP*); //вывод справа и слева
SP *Free(SP*); //Освобождение памяти
void save(SP *); //Сохранение данных
SP *Load(); //Загрузка из файла
SP* SortALF(SP*); //Сортировка по алфавиту
SP *Add_End(SP *, SP *); //Добавление в конец
void menupoisk(SP *, SP *); //Подменю поиска
SP *Seach(SP *,int); //Функция поиска
int Modulus(int,int); //Супервозможности программы
char GetChar(int,char,int); //Реализация матрицы
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_CTYPE, "russian");
SP*h1=NULL,*rez=NULL; //Указатели делаем нулевыми
int pm,pm2,pm3,pm4=0,pm5,pm6,pm7,pm8,check1=0,check=0; //Вспомогательные пер.
char c=NULL,ch=NULL,Base1=NULL,Base2=NULL,matrixch=NULL,lol=1; //Вспомгат.пер
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, 2); //цвет консольки
char caRow[80];
int j = 7;
int k = 2;
int l = 5;
int m = 1;
puts("Нажмите любую кнопку,для загрузки программы");
Screen();
do
{
menu();
fflush(stdin);
puts("");
puts("");
printf("Ввод пункта меню: ");
scanf("%d",&pm);
switch(pm)
{
case 1:
do
{
system("cls");
if (lol==1)
MessageBoxA(0, "Название может содержать латинские буквы и цифры ,и иметь длину не более 15 символов.\nГод выхода имеет форма XXXX.Пример:2010.Должен быть больше 1990 и меньше 2100.\nРейтинг должен быть больше 0.\nДля продолжения нажмите ОК\n", "Дорогой пользователь", 0);
menu_enter();
lol=0;
printf("Ввод пункта меню: ");
scanf("%d",&pm6);
switch(pm6)
{
case 1:
if (check!=1)
{
system("cls");
while(h1!=NULL)
h1=Free(h1);
while(ch!='y')
{
h1=enter(h1);
system("cls");
puts("\n Закончить ввод данных? (y/n)?\n");
ch=getch();
}
do
{
fflush(stdin);
puts("\n\n\Записать в файл (да-y/нет-n)?");
scanf ("%c", &Base2);
}
while (Base2!='n' && Base2!='y'&& Base2!='Y'&& Base2!='N');
if (Base2=='Y'|| Base2=='y')
{
save(h1);
puts("\n\n\n\n\n\t\t Запись данных закончена! Нажмите любую клавишу.");
getch();
}
}
else
{
puts("Последовательный ввод невозможен,используйте добавление элементов.");
puts("");
puts("Нажмите любую клавишу");
getch();
}
check=1;
break;
case 2:
system("cls");
if (h1!=NULL)
h1=Add(h1);
else
{
puts("Т.к. элемент первый в списке я добавлю его в начало,для продолжения нажмите любую кнопку");
getch();
h1=enter(h1);
}
check=1;
break;
case 3:
system("cls");
pm6=3;
break;
default:
system("cls");
puts("Неправильно введен пункт меню");
puts("");
puts("Нажмите любую клавишу");
getch();
break;
}
}
while(pm6!=3);
break;
case 2:
do
{
system("cls");
output_menu();
printf("Ввод пункта меню: ");
scanf("%d",&pm4);
switch(pm4)
{
case 1:
if(h1!=NULL)
Output(h1," Список:");
else
Notice();
getch();
break;
case 2:
if (h1!=NULL)
Output_2(h1);
else
Notice();
getch();
break;
case 3:
pm4=3;
break;
default:
puts("Неправильно введен пункт меню");;
puts("");
puts("Нажмите любую клавишу");
getch();
break;
}
}
while(pm4!=3);
break;
case 3:
system("cls");
if(h1!=NULL)
{
while(rez!=NULL)
rez=Free(rez);
rez=confirming(h1);
if(rez!=NULL)
Output(rez," Результат обработки:");
else
puts("\n В картотеке нет элементов с заданным условием \n");
getch();
}
else
Notice();
puts("\nНажмите любую клавишу\n");
getch();
break;
case 4:
do
{
system("cls");
menu_confiming();
puts("");
printf("Ввод пункта меню: ");
scanf("%d",&pm3);
switch(pm3)
{
case 1:
if (h1!=NULL)
h1=Del(h1);
else
Notice();
getch();
break;
case 2:
if (h1!=NULL)
h1=Sort(h1);
else
Notice();
getch();
break;
case 3:
pm3=4;
break;
default:
puts("Неправильно введен пункт меню");
break;
}
}
while(pm3!=4);
break;
case 5:
do
{
system("cls");
puts("");
menu_seach_1();
printf("Ввод пункта меню:");
scanf("%d",&pm5);
switch(pm5)
{
case 1:
if(h1!=NULL)
menupoisk(h1,rez);
else
Notice();
getch();
break;
case 2:
if (h1!=NULL)
Output(rez,"список:");
else
Notice();
getch();
break;
case 3:
pm5=3;
break;
default:
puts("Неправильно введен пункт меню");
puts("");
puts("Нажмите любую клавишу");
getch();
break;
}
}
while(pm5!=3);
break;
case 6:
do
{
system("cls");
Save_And_Load();
puts("");
printf("Ввод пункта меню:");
scanf("%d",&pm8);
switch(pm8)
{
case 1:
system("cls");
save(h1);
if(h1==NULL)
Notice();
else
puts("\nОперация сохранения завершена");
puts("Нажмите любую кнопку");
getch();
break;
case 2:
system("cls");
h1=Load();
break;
case 3:
system("cls");
pm8=3;
}
}
while(pm8!=3);
break;
case 7:
do
{
system("cls");
User_GUIDE();
puts("");
printf("Ввод пункта меню: ");
scanf("%d",&pm7);
switch(pm7)
{
case 1:
recomend();
break;
case 2:
help();
puts("Нажмите любую клавишу");
getch();
break;
case 3:
pm7=3;
break;
default:
puts("Неправильно введен пункт меню");
puts("");
puts("Нажмите любую клавишу");
getch();
break;
}
}
while(pm7!=3);
break;
case 8:
system("cls");
puts("Вы готовы увидеть истинный мир?(y/n)");
matrixch=getch();
if(matrixch='y')
{
system("cls");
printf("L O G I N: ");
Sleep(500);
system("cls");
printf("L O G I N: П");
Sleep(700);
system("cls");
printf("L O G I N: П О");
Sleep(700);
system("cls");
printf("L O G I N: П О С");
Sleep(700);
system("cls");
printf("L O G I N: П О С Т");
Sleep(700);
system("cls");
printf("L O G I N: П О С Т А");
Sleep(400);
system("cls");
printf("L O G I N: П О С Т А В Ь");
Sleep(600);
system("cls");
printf("L O G I N: П О С Т А В Ь Т ");
Sleep(700);
system("cls");
printf("L O G I N: П О С Т А В Ь Т Е");
Sleep(500);
system("cls");
printf("L O G I N: П О С Т А В Ь Т Е");
puts("");
printf("\nP A S S W O R D: \n");
Sleep(900);
system("cls");
printf("L O G I N: П О С Т А В Ь Т Е");
puts("");
printf("\nP A S S W O R D: 5\n");
Sleep(1200);
getch();
puts("Проверка доступа");
Sleep(1000);
puts("");
puts("Вход в массивы данных");
Sleep(1000);
puts("");
puts("Аутетификация кода");
Sleep(1000);
puts("");
puts("Асимиляция завершена");
Sleep(1000);
system("cls");
puts("Loading… [][][][][] 0%");
system("cls");
puts("Loading… [][][][][ 10%");
system("cls");
puts("Loading… ██[][][][] 20%");
system("cls");
puts("Loading… ███[][][][ 30%");
Sleep(100);
system("cls");
puts("Loading… ████[][][] 40%");
Sleep(100);
system("cls");
puts("Loading… █████[][][ 50%");
Sleep(1000);
system("cls");
puts("Loading… ██████[][] 60%");
Sleep(100);
system("cls");
puts("Loading… ███████[][ 70%");
Sleep(10);
system("cls");
puts("Loading… ████████[] 80%");
Sleep(100);
system("cls");
puts("Loading… █████████[ 90%");
Sleep(100);
system("cls");
puts("Loading… ██████████ 100%");
Sleep(100);
while (true)
{
int i = 0;
while (i < 80)
{
if (caRow[i] != ' ')
{
caRow[i] = GetChar(j + i*i, 33, 30);
if (((i*i + k) % 71) == 0)
{
SetConsoleTextAttribute(hConsole, 7);
}
else
{
SetConsoleTextAttribute(hConsole, 2);
}
}
std::cout << caRow[i];
++i;
SetConsoleTextAttribute(hConsole, 2);
}
j = (j + 31);
k = (k + 17);
l = (l + 47);
m = (m + 67);
caRow[Modulus(j, 80)] = '-';
caRow[Modulus(k, 80)] = ' ';
caRow[Modulus(l, 80)] = '-';
caRow[Modulus(m, 80)] = ' ';
Sleep(10);
}
}
else
break;
case 0:
puts(" Выполнение программы завершено");
c='y';
break;
default:
puts(" Ошибка ввода пункта меню");
puts("");
puts("Нажмите любую клавишу");
getch();
break;
}
}
while(c!='y');
return 0;
}
void menu_seach_1(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************SEACH MENU 1*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Поиск |\n");
puts(" | 2) - Вывод найденных элементов |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void menu_sort_1(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************SORT MENU 2*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Сортировка по убыванию |\n");
puts(" | 2) - Сортировка по возрастанию |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void menu_sort(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************SORT MENU 1*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Сортировка по году |\n");
puts(" | 2) - Сортировка по рейтингу |\n");
puts(" | 3) - Сортировка по алфавиту |\n");
puts(" | 4) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void User_GUIDE(void)
{
puts("");
puts(" ------------------------------------------------------");
puts(" ******************USER GUIDE MENU********************* ");
puts(" ------------------------------------------------------");
puts("");
puts(" | 1) - Рекомендации по использованию программы |\n");
puts(" | 2) - Инструкции пользователю |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ------------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void Save_And_Load(void)
{
puts("");
puts(" ----------------------------------------------------");
puts(" ******************SAVE AND LOAD*********************");
puts(" ----------------------------------------------------");
puts("");
puts(" | 1) - Сохранить |\n");
puts(" | 2) - Загрузить |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ----------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void menu_seach(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************SEACH MENU 2*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Поиск по имени |\n");
puts(" | 2) - Поиск по году |\n");
puts(" | 3) - Поиск по рейтингу |\n");
puts(" | 4) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void menu_confiming(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************CONFIRMING MENU*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Удаление элемента из картотеки |\n");
puts(" | 2) - Сортировка |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void Notice(void)
{
puts("------------------------------------------------------------------------");
puts("\n Операция невозможна!Картотека пуста!Нажмите любую клавишу. \n");
puts("------------------------------------------------------------------------");
}
void menu_enter(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************ENTER MENU*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Последовательный ввод |\n");
puts(" | 2) - Уточнить место добавления информации |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void output_menu(void)
{
puts("");
puts(" ------------------------------------------------");
puts(" ******************ENTER MENU*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Вывод всей картотеки |\n");
puts(" | 2) - Вывод справа и слева от элемента |\n");
puts(" | 3) - Выход в надменю |\n");
puts(" ------------------------------------------------");
puts("");
puts("");
puts("");
puts("");
puts(" -------------------------NOTICE------------------------------");
puts("| Ориентация по меню осуществляется путем ввода пункта меню |");
puts(" --------------------------------------------------------------");
}
void help(void)
{ system("cls");
puts("\n1 - Ввод данных с возможность выбора варианта ввода");
puts("\n2 - Вывод картотеки с возможность выбора варианта вывода");
puts("\n3 - Формирование данных картотеки согласно условию см. пояснительную записку");
puts("\n4 - Возможные варианта обработки:сортировка,удаление");
puts("\n5 - Поиск нужных элементов через ввод искомой комбинации букв или диапозона чисел");
puts("\n6 - Сохранение данных в файле");
puts("\n7 - Выход из программы,завершение всех действий");
}
void recomend(void)
{
system("cls");
MessageBoxA(0, "\t\t\t Рекомендации пользователю :"
"\nЭта программа- подобие электронной базы данных.Программа работает,"
"\используя массивы в памяти ЭВМ для хранения информации, введенной пользователем."
"\Данные могут вводиться с клавиатуры или загружаться из файла.\n"
"\ \n"
"\Также можно вывести на экран всю картотеку или же просматривать картотеку по карточкам,"
"\с возможностью добавления или удаления некоторых карточек по выбору.\n"
"\Программа имеет хороший интерфейс и показывает устойчивую работу.\n"
"\ \n"
"\В программе имеется поиск элементов по заданным условиям, а также сортировка всех полей."
"\В программе есть главное меню и подменю для удобной работы с информацией."
"\Желательно, чтобы данные были точные, корректно записанные и касающиеся"
"\непосредственно темы данной лабораторной работы.", "Дорогой пользователь", 0);
printf("");
puts("\n\n\n\n\n\t\tДля перехода в главное меню нажмите любую клавишу...");
getch();
}
void menu(void)
{
system("cls");
puts("");
puts(" ------------------------------------------------");
puts(" ******************MAIN MENU*********************");
puts(" ------------------------------------------------");
puts("");
puts(" | 1) - Ввод данных картотеки |\n");
puts(" | 2) - Вывод данных |\n");
puts(" | 3) - Формирование новой картотеки |\n");
puts(" | 4) - Обработка |\n");
puts(" | 5) - Поиск элементов |\n");
puts(" | 6) - Cохрание или загрузка |\n");
puts(" | 7) - Пользователю |\n ");
puts(" | 8) - Измените свою судьбу,change your destiny..|\n");
puts(" | 0) - Выход из программы |\n");
puts("\n\n Ориентация по меню осуществляется путем ввода пункта меню");
}
void Screen(void)
{
system("cls");
puts("");
puts("");
puts("");
puts("");
puts("");
printf("\n ╓────────────────────────────────────────────────────────────╖");
printf("\n ║ ║");
printf("\n ║ К А Р Т О Т Е К А П Р О Г Р А М М Н Ы Х ║");
printf("\n ║ П Р О Д У К Т О В ║");
printf("\n ╙────────────────────────────────────────────────────────────╜");
puts("");
puts(" Нажмите любую клавишу для загрузки!");
getch();
system("cls");
puts("Loading… [][][][][] 0%");
system("cls");
puts("Loading… [][][][][ 10%");
system("cls");
puts("Loading… ██[][][][] 20%");
system("cls");
puts("Loading… ███[][][][ 30%");
Sleep(100);
system("cls");
puts("Loading… ████[][][] 40%");
Sleep(100);
system("cls");
puts("Loading… █████[][][ 50%");
Sleep(1000);
system("cls");
puts("Loading… ██████[][] 60%");
Sleep(100);
system("cls");
puts("Loading… ███████[][ 70%");
Sleep(10);
system("cls");
puts("Loading… ████████[] 80%");
Sleep(100);
system("cls");
puts("Loading… █████████[ 90%");
Sleep(100);
system("cls");
puts("Loading… ██████████ 100%");
Sleep(100);
}
SP *enter(SP* head)
{
SP *p=NULL;
fflush(stdin);
p=(SP*)malloc(sizeof(SP));
int rezult;
puts("");
puts(" --------------------------------------------------");
printf("\n ******************ENTERING...*********************\n");
puts(" --------------------------------------------------");
puts("");
do
{
printf("Введите название продукта: ");
gets(p->info.name);
rezult=strlen(p->info.name);
if (rezult>15)
{
MessageBoxA(0, "Название может содержать латинские буквы и цифры ,и иметь длину не более 15 символов.Для повтора ввода нажмите ОК", "Дорогой пользователь", 0);
}
}
while(rezult>15);
puts("");
do
{
printf("Введите год выхода продукта: ");
scanf("%d",&(p->info.year));
if((p->info.year<1990)||(p->info.year>2100))
{
MessageBoxA(0, "Год выхода имеет форма XXXX.Пример:2010.Должен быть больше 1990 и меньше 2100.Для повтора ввода нажмите ОК", "Дорогой пользователь", 0);
puts("");
}
}
while((p->info.year<1990)||(p->info.year>2100));
do
{
printf("Введите рейтинг продукта: ");
scanf("%d",&(p->info.rating));
if((p->info.rating<0)||(p->info.rating>23000))
{
MessageBoxA(0, "Рейтинг должен быть больше 0(И не слишком большой <23000).Для повтора ввода нажмите ОК", "Дорогой пользователь", 0);
puts("");
}
}
while((p->info.rating<0)||(p->info.rating>23000));
p->next=head;
if(head!=NULL)
head->pred=p;
head=p;
return head;
}
void Output(SP *h1,char *s)
{
int i=1;
system("cls");
puts("");
puts(" \n В С Я К А Р Т О Т Е К А\n");
printf(" ┌──────┬─────────────────┬────────────┬───────────────┬\n");
printf(" │ Номер│ Название │ Дата │ Рейтинг │\n");
printf(" │ стр. | продукта │ Выхода │ продукта │\n");
printf(" └──────┴─────────────────┴────────────┴───────────────┴\n");
printf(" ┌──────┬─────────────────┬────────────┬───────────────┬\n");
while (h1!=NULL)
{
printf("\n │ %2d │ %9s │ %7d │ %7d │\n ",i,h1->info.name,h1->info.year,h1->info.rating);
fflush(stdin);
h1=h1->next;
i++;
}
printf("\n └──────┴─────────────────┴────────────┴───────────────┴\n");
puts("\n Вывод закончен, нажмите любую клавишу.\n");
getch();
}
SP* confirming(SP *h1)
{
int d;
SP*h2=NULL, *p=NULL;
puts("\nВведите рейтинг продукта");
scanf("%d",&d);
h2=h1;
scanf("%d", &d);
h2=h1;
while(h2!=NULL)
{
if((h2->info.rating)<d)
{
p=h2->next;
if(h2->next!=NULL || h2->pred!=NULL)
{
if(h2->next!=NULL)
{
if(h2->pred!=NULL)
{
h2->next->pred=h2->pred;
h2->pred->next=h2->next;
}
else
{
h2->next->pred=NULL;
h1=h2->next;
}
}
else
h2->pred->next=NULL;
free(h2);
h2=p;
}
else
{
free(h1);
h2=h1=NULL;
}
}
else
h2=h2->next;
}
puts("Обработка завершена\n");
return h1;
}
SP *Sort(SP*h1)
{
int pm_2,pm_3,pm_4;
int z=0;
do
{
fflush(stdin);
system("cls");
menu_sort();
printf("Ввод пункта меню: ");
scanf("%d",&pm_2);
switch(pm_2)
{
case 1:
do
{
system("cls");
menu_sort_1();
printf("Введите пункт меню: ");
scanf("%d",&pm_3);
switch(pm_3)
{
case 1:
h1=NewSort(h1,1,1);
break;
case 2:
h1=NewSort(h1,1,2);
break;
case 3:
pm_3=3;
break;
default:
puts("\nВы ошиблись с выбором пункта меню,введите еще раз!Нажмите любую кнопку");
getch();
break;
}
}
while(pm_3!=3);
break;
case 2:
do
{
system("cls");
menu_sort_1();
printf("Введите пункт меню: ");
scanf("%d",&pm_4);
switch(pm_4)
{
case 1:
h1=NewSort(h1,2,1);
break;
case 2:
h1=NewSort(h1,2,2);
break;
case 3:
pm_4=3;
break;
default:
puts("\nВы ошиблись с выбором пункта меню,введите еще раз!.Нажмите любую кнопку");
getch();
break;
}
}
while(pm_4!=3);
break;
case 3:
h1=SortALF(h1);
puts("Сортировка завершена.Нажмите любую клавишу");
getch();
break;
case 4:
z=1;
break;
default:
puts("Неправильно введен пункт меню.Нажмите любую клавишу для повтора");
break;
}
}
while(z==0);
return(h1);
}
SP* NewSort(SP*h1,int place,int s)
{
SP *p=NULL,*p1=NULL,*p2=NULL,*p3=NULL;
int z=0;
p=h1;
if(p->next!=NULL)
{
while(p!=NULL)
{
p1=p->next;
p2=p1;
if(p1!=NULL)
p3=p1->next;
while(p1!=NULL)
{
if((((p1->info.year>p->info.year && s==1) || (p1->info.year<p->info.year && s==2))&&place==1) || (((p1->info.rating>p->info.rating && s==1) || ((p1->info.rating<p->info.rating && s==2)))&&place==2) || ((((strcmp(p1->info.name, p->info.name)>0) && s==1) || ((strcmp(p1->info.name, p->info.name)<0)&&s==2)) && place==3))
{
if(p->next!=p)
{
p1->pred->next=p;
p->next->pred=p1;
p1->next=p->next;
}
else
p1->next=p;
if(p->pred!=NULL)
p->pred->next=p;
p1->pred=p->pred;
p->pred=p2;
p->next=p2;
if(p3!=NULL)
p3->pred=p;
p=p1;
}
p=p3;
if(p1!=NULL)
{
p2=p1->pred;
p3=p1->next;
}
}
if(p->pred==NULL)
h1=p;
p=p->next;
}
}
else
puts("В списке всего один элемент\n");
puts("Операция сортировки завершена\n");
getch();
return h1;
}
SP *Add(SP *h1)
{
SP *p1=NULL,*p=NULL;
int pm2=0;
int d=0,k=1;
p=h1;
p1=enter(p1);
puts("\nКуда необходимо добавить элемент?");
puts("\n1 - В начало");
puts("\n2 - В конец");
puts("\n3 - После заданного");
scanf("%d",&pm2);
switch(pm2)
{
case 1:
p1->next=h1;
h1->pred=p1;
h1=p1;
h1->pred=NULL;
break;
case 2:
while((p->next)!=NULL)
p=p->next;
p->next=p1;
p1->next=NULL;
p1->pred=p;
break;
case 3:
puts("Задайте элемент,после которого нужно добавить информацию");
scanf("%d",&d);
while(p!=NULL && k!=d)
{
p=p->next;
k++;
}
if(k==d)
{
if(p->next!=NULL)
{
p1->next=p->next;
p->next->pred=p1;
p->next=p1;
}
else
{
p->next=p1;
p1->pred=p;
p1->next=NULL;
}
}
else
printf("Элемента номер %d не существует!", d);
break;
default:
puts("Ошибка ввода пункта меню");
getch();
break;
}
puts("Операция добавление успешно завершена");
puts("\nНажмите любую клавишу");
getch();
return h1;
}
SP *Del(SP *h1)
{
SP *r=NULL; // вспомогательная переменная
int d=0, k=1;
r=h1;
puts("Введите номер элемента,который нужно удалить\n");
scanf("%d", &d);
while(r->next!=NULL && k!=d)//установление указателя на нужный элемент
{
r=r->next;
k++;
}
if(k==d)
{
if(d!=1) // если заданный элемент не первый
{
if(r->next!=NULL)
{
r->pred->next=r->next;
r->next->pred=r->pred;
}
else
r->pred->next=NULL;
}
else // заданный элемент первый
{
if(r->next!=NULL)
{
h1=r->next;
h1->pred=NULL;
}
else
h1=NULL;
}
}
else
printf("Элемент %d отсутствует!", d);
free(r);
puts("Удаление завершено.Нажмите любую клавишу.\n");
return h1;
}
void Output_2(SP *h1)
{
SP *p=NULL,*p1=NULL,*p2=NULL;
int k=0,z=1;
p=h1;
puts("Слева и справа от какого элемента вывести?\n");
scanf("%d", &k);
while(p->next!=NULL && z!=k)
{
p=p->next;
z++;
}
if(k==z) // заданный элемент существует
{
if(k==1) // выбран первый элемент
{
puts("Элемент слева отсуствует\n");
if(p->next!=NULL)
{
p1=p->next;
p2=p->next->next;
p1->next=NULL;
Output(p1, "");
p1->next=p2;
}
else
puts("Элемент справа отсуствует\n");
}
else // выбран не первый элемент
{
if(p->next!=NULL)
{
p1=p->pred;
p2=p->next->next;
p1->next=p->next;
p1->next->next=NULL;
Output(p1, "");
p1->next->next=p2;
p1->next=p;
}
else
{
puts("Элементы справа отсуствуют\n");
p1=p->pred;
p1->next=NULL;
Output(p1, "");
p1->next=p;
}
}
}
else
printf("Элемента %d не сушесвует!",k);
puts("");
puts("Нажмите любую клавишу");
}
SP *Free(SP *h1)
{
SP *temp=NULL;
temp=h1;
while(temp!=NULL)
{
temp=h1->next;
free(h1);
h1=temp;
}
return NULL;
}
void save(SP *h1) /*h1 - указатель на голову списка*/
{
SP *r=NULL;
FILE *f1;
int n=1;
char namefile[20];
fflush(stdin);
if(h1!=NULL)
{
r=h1;
do
{
printf("Введите имя файла на латинице: ");
gets(namefile);
if (strlen(namefile)>15)
puts ("Повторите ввод.(name < 15 символов)");
}
while(strlen(namefile)>15);
if((f1=fopen(namefile, "w"))!=NULL)
{
while(r->next!=NULL)
{
r=r->next;
n++;
}
r=h1;
fprintf(f1, "%d", n); // записи в файл кол-ва структур, которые будут записаны в файл
putc(' ', f1); // запись в файл пробела
while(r!=NULL)
{
fwrite(&(r->info), sizeof(r->info), 1, f1);
r=r->next;
}
fclose(f1);
puts("Запись в файл завершена");
}
else
puts("Невозможно записать в файл\n");
}
else
puts("Картотека пуста");
}
SP *Load(void) /* возращает сформированный список*/
{
SP *r=NULL, *h1=NULL;
FILE *f1;
int n, i;
char namefile[20];
fflush(stdin);
puts("Введите имя файла:");
gets(namefile);
if((f1=fopen(namefile, "r"))!=NULL)
{
fscanf(f1, "%d", &n); // всего структур
getc(f1); // чтение пробела
printf("Кол-вo: %d", n);
for(i=1; i<=n; i++)
{
r=(SP*)malloc(sizeof(SP)); // выдиление дин. памяти
fread(&(r->info), sizeof(r->info), 1, f1);
h1=Add_End(h1, r); // формирование нового списка
}
fclose(f1);
puts("\nЧтение из файла завершено");
}
else
puts("Не могу открыть файл\n");
return h1;
}
SP *SortALF(SP *h1)
{
SP *point,*tmp=NULL,*f,*s;
int i,j,srav;
//Указатель на начало
f=h1;
point=h1;
while(f!=NULL)
{
s=f->next;
while(s!=NULL)
{
if((strcmp(f->info.name,s->info.name)>0))
{
tmp=(SP*)malloc(sizeof(SP));
strcpy(tmp->info.name,f->info.name);
tmp->info.year=f->info.year;
tmp->info.rating=f->info.rating;
strcpy(f->info.name,s->info.name);
f->info.year=s->info.year;
f->info.rating=s->info.rating;
strcpy(s->info.name,tmp->info.name);
s->info.year=tmp->info.year;
s->info.rating=tmp->info.rating;
free(tmp);
}
s=s->next;
}
strcpy(point->info.name,f->info.name);
point->info.year=f->info.year;
point->info.rating=f->info.rating;
point=point->next;
f=f->next;
}
point=h1;
return(point);
}
SP *Add_End(SP *r, SP *q)/*возвращает указатель на голову получившегося списка
r - указатель на голову списка, к которму добавлять
q - указатель на элемент, который добавляется*/
{
SP *d;
if(r==NULL)
{
r=q;
r->next=NULL;
r->pred=NULL;
}
else
{
d=r;
while((d->next)!=NULL)
d=d->next;
d->next=q;
q->next=NULL;
q->pred=d;
}
return r;
}
void menupoisk(SP *h1, SP *rez)
{
int pm, z; // z - флаг, показываюций выбран ли несуществующий пункт меню
do
{
z=1;
system("cls");
menu_seach();
fflush(stdin);
printf("Введите пункт меню:");
scanf("%d", &pm);
switch(pm)
{
case 1:
rez=Seach(h1, pm); // вызов функции poisk
break;
case 2:
rez=Seach(h1, pm);
break;
case 3:
rez=Seach(h1, pm);
break;
case 4:
break;
default: // обработка ошибки
puts("Ошибка ввода пункта меню");
z=0;
break;
}
}
while(z==0);
}
SP *Seach(SP *h1, int pm) /*h1 - указатель на голову исходного списка
pm - пукт меню, который был выбран пользователем*/
{
SP *r, *q, *d=NULL; // вспомогательные переменные
char name[20]; // масив символов для ввода имени
int year, rating; // переменные для ввода кол-ва голов и возраста
switch(pm)
{
case 1:
printf("Введите название продукта: \n");
fflush(stdin);
gets(name);
break;
case 2:
printf("Введите год выхода продукта: \n");
scanf("%d", &year);
break;
case 3:
printf("Введите рейтинг продукта: ");
scanf("%d", &rating);
break;
}
r=h1;
while(r!=NULL)
{
if(((strcmp(r->info.name, name)==0)&&pm==1)||(r->info.year==year && pm==2) || (r->info.rating==rating && pm==3))
{
q=(SP *)malloc(sizeof(SP)); // выделение дин. памяти
q->info=r->info; // копирование списка
d=Add_End(d, q); // формирование списка-результата
}
r=r->next;
}
if(d==NULL)
puts("Элементы с заданным критерием не найдены");
else
puts("Поиск завершен");
return d;
}
int Modulus(int iN, int iMod) {
int iQ = (iN/iMod);
return iN - (iQ*iMod);
}
char GetChar(int iGenerator, char cBase, int iRange)
{
return (cBase + Modulus(iGenerator, iRange));
}