Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Приложение к курсовой работе



Приложение к курсовой работе

“База данных продуктового склада”

Дмитриев Максим

ИФБ-12


Листинг программы:

Файл definitions.h:

#ifndef DEFINITIONS_H

#define DEFINITIONS_H

//Пути по умолчанию

#define logs "database\\logs.txt"

#define fooddb_txt "database\\findres.txt"

#define fooddb_bin "database\\foodwarehouse_bin.db"

#define fooddb_bin_bak "database\\foodwarehouse_bin.bak"

 

#endif

 

Файл database.h:

#ifndef DATABASE_H

#define DATABASE_H

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

 

struct database{

unsigned int num;//Номер записи

char code[8]; //Код продукта

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

char mesto[8]; //Место на складе

unsigned int srok;//Срок годности продукта

unsigned int kol;//Количество продукта на складе

};

 

#endif


 

Файл main.h:

#ifndef MAIN_H

#define MAIN_H

#define ns printf_s("\n")

#include <stdio.h>

#include <locale.h>

#include <Windows.h>

#include <conio.h>

#include "definitions.h"

 

struct database;

//Прототипы вызываемых из main() функций

void Help();

void UpdateDialog(HANDLE);

void DrawGUI(HANDLE);

void log(const char*);

database* LoadDB(unsigned int &,const char *put=fooddb_bin);

void PrintDB(HANDLE,unsigned int,database *);

database *Addition(unsigned int &,database *);

database *Delete(unsigned int &,unsigned int,database *);

void SaveDB(unsigned int,database *,const char *put=fooddb_bin);

void Sortir(unsigned int,database *);

void Find(unsigned int,database *);

 

#endif

 

 

Файл main.cpp:

#include "main.h"

#include "database.h"

 

void main(){

setlocale(LC_ALL,"RUSSIAN");

log("Запуск программы.");

HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

FreeConsole();//Освобождение консоли

AllocConsole();//Выделение собственной консоли

COORD bufsize={100,60};//Установка размеров окна консоли

SetConsoleScreenBufferSize(out,bufsize);

SetConsoleTitle(L"База данных продуктового склада Дмитриев Максим, ИФБ-12, 2013");

unsigned int razmer;

database *base;

base=LoadDB(razmer);

SaveDB(razmer,base,fooddb_bin_bak);

system("cls");

DrawGUI(out);

PrintDB(out,razmer,base);

UpdateDialog(out);

Help();

int ch, ch1;

//Управление

while(!_kbhit())

{ flushall();

ch1 = _getch(); //младший байт

if(ch1 == 0x1b) break;//нажатие ESC

ch = _getch(); //старший байт

switch(ch)

{

case 0x3B://F1

system("cls");

DrawGUI(out);

PrintDB(out,razmer,base);

UpdateDialog(out);

break;

 

case 0x3C://F2

UpdateDialog(out);

base=Addition(razmer,base);

printf_s("Элемент успешно добавлен!\n");

PrintDB(out,razmer,base);

break;

 

case 0x3D://F3

UpdateDialog(out);

unsigned int number;

printf_s("Введите номер элемента, который следует удалить->");scanf_s("%d",&number);

if(number<=razmer) base=Delete(razmer,number,base);

else printf_s("\nТакого номера не существует, отмена операции.");

printf_s("\n");

PrintDB(out,razmer,base);

break;

 

case 0x3E://F4

UpdateDialog(out);

Sortir(razmer,base);

PrintDB(out,razmer,base);

break;

 

case 0x3F://F5

UpdateDialog(out);

Find(razmer,base);

break;

 

case 0x40://F6

UpdateDialog(out);

SaveDB(razmer,base);

break;

 

case 0x43://F9

UpdateDialog(out);

base=LoadDB(razmer,fooddb_bin_bak);

PrintDB(out,razmer,base);

break;



 

case 0x44://F10

UpdateDialog(out);

base=LoadDB(razmer);

PrintDB(out,razmer,base);

break;

 

case 0x86://F12

UpdateDialog(out);

Help();

break;

 

default:

break;

}//switch

}//while

log("Завершение программы.");

free(base);

};

 

 

Файл functions.cpp:

#include "database.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <Windows.h>

#include "definitions.h"

 

 

