Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик.doc
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
275.46 Кб
Скачать

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

8.1. Для начала работы с программой откройте файл “Kursovik.cpp”.

8.2.После запуска программы вы должны увидеть меню, состоящее 10 пунктов: 1.Помощь – справко о программе, 2.Ввод данных : 2.1.Помощь для ввода данных, 2.2.Ввод данных, 2.3.Редактирование неверно введенных полей, 3.Контрольный вывод, 4.Поиск элемента по выбранному полю, 5.Добавленте элемента перед заданным, 6.Удаление элемента, 7.Сортировка списка, 8. Сохранение в файл, 9.Загрузка из файла, 10 Выход. Для выбора пункта меню необходимо с помощью стрелочек( вверх и вниз ) выбрать необходимый пункт меню и нажать Ентер.

8.3.Для получения справки по работе с программой выберите пункт меню “Справка”.

8.4.Выберите пункт меню 2.“Ввод данных”. Далее необходимо выбрать подпункт меню : 2.2.Ввод данных. Исходную структуру также можно загрузить из файла при помощи пункта меню 9.Загрузка из файла.

8.5.По окончании ввода базы данных нажмите любую клавишу.

8.6.Если вы допустли одну или несколько ошибок в одном из полей, то вам необходимо выбрать подпункт меню 2.3 Редактирование неверно введенных полей. пункта меню 2.Ввод данных. Если вы ввели лишний элемент, то выберите пункт меню 6.Удаление элемента.

Если же вы забыли ввести нужный элемент, то выберите пункт меню 5.Добавленте элемента перед заданным.

8.7.Выберите пункт меню 3.Контрольный вывод для просмотра введенной структуры и проверки элементов.По окончании просмотра нажмите любую клавишу.

8.8.Для поиска необходимого элемента выберите пункт меню 4.Поиск элемента по выбранному полю.

8.9Если же вы хотите просмотреть введенные игры в порядке возрастания цены, то выберите пункт меню 7.Сортировка списка. Данный результат по желанию пользователя можно сохранить.

8.10Если же вы хотите сохранить исходную структуру, то выберите пункт меню 8. Сохранение в файл. При обнаружении файла с идентичным именем по желанию пользователя может быть приостановлен процесс записи.

8.11. Для выхода из программы выберите пункт меню “Выход” или нажмитеF4.

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

9. Заключение

Создание данной программы явилось вторым шагом к написанию приложений, имеющих практическое значение( база данных ). В результате выполнения поставленной задачи были получены огромные практические навыки работы на языке Си. Был приобретен опыт работы со структурами данных на основе односвязного списка, файлами( сохранение данных в файл и загрузка данных с существующего файла ) и динамической памятью.

10. Текст программы

#include<stdio.h>

#include<conio.h>

#include<string.h>

#include<dos.h>

#include<alloc.h>

#include<stdlib.h>

typedef struct _MY_STRUCT

{

char Name[20]; //Название игры

char iCdCount[20]; //Число занимаемых ею дисков

char iMoney[20]; //Стоимость игры

char Style[20]; //Жанр игры

char Language[10]; //Наличие русской версии

_MY_STRUCT *Next;

} MY_STRUCT;

void SaveInFile( MY_STRUCT* , char* );

MY_STRUCT *Search1( MY_STRUCT*, int , char*, int bUseSaveToFile );

void FREE( MY_STRUCT* );

void FreeList( MY_STRUCT **pGame ); //Очистка памяти

void SetNormalTextColor() //Восстановление нормального цвета

{

textcolor( WHITE );

textbackground( BLACK );

}

void SetSelectedTextColor() //Выделение выбранного пункта меню

{

textcolor( BLACK );

textbackground( WHITE );

}

char *strMainMenu[] = {"1.HELP", "2.Ввод данных", "3.Контрольный вывод", "4.Поиск по полю", "5.Добавление элемента", "6.Удаление элемента", "7.Сортировка списка", "8.Сохранение в файл", "9.Загрузка из файла", "F4.Выход" };

