Mô tả bài toán
Mô phỏng hệ thống bầu cử đơn giản: 3 ứng cử viên, người dùng có thể bỏ phiếu, xem thống kê, thoát. Sử dụng hàm, biến toàn cục, switch-case và menu lặp.
Thiết kế chương trình
- 3 ứng cử viên: ABC, XYZ, PQR
- Tùy chọn "Không ai" (None of These)
- Biến toàn cục lưu số phiếu từng ứng viên
- Hàm
boPhieu(),thongKe() - Menu chính trong
main()vớido-while
Chương trình C
#include <stdio.h>
#define SO_UNG_CU_VIEN 3
#define UC1 "ABC"
#define UC2 "XYZ"
#define UC3 "PQR"
int phieu1 = 0, phieu2 = 0, phieu3 = 0;
// Hàm bỏ phiếu
void boPhieu() {
int luaChon;
printf("\n### VUI LONG CHON UNG CU VIEN ###\n\n");
printf("1. %s\n", UC1);
printf("2. %s\n", UC2);
printf("3. %s\n", UC3);
printf("4. Khong ai\n");
printf("Lua chon cua ban (1-4): ");
scanf("%d", &luaChon);
switch (luaChon) {
case 1: phieu1++; break;
case 2: phieu2++; break;
case 3: phieu3++; break;
default:
printf("\nLua chon khong hop le! Vui long thu lai.\n");
while (getchar() != '\n'); // Xử lý buffer
return;
}
printf("\nCam on ban da bo phieu!\n");
}
// Hàm hiển thị thống kê
void thongKe() {
printf("\n### THONG KE KET QUA BAU CU ###\n");
printf("%s - %d phieu\n", UC1, phieu1);
printf("%s - %d phieu\n", UC2, phieu2);
printf("%s - %d phieu\n", UC3, phieu3);
printf("Tong so phieu: %d\n", phieu1 + phieu2 + phieu3);
}
int main() {
int luaChon;
do {
printf("\n=== HE THONG BAU CU 2024 ===\n");
printf("1. Bo phieu\n");
printf("2. Xem thong ke\n");
printf("0. Thoat\n");
printf("Lua chon: ");
scanf("%d", &luaChon);
switch (luaChon) {
case 1: boPhieu(); break;
case 2: thongKe(); break;
case 0: printf("Tam biet!\n"); break;
default: printf("Lua chon khong hop le!\n");
}
} while (luaChon != 0);
return 0;
}
Kết quả chạy chương trình
=== HE THONG BAU CU 2024 ===
1. Bo phieu
2. Xem thong ke
0. Thoat
Lua chon: 1
### VUI LONG CHON UNG CU VIEN ###
1. ABC
2. XYZ
3. PQR
4. Khong ai
Lua chon cua ban (1-4): 1
Cam on ban da bo phieu!
=== HE THONG BAU CU 2024 ===
Lua chon: 1
... (bỏ phiếu lần 2 cho ABC)
=== HE THONG BAU CU 2024 ===
Lua chon: 2
### THONG KE KET QUA BAU CU ###
ABC - 2 phieu
XYZ - 0 phieu
PQR - 0 phieu
Tong so phieu: 2
Phân tích cấu trúc
| Thành phần | Vai trò |
|---|---|
| Biến toàn cục (phieu1,2,3) | Lưu trạng thái phiếu, truy cập được từ mọi hàm |
| #define hằng số | Dễ thay đổi tên ứng viên, số lượng |
| Hàm boPhieu() | Tách logic bỏ phiếu, tái sử dụng được |
| Hàm thongKe() | Tách logic hiển thị, dễ mở rộng (sắp xếp, %) |
| do-while trong main | Menu lặp lại cho đến khi chọn 0 |
| switch-case | Xử lý lựa chọn rõ ràng, hiệu quả |
Mở rộng nâng cao
- Kiểm tra trùng lặp: mỗi người chỉ bỏ 1 lần (yêu cầu ID/token)
- Tính phần trăm phiếu:
(float)phieu1/tong*100 - Xác định người thắng: so sánh 3 biến phiếu
- Lưu kết quả ra file
- Giao diện đồ họa (ncurses) hoặc web (CGI)
Chương trình minh họa tư duy modular (module hóa): tách chức năng thành hàm, dùng biến toàn cục chia sẻ trạng thái, switch-case điều khiển luồng.