void Help(){//Вывод текста помощника

printf_s("\t\t\t\t\tПомощник:\n\t\t\tФайл базы данных находится в папке \"database\"\n\t\tв каталоге с программой и называется \"foodwarehouse_bin.db\".\n\tВ этой же папке находится файл \"logs.txt\", содежращий отчёты обо всех операциях,\n\tвыполененных с базой банных, с указанием числа и времени совершения операции.\n");

printf_s("\n\t\t\t\t\tУправление:\n\t\tF1->Очистка экрана.\n\t\tF2->Добавление элемента в базу данных.\n\t\tF3->Удаление элемента из базы данных.\n\t\tF4->Сортировка.\n\t\tF5->Поиск по тексту.\n\t\tF6->Сохранение базы данных.\n\t\tF9->Загрузка предыдущей версии базы \"database\\foodwarehouse_bin.bak\"\n\t\tF10->Загрузка базы данных \"database\\foodwarehouse_bin.db\"\n\t\tF12->Вызов помощника.\n");

 

};

 

void log(const char *message){//Запись отчётов в файл

FILE *log;

SYSTEMTIME systime;

GetLocalTime(&systime);

fopen_s(&log,logs,"a");

fprintf_s(log,"-----%d.%d.%d [%d:%d:%d]-----\n%s\n\n",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond,message);

fclose(log);

};

 

 

database* LoadDB(unsigned int &razmer,const char *put=fooddb_bin){//Загрузка базы данных из файла

if(!strcmp(put,fooddb_bin_bak)) log("Загрузка предыдущей версии (backup) базы данных.");

else log("Загрузка базы данных.");

FILE *f;

unsigned int pahom=0;

fopen_s(&f,put,"rb");//Попытка открыть базу файл базы данных для чтения в бинаном режиме

if(f==NULL){log("Ошибка: файл базы данных не существует или доступ запрещён.");printf_s("Ошибка при открытии файла базы данных: файл не существует или доступ запрещён.\n");exit(0);}

printf_s("Загрузка базы данных");

fseek(f,0,SEEK_END);//Определение размера файла

pahom=ftell(f);

pahom=pahom-pahom%sizeof(database);

fseek(f,0,SEEK_SET);

razmer=pahom/sizeof(database);

database *base=(database*)calloc(razmer,sizeof(database));

for(int i=0;i<razmer;i++){

printf_s(".");

fread(&base[i].num,sizeof(base->num),1,f);

fread(&base[i].code,sizeof(base->code),1,f);

fread(&base[i].name,sizeof(base->name),1,f);

fread(&base[i].mesto,sizeof(base->mesto),1,f);

fread(&base[i].srok,sizeof(base->srok),1,f);

fread(&base[i].kol,sizeof(base->kol),1,f);

}

 

printf_s("\nЗагрузка успешно завершена!\n");

fclose(f);

return(base);

};

 

void UpdateDialog(HANDLE out){//Очистка диалоговой части экрана

COORD dialogpos={0,23};

SetConsoleCursorPosition(out,dialogpos);

for(int i=0;i<30;i++){

printf_s(" ");

};

SetConsoleCursorPosition(out,dialogpos);

};

 

void DrawGUI(HANDLE out){//Создание вспомогательного меню внизу экрана

COORD guipos={0,54};

SetConsoleCursorPosition(out,guipos);

SetConsoleTextAttribute(out,0x4e);

printf_s("____________________________________________________________________________________________________");

printf_s("| F1 | F2 | F3 | F4 | F5 | F6 | F9 | F10 | F12 |");

printf_s("|__________________________________________________________________________________________________|");

printf_s("| очистка | добавить | удалить |сортировать| поиск |сохранить |загрузить |загрузить | помощь |");

printf_s("| экрана | элемент | элемент | по полю | по тексту| базу | backup | базу | |");

printf_s("____________________________________________________________________________________________________");

SetConsoleTextAttribute(out,0x03);

};

 

 

void PrintDB(HANDLE out,unsigned int razmer,database* base){//Вывод базы данных на экран

COORD xy0={0,0},xy={0,0};

SetConsoleCursorPosition(out,xy);

for(int i=0;i<23;i++){

printf_s(" ");

};

SetConsoleCursorPosition(out,xy0);

SetConsoleTextAttribute(out,0x2f);

printf_s("====================================================================================================");

printf_s("|| Номер || Код || Наименование || Место || Срок г-ти||Количество||");

printf_s("====================================================================================================");

for(int i=0;i<(int)razmer;i++){

printf_s("|| %8d || %8s || %32s || %8s || %6d || %8d ||",base[i].num,base[i].code,base[i].name,base[i].mesto,base[i].srok,base[i].kol);

}

printf_s("====================================================================================================");

SetConsoleTextAttribute(out,0x03);

};

 

 

