ВИУ5-61

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ВИУ5-61 » Информатика и программирование на ЯВУ » Домашнее задание База данных


Домашнее задание База данных

Сообщений 1 страница 3 из 3

1

Выкладываю последнюю версию своей базы данных, больше ничего менять не буду. Советую сразу исключить 4 пункт, т.к если Деон про него спросит - Я сам могу не все вспомнить как это делалось. Вообщем если появятся вопросы то пишите, постараюсь ответить.
DZ.cpp

Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>

#include "DataInput.h"
#include "PrintHead.h"
#include "PrintHeadSearch.h"
#include "FillBD.h"
#include "PrintData.h"
#include "GetRowsCount.h"
#include "PrintDataSearch.h"
#include "PrintHelp.h"

void main()
{
	/* Подключение русского языка */
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	
	/* Для того чтобы работала функция strlwr() для русских букв */
	setlocale(LC_CTYPE,"Russian");

	/* Идентификатор выбранного пункта меню*/
	int menuID = 0;
	
	while(menuID != 9)
	{
    printf("Меню:");
    printf("\n 1. Ввод данных");
    printf("\n 2. Удаление данных");
    printf("\n 3. Добавить запись");
    printf("\n 4. Корректировка данных");
    printf("\n 5. Заполнить БД эксперементальными данными");
    printf("\n 6. Считывание данных из файла");
    printf("\n 7. Поиск");
    printf("\n 8. Справка по БД");
    printf("\n 9. Выход\n");
    printf("-----------------------------------------------\n");
    printf("Выберите пункт: ");
    scanf("%d",&menuID);

    switch(menuID)
    {
    	case 1:
        {
        	printf("Какое кол-во элементов Вы хотите ввести: ");
        	
        	/* Сколько поставщиков вводить */
        	int countProvider;                	
        	scanf("%d",&countProvider);
        	printf("\n");

        	HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        	
        	for(int count = 0; count<countProvider; count++)
        	{
            printf("Поле №%d:\n",count + 1);
            
            printf("Наименование поставщика: ");
            DataInput(hF);
            printf("Город: ");
            DataInput(hF);
            printf("Телефон: ");
            DataInput(hF);
            printf("e-mail: ");
            DataInput(hF);

            printf("\n");
        	}
        	system("cls");
        	CloseHandle(hF);
        	printf("Данные успешно записаны!");
        	getch();
        }
        break;
    	case 2:
        {	/* Создаем файл с тем же именем, затирая существующий */
        	HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        	CloseHandle(hF);
        	system("cls");
        	printf("Данные успешно удалены!");
        	getch();
        }
        break;
    	case 3:
        {
        	char s;
        	DWORD m;
        	bool result = true;
        	HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        	SetFilePointer(hF,GetFileSize(hF,NULL),NULL,FILE_BEGIN);
        
        	/* Принимаем новую запись для БД от пользователя */
        	printf("Наименование поставщика: ");
        	DataInput(hF);
        	printf("Город: ");
        	DataInput(hF);
        	printf("Телефон: ");
        	DataInput(hF);
        	printf("e-mail: ");
        	DataInput(hF);
            
        	printf("\n");
        	
        	CloseHandle(hF);
        	
        	system("cls");
        	printf("Новая запись успешно добавлена!");
        	getch();
        }
        break;
    	case 4:
        {
        	/* Печатаем базу данных */
        	PrintData();

        	/* Функция возвращает кол-во записей в таблице */
        	int rowscount = GetRowsCount();

        	/* Переменная хранит номер поля, которое необходимо редактировать */
        	int row;
        	do
        	{
            printf("Введите номер записи, которую необходимо редактировать(ввести не более %d): ",rowscount);
            scanf("%d",&row);
        	}
        	while(row > rowscount || row <= 0);
        	
        	/* Открываем файл, находим нужную позицию и печатаем туда новые данные */
        	HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE | GENERIC_READ,0,
                NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

        	DWORD m;                    	/* Хранит кол-во прочитанных байтов */
        	char s;                        /* Хранит считываемый символ */
        	int n = 0;                    	/* Счетчик кол-ва записей */
        	int n1 = 0;                    	/* Счетчик кол-ва записей при подсчета оставшихся
                                       записей */        	
        	char *sztemp;                    /* Указатель, который будет ссылаться на временный
                                       массив */	
        	int filesize = 0;                	/* Хранит сколько нужно выделить пямяти для 
                                       временного массива */
        	
        	/* Здесь производится поиск нужной строки, записивается оставшееся содержимое файла в
        	динамический массив sztemp, производтся новая запись и в конце допичывается содержимое
        	массива sztemp */
        	while(true)
        	{	
            ReadFile(hF,&s,1,&m,NULL);
            
            /* Если встречается символ перевода строки, значит дошли до конца записи */
            if(s == '\x0a')
            {
            	n++;
            	if(n/4 == row)
            	{
                /* Узнаем сколько осталось до донца файла */
                while(true)
                {
                	ReadFile(hF,&s,1,&m,NULL);
                	if(s == '\x0a')
                	{
                    n1++;
                    if(n1/4 == rowscount - row) break;
                	}
                	/* В этой переменной хранится то кол-во символов, которое осталось до конца
                	   файла, относительно редактируемой строки */
                	filesize++;
                }

                /* После подстчета кол-ва символов возвращаем файловый указатель в начало 
                   редактируемой строки */
                SetFilePointer(hF,-filesize-1,NULL,FILE_CURRENT);
                
                /* Выполняем инициализирующие действия для подготовки временного буфера
                   для хранения оставшихся данных относительно редактируемой строки */
                sztemp = new char[++filesize]; memset(sztemp,0,filesize);

                /* Читаем из файла во временный буфер все что ниже редактируемой строки */
                ReadFile(hF,sztemp,filesize,&m,NULL);

                /* Ставим указатель в начало редактируемой строки */
                if(row == 1)
                {
                	SetFilePointer(hF,0,NULL,FILE_BEGIN);
                }
                else
                {
                	n = 0;
                	SetFilePointer(hF,0,NULL,FILE_BEGIN);
                	while(true)
                	{
                    ReadFile(hF,&s,1,&m,NULL);
                    if(s == '\x0a')
                    {
                    	n++;
                    	if(n/4 == row - 1) 
                    	{
                        SetEndOfFile(hF);
                        break;
                    	}
                    }
                	}
                }
                break;
            	}
            }
        	}
        	
        	/* Принимаем новую запись для БД от пользователя */
        	printf("Наименование поставщика: ");
        	DataInput(hF);
        	printf("Город: ");
        	DataInput(hF);
        	printf("Телефон: ");
        	DataInput(hF);
        	printf("e-mail: ");
        	DataInput(hF);
        	SetEndOfFile(hF);
            
        	printf("\n");
        	
        	/* Дописываем в конец редактируемой строки содержимое массива sztemp */
        	WriteFile(hF,sztemp,filesize,&m,NULL);
        	
        	/* Освобождаем ранее выделенную память под временный массив */
        	delete []sztemp;

        	CloseHandle(hF);

        	system("cls");
        	printf("База данный успешно отредактирована!");
        	getch();
        }
        break;
    	case 5:
        {
        	FillDB();
        	system("cls");
        	printf("База данный успешно заполенена эксперементальными данными!");
        	getch();
        }
        break;
    	case 6:
        {
        	PrintData();
        	printf("\nДля продолжения нажмите любую клавишу...");
        	getch();
        }
        break;
    	case 7:
        {
        /* Создаем временный буфер для считывания каждого поля и просим пользователя 
           ввести искомую организацию */

        	char szname[20];
        	printf("Введите название поставщика, город, номер телефона или e-mail: "); 
        	gets(szname);
        	gets(szname);
        	
        	/* Печатаем шапку таблицы поиска */
        	PrintHeadSearch();
        	
        	/* Выполняем поиск по базе данных */
        	PrintDataSearch(szname);
        	
        	printf("%s","\nДля продолжения нажмите любую клавишу...");
        	getch();	
        }
        break;
    	case 8:
        {
        	system("cls");
        	PrintHelp();
        	
        	printf("Для продолжения нажмите любую клавишу...");
        	getch();
        }
    	default:
    	break;
    }
    system("cls");
	}
}

DataInput.h

Код:
#define KEY_ESC 0x1b            	/* Код нажатой клавиши ESC */
#define KEY_ENTER 0x0d            	/* Код нажатой клавиши ENTER */
#define KEY_BACKSPACE 0x08            /* Код нажатой клавиши BACKSPACE */

void DataInput(HANDLE hF)
{
	int i = 0;                	/* Текущая позиция индекса массива buf (для записи строк) */
	char buf[50] = {'\0'};            /* Временный массив для хранения вводимой строки */
	DWORD m;                	/* Кол-во записанных и считанных байт информации */

	while(true)
	{    	
    char ch = getch();            /* Считать символ с консоли */
    putchar(ch);            	/* Показать введенный символ */
            	
    if(ch != KEY_ENTER) buf[i++] = ch;
    if(ch == KEY_BACKSPACE)
    {
    	buf[(i-=2)] = '\x00';
    	putchar(' ');
    	putchar('\x08');
    }
    if(ch == KEY_ENTER)
    {
    	buf[i++] = '\x0d';
    	buf[i++] = '\x0a';

    	WriteFile(hF,buf,i,&m,NULL);
    	
    	i = 0;
    	printf("\n");
    	break;
    }
	}
}

FillBD.h

Код:
#include <windows.h>
#include <time.h>

