Chào mừng các bạn đến với Rcom Dăm Yi blog - Kho tài liệu bổ ích!, Chúng tôi sẽ từng bước hoàn thiện để bạn đọc cảm thấy hài lòng, hữu ích!

Thứ Tư, 11 tháng 3, 2026

Lập Trình Game Python Với Pygame - Từ Zero Đến Hero

Lập Trình Game Với Pygame

Hành trình sáng tạo trò chơi từ những dòng mã đầu tiên

Kiến trúc cốt lõi của một trò chơi

Khác với ứng dụng văn phòng, Game chạy liên tục ở tốc độ cao. Cấu trúc gồm: Nhập liệu (Input) -> Cập nhật (Update) -> Hiển thị (Draw).

Các ví dụ thực hành chi tiết

Ví dụ 1 & 2: Cửa sổ và Vòng lặp Game

main.py
import pygame

# 1. Khởi tạo
pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True

# 2. Vòng lặp Game
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    screen.fill((0, 0, 0)) # Xóa màn hình bằng màu đen
    pygame.display.update()

pygame.quit()
Giải thích:
  • pygame.init(): Đánh thức tất cả các module của Pygame.
  • pygame.event.get(): Lấy danh sách tất cả các thao tác (chuột, phím).
  • screen.fill(): Cực kỳ quan trọng để xóa các hình ảnh cũ trước khi vẽ hình mới.

Ví dụ 4: Di chuyển vật thể (Input Handling)

movement.py
x, y = 100, 100
vel = 5 # Vận tốc

# Trong vòng lặp while:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]: x -= vel
if keys[pygame.K_RIGHT]: x += vel
if keys[pygame.K_UP]: y -= vel
if keys[pygame.K_DOWN]: y += vel

pygame.draw.rect(screen, (255, 0, 0), (x, y, 50, 50))
Giải thích: Tọa độ trong Game có gốc (0,0) ở góc trên bên trái. Muốn đi xuống phải cộng y, muốn đi lên phải trừ y.

Ví dụ 6: Xử lý va chạm (Collision Detection)

collision.py
player_rect = pygame.Rect(x, y, 50, 50)
enemy_rect = pygame.Rect(400, 300, 50, 50)

if player_rect.colliderect(enemy_rect):
    print("Va chạm rồi!")
Giải thích: colliderect là hàm có sẵn cực mạnh của Pygame giúp kiểm tra xem hai hình chữ nhật có đè lên nhau hay không. Đây là nền tảng của các game bắn súng hoặc ăn xu.

Ví dụ 10: Giới hạn khung hình (FPS)

fps_control.py
clock = pygame.time.Clock()

while running:
    clock.tick(60) # Chạy đúng 60 khung hình/giây
    # ... logic game ...
Giải thích: Nếu không có clock.tick(60), game sẽ chạy nhanh hết mức có thể (tùy máy mạnh yếu), dẫn đến nhân vật di chuyển quá nhanh không thể kiểm soát.

Ví dụ 12: Màn hình Game Over (State Management)

game_state.py
game_active = True

while running:
    if game_active:
        # Chạy logic game
        if lives <= 0: game_active = False
    else:
        # Hiển thị màn hình Game Over
        screen.fill((200, 0, 0))
        show_text("NHẤN R ĐỂ CHƠI LẠI", 300, 300)
🎮 Thử thách cho học sinh: Hãy thử kết hợp Ví dụ 4 (Di chuyển) và Ví dụ 11 (Kẻ địch) để tạo ra một trò chơi né tránh chướng ngại vật đơn giản. Đây là bài tập thực hành tốt nhất để hiểu về logic Game!
Kết hợp Pandas & Django: Quản Lý Thiết Bị Dạy Học

Kết Hợp Pandas & Django

Xây dựng hệ thống Quản lý Thiết bị dạy học từ dữ liệu Excel

1. File Excel Thiết Bị
2. Pandas Xử Lý & Import
3. SQLite Database
4. Django Web Interface

Bước 1: Khai báo cấu trúc thiết bị (Model)

Chúng ta cần một "khuôn mẫu" để lưu trữ thông tin thiết bị trong Database.

models.py
from django.db import models

class ThietBi(models.Model):
    ma_so = models.CharField(max_length=20, unique=True)
    ten_thiet_bi = models.CharField(max_length=200)
    phong_kho = models.CharField(max_length=100)
    so_luong = models.IntegerField(default=0)
    tinh_trang = models.CharField(max_length=50, default="Tốt")

    def __str__(self):
        return self.ten_thiet_bi

Bước 3: Viết Script Import bằng Pandas