void SaveDBText(unsigned int razmer,database *base,const char *put=fooddb_txt){//Сохранение базы в текстовый файл

log("Сохранение результатов поиска в файл.");

FILE *f;

fopen_s(&f,put,"w");//Попытка открыть файл для записи в текстовом режиме

if(f==NULL)printf_s("Ошибка при открытии файла \"%s\" для сохранения базы данных\n(скорее всего, какой либо каталог на пути не существует).\n",put);

else{

fprintf_s(f,"====================================================================================================\n");

fprintf_s(f,"|| Номер || Код || Наименование || Место || Срок г-ти||Количество||\n");

fprintf_s(f,"====================================================================================================\n");

for(int i=0;i<(int)razmer;i++){

fprintf_s(f,"|| %8d || %8s || %32s || %8s || %6d || %8d ||\n",base[i].num,base[i].code,base[i].name,base[i].mesto,base[i].srok,base[i].kol);

}

fprintf_s(f,"====================================================================================================\n");

printf_s("\n\t\t\tСохранение успешно произведено.");

fclose(f);

}

};

 

 

void SaveDB(unsigned int razmer,database *base,const char *put=fooddb_bin){//Сохранение базы в бинарном режиме

if(!strcmp(put,fooddb_bin_bak)) log("Сохранение backup базы данных.");

else log("Сохранение базы данных.");

FILE *f;

fopen_s(&f,put,"wb");//Попытка открыть файл для сохранения в бинарном режиме

if(f==NULL)printf_s("Ошибка при открытии файла %s для сохранения базы данных.\n",put);

else{

for(int i=0;i<razmer;i++){

fwrite(&base[i].num,sizeof(base->num),1,f);

fwrite(&base[i].code,sizeof(base->code),1,f);

fwrite(&base[i].name,sizeof(base->name),1,f);

fwrite(&base[i].mesto,sizeof(base->mesto),1,f);

fwrite(&base[i].srok,sizeof(base->srok),1,f);

fwrite(&base[i].kol,sizeof(base->kol),1,f);

}

}

printf_s("\nСохранение успешно произведено.");

fclose(f);

};

 

 

void Find(unsigned int razmer,database* base){//Поиск в базе данных

char name[32]="",temp[32]="";

unsigned int findnum=0;

database *finddb=(database*)calloc(findnum,sizeof(database));

printf_s("Введите текст для поиска \20");

gets_s(name,32);

log("Поиск по базе данных.");

OemToCharA(name,name);

strlwr(name);

printf_s("\n");

printf_s("====================================================================================================");

printf_s("|| Номер || Код || Наименование || Место || Срок г-ти||Количество||");

printf_s("====================================================================================================");

for(int i=0;i<razmer;i++){//Поиск совпадений по полям номер, код, наименование, место

if(base[i].num==strtod(name,0)) {

findnum++;

finddb[findnum-1]=base[i];

printf_s("|| %8d || %8s || %32s || %8s || %6d || %8d ||",base[i].num,base[i].code,base[i].name,base[i].mesto,base[i].srok,base[i].kol);

}

else{

strcpy(temp,base[i].code);

strlwr(temp);

if(strstr(temp,name)){

findnum++;

finddb[findnum-1]=base[i];

printf_s("|| %8d || %8s || %32s || %8s || %6d || %8d ||",base[i].num,base[i].code,base[i].name,base[i].mesto,base[i].srok,base[i].kol);

}

else {

strcpy(temp,base[i].name);

strlwr(temp);

if(strstr(temp,name)) {

findnum++;

finddb[findnum-1]=base[i];

printf_s("|| %8d || %8s || %32s || %8s || %6d || %8d ||",base[i].num,base[i].code,base[i].name,base[i].mesto,base[i].srok,base[i].kol);

}

else{

strcpy(temp,base[i].mesto);

strlwr(temp);

if(strstr(temp,name)) {

findnum++;

finddb[findnum-1]=base[i];

printf_s("|| %8d || %8s || %32s || %8s || %6d || %8d ||",base[i].num,base[i].code,base[i].name,base[i].mesto,base[i].srok,base[i].kol);

}

}

}

}

}

printf_s("====================================================================================================\n");

printf_s("\n\t\t\tСохранить результаты поиска в файл? (Y/N)");

char ch;

do{

ch=getch();

}while(ch!='Y' && ch!='y' && ch!='N' && ch!='n' && ch!='Т' && ch!='т' && ch!='Н' && ch!='н');

if(ch=='y' || ch== 'Y' || ch=='Н' || ch=='н'){

printf_s("\n\t\tВведите путь для сохранения: например C:\\file.txt или papka\\file.txt\n\t\t");

gets_s(temp,32);

OemToCharA(temp,temp);

SaveDBText(findnum,finddb,temp);

}

else

printf_s("\n\t\t\t\tСохранение отменено.\n");

free(finddb);

};

 