void FillDB(void)
{	
	/* Массивы эксперементальных данных */
	char *Name[] = {"ЭлитСтрой\r\n","Эликс Центр\r\n","РемСнаб\r\n","Металлист\r\n","Центр АПТ\r\n","ИнТехСтрой\r\n","СТРОЙМИР\r\n","Строймастер\r\n"};
	char *City[] = {"Москва\r\n","Санкт-Петербург\r\n","Тверь\r\n","Новгород\r\n","Москва\r\n","Москва\r\n","Санкт-Петербург\r\n","Тверь\r\n"};
	char *Tel[] = {"516-66-60\r\n","145-67-00\r\n","960-34-68\r\n","456-87-90\r\n","555-00-11\r\n","821-73-11\r\n","345-87-23\r\n","567-98-90\r\n"};
	char *Email[] = {"stroy@grad.ru\r\n","buld@yandex.ru\r\n","stroyka@bk.ru\r\n","steklobeton@mail.ru\r\n","atp_122@yandex.ru\r\n","intehstroy@ya.ru\r\n","stroy-mir@mail.ru\r\n","stroy@master.ru\r\n"};

	HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	DWORD m;
    for(int x = 0; x<8; x++)
    {
    	WriteFile(hF,Name[x],strlen(Name[x]),&m,NULL);
    	WriteFile(hF,City[x],strlen(City[x]),&m,NULL);
    	WriteFile(hF,Tel[x],strlen(Tel[x]),&m,NULL);
    	WriteFile(hF,Email[x],strlen(Email[x]),&m,NULL);
    }
	CloseHandle(hF);
}

GetRowsCount.h

Код:
int GetRowsCount(void)
{
	/* Хранит кол-во записей */
	int rowscount = 0;

	HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	DWORD m = 1;                	/* Кол-во счытанных байтов при чтении из файла*/
	char s;                    	/* Переменная для хранения считанной переменной */
    while(m != 0)
    {
    	while(true)
    	{
        /* Читаем по одному символу, если символов нет, то прерываем цикл */
        ReadFile(hF,&s,1,&m,NULL); if(m == 0) break;
        if(s == '\x0a')
        	rowscount++;
    	}
    }
	CloseHandle(hF);

	return rowscount/4;
}