void Hi(void)

{

clrscr();

printf(" \t\t**************************************************\n");

printf("\tДобро пожаловать в программу, работающую с компьютерными играми !!! ");

printf("\n\n\t\t\tДля продолжения кликните по клавиатуре!");

getch();

}

void Help( void )

{

clrscr();

printf( "\n\n\t\t****************** HELP ******************\n " );

printf( "\n\tДанная программа создана с использованием односвязного списка." );

printf( "\n\tКроме ввода и вывода данных в программе предусмотрены различные дополни-" );

printf( "\tтельные функции работы со списком: всевозможные поиски, добавление и " );

printf( "\n\tудаление элементов. Также она поддерживает возможность записывать " );

printf( "\n\tнеобходимую информацию в файл и считывать ее с существующего файла." );

printf( "\n\t!!! Если при поиске элемента вы хотите сохранить результат, то" );

printf( "\n\tисходный список будет выведен до искомого элемента включительно! " );

printf( "\n\n\t\t\t\tPress any key!" );

getch();

}

void HelpInPut( void)

{

clrscr();

printf( "\n\n\t\t**** ПОМОЩЬ (ДЛЯ ВВОДА ИНФОРМАЦИИ) ****\n " );

printf( "\n\tНазвание игры рекомендуется вводить в пределах 12 символов." );

printf( "\n\tЦена и количество дисков - целые положительные числа!" );

printf( "\n\tЖанр игры вводить в пределах 8 символов.\n\tЖанр игры можно выбрать из ряда предложенных :)" );

printf( "\n\tНаличие русской версии - большие буквы (Y) или (N)" );

printf( "\n\n\t\t\t\tPress any key!" );

getch();

}

char *szFieldNames[] = { "название игры","чосло дисков", "цену игры", "стиль игры", "наличие перевода" };

MY_STRUCT* InPut( MY_STRUCT *Result )

{

int i, iCount = 0;

MY_STRUCT *next;

MY_STRUCT* Search;

char ch1;

char field[20];

char ch;

do

{

clrscr();

printf( "\n\n\t\t******* ВВОД ИНФОРМАЦИИ *******\n " );

printf( "\n\t1.HELP" );

printf( "\n\t2.Ввод данных" );

printf( "\n\t3.Редактирование полей " );

printf( "\n\t4.Exit" );

ch1 = getch();

switch( ch1 )

{

case '1':

HelpInPut();

break;

case '2':

clrscr();

if( Result != NULL )

FreeList( &Result );

do

{

printf("\n\tВведите количество игр, которое вы хотите внести в базу(>=1) ");

scanf( "%d", &iCount );

if ( iCount < 1 )

{

sound(1200);

delay(800);

nosound();

fflush(stdin);

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Кол-во должно быть от 1 до ... ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

delay(1500);

clrscr();

}

}

while ( iCount < 1 );

next = NULL;

for ( i = 0; i < iCount ; i++ )

{

fflush(stdin);

Result = (MY_STRUCT*)malloc(sizeof(MY_STRUCT));

clrscr();

printf( "\n Введите название %d-ой игры \n", i+1 );

scanf( "%12s", &Result->Name );

fflush(stdin);

printf( "\n Введите число дисков, занимаемых игрою ");

scanf( "%5s", &Result->iCdCount );

fflush(stdin);

printf("\n Введите cтоимость игры(измеряется в руб.) ");

scanf( "%5s", &Result->iMoney );

fflush(stdin);

printf( "\n Введите жанр игры(RPG, Квест, Action,...) \n " );

scanf( "%8s", &Result->Style );

fflush(stdin);

printf("\n Есть ли русская версия игры на диске(Y/N) " );

scanf("%5s", &Result->Language );

Result->Next = next;

next = Result;

}

return Result;

default:

break;

case '3':

clrscr();

if( Result != NULL )

{

do

{

clrscr();

printf( "\nВам необходимо найти поле элемента, которое вы хотите изменить! " );

printf( "\n\t\t1.Поиск игр по названию" );

printf( "\n\t\t2.Поиск игр по числу дисков" );

printf( "\n\t\t3.Поиск игр по цене" );

printf( "\n\t\t4.Поиск игр по стилю" );

printf( "\n\t\t5.Поиск игр по наличию перевода" );

printf( "\n\t\t6.EXIT!!!\n\n");

ch=getch();

switch( ch )

{

case '1':

case '2':

case '3':

case '4':

case '5':

do

{

printf( "%c Введите %s, по которому вы будете искать нужный элемент\n", ch, szFieldNames[ch - '1'] );

scanf( "%s", field);

Search = Search1( Result, ch, field, 0 );

if( Search == NULL )

{

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Данного поля в списке нет ! ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

getch();

}

else

{

switch( ch )

{

case '1':

fflush(stdin);

printf( "\n Введите название игры \n" );

scanf( "%12s", &Search->Name );

break;

case '2':

fflush(stdin);

printf( "\n Введите число дисков, занимаемых игрою ");

scanf( "%5s", &Search->iCdCount );

break;

case '3':

fflush(stdin);

printf("\n Введите cтоимость игры(измеряется в руб.) ");

scanf( "%5s", &Search->iMoney );

break;

case '4':

fflush(stdin);

printf( "\n Введите жанр игры(RPG, Квест, Action,...) \n " );

scanf( "%8s", &Search->Style );

break;

case '5':

fflush(stdin);

printf("\n Есть ли русская версия игры на диске(Y/N) " );

scanf("%5s", &Search->Language );

}

}

}

while( Search == NULL );

return Result;

default:

break;

}

}

while( ch != '6');

}

else

{

printf( "\nРедактировать нечего! Сначало надо ввести данные!" );

getch();

}

}

}

while( ch1 != '4');

return Result;

}