database* Addition(unsigned int &razmer,database *base){//Добавление элемента в базу данных

razmer++;

database *newbase=(database*)calloc(razmer,sizeof(database));

//Копирование старой части базы данных

log("Добавление элемента в базу данных.");

for(int i=0;i<razmer-1;i++){

newbase[i].num=i+1;

strcpy(newbase[i].code,base[i].code);

strcpy(newbase[i].name,base[i].name);

strcpy(newbase[i].mesto,base[i].mesto);

newbase[i].srok=base[i].srok;

newbase[i].kol=base[i].kol;

}//Ввод данных элемента

newbase[razmer-1].num=razmer;

printf_s("\nКод продукта(<8 символов)->");gets_s(newbase[razmer-1].code,8);OemToCharA(newbase[razmer-1].code,newbase[razmer-1].code);

printf_s("\nНазвание продукта(<32 символов)->");gets_s(newbase[razmer-1].name,32);OemToCharA(newbase[razmer-1].name,newbase[razmer-1].name);

printf_s("\nМесто на складе(<8 символов)->");gets_s(newbase[razmer-1].mesto,8);OemToCharA(newbase[razmer-1].mesto,newbase[razmer-1].mesto);

printf_s("\nСрок годности(в формате ГГММДД)->");scanf_s("%d",&newbase[razmer-1].srok);

printf_s("\nКоличество товара на складе->");scanf_s("%d",&newbase[razmer-1].kol);

printf_s("\n");

return(newbase);

};

 

database *Delete(unsigned int &razmer,unsigned int nomer,database *base){//Удаление элемента из базы данных

nomer--;

printf_s("\n\t\t\t\tПОДТВЕРДИТЕ ОПЕРАЦИЮ\n");

printf_s("====================================================================================================");

printf_s("|| Номер || Код || Наименование || Место || Срок г-ти||Количество||");

printf_s("====================================================================================================");

printf_s("|| %8d || %8s || %32s || %8s || %6d || %8d ||",base[nomer].num,base[nomer].code,base[nomer].name,base[nomer].mesto,base[nomer].srok,base[nomer].kol);

printf_s("====================================================================================================");

printf_s("\n\t\t\tУдалить данный элемент? (Y/N)");

char ch;

do{

ch=getch();

}while(ch!='Y' && ch!='y' && ch!='N' && ch!='n' && ch!='Т' && ch!='т' && ch!='Н' && ch!='н');

if(ch=='y' || ch== 'Y' || ch=='Н' || ch=='н'){

log("Удаление элемента из базы данных.");

razmer--;

database *newbase=(database*)calloc(sizeof(database),razmer);

for(int i=0;i<nomer;i++){

newbase[i].num=i+1;

strcpy(newbase[i].code,base[i].code);

strcpy(newbase[i].name,base[i].name);

strcpy(newbase[i].mesto,base[i].mesto);

newbase[i].srok=base[i].srok;

newbase[i].kol=base[i].kol;

}

for(int i=nomer;i<razmer;i++){

newbase[i].num=i+1;

strcpy(newbase[i].code,base[i+1].code);

strcpy(newbase[i].name,base[i+1].name);

strcpy(newbase[i].mesto,base[i+1].mesto);

newbase[i].srok=base[i+1].srok;

newbase[i].kol=base[i+1].kol;

}

printf_s("\n\t\t\t\tУдаление завершено.\n");

return(newbase);

}

else

printf_s("\n\t\t\t\tУдаление отменено.\n");

return(base);

};

//

//Функция сортировки и вспомогательные функции

//

int poImeni(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=strcmp(a->name,b->name);

return(P);

};

 

int poImeniA(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=strcmp(a->name,b->name);

return(-P);

};

 

