Skip to main content

Ngày 26: Python Hằng Ngày 365 ngày - Lên ý tưởng và Cài đặt cơ bản - ToDo List App

· 6 min read

Mục tiêu: Xác định rõ cấu trúc dữ liệu sẽ sử dụng để lưu trữ công việc và xây dựng luồng chính của chương trình với menu lựa chọn và các hàm chức năng rỗng (stub functions).


Phần 1: Quyết định cấu trúc dữ liệu

Để lưu trữ danh sách công việc, chúng ta sẽ sử dụng một List trong Python. Mỗi phần tử trong List này không phải là một chuỗi đơn giản, mà là một Dictionary. Cách này giúp lưu trữ nhiều thông tin hơn cho mỗi công việc (nội dung, trạng thái hoàn thành) và dễ dàng mở rộng sau này (ví dụ: thêm ngày hết hạn).

Cấu trúc của một công việc (Dictionary):

{
'task': 'Nội dung mô tả công việc',
'completed': False # Mặc định là chưa hoàn thành
}
Khởi tạo danh sách: Chúng ta bắt đầu với một list rỗng.

# Danh sách để lưu trữ các công việc
tasks = []

Phần 2: Các hàm chức năng (Stub Functions)

Chúng ta sẽ định nghĩa trước các hàm cho từng chức năng chính. Hiện tại, các hàm này chỉ chứa lệnh pass (không làm gì cả) hoặc một lệnh print tạm thời để biết hàm nào đã được gọi. Điều quan trọng là các hàm này cần nhận tasks_list làm tham số để chúng có thể truy cập và thay đổi danh sách công việc chung.

def display_menu():
"""Hàm này chỉ để hiển thị menu cho gọn."""
print("\n----- MENU TO-DO LIST -----")
print("1. Thêm công việc mới")
print("2. Xem danh sách công việc")
print("3. Đánh dấu công việc đã hoàn thành")
print("4. Xóa công việc")
print("5. Thoát chương trình")
print("---------------------------")

def addTask(tasks_list):
"""
Hàm để thêm công việc mới vào danh sách.
(Sẽ được lập trình chi tiết ở Ngày 2)
"""
print("\n>> Chức năng Thêm công việc <<")
# Tạm thời chưa làm gì cả
pass

def viewTasks(tasks_list):
"""
Hàm để hiển thị tất cả công việc trong danh sách.
(Sẽ được lập trình chi tiết ở Ngày 2)
"""
print("\n>> Chức năng Xem danh sách công việc <<")
# Tạm thời chưa làm gì cả
pass

def markComplete(tasks_list):
"""
Hàm để đánh dấu một công việc là đã hoàn thành.
(Sẽ được lập trình chi tiết ở Ngày 3)
"""
print("\n>> Chức năng Đánh dấu hoàn thành <<")
# Tạm thời chưa làm gì cả
pass

def deleteTask(tasks_list):
"""
Hàm để xóa một công việc khỏi danh sách.
(Sẽ được lập trình chi tiết ở Ngày 3)
"""
print("\n>> Chức năng Xóa công việc <<")
# Tạm thời chưa làm gì cả
pass

Phần 3: Vòng lặp chính của chương trình

Đây là trái tim của ứng dụng, nơi chương trình liên tục chạy, hiển thị menu và chờ đợi hành động từ người dùng.

Sử dụng vòng lặp while True: để lặp vô hạn cho đến khi có lệnh break. Gọi display_menu() để hiển thị các lựa chọn. Dùng input() để nhận lựa chọn. Sử dụng if/elif/else để xử lý lựa chọn: Gọi hàm tương ứng nếu nhập 1, 2, 3, hoặc 4. Dùng break để thoát vòng lặp nếu nhập 5. In thông báo lỗi nếu nhập khác.

def main():
"""Hàm chính điều khiển luồng chạy của chương trình."""
while True:
display_menu() # Gọi hàm hiển thị menu
choice = input("Nhập lựa chọn của bạn (1-5): ")

