39285

Электронная картотека

Курсовая

Информатика, кибернетика и программирование

Задача должна быть структурирована, и отдельные части должны быть оформлены как функции. Исходные данные должны вводиться с клавиатуры. В процессе обработки картотека должна храниться в памяти компьютера в виде списка.

Русский

2013-10-02

205.32 KB

8 чел.

Федеральное государственное бюджетное образовательное учреждение высшего

профессионального образования

«Санкт-Петербургский государственный электротехнический

университет «ЛЭТИ» им. В.И.Ульянова (Ленина)»

Факультет компьютерных технологий и информатики

Кафедра вычислительной техники

Пояснительная записка

по курсовой работе

по дисциплине «Программирование. Дополнительные главы»

на тему: «Электронная картотека»

Выполнил: студент группы 2306  Титков Е.В.

Проверила: к.т.н.,  доцент Сискович Т.И.

Санкт-Петербург

2013 г.

Оглавление

1. Цель работы 3

2. Задание 3

3. Уточнение задания 3

4. Описание информационной структуры 3

5. Описание структуры, используемой для организации списка 4

6. Контрольные примеры 4

7. Описание переменных главной функции 5

8. Краткое описание алгоритма 6

9. Описание функций 7

10. Иерархическая структура программы 12

11.Код программы на языке С/С++ 13

12. Набор тестов 37

13. Инструкция для пользователя 38

14. Результаты выполнения программы 40

15. Выводы 40

1. Цель работы

Получение практических навыков в работе со списками и файлами на примере электронной картотеки.

2. Задание

Создать электронную картотеку, хранящуюся на диске, и программу, обеспечивающую взаимодействие с ней.

      Программа должна  выполнять следующие действия:

           -  занесение данных в электронную картотеку;

           -  внесение изменений (исключение, корректировка, добавление);

           - поиск данных по признаку;

           - сортировку;

           -  вывод результатов на экран и сохранение на диске.

3. Уточнение задания

Выбор подлежащих выполнению команд должен быть реализован с помощью меню и подменю.

Задача должна быть структурирована, и отдельные части должны быть оформлены как функции. Исходные данные должны вводиться с клавиатуры. В процессе обработки картотека должна храниться в памяти компьютера в виде списка.

    Программа должна иметь дружественный интерфейс и обеспечивать устойчивую работу при случайном нажатии на клавишу.

    В картотеке хранятся сведения о программных продуктах.

4. Описание информационной структуры

Шаблон:

    

                 typedef struct games

      {

  char name[12]; //Название продукта

  int year;      //Дата выхода

  int rating;    //Рейтинг

           }MS;

Где первое поле типа char - название продукта, второе поле типа int – дата выхода продукта, третье поле типа int – рейтинг.

Имя структурного типа: games.

Имя нового типа:MS.

Пример объявления переменной типа NT: MS *games=NULL.

5. Описание структуры, используемой для организации списка

Шаблон:

         typedef struct list

   {

    MS info;

    struct list* pred;

    struct list* next;

   }SP;

Где первое поле – данные типа MS, второе и третье поле указатель типа   struct list *.

Имя структуры, используемой для организации список: list.

Имя нового типа: SP.

Пример объявления переменной типа SP: SP *h1=NULL.

6. Контрольные примеры

     Контрольные примеры обработки приведены в таблице 1 «Контрольные примеры обработки».

Таблица 1. Контрольные примеры обработки

№ п.п.

Исходные данные

Условие обработки

rating

вывод продуктов с рейтингом

больше, чем n

Результат

Наименование

Год выхода

Рейтинг

Наименование

Год выхода

Рейтинг

1

Crysis

2008

7

n=8

Crysis 2

2010

9

Crysis 2

2010

9

Crysis 3

2012

10

Crysis 3

2012

10

2

Max Payne

2000

9

n=10

Gears World

2012

11

Gears World

2012

11

Shake

2010

3

  Контрольные примеры сортировки  по полю rating приведены в таблице 2 «Контрольные примеры сортировки».

Таблица 2. Контрольные примеры сортировки

№ п.п.

Исходные данные

Тип сортировки

Результат

Наименование

Год выхода

Рейтинг

Наименование

Год выхода

Рейтинг

