Đề thi môn Lập trình C trên Windows

doc 16 trang ngocly 1610
Bạn đang xem tài liệu "Đề thi môn Lập trình C trên Windows", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • docde_thi_mon_lap_trinh_c_tren_windows.doc

Nội dung text: Đề thi môn Lập trình C trên Windows

  1. ĐỀ THI MÔN LẬP TRÌNH C TRÊN WINDOWS Đề thi mẫu số 1 Thời gian: 60 phút. Được phép sử dụng tài liệu. Câu 1. Anh (chị) hãy trình bày (phân tích) tổng quát các đặc điểm chính của các ứng dụng trên MS Windows. Câu 2. Anh (chị) hãy trình bày mô hình thể hiện quy trình nạp và zoom ảnh bitmap? Giải thích mô hình (các hàm) thông qua cơ chế thao tác và thể hiện các đối tượng đồ họa trên MS Windows. Câu 3. Anh (chị) hãy giải thích đoạn code dưới đây, bằng cách cho biết mục đích của chương trình là gì, thể hiện qua các hàm, biến được cài đặt như thế nào; quy trình khi chương trình thực thi trong thực tế ra sao? LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDM_GETTEXT: if(DialogBox(hInst, (LPCTSTR)IDD_GETTEXT, hWnd, (DLGPROC)GetText)==IDOK) InvalidateRect(hWnd, NULL, TRUE);
  2. break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szContent, strlen(szContent), &rt, uAlignment); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } LRESULT CALLBACK GetText(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  3. { switch (message) { case WM_INITDIALOG: uAlignment = 0; // uAlignment là một biến toàn cục kiểu UINT CheckDlgButton(hDlg, IDC_SINGLELINE, BST_CHECKED); CheckRadioButton(hDlg, IDC_TOP, IDC_BOTTOM, IDC_VCENTER); CheckRadioButton(hDlg, IDC_LEFT, IDC_RIGHT, IDC_CENTER); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_SINGLELINE: if(IsDlgButtonChecked(hDlg, IDC_SINGLELINE)==BST_CHECKED) { CheckDlgButton(hDlg, IDC_SINGLELINE, BST_UNCHECKED); EnableWindow(GetDlgItem(hDlg, IDC_TOP), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_VCENTER), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_BOTTOM), FALSE); } else { CheckDlgButton(hDlg, IDC_SINGLELINE, BST_CHECKED); EnableWindow(GetDlgItem(hDlg, IDC_TOP), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_VCENTER), TRUE);
  4. EnableWindow(GetDlgItem(hDlg, IDC_BOTTOM), TRUE); } break; case IDC_TOP: case IDC_VCENTER: case IDC_BOTTOM: CheckRadioButton(hDlg, IDC_TOP, IDC_BOTTOM, LOWORD(wParam)); break; case IDC_LEFT: case IDC_CENTER: case IDC_RIGHT: CheckRadioButton(hDlg, IDC_LEFT, IDC_RIGHT, LOWORD(wParam)); break; case IDOK: if(IsWindowEnabled(GetDlgItem(hDlg, IDC_TOP))) { uAlignment |= DT_SINGLELINE; if(IsDlgButtonChecked(hDlg, IDC_TOP)) uAlignment |= DT_TOP; else if(IsDlgButtonChecked(hDlg, IDC_VCENTER)) uAlignment |= DT_VCENTER; else if(IsDlgButtonChecked(hDlg, IDC_BOTTOM)) uAlignment |= DT_BOTTOM; } if(IsDlgButtonChecked(hDlg, IDC_LEFT))
  5. uAlignment |= DT_LEFT; else if(IsDlgButtonChecked(hDlg, IDC_CENTER)) uAlignment |= DT_CENTER; else if(IsDlgButtonChecked(hDlg, IDC_RIGHT)) uAlignment |= DT_RIGHT; GetDlgItemText(hDlg, IDC_CONTENT, szContent, MAX_LOADSTRING); // szContent là biến toàn cục kiểu TCHAR[] case IDCANCEL: EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; }
  6. ĐỀ THI MÔN LẬP TRÌNH C TRÊN WINDOWS Đề thi mẫu số 2 Thời gian: 60 phút. Được phép sử dụng tài liệu. Câu 1. Anh (chị) hãy trình bày (phân tích) tổng quát các đặc điểm chính của các ứng dụng trên MS Windows. Câu 2. Trình bày hiểu biết của anh (chị) về cơ chế GDI của các ứng ụng trên MS Windows - Giải thích quy trình xuất (các) đối tượng đồ họa ra thiết bị xuất (ví dụ xuất ra màn hình). Quy trình này được thể hiện và xử lý như thế nào khi cài đặt chương trình? Câu 3. Anh (chị) hãy giải thích đoạn code dưới đây, bằng cách cho biết mục đích của chương trình là gì, thể hiện qua các hàm, biến được cài đặt như thế nào; quy trình khi chương trình thực thi trong thực tế ra sao? LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDC, hSrcMemDC, hDestMemDC; HBITMAP hBmp, hOldBmp, hBlankBmp, hOldBlankBmp; static RECT rBmp, rClient; static POINT ptCenter, ptVirDist; switch (message) { case WM_CREATE: GetClientRect(hWnd, &rClient); ptCenter.x = (rClient.right + rClient.left)/2; ptCenter.y = (rClient.bottom + rClient.top)/2; ptVirDist.x = BMP_WIDTH/2; // Ghi chú: BMP_WIDTH và BMP_HEIGHT là ptVirDist.y = BMP_HEIGHT/2; // kích thước một ảnh trong tập tin tài nguyên
  7. break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); hSrcMemDC = CreateCompatibleDC(hDC); hDestMemDC = CreateCompatibleDC(hDC); hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXAM)); // Ảnh trong tập tin tài nguyên hBlankBmp = CreateCompatibleBitmap(hDC, rClient.right, rClient.bottom); hOldBmp = (HBITMAP)SelectObject(hSrcMemDC, hBmp); hOldBlankBmp = (HBITMAP)SelectObject(hDestMemDC, hBlankBmp); rBmp.left = ptCenter.x-ptVirDist.x; rBmp.top = ptCenter.y-ptVirDist.y; rBmp.right = ptCenter.x+ptVirDist.x; rBmp.bottom = ptCenter.y+ptVirDist.y; StretchBlt(hDestMemDC, rBmp.left, rBmp.top, rBmp.right-rBmp.left, rBmp.bottom- rBmp.top, hSrcMemDC, 0, 0, BMP_WIDTH, BMP_HEIGHT, SRCCOPY); BitBlt(hDC, rBmp.left, rBmp.top, rBmp.right-rBmp.left, rBmp.bottom-rBmp.top, hDestMemDC, rBmp.left, rBmp.top, SRCCOPY); SelectObject(hSrcMemDC, hOldBmp); SelectObject(hDestMemDC, hOldBlankBmp); DeleteObject(hBmp); DeleteObject(hBlankBmp); DeleteDC(hSrcMemDC); DeleteDC(hDestMemDC); EndPaint(hWnd, &ps);
  8. break; case WM_SIZE: GetClientRect(hWnd, &rClient); ptCenter.x = (rClient.right + rClient.left)/2; ptCenter.y = (rClient.bottom + rClient.top)/2; break; case WM_LBUTTONDOWN: if( (rBmp.left-BMP_WIDTH/2)>0 && (rBmp.top-BMP_HEIGHT/2)>0 ) { ptVirDist.x += BMP_WIDTH/2; ptVirDist.y += BMP_HEIGHT/2; InvalidateRect(hWnd, &rClient, TRUE); } break; case WM_RBUTTONDOWN: if( (rBmp.left+BMP_WIDTH/2)<ptCenter.x && (rBmp.top+BMP_HEIGHT/2)<ptCenter.y ) { ptVirDist.x -= BMP_WIDTH/2; ptVirDist.y -= BMP_HEIGHT/2; InvalidateRect(hWnd, &rClient, TRUE); } break; case WM_DESTROY: PostQuitMessage(0);
  9. break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
  10. ĐỀ THI MÔN LẬP TRÌNH C TRÊN WINDOWS Đề thi mẫu số 3 Thời gian: 90 phút. Không sử dụng tài liệu. Câu 1. Trình bày hiểu biết của anh (chị) về cơ chế thông điệp của các ứng dụng trên hệ điều hành MS Windows? Với cơ chế này thì lập trình trên MS Windows khác trên MS-DOS như thế nào? Vẽ mô hình xử lý thông điệp và giải thích minh họa qua thông điệp về ký tự (WM_CHAR) khi viết code cho ứng dụng dạng Win32 Application? Câu 2. Viết chương trình thực hiện thao tác vẽ một hình tròn ra chính giữa màn hình ứng dụng Win32 Application, với bán kính được nhập từ một hộp thoại. Ghi chú: Hộp thoại có ID là IDD_GETRADIUS, dạng modal, được gọi hiển thị khi người dùng chọn menu item IDM_GETRADIUS của cửa sổ chính. Giá trị bán kính nhận được là một số nguyên từ edit có ID là IDC_RADIUS, kiểu Number. Hai nút nhấn còn lại trên hộp thoại có ID tương ứng là IDOK và IDCANCEL. Màu tô cho hình tròn (kể cả đường biên) là màu đỏ, tức giá trị RGB(255, 0, 0). Prototype một số hàm tham khảo: int DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDlgFunc); BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase); HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint); BOOL GetClientRect(HWND hWnd, LPRECT lpRect); HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor); HBRUSH CreateSolidBrush(COLORREF crColor); HGDIOBJ SelectObject(HDC hDC, HGDIOBJ hGDIObj);
  11. BOOL DeleteObject(HGDIOBJ hGDIObj); BOOL Ellipse(HDC hDC, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); UINT GetDlgItemInt(HWND hDlg, int iIDDlgItem, BOOL *lpTranslated, BOOL bSigned); BOOL EndDialog(HWND hDlg, int nResult); Chỉ cần viết các hàm xử lý của cửa sổ chính và hộp thoại mà thôi, và không yêu cầu phải thật chính xác như thực hành trên máy tính.
  12. ĐỀ THI MÔN LẬP TRÌNH C TRÊN WINDOWS Đề thi mẫu số 4 Thời gian: 90 phút. Không sử dụng tài liệu. Câu 1. Trình bày hiểu biết của anh (chị) về cơ chế thông điệp của các ứng dụng trên hệ điều hành MS Windows? Với cơ chế này thì lập trình trên MS Windows khác trên MS-DOS như thế nào? Vẽ mô hình xử lý thông điệp và giải thích minh họa qua thông điệp WM_COMMAND khi người dùng thao tác lên hộp thoại có handle là hDlg (hộp thoại này là hộp thoại con của cửa sổ chính)? Câu 2. Viết chương trình thực hiện thao tác thông báo vị trí con trỏ chuột (trên hệ toạ độ vùng làm việc client area) ra chính giữa cửa sổ này với màu sắc theo các trạng thái nhấn của thiết bị chuột. Ghi chú: Nếu người dùng đang nhấn chuột trái thì chữ thể hiện thông báo có màu đỏ, nếu nhấn chuột phải thì chữ màu xanh lá cây, và nếu không nhấn thì có màu xanh da trời. Các màu tương ứng là RGB(255, 0, 0), RGB(0, 255, 0), và RGB(0, 0, 255). Prototype một số hàm tham khảo: int wsprintf(LPTSTR lpOut, LPCTSTR lpFormat ); BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase); HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint); BOOL GetClientRect(HWND hWnd, LPRECT lpRect); COLORREF SetTextColor(HDC hDC, COLORREF crSetColor); int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat); Chỉ cần viết hàm xử lý của cửa sổ chính (mặc định là WndProc),
  13. và không yêu cầu phải thật chính xác như thực hành trên máy tính.
  14. ĐỀ THI MÔN LẬP TRÌNH C TRÊN WINDOWS Đề thi mẫu số 5 Thời gian: 100 phút. Không sử dụng tài liệu. Câu 1. Trình bày hiểu biết của anh (chị) về cơ chế thông điệp của các ứng dụng trên hệ điều hành MS Windows? Với cơ chế này thì từ kinh nghiệm, anh chị hãy cho biết lập trình trên MS Windows khác trên MS-DOS như thế nào? Hãy cho biết và giải thích Windows “báo” cho người lập trình như thế nào (cụ thể với thông điệp?) khi người dùng click lên nút OK (có ID là IDOK) của hộp thoại có handle là hDlg (có thể trình bày qua mô hình truyền và xử lý thông điệp)? Câu 2. Viết hàm xử lý chương trình dạng Win32 API thực hiện thao tác vẽ hình vuông trên client area của ứng dụng, và di chuyển hình trên màn hình khi có tác động từ bàn phím. Ghi chú: Hình vuông có biên dạng nét vẽ đặc (PS_SOLID), màu đỏ RGB(255, 0, 0), độ dày bằng 2, và cũng tô đặc (solid) với màu vàng RGB(255, 255, 0). Hình vuông có chiều rộng và chiều cao đều bằng 100 (pixels). Hình ban đầu có góc trên trái là (0, 0) và di chuyển sang trái, phải, lên, xuống từng pixel khi người dùng nhấn các phím mũi tên tương ứng (giá trị wParam của thông điệp WM_KEYDOWN có giá trị là VK_LEFT, VK_RIGHT, VK_UP và VK_DOWN); với lưu ý là hình không thể di chuyển vượt ra khỏi biên của vùng làm việc. Mỗi khi kích thước client area thay đổi, góc trên trái hình vuông trở về vị trí (0, 0) của client area. Prototype một số hàm tham khảo: BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase); HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint); HPEN CreatePen(int nStyle, int nWidth, COLORREF crColor); HBRUSH CreateSolidBrush(COLORREF crSetColor); HGDIOBJ SelectObject(HDC hDC, HGDIOBJ hObj);
  15. BOOL DeleteObject(HGDIOBJ hObj); BOOL Rectangle(HDC hDC, int nLeft, int nTop, int nRight, int nBottom); * Lưu ý trình bày chính xác trong phạm vi câu hỏi; không lan man. Câu 2 chỉ viết hàm xử lý LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) của cửa sổ chính.