Đây là phần quan trọng nhất: Đọc file Excel báo cáo cuối năm và đẩy thẳng vào SQLite của Django.

import_data.py
import pandas as pd
from main.models import ThietBi

def import_excel_to_db(file_path):
    # 1. Dùng Pandas đọc Excel
    df = pd.read_excel(file_path)
    
    # 2. Lặp qua từng dòng dữ liệu
    for index, row in df.iterrows():
        ThietBi.objects.update_or_create(
            ma_so=row['Mã TB'],
            defaults={
                'ten_thiet_bi': row['Tên'],
                'phong_kho': row['Phòng'],
                'so_luong': row['Số lượng'],
            }
        )
    print("Import hoàn tất!")
💡 Giải thích:
  • df.iterrows(): Giúp duyệt qua từng hàng trong file Excel như một danh sách.
  • update_or_create: Nếu thiết bị đã tồn tại (dựa trên Mã số) thì cập nhật thông tin mới, nếu chưa có thì tạo mới. Tránh trùng lặp dữ liệu.

Bước 8: Thống kê báo cáo nhanh

Kết hợp sức mạnh tính toán của Pandas để tạo báo cáo nhanh trên Web.

views.py
def thong_ke_thiet_bi(request):
    # Lấy dữ liệu từ SQLite chuyển thành DataFrame
    data = ThietBi.objects.all().values()
    df = pd.DataFrame(data)
    
    # Thống kê tổng số lượng theo từng phòng kho
    report = df.groupby('phong_kho')['so_luong'].sum().to_dict()
    
    return render(request, 'report.html', {'report': report})
💡 Giải thích: Thay vì viết các câu lệnh SQL phức tạp, chúng ta đưa dữ liệu về dạng DataFrame để tận dụng hàm groupby() của Pandas chỉ trong 1 dòng code.

Bước 9: Xuất báo cáo ngược lại Excel

Khi Hiệu trưởng yêu cầu báo cáo, bạn có thể xuất dữ liệu từ Web ra file Excel chuẩn chỉ bằng 1 cú click.

views.py
import io
from django.http import HttpResponse