void OutPut( MY_STRUCT *Game )

{

MY_STRUCT* prev;

prev = Game;

printf( "Название игры Число CD Стоимость Жанр игры Наличие Руск\n" );

do

{

printf( "\n %12s %5s %5s Руб. %8s \t %5s ", prev->Name, prev->iCdCount, prev->iMoney, prev->Style, prev->Language );

prev = prev->Next;

}

while( prev != NULL );

}

//Поиск элемента по заданному полю

MY_STRUCT *Search1( MY_STRUCT *Game, int ch1, char *field, int bUseSaveToFile )

{

MY_STRUCT *game;

game = Game;

MY_STRUCT *Search = NULL;

int iCount=0;

char cont, cA;

char Name[20];

do

{

int iWasFound = 0;

switch( ch1 )

{

case '1':

if( !strcmp( field, game->Name ))

iWasFound = 1;

break;

case '2':

if( !strcmp( field, game->iCdCount ))

iWasFound = 1;

break;

case '3':

if( !strcmp( field, game->iMoney ))

iWasFound = 1;

break;

case '4':

if( !strcmp( field, game->Style ))

iWasFound = 1;

break;

case '5':

if(!strcmp( field, game->Language))

iWasFound = 1;

break;

}

if( iWasFound )

{

printf( "Название игры Число CD Стоимость Жанр игры Наличие Руск\n" );

printf( "\n %12s %5s %5s Руб. %8s \t %5s ", game->Name, game- >iCdCount, game->iMoney, game->Style, game->Language );

Search = game;

iCount++;

if( bUseSaveToFile )

{

printf( "\n\tХотите сохранить результат?[y/n] " );

cA = getch();

if( cA == 'y')

{

Search->Next = NULL;

printf( "\nВведите имя файла ");

scanf( "%s", Name );

SaveInFile( Search, Name );

printf( "\n\tСохранение прошло успешно!!!" );

}

printf( "\n\tХотите продолжить поиск[y/n] ?");

cont = getch();

}

}

game = game->Next;

}

while( (game)!=NULL && cont!='n');

if( iCount == 0 )

{

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Данные не найдены !!!!! ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

getch();

}

else if( bUseSaveToFile )

{

printf( "\n\n\tПоиск закончен. Элеменов, удовлетворяющих данному условию боьше НЕТ." );

getch();

}

return Search;

}