PrintData.h

Код:
void PrintData(void)
{
	char s; 
	DWORD m = 1;                /* Кол-во счытанных байтов при чтении из файла*/
	int count = 0;                /* Счетчик считанный строк */
        	
	HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        	
	/* Напечатать шапку таблицы */
	PrintHead();
        	
	/* Считываем все символы из файла */
	while(m != 0)
	{
    char buf[50] = {'\0'};        	/* Массив для одной считанной записи */
    int i = 0;                /* Индекс буфера для считываемых символов */
    char output[100] = {'\0'};
            
    /* Считываем файл, пока не встретится символ перевода строки,
       после этого переходим к слудеющей итерации внешнего цикла.*/
    while(true)
    {
    	/* Читаем по одному символу, если символов нет, то прерываем цикл */
    	ReadFile(hF,&s,1,&m,NULL); if(m == 0) break;
    	buf[i++] = s;
        	     
    	if(s == '\x0a')
    	{
        buf[i-1] = '\0';
        strcat(output,buf);
        
        if(++count == 4)
        {
        	printf("%s",strcat(output,"\n"));
        	memset(output,0,strlen(output));
        	
        	i = 0;
        	count = 0;
        	break;
        }

        /* Подставляем нужное кол-во пробелов. */
        for(int x = 0; x<(10+(9-strlen(buf))); x++)
        	strcat(output," ");
                
        memset(buf,0,strlen(buf));
        i = 0;
    	}
        if(s == '\x0d')            	// Если встретился символ возврата, то
        	buf[i-1] = '\x00';        	// вставляем пустой символ.
    }
	}
	CloseHandle(hF);
        	
	/* Переводим каретку в начало строки и печатаем подвал таблицы. */
	printf("-----------------------------------------------------------------------------\n");
}

PrintDataSearch.h

Код:
bool PrintDataSearch(char *name)
{
	char s; 
	DWORD m = 1;                /* Кол-во счытанных байтов при чтении из файла*/
	int count = 0;                /* Счетчик считанный строк */
	bool result = false;            /* Хранит результат поиска */
        	
	HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
                	
	/* Считываем все символы из файла */
	while(m != 0)
	{
    char buf[50] = {'\0'};        	/* Массив для одной считанной записи */
    int i = 0;                /* Индекс буфера для считываемых символов */
    char output[100] = {'\0'};
            
    /* Считываем файл, пока не встретится символ перевода строки,
       после этого переходим к слудеющей итерации внешнего цикла.*/

    while(true)
    {
    	/* Читаем по одному символу, если символов нет, то прерываем цикл */
    	ReadFile(hF,&s,1,&m,NULL); if(m == 0) break;
    	buf[i++] = s;
        	     
    	if(s == '\x0a')
    	{
        buf[i-1] = '\0';
        strcat(output,buf);
        
        if(++count == 4)
        {
        	/* Создаем временные массивы для сравнения сток */
        	char *szname = new char[strlen(name) + 1]; strcpy(szname,name);
        	char *szoutput = new char[strlen(output) + 1]; strcpy(szoutput,output);

        	if(strstr(strlwr(szoutput),strlwr(szname)) != NULL)
        	{
            printf("%s",strcat(output,"\n"));
            result = true;
        	}
        	delete []szname; delete []szoutput;
        	memset(output,0,strlen(output));
        	
        	i = 0;
        	count = 0;
        	break;
        }

        /* Подставляем нужное кол-во пробелов. */
        for(int x = 0; x<(10+(9-strlen(buf))); x++)
        	strcat(output," ");
                
        memset(buf,0,strlen(buf));
        i = 0;
    	}
        if(s == '\x0d')            	// Если встретился символ возврата, то
        	buf[i-1] = '\x00';        	// вставляем пустой символ.
    }
	}
	CloseHandle(hF);
	
	/* Переводим каретку в начало строки и печатаем подвал таблицы. */
	printf("-----------------------------------------------------------------------------\n");

	return result;
}

