Разработка самообучающегося словаря

Автор работы: Пользователь скрыл имя, 22 Июня 2014 в 18:15, курсовая работа

Краткое описание

Особую роль в интерпретаторе на Prolog играют конкретные запросы к базам знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система на Prolog выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода.
Теоретической основой Prolog является раздел символьной логики, называемый исчислением предикатов. Исчисление предикатов и логический вывод являются базой Prolog. В отличие от процедурных языков Prolog можно рассматривать как язык описаний. Используемый в Prolog подход состоит в описании известных фактов и отношений, касающихся данной задачи. Решение на Prolog следует из составленного описания.

Содержание

ВВЕДЕНИЕ 5
1 АНАЛИЗ СОСТОЯНИЯ ВОПРОСА 7
1.1 Общие сведения о реестре 7
1.2 Описание разделов реестра 7
2 ПОСТАНОВКА ЗАДАЧИ 10
3 ПРОЕКТИРОВАНИЕ ПО 11
3.1 Интерфейс программы 11
3.1 Структура программы 11
4 РЕАЛИЗАЦИЯ ПО 13
4.1 Описание интерфейса программы 13
4.2 Использование переменных и функций 14
5 ТЕСТИРОВАНИЕ ПО 19
5.1 Функциональное тестирование 19
5.2 Полное тестирование 23
ВЫВОДЫ 25
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 26
ПРИЛОЖЕНИЕ A 27

Прикрепленные файлы: 1 файл

ПЗ.doc

— 355.50 Кб (Скачать документ)

if(strcmp(gszName, "") != 0)

{

HKEY hkTemp;

if(RegOpenKeyEx(ghKey, gszName, 0, KEY_READ, &hkTemp) != ERROR_SUCCESS)

{

HKEY hkNew;

RegCreateKey(ghKey, gszName, &hkNew);

RegCloseKey(hkNew);

TV_INSERTSTRUCT tvIS;

tvIS.item.mask = TVIF_TEXT;

tvIS.item.hItem = NULL;

tvIS.item.pszText = gszName;

tvIS.item.cchTextMax = MAX_KEY_LENGTH;

tvIS.hParent = tiSelected;

tvIS.hInsertAfter = TVI_LAST;

TreeView_InsertItem(hTV, &tvIS);

node *nodeTemp = nodeList;

while(nodeTemp->next != NULL) nodeTemp = nodeTemp->next;

node *nodeCurrent = new node;

nodeCurrent->hti = tiSelected;

nodeCurrent->next = NULL;

nodeTemp->next = nodeCurrent;

 

TV_ITEM tvi;

tvi.mask = TVIF_CHILDREN;

tvi.hItem = tiSelected;

tvi.cChildren = 1;

TreeView_SetItem(hTV, &tvi);

}

else

{

MessageBox(hwnd, "Раздел с таким именем уже существует", szTitleName, MB_ICONERROR);

RegCloseKey(hkTemp);

}

}

RegCloseKey(ghKey);

}

else MessageBox(hwnd, "Нет прав на создание раздела", szTitleName, MB_ICONERROR);

 

break;

}

case ID_KEY_RENAME:

{

HTREEITEM tiSelected, tiParent;

tiSelected = TreeView_GetSelection(hTV);

tiParent = TreeView_GetParent(hTV, tiSelected);

if(tiSelected == tiRoot || tiParent == tiRoot)

{

MessageBox(hwnd, "Нельзя переименовать  корневой раздел", szTitleName, MB_ICONERROR);

break;

}

 

char szName[MAX_KEY_LENGTH];

TV_ITEM tvi;

tvi.mask = TVIF_TEXT;

tvi.pszText = szName;

tvi.cchTextMax = MAX_KEY_LENGTH;

tvi.hItem = tiSelected;

TreeView_GetItem(hTV, &tvi);

strcpy_s(gszName, szName);

isRename = true;

DialogBox(hInst, MAKEINTRESOURCE(IDD_RENAME), hwnd, DialogProcedureRename);

if(strcmp(gszName, szName) != 0)

{

if(OpenKey(tiParent, KEY_ALL_ACCESS))

{

HKEY hkTemp;

if(RegOpenKeyEx(ghKey, gszName, 0, KEY_READ, &hkTemp) != ERROR_SUCCESS)

{

HKEY hkNew;

RegCreateKey(ghKey, gszName, &hkNew);

RegCopyTree(ghKey, szName, hkNew);

RegDeleteTree(ghKey, szName);

RegCloseKey(ghKey);

RegCloseKey(hkNew);

 

tvi.pszText = gszName;

TreeView_SetItem(hTV, &tvi);

}

else

{

MessageBox(hwnd, "Раздел с таким именем уже существует", szTitleName, MB_ICONERROR);

RegCloseKey(hkTemp);

}

}

else MessageBox(hwnd, "Нет прав на изменение раздела", szTitleName, MB_ICONERROR);

}

break;

}