//Добавление после заданного элемента

void add( MY_STRUCT **pSearch)

{

MY_STRUCT* New;

New = (MY_STRUCT*)malloc(sizeof(MY_STRUCT));

clrscr();

fflush(stdin);

printf( "\n Введите название игры \n" );

scanf( "%12s", &New->Name );

fflush(stdin);

printf( "\n Введите число дисков, занимаемых игрою ");

scanf( "%5s", &New->iCdCount );

fflush(stdin);

printf("\n Введите cтоимость игры(измеряется в руб.) ");

scanf( "%5s", &New->iMoney );

fflush(stdin);

printf( "\n Введите жанр игры(RPG, Квест, Action,...) \n " );

scanf( "%8s", &New->Style );

fflush(stdin);

printf("\n Есть ли русская версия игры на диске(Y/N) " );

scanf("%5s", &New->Language );

if( *pSearch == NULL)

{

*pSearch = New;

(*pSearch)->Next = NULL;

}

else

{

New->Next = (*pSearch)->Next;

(*pSearch)->Next = New;

}

}

//Удаление элемента

void del(MY_STRUCT** Game,MY_STRUCT* Search )

{

MY_STRUCT* distr = *Game, *delit;

if( *Game != Search )

{

while( distr && distr->Next != Search)

distr = distr->Next;

delit = distr->Next;

distr->Next = distr->Next->Next;

free( delit );

}

else

{

delit = *Game;

*Game = (*Game)->Next;

free( delit );

}

}

//Сортировка по стоимости игры

void SortByiMoney( MY_STRUCT* pGame)

{

MY_STRUCT* pSort = pGame;

MY_STRUCT** pNew = NULL;

int iCount = 0;

int i;

char ch, address[20];

while( pSort != NULL )

{

iCount++;

pSort = pSort->Next;

}

pNew = (MY_STRUCT**)malloc(iCount*sizeof(MY_STRUCT*));

pSort = pGame;

for( i = 0; i < iCount; i++ )

{

pNew[i] = pSort;

pSort = pSort->Next;

}

int j;

MY_STRUCT *pTemp = NULL;

for( i = 0; i < iCount; i++ )

{

for( j = i; j < iCount ; j++ )

{

int iI = atoi(pNew[i]->iMoney);

int iJ = atoi(pNew[j]->iMoney);

//if( (pNew[i]->iMoney) > (pNew[j]->iMoney) )

if( iI > iJ )

{

pTemp = pNew[i];

pNew[i] = pNew[j];

pNew[j] = pTemp;

}

}

}

printf( "\n\tСортировка производится по возрастанию цены на игры!!\n" );

printf( "\nНазвание игры Число CD Стоимость Жанр игры Наличие Руск\n" );

for( i = 0; i < iCount ; i++ )

printf( "\n %12s %5s %5s Руб. %8s \t %5s ", pNew[i]->Name, pNew[i]->iCdCount, pNew[i]->iMoney, pNew[i]->Style, pNew[i]->Language );

printf( "\n\n\tХотите записать результат сортировки?[y/n]" );

ch = getch();

if( ch == 'y' || ch == 'Y')

{

for( i = 0; i < (iCount - 1); i++ )

pNew[i]->Next = pNew[i+1];

pNew[iCount - 1]->Next = NULL;

printf( "\n\tВведите имя файла ");

scanf( "%s", address );

SaveInFile( *pNew, address );

}

else

delete( pNew );

getch();

}

/* Сохранение в файл */

void SaveInFile( MY_STRUCT* Game, char *address )