def export_to_excel(request):
    df = pd.DataFrame(list(ThietBi.objects.all().values()))
    
    output = io.BytesIO()
    with pd.ExcelWriter(output, engine='openpyxl') as writer:
        df.to_excel(writer, index=False, sheet_name='ThietBi')
    
    response = HttpResponse(output.getvalue(), content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename=Bao_cao_thiet_bi.xlsx'
    return response

✅ Kết luận bài học

Sự kết hợp này mang lại quy trình khép kín:

  1. Dữ liệu đầu vào: Tận dụng các file Excel có sẵn từ kế toán/văn phòng.
  2. Lưu trữ: Dùng SQLite (đi kèm Django) nhẹ nhàng, không cần cài đặt server phức tạp.
  3. Hiển thị: Django giúp mọi giáo viên trong trường có thể truy cập qua mạng nội bộ để đăng ký mượn/trả thiết bị.
Lập Trình Web Với Framework Django - Python

Lập Trình Web Chuyên Nghiệp Với Django

Framework dành cho những người cầu toàn với thời hạn gấp rút

Kiến trúc MVT (Model - View - Template)

Khác với mô hình MVC thông thường, Django sử dụng kiến trúc MVT giúp tách biệt hoàn toàn giữa dữ liệu, giao diện và logic xử lý.

Chi tiết bài giảng & Ví dụ

Ví dụ 1: Lệnh khởi tạo hệ thống

Trước tiên, bạn cần cài đặt Django và khởi tạo cấu trúc thư mục.

pip install django
django-admin startproject mywebsite .
python manage.py startapp main
  • startproject: Tạo bộ khung quản lý web (cài đặt, database).
  • startapp: Tạo một "chức năng" cụ thể (như quản lý học sinh, tin tức).

Ví dụ 2: Tạo View đầu tiên (views.py)

main/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Chào mừng bạn đến với Web trường PCT!")
Giải thích: Hàm index nhận một yêu cầu (request) từ trình duyệt và trả về một phản hồi (response) bằng văn bản thuần túy.

Ví dụ 4: Sử dụng Template HTML

main/templates/index.html
<html>
<body>
    <h1>Danh sách môn học</h1>
    <ul>
    {% for mon in mon_hoc %}
        <li>{{ mon }}</li>
    {% endfor %}
    </ul>
</body>
</html>
Django sử dụng ngôn ngữ Template riêng. {% ... %} dùng cho logic (vòng lặp, điều kiện) và {{ ... }} dùng để hiển thị biến.

Ví dụ 6: Thiết kế Model (Lớp học)

main/models.py
from django.db import models

class HocSinh(models.Model):
    ho_ten = models.CharField(max_length=100)
    ngay_sinh = models.DateField()
    diem_tb = models.FloatField()

    def __str__(self):
        return self.ho_ten
Đây là cách Django định nghĩa bảng trong Database bằng mã Python. Bạn không cần viết lệnh SQL, Django sẽ tự động tạo bảng cho bạn qua lệnh makemigrations.

Ví dụ 7: Kích hoạt trang Admin siêu tốc

main/admin.py
from django.contrib import admin
from .models import HocSinh

admin.site.register(HocSinh)
Chỉ với 2 dòng code, bạn đã có một trang quản trị (Admin Dashboard) chuyên nghiệp để thêm, sửa, xóa học sinh mà không cần code giao diện.

Ví dụ 10: Logic ứng dụng To-Do List hoàn chỉnh

views.py - Final App
from django.shortcuts import render, redirect
from .models import Task

def task_list(request):
    tasks = Task.objects.all() # Lấy tất cả công việc
    if request.method == "POST":
        new_task = request.POST.get("task_name")
        Task.objects.create(name=new_task) # Lưu vào DB
        return redirect('task_list')
    return render(request, 'tasks.html', {'tasks': tasks})
Ví dụ này kết hợp việc lấy dữ liệu từ Database (ORM) và xử lý dữ liệu gửi lên từ người dùng (POST request) để tạo ra một ứng dụng tương tác thực sự.

🎯 Hướng phát triển nâng cao

Sau khi nắm vững 10 ví dụ này, học sinh có thể tự xây dựng trang Tra cứu điểm thi cho nhà trường bằng cách kết hợp Pandas (để nạp dữ liệu từ Excel) vào Django (để hiển thị lên Web).

Phân Tích Dữ Liệu Với Thư Viện Pandas - Python

Xử Lý Dữ Liệu Với Thư Viện Pandas

Biến Python thành công cụ thay thế Excel chuyên nghiệp

Giới thiệu chung

Pandas là thư viện mã nguồn mở cung cấp các cấu trúc dữ liệu hiệu suất cao (như DataFrame) giúp việc làm sạch, phân tích và xử lý dữ liệu trở nên cực kỳ đơn giản.

Ví dụ thực hành chi tiết

Ví dụ 1: Tạo DataFrame từ Dictionary

Python
import pandas as pd

data = {
    'Họ tên': ['An', 'Bình', 'Chi'],
    'Điểm': [8.5, 9.0, 7.5],
    'Lớp': ['12A1', '12A2', '12A1']
}

df = pd.DataFrame(data)
print(df)
Giải thích:
  • pd.DataFrame(data): Chuyển đổi một từ điển (Dictionary) thành bảng dữ liệu có hàng và cột.
  • Mỗi Key trở thành tiêu đề cột, Value (danh sách) trở thành dữ liệu hàng.

Ví dụ 2: Đọc dữ liệu từ file Excel

Python
# Đọc file Excel (Cần cài thêm openpyxl)
df = pd.read_excel('danh_sach_hoc_sinh.xlsx')

# Đọc file CSV
# df = pd.read_csv('du_lieu.csv')

print(df.info())
Giải thích:
  • read_excel(): Hàm quyền lực nhất để lấy dữ liệu từ các báo cáo kế toán/nhà trường.
  • df.info(): Xem tổng quan về kiểu dữ liệu và số lượng dòng không trống.

Ví dụ 5: Lọc dữ liệu theo điều kiện

Python
# Lọc những học sinh có điểm >= 8.0
hoc_sinh_gioi = df[df['Điểm'] >= 8.0]

# Lọc học sinh lớp 12A1 có điểm trên 7
loc_pht = df[(df['Lớp'] == '12A1') & (df['Điểm'] > 7)]

print(loc_pht)
Giải thích:
  • Pandas sử dụng cơ chế Boolean Indexing để lọc.
  • Ký hiệu & đại diện cho điều kiện "VÀ", | cho điều kiện "HOẶC".

Ví dụ 9: Gom nhóm dữ liệu (GroupBy)

Python
# Tính điểm trung bình theo từng lớp
diem_lop = df.groupby('Lớp')['Điểm'].mean()

# Đếm số lượng học sinh mỗi lớp
so_luong = df.groupby('Lớp')['Họ tên'].count()

print(diem_lop)
Giải thích:
  • groupby(): Tương tự Pivot Table trong Excel, giúp tổng hợp dữ liệu cực nhanh.
  • mean(), sum(), count(): Các hàm tính toán đi kèm sau khi gom nhóm.

Ví dụ 10: Xuất dữ liệu sau xử lý ra Excel

Python
# Lưu kết quả lọc vào một file Excel mới
loc_pht.to_excel('ket_qua_loc.xlsx', index=False)

print("Đã xuất file thành công!")
Giải thích:
  • to_excel(): Xuất DataFrame ra file.
  • index=False: Loại bỏ cột số thứ tự mặc định của Pandas để file Excel trông sạch sẽ hơn.
💡 Lời khuyên cho giáo viên: Khi dạy Pandas, hãy cho học sinh thực hành trực tiếp trên file điểm của lớp. Việc thấy code tự động tính điểm trung bình của 40 bạn trong nháy mắt sẽ tạo hứng thú rất lớn.
Học Lập Trình Tkinter Python - Từ Cơ Bản Đến Nâng Cao

Lập Trình Giao Diện Với Python Tkinter

Hệ thống bài giảng từ cơ bản đến ứng dụng thực tế (12 Ví dụ)

Kiến thức trọng tâm

Tkinter là thư viện chuẩn của Python dùng để tạo GUI. Để xây dựng một ứng dụng, chúng ta luôn đi theo trình tự: Khởi tạo -> Thêm Widget -> Bố trí -> Xử lý sự kiện.

Hệ thống ví dụ thực hành

Ví dụ 1: Cấu trúc khởi tạo CƠ BẢN

Python
import tkinter as tk
root = tk.Tk()
root.title("Xin chào Tkinter")
root.geometry("300x200")
root.mainloop()
  • tk.Tk(): Tạo ra cửa sổ "cha" (root).
  • geometry("WxH"): Định nghĩa kích thước cửa sổ.
  • mainloop(): Giữ cửa sổ luôn hiển thị.

Ví dụ 2: Hiển thị Label & Định dạng

Python
import tkinter as tk
root = tk.Tk()
lbl = tk.Label(root, text="Học Python tại Phan Chu Trinh", fg="blue", font=("Arial", 14, "bold"))
lbl.pack(pady=20)
root.mainloop()
  • fg: Màu chữ (Foreground).
  • font: Định dạng phông chữ, cỡ chữ, kiểu chữ.
  • pack(pady=20): Đặt widget vào cửa sổ và tạo khoảng cách trên-dưới 20px.

Ví dụ 5: Máy tính cộng số (Xử lý sự kiện)

Python
import tkinter as tk

def tinh():
    n1 = int(e1.get())
    n2 = int(e2.get())
    kq.config(text=f"Tổng là: {n1 + n2}")

root = tk.Tk()
e1 = tk.Entry(root); e1.pack()
e2 = tk.Entry(root); e2.pack()
btn = tk.Button(root, text="Cộng", command=tinh); btn.pack()
kq = tk.Label(root, text="Kết quả"); kq.pack()
root.mainloop()
  • e1.get(): Lấy giá trị từ ô nhập liệu (luôn là chuỗi).
  • config(): Thay đổi thuộc tính (ở đây là thay đổi văn bản kết quả) của widget khi chương trình đang chạy.

Ví dụ 9: Hộp thoại thông báo (Messagebox)

Python
import tkinter as tk
from tkinter import messagebox

def thong_bao():
    messagebox.showinfo("Thông báo", "Bạn đã lưu dữ liệu thành công!")

root = tk.Tk()
tk.Button(root, text="Lưu", command=thong_bao).pack(pady=50)
root.mainloop()
  • messagebox.showinfo(tiêu đề, nội dung): Hiển thị cửa sổ pop-up thông báo.

Ví dụ 11: Vẽ đồ họa (Canvas) NÂNG CAO

Python
import tkinter as tk
root = tk.Tk()
cv = tk.Canvas(root, width=200, height=200, bg="white")
cv.pack()

# Vẽ hình chữ nhật màu đỏ
cv.create_rectangle(50, 50, 150, 150, fill="red")
# Vẽ đường thẳng
cv.create_line(0, 0, 200, 200, fill="blue", width=3)

root.mainloop()
  • Canvas: Vùng không gian để vẽ hình đồ họa, biểu đồ.
  • create_rectangle(x1, y1, x2, y2): Vẽ hình chữ nhật dựa trên tọa độ góc trên bên trái và góc dưới bên phải.

Ví dụ 12: Đồng hồ kỹ thuật số thực tế

Python
import tkinter as tk
import time

def cap_nhat_gio():
    chuoi_gio = time.strftime("%H:%M:%S")
    lbl_clock.config(text=chuoi_gio)
    lbl_clock.after(1000, cap_nhat_gio) # Gọi lại hàm sau 1 giây

root = tk.Tk()
root.title("Đồng hồ PCT")
lbl_clock = tk.Label(root, font=("Courier", 40), bg="black", fg="lime")
lbl_clock.pack()

cap_nhat_gio()
root.mainloop()
  • time.strftime("%H:%M:%S"): Lấy giờ hệ thống định dạng Giờ:Phút:Giây.
  • after(ms, function): Kỹ thuật đệ quy giúp ứng dụng tự cập nhật mà không làm treo giao diện.

Tổng kết ứng dụng

Từ 12 ví dụ trên, bạn có thể kết hợp để tạo ra các sản phẩm như:

📚 Giáo dục: Phần mềm trộn đề thi (Sử dụng Entry, Button, Messagebox).
🛠 Quản lý: Quản lý thiết bị dạy học (Sử dụng Grid, SQLite, Treeview).
Bài giảng Python Tkinter - THPT Phan Chu Trinh

Tìm hiểu Thư viện Tkinter trong Python

Tài liệu hỗ trợ nâng cao cho học sinh & giáo viên

1.2. Cấu trúc cơ bản của chương trình Tkinter

Mọi chương trình GUI (Giao diện người dùng) với Tkinter đều tuân thủ các bước sau:

BướcMô tả lệnh
1. Importimport tkinter as tk
2. Cửa sổroot = tk.Tk() (Khởi tạo cửa sổ chính)
3. WidgetThêm Label, Button, Entry...
4. Vòng lặproot.mainloop() (Duy trì ứng dụng)
Python Code
import tkinter as tk

# Tạo cửa sổ chính
root = tk.Tk()
root.title("Chương trình Tkinter đầu tiên")
root.geometry("400x200") # Rộng x Cao

# Hiển thị cửa sổ và chờ thao tác
root.mainloop()

1.3. Widget trong Tkinter

Widget là "linh hồn" của giao diện. Dưới đây là các thành phần bạn sẽ dùng thường xuyên nhất:

WidgetChức năng
LabelHiển thị văn bản hướng dẫn
ButtonNút thực hiện lệnh (Event Handling)
EntryÔ nhập liệu 1 dòng (Username, Điểm số...)
TextNhập nội dung dài (Ghi chú, đề bài...)
CheckbuttonLựa chọn nhiều mục (Trắc nghiệm nhiều đáp án)

1.4 - 1.8. Các ví dụ thực hành tiêu biểu

Ví dụ 5: Máy tính cộng đơn giản

Chương trình cho phép nhập 2 số và hiển thị kết quả khi nhấn nút.

Python Code
import tkinter as tk

def tinh_tong():
    try:
        # Lấy dữ liệu từ Entry và ép kiểu sang số
        so1 = int(e1.get())
        so2 = int(e2.get())
        tong = so1 + so2
        lbl_kq.config(text=f"Kết quả: {tong}")
    except:
        lbl_kq.config(text="Lỗi: Hãy nhập số!")

root = tk.Tk()
root.title("Máy tính Mini")

tk.Label(root, text="Nhập số thứ nhất:").pack()
e1 = tk.Entry(root)
e1.pack()

tk.Label(root, text="Nhập số thứ hai:").pack()
e2 = tk.Entry(root)
e2.pack()

btn = tk.Button(root, text="Tính Tổng", command=tinh_tong)
btn.pack(pady=10)

lbl_kq = tk.Label(root, text="Kết quả: ", font=("Arial", 12, "bold"))
lbl_kq.pack()

root.mainloop()

1.9. Các phương pháp bố trí giao diện

Để giao diện chuyên nghiệp, chúng ta thường dùng grid() (chia ô như Excel) thay vì pack().

Ví dụ Grid Layout
import tkinter as tk
root = tk.Tk()

# Dòng 0
tk.Label(root, text="Tài khoản:").grid(row=0, column=0, padx=5, pady=5)
tk.Entry(root).grid(row=0, column=1)

# Dòng 1
tk.Label(root, text="Mật khẩu:").grid(row=1, column=0, padx=5, pady=5)
tk.Entry(root, show="*").grid(row=1, column=1)

root.mainloop()

1.10. Khi nào nên ứng dụng Tkinter?

Tkinter là lựa chọn số 1 cho các phần mềm nhỏ hỗ trợ giáo dục:

📝 Phần mềm trộn đề thi trắc nghiệm
📊 Quản lý điểm & chuyên cần
📦 Quản lý thiết bị dạy học
⏱ Đồng hồ đếm ngược giờ thi
Lời khuyên: Hãy bắt đầu với các Widget cơ bản trước khi chuyển sang các thư viện giao diện phức tạp hơn như PySide6 hay CustomTkinter.

Thứ Sáu, 6 tháng 3, 2026

Khám Phá Cấu Trúc Layout Python Strings

Di chuột vào các thành phần bên trái để xem vị trí tương ứng trên giao diện.

// Cấu trúc HTML của bạn
<html lang="vi">
<head> ... </head>
<body>
<div class="flex">
<nav> (MENU) </nav>
<main> (NỘI DUNG)
#tong-quan
#truc-quan
#toan-tu
#tu-vung
#luyen-tap
#thuc-hanh
</main>
</div>
</body>
</html>

Main Content Area

#tong-quan
#truc-quan
#toan-tu
#tu-vung
#luyen-tap
#thuc-hanh
Gợi ý: Rê chuột vào các dòng code bên trái.

i Giải thích ý nghĩa các thành phần (Components)

1. <nav> (Thanh điều hướng)

Đóng vai trò như "Mục lục động". Trong học tập, nó giúp người dùng biết mình đang ở đâu và có thể nhảy nhanh đến các phần kiến thức khác nhau mà không cần cuộn trang.

2. <main> (Nội dung chính)

Đây là "trái tim" của bài học. Mọi kiến thức quan trọng về Python Strings đều nằm ở đây. Việc dùng thẻ <main> giúp trình duyệt và công cụ tìm kiếm hiểu đâu là phần quan trọng nhất.

3. Cấu trúc <section> theo trình tự học

  • #tong-quan: Định nghĩa "Chuỗi là gì?" (Lý thuyết nền).
  • #truc-quan: Xem chuỗi dưới dạng mảng/vị trí index (Hình ảnh hóa).
  • #toan-tu: Cách cộng, nhân, cắt chuỗi (Công cụ xử lý).
  • #luyen-tap & #thuc-hanh: Chuyển hóa kiến thức thành kỹ năng qua bài tập.
💡

Tư duy lập trình Layout:

Cấu trúc flex-col md:flex-row bạn thấy ở trên giúp trang web tự thích nghi: Trên điện thoại, Menu sẽ nằm trên nội dung; trên máy tính, Menu sẽ nằm bên trái. Đây là tiêu chuẩn thiết kế hiện đại (Responsive Design).

Thứ Năm, 5 tháng 3, 2026

Chuyển dữ liệu thời gian trong Excel về số thực bằng VBA

Trong quá trình xử lý dữ liệu Excel, đôi khi chúng ta gặp trường hợp ô hiển thị dạng thời gian hoặc ngày giờ nhưng thực chất giá trị bên trong lại là một số thực. Điều này thường gây khó khăn khi cần tính toán hoặc xử lý dữ liệu hàng loạt.

Ví dụ một ô hiển thị:

1/5/1900 2:24:00 AM

Nhưng giá trị thực của nó trong Excel là:

0.1
Excel lưu thời gian theo dạng serial number. Nghĩa là thời gian chỉ là một dạng hiển thị của số thực.

Nguyên lý lưu trữ thời gian trong Excel

Giá trị hiển thị Giá trị thực
24 giờ 1
12 giờ 0.5
6 giờ 0.25
2 giờ 24 phút 0.1

Do đó nếu dữ liệu của bạn đang hiển thị dạng thời gian nhưng cần xử lý dưới dạng số, chúng ta có thể dùng VBA để chuyển đổi tự động.

Giải pháp dùng VBA để chuyển đổi

Đoạn VBA dưới đây sẽ chuyển toàn bộ ô thời gian trong vùng được chọn sang số thực.

Bước 1: Mở VBA

Alt + F11

Sau đó chọn:

Insert → Module

Bước 2: Thêm đoạn code VBA

Sub ConvertTimeToNumber()
    Dim c As Range
    Dim rng As Range
     Set rng = Selection
    For Each c In rng
     If IsDate(c.Value) Then
         c.Value = CDbl(c.Value)
          c.NumberFormat = "0.########"
    End If
    Next c
    MsgBox "Đã chuyển thời gian sang số thực!"
End Sub

Cách sử dụng Macro

Bước 1: Chọn vùng dữ liệu cần chuyển.

Bước 2: Nhấn

Alt + F8

Bước 3: Chọn macro:

ConvertTimeToNumber

Bước 4: Nhấn Run.

Kết quả sau khi chuyển đổi

Trước khi chạy VBA Sau khi chạy VBA
1/5/1900 2:24:00 AM 0.1
1/1/1900 12:00:00 PM 0.5
1/1/1900 6:00:00 AM 0.25

Ưu điểm của phương pháp này

  • Tự động chuyển đổi hàng nghìn dòng dữ liệu.
  • Tiết kiệm rất nhiều thời gian xử lý.
  • Áp dụng cho mọi bảng dữ liệu Excel.
  • Phù hợp cho thống kê, phân tích dữ liệu hoặc xử lý điểm số.

Kết luận

Trong Excel, thời gian chỉ là một dạng hiển thị của số thực. Hiểu được nguyên lý này giúp bạn xử lý dữ liệu nhanh hơn và chính xác hơn.

Việc sử dụng VBA để tự động chuyển đổi là một giải pháp rất hiệu quả khi làm việc với các bảng dữ liệu lớn.

Thứ Tư, 25 tháng 2, 2026

III. XÂU KÝ TỰ (STRING) - "XỬ LÝ VĂN BẢN"

Phần 3: Kỹ thuật xử lý chuỗi và chuẩn hóa dữ liệu - Đội tuyển HSG Phan Chu Trinh

Xâu ký tự thực chất là một "mảng của các ký tự". Tuy nhiên, trong Python, xâu ký tự có những phương thức xử lý cực mạnh giúp việc biến đổi văn bản trở nên đơn giản.

Ví dụ 3: Chuẩn hóa họ tên
Yêu cầu: Nhập vào một họ tên có thể chứa khoảng trắng thừa ở đầu, cuối hoặc giữa các từ. Hãy chuyển đổi về dạng chuẩn (Viết hoa chữ cái đầu mỗi từ, các từ cách nhau đúng 1 dấu cách).

1. Mã nguồn Python Full (Tham khảo)

def chuan_hoa_ho_ten(s): # Bước 1: Tách xâu thành danh sách các từ (loại bỏ khoảng trắng thừa)
words = s.split()
# Bước 2: Viết hoa chữ cái đầu mỗi từ (capitalize)
cap_words = [w.capitalize() for w in words]
# Bước 3: Nối lại thành xâu hoàn chỉnh bằng dấu cách
result = ' '.join(cap_words)
return result
# Sử dụng name = " nguYễn vĂn aN " print(f"Kết quả: '{chuan_hoa_ho_ten(name)}'") # Output: "Nguyễn Văn An"
Lưu ý quan trọng:
  • Hàm split() không tham số sẽ tự động gom các khoảng trắng liên tiếp thành 1 dấu phân cách.
  • Xâu ký tự trong Python là Immutable (không thể thay đổi trực tiếp từng ký tự), nên ta thường chuyển sang List rồi mới Join lại.

✨ CÔNG CỤ CHUẨN HÓA TÊN TRỰC TUYẾN

4. Tư duy lập trình

Trong các kỳ thi HSG, xâu ký tự thường xuất hiện trong các bài toán về Tần suất (kết hợp với Dictionary) hoặc Xử lý số lớn (BigNum). Việc nắm vững split()join() giúp bạn tiết kiệm 50% thời gian viết code so với các ngôn ngữ cũ như Pascal hay C++.

II. MẢNG (LIST) - "DÃY NGĂN KÉO CHỨA ĐỒ"

Phần 2: Quản lý và xử lý dữ liệu tập trung - Đội tuyển HSG Phan Chu Trinh

Mảng là cấu trúc dữ liệu quan trọng nhất giúp chúng ta lưu trữ hàng triệu giá trị chỉ với một tên biến duy nhất.

Ví dụ 2: Quản lý điểm số
Đề bài: Cho danh sách điểm của n học sinh. Tìm điểm cao nhất và đếm xem có bao nhiêu bạn đạt số điểm đó.

1. Mã nguồn Python tối ưu

# Cách 1: Sử dụng các hàm xây dựng sẵn (Built-in)
def thong_ke_diem(ds_diem):
    diem_max = max(ds_diem)
    so_luong = ds_diem.count(diem_max)
    return diem_max, so_luong

# Cách 2: Duyệt một vòng lặp (Tối ưu nhất cho dữ liệu lớn)
def tim_max_va_dem(ds_diem):
    m = -1
    c = 0
    for x in ds_diem:
        if x > m:
            m = x; c = 1
        elif x == m:
            c += 1
    return m, c
Phân tích thuật toán:
  • Kiến thức: Truy xuất A[i], hàm max(), count().
  • Tư duy: Gom nhóm dữ liệu. Thay vì xử lý rời rạc, ta xử lý trên một tập hợp thống nhất.
  • Độ phức tạp: $O(n)$. Với 1 triệu học sinh ($n=10^6$), Python chỉ mất khoảng 0.1s.

📊 MÔ PHỎNG QUẢN LÝ ĐIỂM HỌC SINH

Nhập số lượng học sinh bạn muốn giả lập (N):

Điểm cao nhất
--
Số bạn đạt được
--
Thời gian xử lý
--

3. Bài học về kỹ năng

Khi làm việc với mảng trong thi HSG Tin học, hãy luôn ưu tiên các hàm có sẵn của Python như sum(), max(), min(), sort() vì chúng được viết bằng ngôn ngữ C, giúp chương trình chạy nhanh hơn nhiều so với việc tự viết vòng lặp thủ công.

BÀI 1: ĐỘ PHỨC TẠP THUẬT TOÁN

Dành cho đội tuyển HSG Tin học - THPT Phan Chu Trinh

1. Khái niệm về "Thước đo sức mạnh" $O$

Trong lập trình thi đấu, không phải cứ ra kết quả đúng là có điểm. Bạn phải ra kết quả đúng trong thời gian cho phép (thường là 1 giây).

Quy tắc vàng: Máy tính xử lý được khoảng 107 - 108 phép tính mỗi giây. Nếu thuật toán của bạn vượt quá con số này, bạn sẽ nhận lỗi TLE (Time Limit Exceeded).

2. Ví dụ: Tính tổng từ 1 đến $N$

Đề bài: Tính tổng $S = 1 + 2 + 3 + \dots + n$ với $n$ là số nguyên dương nhập từ bàn phím.
CÁCH 1: Duyệt tuần tự (Vòng lặp for - Duyệt vòng lặp $O(N)$) Mô tả: Giống như việc em đi bộ từ cổng trường vào lớp, bước đủ $n$ bước, mỗi bước cộng thêm 1 giá trị vào tổng.Mã nguồn Python:

def sum_linear(n):
    s = 0
     for i in range(1, n + 1):
         s += i
     return s

=> Càng nhiều bước ($N$ lớn), máy càng tốn thời gian.

Phân tích:
    - Kiến thức: Sử dụng biến tích lũy và vòng lặp cơ bản.
    -Tư duy: Tuyến tính (Linear). $n$ tăng gấp đôi thì máy phải làm việc gấp đôi.
    - Độ phức tạp: $O(n)$.).

CÁCH 2: Dùng công thức toán học (Gauss)

Mô tả: Thay vì đi bộ, em dùng "siêu năng lực" dịch chuyển tức thời. Chỉ cần một phép tính duy nhất là ra kết quả.:

def sum_constant(n):
    return n * (n + 1) // 2

=> Dù $N$ lớn bao nhiêu, chỉ cần 1 bước tính là xong!

Phân tích:
    - Kiến thức: Áp dụng công thức tổng cấp số cộng: $$S = \frac{n(n+1)}{2}$$
    -Tư duy: TTối ưu (Constant). Không phụ thuộc vào độ lớn của $n$.
    - Độ phức tạp: $O(1)$

🔬 PHÒNG THÍ NGHIỆM THUẬT TOÁN

import time
def demo_complexity(n):
    print(f"\n--- Thử nghiệm với n = {n:,} ---")
    # Đo Cách 1: O(n)
    start = time.time()
    res1 = sum_linear(n)
    end = time.time()
     print(f"Cách 1 (Vòng lặp): Kết quả = {res1}, Thời gian = {end - start:.5f} giây")
    # Đo Cách 2: O(1)
    start = time.time()
    res2 = sum_constant(n)
    end = time.time()
     print(f"Cách 2 (Toán học): Kết quả = {res2}, Thời gian = {end - start:.5f} giây")
# Chạy thử nghiệm
demo_complexity(10**7) # 10 triệu
demo_complexity(10**8) # 100 triệu

Nhập số $N$ để so sánh tốc độ (Thử với $N = 10,000,000$):

Cách 2 - $O(1)$: ---
Cách 1 - $O(N)$: ---

3. Bài học rút ra

  • Tư duy tuần tự: Dễ nhưng chậm.
  • Tư duy tối ưu: Cần kiến thức nhưng cực nhanh.
SQL Education Simulator V3 PRO
SQL Education Simulator V3 PRO – WHERE (AND/OR) | ORDER | UPDATE

Bài đăng phổ biến

💬 Bình luận

💬 Bình luận

📌 Danh sách bình luận