case ID_KEY_DELETE:

{

HTREEITEM tiSelected, tiParent;

tiSelected = TreeView_GetSelection(hTV);

tiParent = TreeView_GetParent(hTV, tiSelected);

if(tiSelected == tiRoot || tiParent == tiRoot)

{

MessageBox(hwnd, "Нельзя удалить корневой  раздел", szTitleName, MB_ICONERROR);

break;

}

if(MessageBox(hwnd, "Вы действительн  хотите удалить выбранный раздел  и всё что внутри?", szTitleName, MB_YESNO|MB_ICONWARNING) == IDYES)

{

if(OpenKey(tiParent, KEY_READ))

{

char szSelected[MAX_KEY_LENGTH];

TV_ITEM tvi;

tvi.mask = TVIF_TEXT;

tvi.pszText = szSelected;

tvi.cchTextMax = MAX_KEY_LENGTH;

tvi.hItem = tiSelected;

TreeView_GetItem(hTV, &tvi);

 

RegDeleteTree(ghKey, szSelected);

RegCloseKey(ghKey);

TreeView_DeleteItem(hTV, tiSelected);

}

}

break;

}

case ID_VALUE_MODIFY:

{

int iSel = ListView_GetSelectionMark(hLV);

if(iSel != -1)

{

char szName[MAX_KEY_LENGTH];

ListView_GetItemText(hLV, iSel, 0, szName, MAX_KEY_LENGTH);

 

HTREEITEM tiSelected;

tiSelected = TreeView_GetSelection(hTV);

if(OpenKey(tiSelected, KEY_ALL_ACCESS))

{

DWORD dwType, dwDataSize;

RegQueryValueEx(ghKey, szName, NULL, &dwType, NULL, NULL);

if(dwType == REG_SZ)

{

dwDataSize = 1024;

char szData[1024];

RegQueryValueEx(ghKey, szName, NULL, NULL, (LPBYTE)szData, &dwDataSize);

strcpy_s(gszName, "");

if(dwDataSize != 0) strcpy_s(gszName, szData);

isRename = 2;

DialogBox(hInst, MAKEINTRESOURCE(IDD_RENAME), hwnd, DialogProcedureRename);

if(strcmp(gszName, szData) != 0)

{

RegSetValueEx(ghKey, szName, NULL, dwType, (LPBYTE)gszName, strlen(gszName)*sizeof(char));

}

}

else if(dwType == REG_DWORD)

{

dwDataSize = sizeof(DWORD);

DWORD dwData;

RegQueryValueEx(ghKey, szName, NULL, NULL, (LPBYTE)&dwData, &dwDataSize);

char szData[16];

_itoa_s(dwData, szData, 10);

strcpy_s(gszName, szData);

isRename = 2;

DialogBox(hInst, MAKEINTRESOURCE(IDD_RENAME), hwnd, DialogProcedureRename);

if(strcmp(gszName, szData) != 0)

{

dwData = atoi(gszName);

RegSetValueEx(ghKey, szName, NULL, dwType, (LPBYTE)&dwData, sizeof(DWORD));

}

}

else MessageBox(hwnd, "Неизвестный формат, редактирование невозможно", szTitleName, MB_ICONERROR);

RegCloseKey(ghKey);

 

OpenKey(tiSelected, KEY_READ);

ShowValues();

RegCloseKey(ghKey);

}

else MessageBox(hwnd, "Нет прав на изменение записи", szTitleName, MB_ICONERROR);

}

else MessageBox(hwnd, "Запись не выбрана", szTitleName, MB_ICONINFORMATION);

break;

}