1

Crysis

2008

8

По возрастанию

 Crysis 3

2012

7

Crysis 2

2010

11

Crysis 

2008

8

Crysis 3

2012

7

Crysis 2

2010

11

2

Crysis

2008

8

По убыванию

Crysis 2

2010

11

Crysis 2

2010

11

Crysis

2008

8

Crysis 3

2012

7

Crysis 3

2012

7

  Контрольные примеры сортировки по полю year приведены в таблице 3  «Контрольные примеры сортировки».

Таблица 3. Контрольные примеры сортировки

№ п.п.

Исходные данные

Тип сортировки

Результат

Наименование

Год выхода

Рейтинг

Наименование

Год выхода

Рейтинг

1

Baloo

2008

8

По возрастанию

Aentik

2012

7

Charge

2010

11

Baloo

2008

8

Aentik

2012

7

Charge

2010

11

2

Nord

2008

8

По убыванию

Ascell

2010

11

Ascell

2010

11

Jaske

2012

7

Jaske

2012

7

Nord

2008

8

7. Описание переменных главной функции

Описание переменных главной функции приведено в таблице 4.

Таблица 4. Описание переменных главной функции

 

Имя переменной

Тип переменной

Назначение

k, q, z

int

Вспомогательные переменные

pm, pm2,pm3,pm4,pm5,pm6,pm7,pm8

int

Переменные для выбора пунктов меню

c, ch

char

Переменные, управляющие циклом

h1, rez

SP *

Указатели

8. Краткое описание алгоритма

При разработке алгоритма предусмотрен контроль над  выполнением пунктов меню.

1) Пользователь выбирает один из пунктов меню: 1 – ввод данных картотеки; 2 – вывод данных; 3 –Формирование нового списка; 4 – Обработка  5 – Поиск ; 6 – Сохранение и загрузка  картотеки; 7 –Пользователю ; 0 – Выход из программы.

2) Если пользователь выбирает первый пункт меню, выводится подменю: 1 – Последовательный ввод ; 2 – Ввод с уточнениям места добавления элемента в картотеку 3 – выход в надменю.

2.1) Если пользователь выбирает первый пункт меню,  выполняется:

 2.1.1) ввод названия, переход к пункту 2.1.2;

 2.1.2) ввод года, переход к пункту 2.1.3;

 2.1.3) ввод рейтинга переход к пункту 2.1.4;

 2.1.4) вывод сообщения «Завершить ввод?(y/n)».

 2.1.5) если сh==n, переход к пункту 2.1.1; если сh!=n, переход к пункту 2.

3) Если пользователь выбирает второй пункт меню, выполняется  вывод под-меню :

 

   1 – Последовательный ввод.

   2 – Уточнение ввода данных

   3 -  Выход

             4) Если пользователь выбирает третий пункт меню, выполняется обработка по заданному пользователем условию, переход к пункту 1.

5) Если выбран четвертый пункт меню, выводится подменю: 1 – Удаление элементов ; 2 – Сортировка (По имени, году или рейтингу); 3 - Выход (действия осуществляются в соответствии с выбранным пунктом).

6) Если выбран 5 пункт, выполняется поиск элемента (по имени или году).

7) Если выбран 6 пункт меню, выводится подменю с вариантами выбора: 1 – Сохранение ,2 – Загрузка  

8) Если выбран 7 пункт меню, осуществляется вывод информации для пользователя:

1 – Рекомендации по использованию, 2 – Инструкция по программе

9) Если выбран 0 пункт меню, осуществляется выход из программы.

     9. Описание функций

Описание функции «menu_seach_1»

Назначение: вывод подменю пункта “Поиск”.

Прототип: void menu_seach_1(void)  

Пример вызова: menu_seach _1();

Описание функции «menu_sort_1»

Назначение: вывод подменю пункта “Сортировка”.

Прототип: void menu_sort_1(void)  

Пример вызова: menu_seach _1();

Описание функции «user_GUIDE»

Назначение: вывод подменю пункта “Пользователю”.

Прототип: void user_GUIDE(void)  

Пример вызова: user_GUIDE();

Описание функции «Save_and_Load»

Назначение: вывод подменю пункта “Сохранение и загрузка”.

Прототип: void Save_and_Load(void)  

Пример вызова: Save_and_Load ();

Описание функции «menu_seach»

Назначение: вывод подменю пункта “Поиск”.

Прототип: void menu_seach(void)  

Пример вызова: menu_seach ();

Описание функции «menu_confirming»

Назначение: вывод подменю пункта “Обработка”.

Прототип: void menu_confirming(void)  

Пример вызова: menu_confirming ();

Описание функции «Notice»

Назначение: вывод подсказки

Прототип: void Notice(void)  

Пример вызова: Notice ();

Описание функции «menu_enter»

Назначение: вывод подменю пункта  “Ввод данных картотеки”

Прототип: void menu_enter(void)  

Пример вызова: menu_enter();

Описание функции «menu_enter»

Назначение: вывод подменю пункта “Ввод данных”

Прототип: void menu_enter(void)  

Пример вызова: menu_enter();

Описание функции «output_menu»

Назначение: вывод подменю пункта “Вывод данных”

Прототип: void output_menu(void)  

Пример вызова: output_menu();

Описание функции «help»

Назначение: вывод помощи.

Прототип: void help(void)  

Пример вызова: help();

Описание функции «recomend»

Назначение: вывод рекомендации пользователю.

Прототип: void recomend(void)  

Пример вызова: recomend();

Описание функции «Screen»

Назначение: вывод няшности*

Прототип: void Screen(void)  

Пример вызова: Screen();

Описание функции «enter»

Назначение: ввод

Прототип: SP *enter(SP *), где параметр типа SP * - указатель на “голову” списка, тип возвращаемого значения SP * - указатель на “голову” списка.

Пример вызова: names = enter(&k), где names - указатель на “голову” списка.

Описание переменных: описание локальных переменных функции enter приведено в таблице 4.

 Таблица 4. Описание локальных переменных функции enter

Имя переменной

Тип переменной

Назначение

p

SP *

Указатель на голову списка

Описание функции «Output»

Назначение: вывод информационных полей списка.

Прототип: void Output (SP *, char *), первый тип параметра SP * - указатель на “голову” списка, второй тип параметра char * - указатель на объект типа char.

Пример вызова: Output(games, "Данные:"), где games –адрес первого элемента последовательности структур.

Описание переменных: описание локальных переменных функции Output приведены в таблице 5.

Таблица 5. Описание локальных переменных функции Output

Имя переменной

Тип переменной

Назначение

q

Int

Вспомогательная переменная

Описание функции «confirming»

Назначение: функция обрабатывает исходный список и возвращает полученный список - результат.

Прототип: SP *confirming(SP *)где тип возвращаемого значения SP * - указатель на “голову” списка, первый тип параметра SP * - адрес первого элемента списка.

Пример вызова: rez=confirming(SP *h1), где rez –  возвращаемое значение типа SP *, h1 - указатель на “голову” списка.

Описание переменных: описание локальных переменных функции confirming приведено в таблице 6.

Таблица 6. Описание локальных переменных функции confirming

Имя переменной

Тип переменной

Назначение

d

int

Переменная для хранения рейтинга

p, h2, p1, p2

SP *

переменные указатели

Описание функции «Sort»

Назначение: функция вызывает функцию “NewSort” с соответствующими параметрами для различных типов сортировки(по возрастанию, убыванию)

Прототип: SP *Sort(SP *),где первый тип параметра SP * - указатель на “голову” списка, второй тип параметра int – размер исходного списка, а тип возвращаемого значения SP* - указатель на “голову” списка

Пример вызова: h1=Sort(games),где h1 указатель на “голову” списка

Описание переменных: описание локальных переменных функции Sort приведено в таблице 7.

Таблица 7. Описание локальных переменных функции Sort

Имя переменной

Тип переменной

Назначение

pm2, pm3, pm4

Int

Переменные для управления меню

Описание функции «Newsort»

Назначение: функция сортирует элементы списка.

Прототип: SP *Newsort(SP *, int, int), где первый параметр типа SP * - указатель на “голову” списка, второй тип параметра int – флаг, показывающий по какому полю сортировать, третий тип параметра int – флаг, показывающий какой тип сортировки выполнять(по возрастанию убыванию), возвращаемое значение типа SP * - указатель на “голову” списка.