PrintHead.h

Код:
void PrintHead(void)
{
	printf("\n                          БАЗА ДАННЫХ ПОСТАВШИКОВ                      ");
	printf("\n-----------------------------------------------------------------------------\n");
	printf("Организация        Город              Телефон            E-mail\n");
	printf("-----------------------------------------------------------------------------\n");
}

PrintHeadSearch.h

Код:
void PrintHeadSearch(void)
{
	printf("\n                          РЕЗУЛЬТАТЫ ПОИСКА                        ");
	printf("\n-----------------------------------------------------------------------------\n");
	printf("Организация        Город              Телефон            E-mail\n");
	printf("-----------------------------------------------------------------------------\n");
}

PrintHelp.h

Код:
void PrintHelp(void)
{
	printf("                               ЗДРАВСТВУЙТЕ!                    \n\n");
	printf("Вашему вниманию предлагается учебная база данных \"Поставщики строительных \nматериалов\". ");
	printf("База данных имеет удобный и понятный интерфейс, с помощью которого\nможно выполнить ");
	printf("все типовые задачи, которые присутствуют в базах данных. \nНиже приводится описание ");
	printf("имеющихся в базе данных пунктов меню.\n\n"); 
	printf("1. Ввод данных. С помощью этого пункта меню можно вводить новые данные по \nпоставщику, ");
	printf("указав его название, город, номер телефона и адрес электронной \nпочты.\n\n");
	printf("2. Удаление данных. ОСТОРОЖНО!!! Данный пункт меню полностью удаляет имеющуюся \nбазу данных\n\n");
	printf("3. Добавить запись. Позволяет дабавлять нового поставщика. (Новая запись \nдобавляется в конец имеющейся базы данных ) \n\n");
	printf("4. Корректировка данных. Данный пункт меню позволяет откорректировать любую \nзапись в имеющейся базе данных. ");
	printf("Оператору БД необходимо указать номер записи,\nкоторую нужно отредактировать, затем ввести новые данные о поставщике.\n\n");
	printf("5. Заполнить БД эксперементальными данными. Этот пункт предназначен для \nдемонстрации отображения данных. После его выполнения ");
	printf("база данных заполняется \nпримерным набором поставщиков, с помощью которого можно проверить другие \nее возможности.\n\n");
	printf("6. Считывание данных из файла. Отображает данные на экране в виде таблицы. \nДанные берутся из файла DBase.txt, который расположен ");
	printf("в том же каталоге где и \nсама программа.\n\n");
	printf("7. Поиск. Позволяет производить поиск по базе данных, причем поиск устроен \nтаким образом, что в качестве строки поиска можно использовать название");
	printf("\nгород, номер телефона или адрес электронной почты поставщика. ");
	printf("В случае если \nв одной или нескольких записей встретится искомая комбинаия символов, то в \nтаблицу \"РЕЗУЛЬТАТЫ ПОИСКА\" будут выведены соответствующие поставщики с их \nполными данными.\n\n");
	printf("8. Справка по БД. Позволяет получить полную справку по базе данных.\n\n");
	printf("9. Выход. Выход из базыданных.\n\n");
}

Чтобы все заработало, Вам надо в VS создать новый проект и включить в него все эти файлы. Жду Ваших вопросов и комментариев по проге.

Отредактировано Тема (2009-11-11 10:13:17)

+1

2

Тема, ты молодец! Особенно справка!

0

3

Спасибо за программу!

0


Вы здесь » ВИУ5-61 » Информатика и программирование на ЯВУ » Домашнее задание База данных