|
Приложение к курсовой работе
“База данных продуктового склада”
Дмитриев Максим
ИФБ-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 к страховому полису |