case ID_VALUE_NEW_STRING:

{

CreateValue(hwnd, REG_SZ);

break;

}

case ID_VALUE_NEW_DWORD:

{

CreateValue(hwnd, REG_DWORD);

break;

}

case ID_VALUE_RENAME:

{

int iSel = ListView_GetSelectionMark(hLV);

if(iSel != -1)

{

HTREEITEM tiSelected;

tiSelected = TreeView_GetSelection(hTV);

if(OpenKey(tiSelected, KEY_ALL_ACCESS))

{

DWORD dwDataSize, dwDataType;

byte *temp;

char szName[MAX_KEY_LENGTH];

ListView_GetItemText(hLV, iSel, 0, szName, MAX_KEY_LENGTH);

RegQueryValueEx(ghKey, szName, NULL, &dwDataType, NULL, &dwDataSize);

temp = new byte[dwDataSize];

RegQueryValueEx(ghKey, szName, NULL, NULL, (LPBYTE)temp, &dwDataSize);

 

strcpy_s(gszName, szName);

isRename = true;

DialogBox(hInst, MAKEINTRESOURCE(IDD_RENAME), hwnd, DialogProcedureRename);

if(strcmp(gszName, szName) != 0)

{

if(RegQueryValueEx(ghKey, gszName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)

{

MessageBox(hwnd, "Запись с таким именем уже существует", szTitleName, MB_ICONERROR);

break;

}

RegDeleteValue(ghKey, szName);

RegSetValueEx(ghKey, gszName, NULL, dwDataType, (LPBYTE)temp, dwDataSize);

 

OpenKey(tiSelected, KEY_READ);

ShowValues();

}

RegCloseKey(ghKey);

}

else MessageBox(hwnd, "Нет прав на изменение записи", szTitleName, MB_ICONERROR);

}

else MessageBox(hwnd, "Запись не выбрана", szTitleName, MB_ICONINFORMATION);

break;

}

case ID_VALUE_DELETE:

{

int iSel = ListView_GetSelectionMark(hLV);

if(iSel != -1)

{

if(MessageBox(hwnd, "Вы действительно  хотите удалить запись?", szTitleName, MB_YESNO|MB_ICONWARNING) == IDYES)

{

HTREEITEM tiSelected;

tiSelected = TreeView_GetSelection(hTV);

OpenKey(tiSelected, KEY_ALL_ACCESS);

char szName[MAX_KEY_LENGTH];

ListView_GetItemText(hLV, iSel, 0, szName, MAX_KEY_LENGTH);

if(RegDeleteValue(ghKey, szName) != ERROR_SUCCESS) MessageBox(hwnd, "Запись нельзя удалить", szTitleName, MB_ICONERROR);

RegCloseKey(ghKey);

 

ListView_DeleteItem(hLV, iSel);

}

}

else MessageBox(hwnd, "Запись не выбрана", szTitleName, MB_ICONWARNING);

break;

}

case ID_FIND_FIND:

{

HTREEITEM tiSelected;

tiSelected = TreeView_GetSelection(hTV);

if(tiSelected != tiRoot)

{

isFindNext = 0;

DialogBox(hInst, MAKEINTRESOURCE(IDD_FIND), hwnd, DialogProcedureFind);

}

else

{

MessageBox(hwnd, "Выберите раздел", szTitleName, MB_ICONWARNING);

}

break;

}

case ID_FIND_FINDNEXT:

{

if(nodePath != NULL)

{

isFindNext++;

DialogBox(hInst, MAKEINTRESOURCE(IDD_FIND), hwnd, DialogProcedureFind);

}

else

{

SendMessage(hwnd, WM_COMMAND, ID_FIND_FIND, 0);

}

break;

}

case ID_HELP_ABOUT:

{

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hwnd, DialogProcedureAbout);

break;

}

case ID_ACCEL_RENAME:

{

HWND hFocus = GetFocus();

if(hFocus == hTV) SendMessage(hwnd, WM_COMMAND, ID_KEY_RENAME, 0);

else if(hFocus == hLV) SendMessage(hwnd, WM_COMMAND, ID_VALUE_RENAME, 0);

else if(hFocus == hwnd) MessageBox(hwnd, "Необходимо выбрать объект", szTitleName, MB_ICONWARNING);

break;

}

case ID_ACCEL_DELETE:

{

HWND hFocus = GetFocus();

if(hFocus == hTV) SendMessage(hwnd, WM_COMMAND, ID_KEY_DELETE, 0);

else if(hFocus == hLV) SendMessage(hwnd, WM_COMMAND, ID_VALUE_DELETE, 0);

else if(hFocus == hwnd) MessageBox(hwnd, "Необходимо  выбрать объект", szTitleName, MB_ICONWARNING);

break;

}

}

break;

case WM_NOTIFY:

switch(((LPNMHDR)lParam)->code)

{

case TVN_ITEMEXPANDING:

{

LPNMTREEVIEW ptvi = (LPNMTREEVIEW)lParam;

if(ptvi->itemNew.hItem == tiRoot) break;

if(!OpenKey(ptvi->itemNew.hItem, KEY_READ))

{

MessageBox(hwnd, "Не удалось открыть  раздел", szTitleName, MB_ICONWARNING);

break;

}

ShowSubKeys(ptvi->itemNew.hItem);

RegCloseKey(ghKey);

break;

}

case TVN_SELCHANGING:

{

LPNMTREEVIEW ptvi = (LPNMTREEVIEW)lParam;

if(ptvi->itemNew.hItem == tiRoot)

{

ListView_DeleteAllItems(hLV);

break;

}

if(!OpenKey(ptvi->itemNew.hItem, KEY_READ))

{

MessageBox(hwnd, "Не удалось открыть  раздел", szTitleName, MB_ICONWARNING);

break;

}

ShowValues();

RegCloseKey(ghKey);

break;

}

case NM_RCLICK:

{

POINT p;

GetCursorPos(&p);

int iSel = -1;

 

if(((LPNMHDR)lParam)->hwndFrom == hTV)

{

static HMENU hPopupMenu = GetSubMenu(GetMenu(hwnd), 1);

iSel = TrackPopupMenu(hPopupMenu, TPM_LEFTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hTV, NULL);

SendMessage(hwnd, WM_COMMAND, iSel, 0);

}

if(((LPNMHDR)lParam)->hwndFrom == hLV)

{

static HMENU hPopupMenu = GetSubMenu(GetMenu(hwnd), 2);

iSel = TrackPopupMenu(hPopupMenu, TPM_LEFTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hLV, NULL);

SendMessage(hwnd, WM_COMMAND, iSel, 0);

}

break;

}

}

break;

case WM_SIZE:

{

MoveWindow(hTV, -1, -1, 301, HIWORD(lParam)+2, true);

MoveWindow(hLV, 300, 0, LOWORD(lParam)-300, HIWORD(lParam), true);

break;

}

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, msg, wParam, lParam);

}

return 0;

}

BOOL CALLBACK DialogProcedureRename(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)

{

static HWND editName;

    switch(msg)

    {

case WM_INITDIALOG:

{

editName = GetDlgItem(hDlg, IDC_NAME);

if(isRename)

{

SetWindowText(editName, gszName);

if(isRename == 2)

{

SetWindowText(hDlg, "Редактирование данных");

SetWindowText(GetDlgItem(hDlg, IDC_LABEL), "Значение:");

}

}

else SetWindowText(hDlg, "Создание раздела");

SetFocus(editName);

break;

}

case WM_COMMAND:

{

switch(LOWORD(wParam))

            {

case IDOK:

{

char szName[MAX_KEY_LENGTH];

GetWindowText(editName, szName, MAX_KEY_LENGTH);

if(strlen(szName))

{

if(strcmp(gszName, szName) != 0) strcpy_s(gszName, szName);

EndDialog(hDlg, 0);

return false;

}

else MessageBox(hDlg, "Заполните поле", szTitleName, MB_ICONINFORMATION);

break;

}

case IDCANCEL:

{

                    EndDialog(hDlg, 0);

                    return false;

}

            }

break;

}

break;

    }

    return false;

}

