Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Mã quản lý sinh viên đơn giản trên Windows.

  1. #1
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    857

    Mặc định Mã quản lý sinh viên đơn giản trên Windows.

    Visual C++ Code:
    1. #include<Windows.h>
    2. #include<CommCtrl.h>
    3. #include"resource.h"
    4. #pragma comment(lib,"comctl32.lib")
    5.  
    6. typedef struct
    7. {
    8.     TCHAR   szFullName[MAX_PATH];       //
    9.     TCHAR   szIDClass[MAX_PATH];        //
    10.     TCHAR   szIDStudent[MAX_PATH];      //
    11.     int     nDay;                       //
    12.     int     nMonth;                     //
    13.     int     nYear;                      //
    14. } STUDENT, *PSTUDENT;
    15. typedef struct
    16. {
    17.     WNDPROC     pOldProc;       // Thủ tục cũ của Edit
    18.     int         iItem;          // ItemListView đang xử lý
    19.     int         iSubItem;       // SubItemListView đang xử lý
    20. } SUBCLASS, *PSUBCLASS;
    21.  
    22. void Swap(PSTUDENT pStudent1, PSTUDENT pStudent2)
    23. {
    24.     STUDENT     Student;
    25.     CopyMemory(&Student, pStudent1, sizeof(STUDENT));
    26.     CopyMemory(pStudent1, pStudent2, sizeof(STUDENT));
    27.     CopyMemory(pStudent2, &Student, sizeof(STUDENT));
    28. }
    29. void Sort(PSTUDENT pStudent, int cCount, int nColumn)
    30. {
    31.     int         i, j;
    32.  
    33.     switch (nColumn)
    34.     {
    35.     case 1:     // Sắp xếp theo FullName
    36.         for (i = 0; i < cCount - 1; i++)
    37.             for (j = i + 1; j < cCount; j++)
    38.                 if (lstrcmp(pStudent[i].szFullName, pStudent[j].szFullName) > 0)
    39.                     Swap(&pStudent[i], &pStudent[j]);
    40.         break;
    41.     case 2:     // Sắp xếp theo IDClass
    42.         for (i = 0; i < cCount - 1; i++)
    43.             for (j = i + 1; j < cCount; j++)
    44.                 if (lstrcmp(pStudent[i].szIDClass, pStudent[j].szIDClass) > 0)
    45.                     Swap(&pStudent[i], &pStudent[j]);
    46.         break;
    47.     case 3:     // Sắp xếp theo IDStudent
    48.         for (i = 0; i < cCount - 1; i++)
    49.             for (j = i + 1; j < cCount; j++)
    50.                 if (lstrcmp(pStudent[i].szIDStudent, pStudent[j].szIDStudent) > 0)
    51.                     Swap(&pStudent[i], &pStudent[j]);
    52.         break;
    53.     case 4:     // Sắp xếp theo Day
    54.         for (i = 0; i < cCount - 1; i++)
    55.             for (j = i + 1; j < cCount; j++)
    56.                 if(pStudent[i].nDay > pStudent[j].nDay)
    57.                     Swap(&pStudent[i], &pStudent[j]);
    58.         break;
    59.     case 5:     // Sắp xếp theo Month
    60.         for (i = 0; i < cCount - 1; i++)
    61.             for (j = i + 1; j < cCount; j++)
    62.                 if (pStudent[i].nMonth > pStudent[j].nMonth)
    63.                     Swap(&pStudent[i], &pStudent[j]);
    64.         break;
    65.     case 6:     // Sắp xếp theo Year
    66.         for (i = 0; i < cCount - 1; i++)
    67.             for (j = i + 1; j < cCount; j++)
    68.                 if (pStudent[i].nYear > pStudent[j].nYear)
    69.                     Swap(&pStudent[i], &pStudent[j]);
    70.         break;
    71.     }
    72. }
    73. BOOL AddNewItem(HWND hList)
    74. {
    75.     int     cCount = ListView_GetItemCount(hList);
    76.     LVITEM  lvi;
    77.     TCHAR   szSTT[8];
    78.     wsprintf(szSTT, TEXT("%03d"), cCount + 1);
    79.     lvi.pszText = szSTT;
    80.     lvi.mask = LVIF_TEXT;
    81.     lvi.iSubItem = 0;
    82.     lvi.iItem = cCount;
    83.     if (ListView_InsertItem(hList, &lvi) == -1)
    84.         return FALSE;
    85.     return TRUE;
    86. }
    87. HWND InitListView(HWND hDlg)
    88. {
    89.     INITCOMMONCONTROLSEX    icx;
    90.     icx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    91.     icx.dwICC = ICC_LISTVIEW_CLASSES;
    92.     if (!InitCommonControlsEx(&icx))
    93.         return NULL;
    94.  
    95.     HWND    hList = GetDlgItem(hDlg, IDC_LIST1);
    96.  
    97.     LVCOLUMN    lvc;
    98.     lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    99.  
    100.     PTCHAR  pszText[7] = { TEXT("STT"), TEXT("Họ và tên"), TEXT("Mã lớp"), TEXT("Mã sinh viên"), TEXT("Ngày"), TEXT("Tháng"), TEXT("Năm") };
    101.     int     cx[7] = { 30, 140, 80, 80, 50, 50, 50 };
    102.  
    103.     for (int i = 0; i < 7; i++)
    104.     {
    105.         lvc.iSubItem = i;
    106.         lvc.cx = cx[i];
    107.         lvc.pszText = pszText[i];
    108.         if (ListView_InsertColumn(hList, i, &lvc) == -1)
    109.             return NULL;
    110.     }
    111.     ListView_SetExtendedListViewStyle(hList, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
    112.     ListView_SetBkColor(hList, RGB(0, 255, 255));
    113.     ListView_SetTextBkColor(hList, RGB(0, 255, 255));
    114.     AddNewItem(hList);
    115.     return hList;
    116. }
    117. BOOL ListViewClick(HWND hDlg, HWND hEdit, LPNMITEMACTIVATE p)
    118. {
    119.     RECT    r;
    120.     TCHAR   szText[MAX_PATH];
    121.     HWND    hList = p->hdr.hwndFrom;
    122.     if (p->iItem < 0 || p->iSubItem < 0)
    123.         return TRUE;
    124.     PSUBCLASS   pSubClass = (PSUBCLASS)GetWindowLongPtr(hEdit, GWLP_USERDATA);
    125.     pSubClass->iItem = p->iItem;
    126.     pSubClass->iSubItem = p->iSubItem;
    127.     if (pSubClass->iSubItem == 0)
    128.         pSubClass->iSubItem = 1;
    129.     if (pSubClass->iSubItem > 3)
    130.         SetWindowLongPtr(hEdit, GWL_STYLE, GetWindowLongPtr(hEdit, GWL_STYLE) | ES_NUMBER);
    131.     else
    132.         SetWindowLongPtr(hEdit, GWL_STYLE, GetWindowLongPtr(hEdit, GWL_STYLE) &~ ES_NUMBER);
    133.     ListView_EnsureVisible(hList, pSubClass->iItem, FALSE);
    134.     ListView_GetSubItemRect(hList, pSubClass->iItem, pSubClass->iSubItem, LVIR_BOUNDS, &r);
    135.     ClientToScreen(hList, (LPPOINT)&r);
    136.     ClientToScreen(hList, (LPPOINT)&r + 1);
    137.     ScreenToClient(hDlg, (LPPOINT)&r);
    138.     ScreenToClient(hDlg, (LPPOINT)&r + 1);
    139.     MoveWindow(hEdit, r.left, r.top, r.right - r.left, r.bottom - r.top, FALSE);
    140.     ListView_GetItemText(hList, pSubClass->iItem, pSubClass->iSubItem, szText, MAX_PATH - 1);
    141.     SetWindowText(hEdit, szText);
    142.     ShowWindow(hEdit, SW_SHOW);
    143.     BringWindowToTop(hEdit);
    144.     SetFocus(hEdit);
    145.     return TRUE;
    146. }
    147. PSTUDENT ListViewToMemory(HWND hList)
    148. {
    149.     TCHAR       szText[MAX_PATH];
    150.     char        sz[MAX_PATH];
    151.     int         cCount = ListView_GetItemCount(hList);
    152.     if (cCount <= 0)
    153.         return NULL;
    154.     PSTUDENT    pStudent = (PSTUDENT)malloc(cCount * sizeof(STUDENT));
    155.     if (!pStudent)
    156.         return NULL;
    157.     for (int i = 0; i < cCount; i++)
    158.     {
    159.         ListView_GetItemText(hList, i, 1, pStudent[i].szFullName, MAX_PATH - 1);
    160.         ListView_GetItemText(hList, i, 2, pStudent[i].szIDClass, MAX_PATH - 1);
    161.         ListView_GetItemText(hList, i, 3, pStudent[i].szIDStudent, MAX_PATH - 1);
    162.  
    163.         ListView_GetItemText(hList, i, 4, szText, MAX_PATH - 1);
    164.         WideCharToMultiByte(CP_ACP, 0, szText, -1, sz, MAX_PATH - 1, NULL, NULL);
    165.         pStudent[i].nDay = atoi(sz);
    166.  
    167.         ListView_GetItemText(hList, i, 5, szText, MAX_PATH - 1);
    168.         WideCharToMultiByte(CP_ACP, 0, szText, -1, sz, MAX_PATH - 1, NULL, NULL);
    169.         pStudent[i].nMonth = atoi(sz);
    170.  
    171.         ListView_GetItemText(hList, i, 6, szText, MAX_PATH - 1);
    172.         WideCharToMultiByte(CP_ACP, 0, szText, -1, sz, MAX_PATH - 1, NULL, NULL);
    173.         pStudent[i].nYear = atoi(sz);
    174.     }
    175.     return pStudent;
    176. }
    177. void MemoryToListView(HWND hList, PSTUDENT pStudent, int cCount)
    178. {
    179.     TCHAR       szText[MAX_PATH];
    180.     for (int i = 0; i < cCount; i++)
    181.     {
    182.         ListView_SetItemText(hList, i, 1, pStudent[i].szFullName);
    183.         ListView_SetItemText(hList, i, 2, pStudent[i].szIDClass);
    184.         ListView_SetItemText(hList, i, 3, pStudent[i].szIDStudent);
    185.  
    186.         wsprintf(szText, TEXT("%d"), pStudent[i].nDay);
    187.         ListView_SetItemText(hList, i, 4, szText);
    188.         wsprintf(szText, TEXT("%d"), pStudent[i].nMonth);
    189.         ListView_SetItemText(hList, i, 5, szText);
    190.         wsprintf(szText, TEXT("%d"), pStudent[i].nYear);
    191.         ListView_SetItemText(hList, i, 6, szText);
    192.     }
    193. }
    194. BOOL ListViewColumnClick(HWND hList, LPNMLISTVIEW p)
    195. {
    196.     int     cCount = ListView_GetItemCount(hList);
    197.     if (cCount < 2)
    198.         return TRUE;
    199.     PSTUDENT    pStudent = ListViewToMemory(hList);
    200.     if (!pStudent)
    201.         return TRUE;
    202.     Sort(pStudent, cCount, p->iSubItem);
    203.     MemoryToListView(hList, pStudent, cCount);
    204.     free(pStudent);
    205.     return TRUE;
    206. }
    207. BOOL EditKillFocus(HWND hEdit, HWND hList)
    208. {
    209.     TCHAR   szText[MAX_PATH];
    210.     PSUBCLASS   pSubClass = (PSUBCLASS)GetWindowLongPtr(hEdit, GWLP_USERDATA);
    211.     ShowWindow(hEdit, SW_HIDE);
    212.     GetWindowText(hEdit, szText, MAX_PATH - 1);
    213.     ListView_SetItemText(hList, pSubClass->iItem, pSubClass->iSubItem, szText);
    214.     return TRUE;
    215. }
    216. BOOL EditArrowPress(HWND hEdit, WPARAM wparam)
    217. {
    218.     TCHAR       szText[MAX_PATH];
    219.     int         nStart, nLast;
    220.     RECT        r;
    221.     HWND        hDlg = GetParent(hEdit);
    222.     HWND        hList = GetDlgItem(hDlg, IDC_LIST1);
    223.     PSUBCLASS   pSubClass = (PSUBCLASS)GetWindowLongPtr(hEdit, GWLP_USERDATA);
    224.     SendMessage(hEdit, EM_GETSEL, (WPARAM)&nStart, (LPARAM)&nLast);
    225.     if (nStart < nLast)                                                             // Đang có text được chọn - cho xử lý mặc định
    226.         return FALSE;
    227.     if (wparam == VK_LEFT && nStart > 0)                                            // Caret không nằm ở đầu chuỗi - cho xử lý mặc định
    228.         return FALSE;
    229.     if (wparam == VK_RIGHT && nLast < GetWindowTextLength(hEdit))                   // Caret không nằm ở cuối chuỗi - cho xử lý mặc định
    230.         return FALSE;
    231.     if (wparam == VK_UP && pSubClass->iItem == 0)                                   // Item đang nằm ở hàng đầu nên không di chuyển lên
    232.         return FALSE;
    233.     if (wparam == VK_DOWN && pSubClass->iItem == ListView_GetItemCount(hList) - 1)  // Item đang nằm ở hàng cuối nên cộng thêm 1 Item chờ
    234.         AddNewItem(hList);
    235.     GetWindowText(hEdit, szText, MAX_PATH - 1);
    236.     ListView_SetItemText(hList, pSubClass->iItem, pSubClass->iSubItem, szText);
    237.  
    238.     switch (wparam)
    239.     {
    240.     case VK_LEFT:
    241.         if (--pSubClass->iSubItem == 0)
    242.             pSubClass->iSubItem = 6;
    243.         break;
    244.     case VK_RIGHT:
    245.         if (++pSubClass->iSubItem == 7)
    246.             pSubClass->iSubItem = 1;
    247.         break;
    248.     case VK_UP:
    249.         pSubClass->iItem--;
    250.         break;
    251.     case VK_DOWN:
    252.         pSubClass->iItem++;
    253.         break;
    254.     }
    255.     if (pSubClass->iSubItem > 3)
    256.         SetWindowLongPtr(hEdit, GWL_STYLE, GetWindowLongPtr(hEdit, GWL_STYLE) | ES_NUMBER);
    257.     else
    258.         SetWindowLongPtr(hEdit, GWL_STYLE, GetWindowLongPtr(hEdit, GWL_STYLE) &~ES_NUMBER);
    259.     ListView_EnsureVisible(hList, pSubClass->iItem, FALSE);
    260.     ListView_GetSubItemRect(hList, pSubClass->iItem, pSubClass->iSubItem, LVIR_BOUNDS, &r);
    261.     ClientToScreen(hList, (LPPOINT)&r);
    262.     ClientToScreen(hList, (LPPOINT)&r + 1);
    263.     ScreenToClient(hDlg, (LPPOINT)&r);
    264.     ScreenToClient(hDlg, (LPPOINT)&r + 1);
    265.     ListView_GetItemText(hList, pSubClass->iItem, pSubClass->iSubItem, szText, MAX_PATH - 1);
    266.     SetWindowText(hEdit, szText);
    267.     SetFocus(hList);
    268.     MoveWindow(hEdit, r.left, r.top, r.right - r.left, r.bottom - r.top, FALSE);
    269.     ShowWindow(hEdit, SW_SHOW);
    270.     BringWindowToTop(hEdit);
    271.     SetFocus(hEdit);
    272.     return TRUE;
    273. }
    274. BOOL ButtonOpenClick(HWND hDlg, HWND hList)
    275. {
    276.     TCHAR           szFile[MAX_PATH];
    277.     OPENFILENAME    ofn;
    278.  
    279.     szFile[0] = 0;
    280.     ZeroMemory(&ofn, sizeof(OPENFILENAME));
    281.     ofn.hwndOwner = hDlg;
    282.     ofn.lpstrFile = szFile;
    283.     ofn.nMaxFile = sizeof(szFile);
    284.     ofn.lStructSize = sizeof(OPENFILENAME);
    285.     ofn.lpstrFilter = TEXT("Files Student (*.std)\0*.std\0");
    286.     ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
    287.     if (!GetOpenFileName(&ofn))
    288.         return TRUE;
    289.     HANDLE      hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    290.     if (hFile == INVALID_HANDLE_VALUE)
    291.         return TRUE;
    292.     DWORD   dwSize = GetFileSize(hFile, NULL);
    293.     if (dwSize < sizeof(int))
    294.     {
    295.         CloseHandle(hFile);
    296.         return TRUE;
    297.     }
    298.     int     cCount;
    299.     DWORD   dw;
    300.     ReadFile(hFile, &cCount, sizeof(int), &dw, NULL);
    301.     if (cCount <= 0 || dwSize < sizeof(int) + cCount * sizeof(STUDENT))
    302.     {
    303.         CloseHandle(hFile);
    304.         return TRUE;
    305.     }
    306.     STUDENT     Student;
    307.     TCHAR       szText[MAX_PATH];
    308.     ListView_DeleteAllItems(hList);
    309.     for (int i = 0; i < cCount; i++)
    310.     {
    311.         ReadFile(hFile, &Student, sizeof(STUDENT), &dw, NULL);
    312.         AddNewItem(hList);
    313.  
    314.         ListView_SetItemText(hList, i, 1, Student.szFullName);
    315.         ListView_SetItemText(hList, i, 2, Student.szIDClass);
    316.         ListView_SetItemText(hList, i, 3, Student.szIDStudent);
    317.  
    318.         wsprintf(szText, TEXT("%d"), Student.nDay);
    319.         ListView_SetItemText(hList, i, 4, szText);
    320.         wsprintf(szText, TEXT("%d"), Student.nMonth);
    321.         ListView_SetItemText(hList, i, 5, szText);
    322.         wsprintf(szText, TEXT("%d"), Student.nYear);
    323.         ListView_SetItemText(hList, i, 6, szText);
    324.     }
    325.     CloseHandle(hFile);
    326.     return TRUE;
    327. }
    328. BOOL ButtonSaveClick(HWND hDlg, HWND hList)
    329. {
    330.     TCHAR           szFile[MAX_PATH];
    331.     OPENFILENAME    ofn;
    332.  
    333.     szFile[0] = 0;
    334.     ZeroMemory(&ofn, sizeof(OPENFILENAME));
    335.     ofn.lStructSize = sizeof(OPENFILENAME);
    336.     ofn.hwndOwner = hDlg;
    337.     ofn.lpstrFile = szFile;
    338.     ofn.lpstrDefExt = TEXT(".std");
    339.     ofn.lpstrFilter = TEXT("Files Student (*.std)\0*.std\0");
    340.     ofn.nMaxFile = sizeof(szFile) / sizeof(*szFile);
    341.     ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
    342.     if (!GetSaveFileName(&ofn))
    343.         return TRUE;
    344.     HANDLE      hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    345.     if (hFile == INVALID_HANDLE_VALUE)
    346.         return TRUE;
    347.     int         cCount = ListView_GetItemCount(hList);
    348.     if (cCount <= 0)
    349.     {
    350.         CloseHandle(hFile);
    351.         return TRUE;
    352.     }
    353.     PSTUDENT    pStudent = ListViewToMemory(hList);
    354.     if (!pStudent)
    355.     {
    356.         CloseHandle(hFile);
    357.         return TRUE;
    358.     }
    359.     DWORD       dw;
    360.     WriteFile(hFile, &cCount, sizeof(int), &dw, NULL);
    361.     WriteFile(hFile, pStudent, cCount * sizeof(STUDENT), &dw, NULL);
    362.     free(pStudent);
    363.     CloseHandle(hFile);
    364.     return TRUE;
    365. }
    366. LRESULT CALLBACK NewEditProc(HWND hEdit, UINT msg, WPARAM wparam, LPARAM lparam)
    367. {
    368.     PSUBCLASS   pSubClass = (PSUBCLASS)GetWindowLongPtr(hEdit, GWLP_USERDATA);
    369.     switch (msg)
    370.     {
    371.     case WM_KEYDOWN:
    372.         if (GetFocus() == hEdit && (wparam == VK_LEFT || wparam == VK_RIGHT || wparam == VK_UP || wparam == VK_DOWN))
    373.             if (EditArrowPress(hEdit, wparam))
    374.                 return 0;
    375.         break;
    376.     }
    377.     return CallWindowProc(pSubClass->pOldProc, hEdit, msg, wparam, lparam);
    378. }
    379. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wparam, LPARAM lparam)
    380. {
    381.     static  HWND        hList;
    382.     static  HWND        hEdit;
    383.     static  SUBCLASS    SubClass;
    384.  
    385.     switch (message)
    386.     {
    387.     case WM_INITDIALOG:
    388.         if (!(hList = InitListView(hDlg)))
    389.         {
    390.             SendMessage(hDlg, WM_CLOSE, 0, 0);
    391.             return TRUE;
    392.         }
    393.         hEdit = GetDlgItem(hDlg, IDC_EDIT1);
    394.         SubClass.pOldProc = (WNDPROC)GetWindowLongPtr(hEdit, GWL_WNDPROC);
    395.         SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)NewEditProc);
    396.         SetWindowLongPtr(hEdit, GWLP_USERDATA, PtrToUlong(&SubClass));
    397.         SetClassLongPtr(hDlg, GCLP_HICON, (LONG)LoadIcon(NULL, IDI_APPLICATION));
    398.         return TRUE;
    399.     case WM_NOTIFY:
    400.         switch (((LPNMHDR)lparam)->code)
    401.         {
    402.         case NM_CLICK:          return ListViewClick(hDlg, hEdit, (LPNMITEMACTIVATE)lparam);
    403.         case LVN_COLUMNCLICK:   return ListViewColumnClick(hList, (LPNMLISTVIEW)lparam);
    404.         }
    405.         return FALSE;
    406.     case WM_COMMAND:
    407.         switch (LOWORD(wparam))
    408.         {
    409.         case IDC_EDIT1:
    410.             switch (HIWORD(wparam))
    411.             {
    412.             case EN_KILLFOCUS:  return EditKillFocus(hEdit, hList);
    413.             }
    414.             return FALSE;
    415.         case IDC_BUTTON_OPEN:   return ButtonOpenClick(hDlg, hList);
    416.         case IDC_BUTTON_SAVE:   return ButtonSaveClick(hDlg, hList);
    417.         case IDCANCEL:
    418.             EndDialog(hDlg, 0);
    419.             return TRUE;
    420.         }
    421.         return FALSE;
    422.     case WM_CLOSE:
    423.         EndDialog(hDlg, 0);
    424.         return TRUE;
    425.     }
    426.     return FALSE;
    427. }
    428. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
    429. {
    430.     DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    431.     return 0;
    432. }
    Chương trình nhập xuất trực tiếp trên nền Listview mà không cần thông qua hộp thoại khác bằng các phím mũi tên, các chức năng sắp xếp được gán vào việc Click HeaderListview tương tự như trong Explorer. Lưu xuất tập tin theo nhị phân. Có thiết lập Unicode trên dự án trống trong VS2015.
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		QLSV.jpg
Lần xem:	4
Size:		85.3 KB
ID:		61353
    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    08 2017
    Bài viết
    1,658

    Tiếc một chút, thông thường, sắp xếp tên người Việt là sắp theo vần - tên trước (độ ưu tiên cao nhất) : An, Bình, ... Xuân, ...
    Sắp xếp tên người Việt thường thấy trong bảng điểm, danh sách thí sinh, ...


    là sắp theo chuỗi, không hợp với họ tên người Việt, ở Việt Nam

  3. #3
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    857

    Đúng vậy, vì tôi đang mô tả cho 1 bạn ở đề tài khác nên chưa để ý. Chúng ta có thể sửa lại chút ít để sắp xếp theo tên chứ không phải họ.
    Visual C++ Code:
    1. PTCHAR FindNamePtr(PTCHAR pszFullName)
    2. {
    3.     PTCHAR  pName = pszFullName + lstrlen(pszFullName) - 1;
    4.  
    5.     // Loại bỏ khoảng trống dư thừa tận cùng chuỗi nếu có
    6.     while (*pName == L' ' && pName >= pszFullName)  pName--;
    7.     // Tìm khoảng trống đầu tiên nếu có
    8.     while (*pName != L' ' && pName > pszFullName)   pName--;
    9.  
    10.     return pName;
    11. }
    12. void Sort(PSTUDENT pStudent, int cCount, int nColumn)
    13. {
    14.     int         i, j;
    15.  
    16.     switch (nColumn)
    17.     {
    18.     case 1:     // Sắp xếp theo FullName
    19.         for (i = 0; i < cCount - 1; i++)
    20.             for (j = i + 1; j < cCount; j++)
    21.                 if(lstrcmp(FindNamePtr(pStudent[i].szFullName), FindNamePtr(pStudent[j].szFullName)) > 0)
    22.                 //if (lstrcmp(pStudent[i].szFullName, pStudent[j].szFullName) > 0)
    23.                     Swap(&pStudent[i], &pStudent[j]);
    24.         break;
    25.         ///.........

  4. #4
    Ngày gia nhập
    02 2016
    Bài viết
    295

    Mã đơn giản hay không chưa biết. Chạy đúng như ý hay không cũng chưa biết (có chú thích cho biết nó làm gì đâu mà xác định được nó chạy đúng hay không?)

    Nhưng code từ dòng 73 đến 214: gần 140 dòng, và từ 238 đến 430: gần 200 dòng không có một chú thích.
    Bài này mà học sinh nộp cho tôi thì tôi không chấm điểm.

  5. #5
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    857

    Cám ơn góp ý của bạn.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn