Автор работы: Пользователь скрыл имя, 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
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, "Вы действительн
хотите удалить выбранный
{
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)->
{
case TVN_ITEMEXPANDING:
{
LPNMTREEVIEW ptvi = (LPNMTREEVIEW)lParam;
if(ptvi->itemNew.hItem == tiRoot) break;
if(!OpenKey(ptvi->itemNew.
{
MessageBox(hwnd, "Не удалось открыть раздел", szTitleName, MB_ICONWARNING);
break;
}
ShowSubKeys(ptvi->itemNew.
RegCloseKey(ghKey);
break;
}
case TVN_SELCHANGING:
{
LPNMTREEVIEW ptvi = (LPNMTREEVIEW)lParam;
if(ptvi->itemNew.hItem == tiRoot)
{
ListView_DeleteAllItems(hLV);
break;
}
if(!OpenKey(ptvi->itemNew.
{
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;
}