{

FILE *fp;

MY_STRUCT* next = Game;

if( fopen( address, "r" ) ) //Проверяем на наличие файла с данным именем

{

printf( "\n\t\t\t********* WARNING *********" );

printf( "\n\tФайл с таким именем уже существует !" );

printf( "\n\tПри сохранении нового файла старые данные исчезнут!" );

printf( "\n\tВы точно хотите продолжить?[y\\n] " );

if( getch() == 'n' )

return;

}

fp = fopen( address, "w+" ); //открытие файла для записи

while( next )

{

fwrite( next, (long)(sizeof(MY_STRUCT)), 1, fp);

next = next->Next;

}

fclose( fp ); //Закрытие файла

}

/* Загрузка из файла */

MY_STRUCT* LoadFromFile(MY_STRUCT* Game, char *address)

{

FILE *fp;

MY_STRUCT* game, *next;

fp = fopen( address, "r+" ); //Открытие файла для чтения

if( fp )

{

next = (MY_STRUCT*)malloc(sizeof(MY_STRUCT));

game = next;

while( fread (next, (long)(sizeof(MY_STRUCT)), 1, fp))

if( next->Next)

{

next->Next = (MY_STRUCT*)malloc(sizeof(MY_STRUCT));

next = next->Next;

next->Next = NULL;

}

printf( "\n\tОткрытие файла прошло успешно!!!" );

getch();

fclose( fp);

}

else

{

clrscr();

printf( "\n\tФайла с данным именем не имеется!!!" );

getch();

return Game;

}

return game;

}

void FREE( MY_STRUCT* Game ) //Очистка памяти

{

MY_STRUCT* List;

while( Game )

{

List = Game;

Game = List->Next;

free( List);

}

}

void FreeList( MY_STRUCT **pGame ) //Очистка памяти

{

MY_STRUCT *pTemp;

while( *pGame != NULL )

{

pTemp = *pGame;

int iQuit = 0;

while( !iQuit )

{

if( pTemp->Next != NULL )

{

if( pTemp->Next->Next != NULL )

pTemp = pTemp->Next;

else

{

delete pTemp->Next;

pTemp->Next = NULL;

iQuit = 1;

}

}

else

{

delete pTemp;

*pGame = NULL;

iQuit = 1;

}

}

}

}

void main(void)

