Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / КУРСАЧ ос.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
349.87 Кб
Скачать

10.Приложение

10.1Листинги программ

Shulte20.cpp

#include <windows.h>

#include <string>

#include <ctime>

#include <windowsx.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const int n = 5; // Размер таблицы

int shulteTable[n][n]; // Таблица

int currentNumber = 1; // Номер, который нужно найти

int squareSize = 60; // Размер клетки

int offsetX = 60, offsetY = 60; // Смещение для первой клетки

clock_t startTime, buffTime; // Время начала, время для отображение на экране

int errors = 0;// Кол-во ошибок, допкщенных пользователем

std::wstring timePassed;// строка для отображения времени

bool f = false;

HINSTANCE g_instance = 0;

#define START_BTN_ID 101

#define INFO_BTN_ID 102

void GenerateShulteTable() {

int nums[n * n];

for (int i = 0; i < n * n; i++) nums[i] = i + 1;

srand(time(NULL));

for (int i = n * n - 1; i > 0; i--) {

int j = rand() % (i + 1);

int temp = nums[i];

nums[i] = nums[j];

nums[j] = temp;

}

int k = 0;

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

for (int j = 0; j < n; j++) {

shulteTable[i][j] = nums[k];

k++;

}

}

}

void DrawShulteTable(HDC hdc) {

HFONT hFont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, L"Arial");

SelectObject(hdc, hFont);

RECT rect;

rect.top = offsetY;

rect.bottom = offsetY + squareSize;

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

rect.left = offsetX;

rect.right = offsetX + squareSize;

for (int j = 0; j < n; j++) {

std::wstring num = std::to_wstring(shulteTable[i][j]);

DrawText(hdc, num.c_str(), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

rect.left += squareSize;

rect.right += squareSize;

}

rect.top += squareSize;

rect.bottom += squareSize;

}

DeleteObject(hFont);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

WNDCLASS wc = { 0 };

wc.lpszClassName = L"ShulteTable";

wc.hInstance = hInstance;

g_instance = hInstance;

wc.lpfnWndProc = WndProc;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

RegisterClass(&wc);

HWND hwnd = CreateWindow(wc.lpszClassName, L"Shulte Table Test", (WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED) &~(WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX), 100, 100, n * squareSize + 130, n * squareSize + 150, NULL, NULL, hInstance, NULL);

MSG msg;

GenerateShulteTable(); // Генерация таблицы Шульте

UpdateWindow(hwnd);

ShowWindow(hwnd, nCmdShow);

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {

switch (msg) {

case WM_CREATE:{

HMENU hMenu, hSubMenu;

hMenu = CreateMenu();

hSubMenu = CreatePopupMenu();

CreateWindow(L"button", L"Start", WS_CHILD | WS_VISIBLE, n * squareSize, 5, 90, 15, hWnd, (HMENU)START_BTN_ID, g_instance, 0);

CreateWindow(L"button", L"Info", WS_CHILD | WS_VISIBLE, n * squareSize, 25, 90, 15, hWnd, (HMENU)INFO_BTN_ID, g_instance, 0);

AppendMenu(hSubMenu, MF_STRING, 1, L"Об авторе");

AppendMenu(hSubMenu, MF_STRING, 2, L"О программе");

AppendMenu(hSubMenu, MF_STRING, 3, L"Выход");

AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Меню");

SetMenu(hWnd, hMenu);

}

case WM_COMMAND: {

switch (LOWORD(wParam)){

case INFO_BTN_ID:

MessageBox(hWnd, L"Вам представлены числа в таблице от 1 до 25.\nВ левом углу есть счётчик, указывающий на текущее число для нажатия, и таймер.\nВаша задача поочереди нажимать на ячейки в порядке \nвозрастания.\nПосле нажатия кнопки Start вы сможете \nвзаимодействовать с таблицей.\nТакже запуститься таймер.\nВаши ошибки съедают время)\nВ конце вы узнаете свои результаты(количесвто ошибок и время прохождения).", L"Инструкция", MB_OK | MB_ICONINFORMATION);

break;

case START_BTN_ID:

f = true;

startTime = clock(); // Запуск секундомера

break;

case 1:

MessageBox(hWnd, L"Автор: Ермолин Владислав Константинович\nГруппа: ИС2-2", L"Об авторе", MB_OK | MB_ICONINFORMATION);

break;

case 2:

MessageBox(hWnd, L"Данное приложение сделано в рамках курсовой работы\nпо диспицплине Операционные системы.\nТематика курсовой: создания приложения для проверки\nвнимательности (основана на таблице Шульте).", L"О приложении", MB_OK | MB_ICONINFORMATION);

break;

case 3:

PostQuitMessage(0);

break;

}

}

case WM_PAINT: {

PAINTSTRUCT ps;

HDC hdc = BeginPaint(hWnd, &ps);

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

// Горизонтальные линии

int y = offsetY + i * squareSize;

MoveToEx(hdc, offsetX, y, NULL);

LineTo(hdc, offsetX + n * squareSize, y);

// Вертикальные линии

int x = offsetX + i * squareSize;

MoveToEx(hdc, x, offsetY, NULL);

LineTo(hdc, x, offsetY + n * squareSize);

}

if (f == true) buffTime = clock() - startTime;

else buffTime = time_t(0);

std::wstring numberToFind = L"Найти: " + std::to_wstring(currentNumber);

timePassed = L"Прошло времени: " + std::to_wstring((buffTime) / CLOCKS_PER_SEC) + L" секунд";

TextOut(hdc, 10, 10, numberToFind.c_str(), numberToFind.length());

TextOut(hdc, 10, 30, timePassed.c_str(), timePassed.length());

DrawShulteTable(hdc);

EndPaint(hWnd, &ps);

break;

}

case WM_LBUTTONDOWN: {

int x = GET_X_LPARAM(lParam);

int y = GET_Y_LPARAM(lParam);

int j = (x - offsetX) / squareSize;

int i = (y - offsetY) / squareSize;

if (i >= 0 && i < n && j >= 0 && j < n) {

if (shulteTable[i][j] == currentNumber and f == true) {

currentNumber++;

if (currentNumber == n * n + 1) {

MessageBox(hWnd, (L"Поздравляем! Вы прошли тест!\nКоличесвто ошибок: " + std::to_wstring(errors) + L"\n" + timePassed).c_str(), L"Результаты", MB_OK | MB_ICONINFORMATION);

PostQuitMessage(0);

}

InvalidateRect(hWnd, NULL, TRUE);

}

else {

if (f == true and x > squareSize and y > squareSize)

{

MessageBox(hWnd, L"Неправильное число!", L"Ошибка", MB_OK | MB_ICONERROR);

errors++;

}

}

if (f == false) { }

}

InvalidateRect(hWnd, NULL, TRUE);

break;

}

case WM_DESTROY:{

PostQuitMessage(0);

break;

}

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

}