BOOL CALLBACK DialogProcedureFind(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)

{

static HWND editFind, radioKey, radioValue;

static bool isKey;

static HTREEITEM tiSelected;

static char szFind[MAX_KEY_LENGTH];

    switch(msg)

    {

case WM_INITDIALOG:

{

editFind = GetDlgItem(hDlg, IDC_FIND);

radioKey = GetDlgItem(hDlg, IDC_KEY);

radioValue = GetDlgItem(hDlg, IDC_VALUE);

SendMessage(radioKey, BM_SETCHECK, 1, 0);

SetFocus(editFind);

if(isFindNext) SendMessage(hDlg, WM_COMMAND, IDOK, 0);

break;

}

case WM_COMMAND:

{

switch(LOWORD(wParam))

            {

case IDOK:

{

if(!isFindNext)

{

isKey = false;

if(SendMessage(radioKey, BM_GETSTATE, 0, 0)) isKey = true;

GetWindowText(editFind, szFind, MAX_KEY_LENGTH);

}

if(strlen(szFind))

{

nodeStr *nodeDeleteStr, *nodeTempStr = nodePath;

while(nodeTempStr != NULL)

{

nodeDeleteStr = nodeTempStr;

nodeTempStr = nodeTempStr->next;

delete(nodeDeleteStr);

}

nodePath = NULL;

EnableWindow(radioKey, false);

EnableWindow(radioValue, false);

EnableWindow(editFind, false);

EnableWindow(GetDlgItem(hDlg, IDOK), false);

if(!isFindNext) tiSelected = TreeView_GetSelection(hTV);

if(OpenKey(tiSelected, KEY_READ))

{

char szName[MAX_KEY_LENGTH] = "";

cFinded = 0;

if(FindRegistry(ghKey, szName, szFind, isKey))

{

nodeStr *nodeTemp = nodePath;

HTREEITEM tiTemp = tiSelected;

while(nodeTemp != NULL)

{

OpenKey(tiTemp, KEY_READ);

ShowSubKeys(tiTemp);

 

HTREEITEM tiChild;

char szTemp[MAX_KEY_LENGTH];

TV_ITEM tvi;

tvi.mask = TVIF_TEXT;

tvi.pszText = szTemp;

tvi.cchTextMax = MAX_KEY_LENGTH;

tiChild = TreeView_GetNextItem(hTV, tiTemp, TVGN_CHILD);

while(tiChild)

{

tvi.hItem = tiChild;

TreeView_GetItem(hTV, &tvi);

if(strcmp(szTemp, nodeTemp->szName) == 0)

{

tiTemp = tiChild;

break;

}

tiChild = TreeView_GetNextItem(hTV, tiChild, TVGN_NEXT);

}

nodeTemp = nodeTemp->next;

}

TreeView_Select(hTV, tiTemp, TVGN_CARET);

 

EndDialog(hDlg, 1);

SetFocus(hTV);

return true;

}

else

{

EnableWindow(radioKey, true);

EnableWindow(radioValue, true);

EnableWindow(editFind, true);

EnableWindow(GetDlgItem(hDlg, IDOK), true);

MessageBox(hDlg, "Ничего не найдено", szTitleName, MB_ICONINFORMATION);

if(isFindNext)

{

EndDialog(hDlg, 0);

return true;

}

}

}

else

{

MessageBox(hDlg, "Нет доступа", szTitleName, MB_ICONERROR);

EndDialog(hDlg, 0);

return true;

}

}

else MessageBox(hDlg, "Заполните поле", szTitleName, MB_ICONINFORMATION);

break;

}

case IDCANCEL:

{

                    EndDialog(hDlg, 0);

                    return true;

}

            }

break;

}

break;

    }

    return false;

}

////////

BOOL CALLBACK DialogProcedureAbout(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)

{

    switch(msg)

    {

case WM_COMMAND:

{

switch(LOWORD(wParam))

            {

case IDOK:

{

EndDialog(hDlg, 0);

return false;

}

case IDCANCEL:

{

EndDialog(hDlg, 0);

return false;

}

            }

break;

}

break;

    }

    return false;

}

 


Информация о работе Разработка самообучающегося словаря