int poKodu(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=strcmp(a->code,b->code);

return(P);

};

 

int poKoduA(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=strcmp(a->code,b->code);

return(-P);

};

 

int poMestu(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=strcmp(a->mesto,b->mesto);

return(P);

};

 

int poMestuA(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=strcmp(a->mesto,b->mesto);

return(-P);

};

 

int poNomeru(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=0;

if(a->num<b->num) P=-1; else if(a->num>b->num) P=1;

return(P);

};

 

int poNomeruA(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=0;

if(a->num<b->num) P=-1; else if(a->num>b->num) P=1;

return(-P);

};

 

int poKolvu(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=0;

if(a->kol<b->kol) P=-1; else if(a->kol>b->kol) P=1;

return(P);

};

 

int poKolvuA(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=0;

if(a->kol<b->kol) P=-1; else if(a->kol>b->kol) P=1;

return(-P);

};

 

int poSroku(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=0;

if(a->srok<b->srok) P=-1; else if(a->kol>b->kol) P=1;

return(P);

};

 

int poSrokuA(const void *par1,const void *par2){

database *a,*b;

a=(database *)par1;

b=(database *)par2;

int P;

P=0;

if(a->srok<b->srok) P=-1; else if(a->kol>b->kol) P=1;

return(-P);

};

 

 

void Sortir(unsigned int razmer,database *base){//Функция сортировки

unsigned int op1,op2;

printf_s("\nОпции сортировки (шаг 1):\n\t1->по порядковому номеру\n\t2->по коду\n\t3->по наименованию\n\t4->по месту на складе\n\t5->по сроку годности\n\t6->по количеству\n\nВаш выбор->");scanf_s("%d",&op1);

switch(op1){

case 1:

printf_s("\nОпции сортировки (шаг 2):\n\t1->по возрастанию\n\t2->по убыванию\nВаш выбор->");

scanf_s("%d",&op2);

if(op2==1)qsort(base,razmer,sizeof(database),poNomeru);

else if(op2==2)qsort(base,razmer,sizeof(database),poNomeruA);

else printf_s("\nНеверно введены параметры");

break;

case 2:

printf_s("\nОпции сортировки (шаг 2):\n\t1->в алфавитном порядке\n\t2->в обратном алфавитному порядке\nВаш выбор->");

scanf_s("%d",&op2);

if(op2==1)qsort(base,razmer,sizeof(database),poKodu);

else if(op2==2)qsort(base,razmer,sizeof(database),poKoduA);

else printf_s("\nНеверно введены параметры");

break;

case 3:

printf_s("\nОпции сортировки (шаг 2):\n\t1->в алфавитном порядке\n\t2->в обратном алфавитному порядке\nВаш выбор->");

scanf_s("%d",&op2);

if(op2==1)qsort(base,razmer,sizeof(database),poImeni);

else if(op2==2)qsort(base,razmer,sizeof(database),poImeniA);

else printf_s("\nНеверно введены параметры");

break;

case 4:

printf_s("\nОпции сортировки (шаг 2):\n\t1->в алфавитном порядке\n\t2->в обратном алфавитному порядке\nВаш выбор->");

scanf_s("%d",&op2);

if(op2==1)qsort(base,razmer,sizeof(database),poMestu);

else if(op2==2)qsort(base,razmer,sizeof(database),poMestuA);

else printf_s("\nНеверно введены параметры");

break;

case 5:

printf_s("\nОпции сортировки (шаг 2):\n\t1->по возрастанию\n\t2->по убыванию\nВаш выбор->");

scanf_s("%d",&op2);

if(op2==1)qsort(base,razmer,sizeof(database),poSroku);

else if(op2==2)qsort(base,razmer,sizeof(database),poSrokuA);

else printf_s("\nНеверно введены параметры");

break;

case 6:

printf_s("\nОпции сортировки (шаг 2):\n\t1->по возрастанию\n\t2->по убыванию\nВаш выбор->");

scanf_s("%d",&op2);

if(op2==1)qsort(base,razmer,sizeof(database),poKolvu);

else if(op2==2)qsort(base,razmer,sizeof(database),poKolvuA);

else printf_s("\nНеверно введены параметры");

break;

}

};

 


Дата добавления: 2015-09-29; просмотров: 21 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
Деепричастие как особая форма глагола | Приложение 2 к страховому полису

mybiblioteka.su - 2015-2024 год. (0.078 сек.)