return 0;

}

Shulte20.rc

//Сценарий ресурсов, созданный в Microsoft Visual C++.

//

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////

//

// Создано из ресурса TEXTINCLUDE.

//

#ifndef APSTUDIO_INVOKED

#include "targetver.h"

#endif

#define APSTUDIO_HIDDEN_SYMBOLS

#include "windows.h"

#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////

#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)

LANGUAGE 25, 1

/////////////////////////////////////////////////////////////////////////////

//

// Значок

//

// Значок с наименьшим значением идентификатора помещается первым, чтобы гарантировать использование

// идентичного значка приложения для всех систем.

IDI_SHULTE20 ICON "Shulte20.ico"

IDI_SMALL ICON "small.ico"

/////////////////////////////////////////////////////////////////////////////

//

// Меню

//

IDC_SHULTE20 MENU

BEGIN

POPUP "&Файл"

BEGIN

MENUITEM "Вы&ход", IDM_EXIT

END

POPUP "&Справка"

BEGIN

MENUITEM "&О программе...", IDM_ABOUT

END

END

/////////////////////////////////////////////////////////////////////////////

//

// Ускоритель

//

IDC_SHULTE20 ACCELERATORS

BEGIN

"?", IDM_ABOUT, ASCII, ALT

"/", IDM_ABOUT, ASCII, ALT

END

/////////////////////////////////////////////////////////////////////////////

//

// Диалоговое окно

//

IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62

STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "О программе Shulte20"

FONT 8, "MS Shell Dlg"

BEGIN

ICON IDI_SHULTE20,IDC_STATIC,14,14,21,20

LTEXT "Shulte20, Версия 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX

LTEXT "(c) 2024",IDC_STATIC,42,26,114,8

DEFPUSHBUTTON "ОК",IDOK,113,41,50,14,WS_GROUP

END

/////////////////////////////////////////////////////////////////////////////

//

// DESIGNINFO

//

#ifdef APSTUDIO_INVOKED

GUIDELINES DESIGNINFO

BEGIN

IDD_ABOUTBOX, DIALOG

BEGIN

LEFTMARGIN, 7

RIGHTMARGIN, 163

TOPMARGIN, 7

BOTTOMMARGIN, 55

END

END

#endif // APSTUDIO_INVOKED

#ifdef APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////

//

// TEXTINCLUDE

//

1 TEXTINCLUDE

BEGIN

"resource.h\0"

END

2 TEXTINCLUDE

BEGIN

"#ifndef APSTUDIO_INVOKED\r\n"

"#include ""targetver.h""\r\n"

"#endif\r\n"

"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"

"#include ""windows.h""\r\n"

"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"

"\0"

END

3 TEXTINCLUDE

BEGIN

"\r\n"

"\0"

END

#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////

//

// Таблица строк

//

STRINGTABLE

BEGIN

IDC_SHULTE20 "SHULTE20"

IDS_APP_TITLE "Shulte20"

END

#endif

/////////////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////

//

// Создано из ресурса TEXTINCLUDE.

//

/////////////////////////////////////////////////////////////////////////////

#endif // not APSTUDIO_INVOKED

Соседние файлы в папке курсовая