if choice == '1':
addTask(tasks) # Gọi hàm thêm, truyền list 'tasks' vào
elif choice == '2':
viewTasks(tasks) # Gọi hàm xem
elif choice == '3':
markComplete(tasks) # Gọi hàm đánh dấu hoàn thành
elif choice == '4':
deleteTask(tasks) # Gọi hàm xóa
elif choice == '5':
print("\nCảm ơn bạn đã sử dụng chương trình. Tạm biệt!")
break # Thoát khỏi vòng lặp while True
else:
# Xử lý trường hợp người dùng nhập không phải số từ 1 đến 5
print("\nLựa chọn không hợp lệ. Vui lòng nhập một số từ 1 đến 5.")

Phần 4: Chạy chương trình

Để đảm bảo hàm main() chỉ được thực thi khi file Python này được chạy trực tiếp (chứ không phải khi được import như một module vào file khác), chúng ta sử dụng cấu trúc if name == "main":.

Dòng này đảm bảo hàm main() chỉ chạy khi file này được thực thi trực tiếp

if name == "main": main() Toàn bộ mã nguồn cho Ngày 1 (Ví dụ: todo_app.py)

# --- Phần 1: Quyết định cấu trúc dữ liệu ---
# Sử dụng một list để chứa các công việc.
# Mỗi công việc là một dictionary.
tasks = []

# --- Phần 2: Các hàm chức năng (Stub Functions) ---

def display_menu():
"""Hàm này chỉ để hiển thị menu cho gọn."""
print("\n----- MENU TO-DO LIST -----")
print("1. Thêm công việc mới")
print("2. Xem danh sách công việc")
print("3. Đánh dấu công việc đã hoàn thành")
print("4. Xóa công việc")
print("5. Thoát chương trình")
print("---------------------------")

def addTask(tasks_list):
"""
Hàm để thêm công việc mới vào danh sách.
(Sẽ được lập trình chi tiết ở Ngày 2)
"""
print("\n>> Chức năng Thêm công việc <<")
# Tạm thời chưa làm gì cả
pass

def viewTasks(tasks_list):
"""
Hàm để hiển thị tất cả công việc trong danh sách.
(Sẽ được lập trình chi tiết ở Ngày 2)
"""
print("\n>> Chức năng Xem danh sách công việc <<")
# Tạm thời chưa làm gì cả
pass

def markComplete(tasks_list):
"""
Hàm để đánh dấu một công việc là đã hoàn thành.
(Sẽ được lập trình chi tiết ở Ngày 3)
"""
print("\n>> Chức năng Đánh dấu hoàn thành <<")
# Tạm thời chưa làm gì cả
pass

def deleteTask(tasks_list):
"""
Hàm để xóa một công việc khỏi danh sách.
(Sẽ được lập trình chi tiết ở Ngày 3)
"""
print("\n>> Chức năng Xóa công việc <<")
# Tạm thời chưa làm gì cả
pass

# --- Phần 3: Vòng lặp chính của chương trình ---
def main():
"""Hàm chính điều khiển luồng chạy của chương trình."""
while True:
display_menu() # Gọi hàm hiển thị menu
choice = input("Nhập lựa chọn của bạn (1-5): ")

if choice == '1':
addTask(tasks) # Gọi hàm thêm, truyền list 'tasks' vào
elif choice == '2':
viewTasks(tasks) # Gọi hàm xem
elif choice == '3':
markComplete(tasks) # Gọi hàm đánh dấu hoàn thành
elif choice == '4':
deleteTask(tasks) # Gọi hàm xóa
elif choice == '5':
print("\nCảm ơn bạn đã sử dụng chương trình. Tạm biệt!")
break # Thoát khỏi vòng lặp while True
else:
# Xử lý trường hợp người dùng nhập không phải số từ 1 đến 5
print("\nLựa chọn không hợp lệ. Vui lòng nhập một số từ 1 đến 5.")

# --- Phần 4: Chạy chương trình ---
# Dòng này đảm bảo hàm main() chỉ chạy khi file này được thực thi trực tiếp
if __name__ == "__main__":
main()