Пример вызова: h1=Newsort(h1, 1, 1), где первый параметр  h1- указатель на “голову” списка, второй параметр 1 – флаг, показывающий по какому полю сортировать, третий параметр int – флаг, показывающий какой тип сортировки выполнять(по возрастанию убыванию), возвращаемое значение типа SP * - указатель на “голову” списка.

Описание переменных: описание локальных переменных функции Newsort приведено в таблице 8.

Таблица 8. Описание локальных переменных функции NewSort

Имя переменной

Тип переменной

Назначение

p,p1,p2,p3

SP *

Переменные указатели

z

int

Вспомогательная переменная

Описание функции «Add»

Назначение: функция добавляет элемент в существующий список.

Прототип: SP *Add(SP *), где тип возвращаемого значения SP *-  указатель на “голову” списка, первый тип параметра SP * - указатель на “голову” списка.

Пример вызова: h1=Add(h1), где h1 указатель на “голову” списка.

Описание переменных: описание локальных переменных функции Add приведено в таблице 9.

Таблица 9. Описание локальных переменных функции Add

Имя переменной

Тип переменной

Назначение

d, k

int

Вспомогательные переменные

pm2

int

Переменная  для управления меню

p1,p

SP *

Переменные указатели

Описание функции «Del»

Назначение: функция удаляет элемент из списка.

Прототип:  SP *Del(SP *), где тип возвращаемого значения SP *- указатель на “голову” списка, первый тип параметра SP *- указатель на “голову” списка.

Пример вызова: h1=Del(h1), где h1 - указатель на “голову”голову списка.

Описание переменных: описание локальных переменных функции Del приведено в таблице 10.

Таблица 10. Описание переменных функции Del

Имя переменной

Тип переменной

Назначение

d,k

int

Вспомогательные переменные

p1, p

SP *

Переменные указатели

Описание функции «Output_2»

Назначение: функция выводит информационные поля элементов, расположенных справа и слева от заданного.

Прототип: void Output_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»

Назначение: функция ищет продукты по определенному сочетанию букв,году и рейтингу.

Прототип:  void Seach_1(SP *), где первый тип параметра SP *- указатель на “голову” списка.

Пример вызова: Seach_1(h1), где h1 - указатель на “голову” списка.

Описание переменных: описание локальных переменных функции приведено в таблице 14.

Таблица 15. Описание переменных функции Seach_1

Имя переменной

Тип переменной

Назначение

i,l

           int

Вспомогательные переменные

s[15]

          char

Сочетание вводимое пользователем

ch

          char

Вспомогательные переменные

10. Иерархическая структура программы

Free ()

fname()

Confirming()

enter()

menu()

NewSort()

men()

main()

Load()

Add()

Del()

Sort()

Seach_1

The_end()

Output()

save()

Seach_2()

Output_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));

}

12. Набор тестов

№ п.п.

Исходные данные

Тип сортировки

по полю rating

Результат

Наименование

Год выхода

Рейтинг

Наименование

Год выхода

Рейтинг

1

Baloo

2008

8

По возрастанию

Aentik

2012

7

Charge

2010

11

Baloo

2008

8

Aentik

2012

7

Charge

2010

11

2

Nord

2008

8

По убыванию

Ascell

2010

11

Ascell

2010

11

Jaske

2012

7

Jaske

2012

7

Nord

2008

8

1. Проверка программы на наличие ошибок при сортировке по двум полям:

Сортировка по двум полям(в алфавитном порядке и по возрастанию поля rating) начинается с сравнивания главного поля(для сортировки). Поле name первого элемента сравнивается со вторым при помощи функции strcmp, если функция возвращает число больше нуля, то элементы меняются местами и т.д. Когда возникнет ситуация, что имена одинаковы, сравнение будет выполняться по второстепенному полю. Если значение поля rating одного элемента меньше значения другого элемента, они меняются местами. Ошибок не обнаружено.

2. Проверка программы на наличие ошибок при поиске элементов, не удовлетворяющих заданному условию:

Значение заданного поля каждого элемента сравнивается со значением, введенным пользователем с клавиатуры. Если совпадений не найдено, то новый список не формируется и выводится сообщение «Элементов с заданным условием нет». Ошибок не обнаружено.

3.Проверка вывода элементов справа и слева при отсутствии первого элемента: “Элементов справа и слева нет”

13. Инструкция для пользователя

  1. Для ввода данных нажмите 1.
  2. Выберите один из предложенных пунктов меню:
    1. “Последовательный ввод “ - Ввод данных, данные сохраняются последовательно, без уточнения места добавления информации.
    2. “Уточнить место добавления информации” – Здесь вы можете уточнить место добавления информации ,будет выведено подменю с соответствующими пунктами  (1-В начало ,2-После заданного, 3-в конец)
    3. Выход в надменю (Программа выйдет в надменю ввода)

  1. Для вывода данных нажмите 2.
  2. Выберите один из пунктов меню:
    1. “Вывод всей картотеки” – будет произведен вывод всей картотеки, в случае ,если картотека пуста ,программа выдаст ошибку.
    2. “Вывод справа и слева от элемента” – будет произведен вывод справа и слева от заданного элемента, если картотека пуста, программа выдаст ошибку, если заданный элемент не существует, программа также выдаст ошибку.
    3. Выход в надменю (Программа выйдет в надменю вывода)

  1. Для формирования новой картотеки по заданному условию нажмите 3.
    1. При выборе этого пункта произойдет формирование новой картотеки по заданному условию, в данном случае ,программа сформирует новую картотеку из данных ,которые соответствуют условию : рейтинг больше n ,где n вводится после выбора пункта меню.
    2. После успешного формирования данных, программа выдаст соответствующее сообщение, в случае ошибки, соответствующее сообщение

  1. Для обработки картотеки нажмите 4:
  2. Выберите один из пунктов меню:
    1. “Удаление элементов из картотеки” – при выборе этого пункта ,Вам будет предоставлен выбор, какой элемент удалить. Введите номер элемента.
    2. “Добавление элемента в указанного место” – аналог п.1.1.2.
    3. Выход в надменю (Программа выйдет в надменю обработки)

  1. Для поиска элементов нажмите 5:
  2. Выберите один из пунктов меню:
    1. “Поиск по имени” – при выборе этого пункта , Вам необходимо ввести комбинацию букв для поиска ее в базе данных. Если элементы будут найдены, произойдет вывод, иначе программа сообщит об отсутствии элементов в базе.
    2. “Поиск по году” – при выборе этого пункта , Вам необходимо ввести диапазон от a до b годов. Будет осуществлен поиск продуктов в этом диапозоне . Если элементы будут найдены, произойдет вывод, иначе программа сообщит об отсутствии элементов в базе.
    3. Выход в надменю (Программа выйдет в надменю поиска)

  1. Для сохранения или загрузки файлов нажмите 6:
  2. Выберите один из пунктов меню:
    1. “Сохранение” –Картотека будет сохранена в файле,имя которого Вы задаете сами. В случае ,если картотека пуста, сохранение невозможно.
    2. “Загрузка” – Загрузка данных из файла. В случае отсутствия файла, программа сообщит об ошибки.
    3. “Выход в надменю” (Программа выйдет в надменю сохранения и загрузки)

  1. Для просмотра документов для пользователя нажмите 7:
  2. Выберите один из пунктов меню:
    1. “Рекомендации по использованию программы” –Основные рекомендации для пользователя по использованию программы.
    2. “Инструкция пользователю” – кратка инструкция по использованию программы.
    3. “Выход в надменю” (Программа выйдет в надменю вывода)

  1. Для выхода из программы нажмите 0
  2. В случае ввода неправильного пункта меню ,программа сообщит об соответствующей ошибке.
  3. Программа русифицирована, но в связи с особенностями среды, поддерживает только английский язык
  4. Также замечена нестабильность работы на Windows 8,возможны сбои в сохранении, загрузке и поиске данных.
  5. Хорошего Вам дня.

14. Результаты выполнения программы

При выполнении программы полученные результаты совпадают с приведенными в таблицах 1 и 2 "Контрольные примеры". Ошибок не обнаружено.

15. Выводы

При выполнении курсовой работы получены практические навыки в работе со списками и файлами на языке С/С++.