{

MY_STRUCT* Game = NULL;

MY_STRUCT* Search = NULL;

char field[12], address[15];

char ch, ch1;

int iCurrentItem = 0;

int iMenuCount = 0;

Hi();

char cKey = 0;

for( ;; )

{

clrscr();

printf( "\t\t\t ***** Пользовательское Меню *****\n\n\n\n" );

for( int i = 0; i < 10; i++ )

{

if( i == iCurrentItem )

SetSelectedTextColor();

else

SetNormalTextColor();

printf( "\t" );

cprintf( "%s\r\n", strMainMenu[i] );

}

SetNormalTextColor();

cKey = getch();

if( cKey == 0 )

{

switch( getch() )

{

case 72:

iCurrentItem--;

if( iCurrentItem < 0 )

iCurrentItem = 9;

break;

case 80:

iCurrentItem++;

if( iCurrentItem == 10 )

iCurrentItem = 0;

break;

case 62:

iMenuCount = 1;

break;

}

}

else if( cKey == 13 )

{

switch( iCurrentItem )

{

case 0:

Help();

break;

case 1:

Game = InPut( Game );

break;

case 2:

clrscr();

if ( Game )

OutPut( Game );

else

printf( "\n\n\t\tСписок пуст!" );

getch();

break;

case 3:

clrscr();

if( Game == NULL)

{

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Данные не были введены ! ! ! ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

getch();

}

else

{

do

{

clrscr();

printf( "\n\t\t1.Поиск игр по названию" );

printf( "\n\t\t2.Поиск игр по числу дисков" );

printf( "\n\t\t3.Поиск игр по цене" );

printf( "\n\t\t4.Поиск игр по стилю" );

printf( "\n\t\t5.Поиск игр по наличию перевода" );

printf( "\n\t\t6.EXIT!!!\n");

ch1=getch();

int iUseSearch = 1;

switch( ch1 )

{

case '1':

printf( "\n1.You want to found the game.Введите название игры!\n " );

break;

case '2':

printf( "\n2.You want to found the game.Введите количество дисков!\n " );

break;

case '3':

printf( "\n3.You want to found the game.Введите цену(желательно в руб.)!\n " );

break;

case '4':

printf( "\n4.You want to found the game.Введите жанр игры!\n " );

break;

case '5':

printf( "\n5.You want to found the game.Есть ли перевод на родной язык(Russian)!\n " );

break;

default:

iUseSearch = 0;

break;

}

if( iUseSearch )

{

scanf( "%s", field );

Search1( Game, ch1, field, 1 );

}

}

while( ch1!='6');

}

break;

case 4:

if( Game == NULL )

{

clrscr();

printf( "\n\tPlease, Enter the list!!!" );

getch();

add( &Game );

}

else

{

do

{

clrscr();

printf( "Вам необходимо найти элемент, после которого вы хотите добавить новый!\n " );

printf( "\n\t\t1.Поиск игр по названию" );

printf( "\n\t\t2.Поиск игр по числу дисков" );

printf( "\n\t\t3.Поиск игр по цене" );

printf( "\n\t\t4.Поиск игр по стилю" );

printf( "\n\t\t5.Поиск игр по наличию перевода" );

printf( "\n\t\t6.EXIT!!!\n\n");

ch1=getch();

switch( ch1 )

{

case '1':

case '2':

case '3':

case '4':

case '5':

printf( "%c Введите содержимое поля, по которому вы будете искать нужный элемент\n", ch1 );

scanf( "%s", field);

Search = Search1( Game, ch1, field, 0 );

if( Search != NULL )

add(&Search);

break;

default:

break;

}

}

while( ch1 != '6');

}

break;

case 5:

clrscr();

if( Game == NULL)

{

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Данные не были введены ! ! ! ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

getch();

}

else

{

do

{

clrscr();

printf("\n\tНужно найти элемент ,который вы будете удалять!!!");

printf( "\n\t\t1.Поиск игр по названию" );

printf( "\n\t\t2.Поиск игр по числу дисков" );

printf( "\n\t\t3.Поиск игр по цене" );

printf( "\n\t\t4.Поиск игр по стилю" );

printf( "\n\t\t5.Поиск игр по наличию перевода" );

printf( "\n\t\t6.EXIT!!!\n\n");

ch1=getch();

switch( ch1 )

{

case '1':

case '2':

case '3':

case '4':

case '5':

do

{

printf( "%c Введите содержимое поля, по которому вы будете искать нужный элемент\n", ch1 );

scanf( "%s", field);

Search = Search1( Game, ch1, field, 0 );

if( Search == NULL )

{

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Данного поле в списке нет ! ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

getch();

}

else

del( &Game, Search );

}

while( Search == NULL );

break;

default:

break;

}

}

while( ch1 != '6');

}

break;

case 6:

clrscr();

if( Game == NULL )

printf( "\n\tСортировать нечего!!" );

else

{

SortByiMoney( Game );

printf( "\n\n\n\t\t\t !Сортировка выполнена! " );

}

getch();

break;

case 7:

clrscr();

if( Game == NULL )

{

printf("\n\t\t\t ╔════════════════════════════════╗ ");

printf("\n\t\t\t ║ Сохранять нечего!!! ║ ");

printf("\n\t\t\t ║ !Список пуст! ║ ");

printf("\n\t\t\t ╚════════════════════════════════╝ ");

}

else

{

printf( "\n\tВведите имя файла, в который вы хотите сохранить информацию!\n" );

scanf( "%s", address );

SaveInFile( Game, address );

printf( "\n\tСохранение прошло успешно!!!" );

}

getch();

break;

case 8:

{

clrscr();

printf( "\n\tВведите имя файла, откуда вы хотите загрузить информацию\n" );

scanf( "%s", address );

Game = LoadFromFile( Game, address);

break;

}

case 9:

iMenuCount = 1;

break;

}

}

if( iMenuCount == 1)

break;

}

FreeList( &Game );

}

Соседние файлы в предмете Программирование