Lược đồ giải thuật và mã giả để biểu diễn thuật toán bằng hình học và cú pháp và các cấu trúc luồng chạy trong lập trình
Mục lục
Khái niệm mã giả (pseudo code):
Đây là một khái niệm mã nguồn nhưng không phải mã nguồn thật của bất cứ ngôn ngữ lập trình nào cả, để dễ hình dung, chúng ta sẽ hiểu như sau: Hãy hình dung trong cuộc sống, với ngôn ngữ thực tế một từ xin chào bằng tiếng Việt có thể dịch sang các ngôn ngữ khác nhau ví dụ tiếng anh là hello, tiếng Pháp là bonjour …., cùng để mô tả một lời chào. Trong lập trình cũng vậy, mỗi ngôn ngữ lập trình sẽ hiểu và biên dịch cùng một công việc, nhưng có sự khác biệt về mặt cú pháp tùy theo đặc điểm và cấu trúc của mỗi ngôn ngữ. Vì thế, khi tiếp cận lập trình, chúng ta có thể sử dụng khái niệm mã giả để mô tả chung một nội dung công việc theo phong cách viết code nhưng ngắn gọn và dễ hiểu hơn. Và ngôn ngữ này trình biên dịch trên máy tính không thể biên dịch được mà chủ yếu để giao tiếp giữa các lập trình viên với nhau. ( Trong thực tế, khi trao đổi chuyên môn lập trình, lập trình viên cũng ít khi viết mã giả để giao tiếp mà chủ yếu sẽ nói chuyện để mô tả và hiểu vấn đề, tuy nhiên trong một vài trường hợp vấn đề phức tạp hoặc với các lập trình viên mới, các viết mã giả để mô tả vấn đề cũng được áp dụng).
Các bạn đã có một chút kĩ năng về lập trình hoặc đã tiếp cận một vài ngôn ngữ lập trình rồi thì có thể không cần tham khảo bài viết này.
Ví dụ cơ bản nhất về viết mã giả:
BEGIN
DISPLAY "hello world"
END
Đây là một ví dụ cơ bản về việc ra lệnh cho máy tính nhưng với phong cách sử dụng mã giả (pseudo code), cách viết này sẽ ngắn gọn, dễ hiểu và nhiệm vụ của lập trình viên là sẽ dựa theo cú pháp của từng ngôn ngữ lập trình cụ thể để viết dòng lệnh yêu cầu máy tính in ra dòng chữ “hello world” .
Luồng chạy ( tuần tự thực thi ) của mã giả:
- BEGIN : bắt đầu chương trình
- DISPLAY “hello world” : in ra màn hình dòng chữ “hello world”
- END : Kết thúc chương trình
Các từ khóa của mã giả có thể thay đổi linh hoạt tùy theo khẩu vị của mỗi người, nhưng chúng ta có thể hiểu START hay BEGIN hay thậm chí có thể việt hóa thành BATDAU cũng là mã giả để biểu diễn cú pháp bắt đầu chương trình mà thôi. Tương tự với END/STOP/KETTHUC, và cặp từ khóa này thường đi kèm với nhau vì trong lập trình, có bắt đầu phải có kết thúc.
Một số từ khóa thường gặp khi biểu diễn mã giả:
- BEGIN/START => Bắt đầu chương trình
- END/STOP => Kết thúc chương trình
- INPUT => Yêu cầu người dùng nhập liệu và lưu vào bộ nhớ (tương tác với bàn phím)
- DISPLAY/WRITE => In ra màn hình
- IF/ELSE => Nếu/thì sử dụng để rẽ nhánh luồng chạy ( tuần tự thực thi chương trình dựa theo một điều kiện đã được tính toán)
- BEGIN LOOP/END LOOP => bắt đầu và kết thúc vòng lặp ( một khái niệm trong lập trình sẽ được đề cập ở phần sau bài viết)
Ví dụ cơ bản mã giả với một bài toán tính tổng 2 số do người dùng nhập vào:
BEGIN
INPUT A
INPUT B
C = A + B
DISPLAY C
END
Đoạn mã giả trên yêu cầu máy tính thực thi tuần tự các công việc:
- Bắt đầu chương trình
- Yêu cầu người dùng nhập liệu 2 số và đặt tên 2 tài nguyên lưu trữ A,B để lưu giá trị người dùng nhập liệu,
- Ngoài ra cần một tài nguyên C, được tính toán bằng phép tính tổng của A và B
- sau đó hiển thị giá trị của tài nguyên có tên C ra màn hình.
- Kết thúc chương trình
Khái niệm lược đồ giải thuật (algorithm diagram):
Đây là một dạng biểu diễn giải thuật dưới dạng hình học, khi đọc lược đồ giải thuật, lập trình viên sẽ hình dung được luồng chạy của chương trình, và mỗi hành động trong tiến trình thực thi sẽ được biểu diễn bằng một ký hiệu tương ứng.
Bảng mô tả các ký hiệu trong lược đồ giải thuật:
Ký hiệu | Mô tả khái niệm |
Bắt đầu/ kêt thúc chương trình (Terminator) | |
Nhập vào, xuất/in ra màn hình (Input/Output) | |
Các bước tính toàn (processing) | |
Quyết định rẽ nhánh chương trình theo điều kiện (Decision) | |
Kết nối trong trang, sử dụng để kết nối với thành phần lược đồ khác khi lược đồ quá dài hoặc phức tạp (On-page connector) | |
Kết nối ngoài trang, sử dụng để kết nối với thành phần lược đồ khác khi lược đồ quá dài hoặc phức tạp (Off-page connector) |
Duới đây là lược đồ giải thuật với bài toán tính tổng 2 số do người dùng nhập vào:
Lược đồ giải thuật trên yêu cầu máy tính thực thi tuần tự các công việc:
- Bắt đầu chương trình (Terminator)
- Yêu cầu người dùng nhập liệu 2 số và đặt tên 2 tài nguyên lưu trữ A,B để lưu giá trị người dùng nhập liệu. (Input)
- Ngoài ra cần một tài nguyên C, được tính toán bằng phép tính tổng của A và B (Processing)
- sau đó hiển thị giá trị của tài nguyên có tên C ra màn hình. (Output)
- Kết thúc chương trình (Terminator)
Các cấu trúc luồng chạy nâng cao trong lập trình
Như mô tả ở phần trên, chương trình chạy theo cấu trúc tuần tự, luồn chạy sẽ đi từ trên xuống, nâng cao hơn một chút, ta thử hình dung:
- Giải quyết bài toán kiểm tra dữ liệu người dùng nhập liệu vào số chẵn hay lẻ.
- Giải quyết bài toán in 1000 lần một nội dung “dong 1′, ‘dong 2’ … ‘dong 100’ ra màn hình.
Với các bài toán này, chúng ta sẽ cần tiếp cận một vài khái niệm cấu trúc nâng cao hơn trong lập trình, cấu trúc này áp dụng cho hầu hết tất cả các ngôn ngữ lập trình, và các lập trình viên đều nằm lòng.
Để giải quyết bài toán số 1, chúng ta sử dụng cấu trúc IF (nếu), chúng ta có thể hình dung giống thực tế nếu thỏa mãn điều kiện thì làm một công việc gì đó.
Cấu trúc IF (nếu), IF – ELSE (nếu thì – nếu không thì), IF – ELSE IF – ELSE (chia luồng chương trình thành nhiều nhánh dựa theo điều kiện)
Cấu trúc IF luôn đi kèm cùng 1 điều kiện để kiểm tra, máy tính sẽ dựa theo điều kiện kiểm tra để rẽ nhánh chương trình theo ý đồ của lập trình viên. Nếu điều kiện đúng, luồng chạy chương trình sẽ nhảy vào các câu lệnh của phần thân bên trong cấu trúc IF để thực thi, chương trình sẽ xác định phần thân bằng từ khóa ENDIF. Một cấu trúc IF luôn phải kết thúc bằng từ khóa ENDIF
Mã giả đầu tiên sử dụng cấu trúc IF cho bài toán kiểm tra dữ liệu người dùng nhập liệu vào số chẵn hay lẻ:
BEGIN
DISPLAY "Nhap vao so can kiem tra"
INPUT A
RES = A MOD 2
IF (RES == 0)
DISPLAY "So vua nhap vao la so chan"
ENDIF
END
Mã giả rút gọn hơn khi kiểm tra trực tiếp biểu thức A MOD 2 có bằng 0 hay không, không cần thông qua một tài nguyên RES để lưu trữ giá trị
BEGIN
DISPLAY "Nhap vao so can kiem tra"
INPUT A
IF (A MOD 2 == 0)
DISPLAY "So vua nhap vao la so chan"
ENDIF
END
Cấu trúc IF ELSE (nếu – thì / nếu không – thì)
Ở ví dụ mã giả phía trên, chúng ta thấy nếu như điều kiện không thỏa mãn, chương trình sẽ kết thúc mà không in ra dòng “So vua nhap la so le”, để xử lý vấn đề này, nếu chỉ dùng IF thì cách làm bằng mã giả sẽ là:
BEGIN
DISPLAY "Nhap vao so can kiem tra"
INPUT A
IF (A MOD 2 == 0)
DISPLAY "So vua nhap vao la so chan"
ENDIF
IF (A MOD 2 !=0)
DISPLAY "So vua nhap vao la so le"
ENDIF
END
Tuy nhiên chúng ta có thể sử dụng giả pháp bổ sung thêm từ khóa ELSE bên trong cấu trúc IF để rẽ nhánh chương trình khi kết quả của phép chia lấy dư khác 0, mã giả như sau:
BEGIN
DISPLAY "Nhap vao so can kiem tra"
INPUT A
IF (A MOD 2 == 0)
DISPLAY "So vua nhap vao la so chan"
ELSE
DISPLAY "So vua nhap vao la so le"
ENDIF
END
Ngoài ra, với tình huống này chúng ta hoàn toàn có thể làm cấu trúc IF như sau, kết quả in ra vẫn tương tự
BEGIN
DISPLAY "Nhap vao so can kiem tra"
INPUT A
IF (A MOD 2 != 0)
DISPLAY "So vua nhap vao la so le"
ELSE
DISPLAY "So vua nhap vao la so chan"
ENDIF
END
Với cấu trúc IF ELSE, mã giả sẽ có phần ngắn gọn và dễ đọc dễ hiểu, và nếu xét theo góc độ logic, cách làm IF phía trên chương trình phải 1 lần nữa kiểm tra với điều kiện khác 0, còn với IF ELSE , chúng ta chỉ cần kiểm tra 1 lần, khi điều kiện không thỏa mãn chương trình sẽ lập tức rẽ nhánh vào khối lệnh phần thân bên trong else , và thông thường, lập trình viên hay lựa chọn cách làm này.
Lược đồ giải thuật cho bài toán trên:
Cấu trúc IF ELSE IF ELSE
Với cấu trúc này, bạn có thể rẽ nhánh chương trình thành nhiều hơn 2 luồng chạy dựa theo điều kiện chương trình, tham khảo mã giả sau:
BEGIN
IF ( DIEUKIEN1 )
// LAM GI DO
ELSEIF ( DIEUKIEN2)
// LAM GI DO
ELSE
// TRUONG HOP CON LAI
ENDIF
END
Cấu trúc AND/OR ( kiểm tra cùng lúc nhiều điều kiện kết hợp)
Chúng ta mới tiếp cận cấu trúc IF ở phần trước, tuy nhiên chỉ mới sử dụng cho bài toán kiểm tra 1 điều kiện là kết phép chia lấy dư có bằng 0 hay không, ở phần giới thiệu này, chúng ta đến với giải khái niệm sử dụng AND/OR để kiểm tra cùng lúc nhiều điều kiện trong chương trình.
Ví dụ mã giả máy tính giải quyết bài toán sau để giải thích về cấu trúc AND:
Kiểm tra một sinh viên do người dùng nhập vào bao gồm tên, tuổi, điểm số, dựa vào thang điểm để xếp hạng. Thang điểm như sau:
- Hạng A: 8<=điểm<=10
- Hạng B: 6<=điểm<=8
- Hạng C: <6
BEGIN
DISPLAY "NHAP VAO SINH VIEN"
DISPLAY "NHAP VAO TEN";
INPUT NAME
DISPLAY "NHAP VAO TUOI";
INPUT AGE
DISPLAY "NHAP VAO DIEM";
INPUT MARK
IF (MARK >= 8 AND MARK <= 10)
DISPLAY "SINH VIEN " + NAME + " XEP HANG A"
ELSE IF(MARK >= 6 AND MARK <=8)
DISPLAY "SINH VIEN " + NAME + " XEP HANG B"
ELSE
DISPLAY "SINH VIEN " + NAME + " XEP HANG C"
ENDIF
END
Ví dụ mã giả máy tính giải quyết bài toán sau để giải thích về cấu trúc OR:
Kiểm tra dữ liệu người dùng nhập vào sinh viên do người dùng nhập vào bao gồm tên, tuổi, kiểm tra xem tuổi người dùng nhập vào, nếu lớn hơn 0 và nhỏ hơn 18 thì in ra là không hợp lệ
BEGIN
DISPLAY "NHAP VAO SINH VIEN"
DISPLAY "NHAP VAO TEN";
INPUT NAME
DISPLAY "NHAP VAO TUOI";
INPUT AGE
IF(AGE < 0 OR AGE > 18)
DISPLAY "TUOI NHAP VAO KHONG HOP LE"
ENDIF
// DO SOMETHING
END
Cấu trúc NESTED IF (IF lồng nhau)
Ví dụ mã giả giải quyết bài toán về cấu trúc IF lồng nhau
Giải quyết bài toán kiểm tra dữ liệu sinh viên do người dùng nhập vào bao gồm tên, tuổi và điểm số,
Bước 1: nếu tên không thỏa mãn in ra chưa nhập tên và kết thúc
Bước 2: nếu tên thỏa mãn, yêu cầu nhập tuổi nếu tuổi không thỏa mãn lớn hơn 0 và nhỏ hơn 18 thì in ra màn hình không hợp lệ và kết thúc
Bước 3: nếu thỏa mãn thì yêu cầu nhập điểm số, tiếp tục kiểm tra điểm số để xếp hạng
- Hạng A: 8<=điểm<=10
- Hạng B: 6<=điểm<=8
- Hạng C: <6
BEGIN
DISPLAY "NHAP VAO TEN SINH VIEN"
INPUT NAME
IF ( COUNTCHARACTERS(NAME) => 0 )
DISPLAY "NHAP VAO TUOI SINH VIEN"
INPUT AGE
IF (AGE < 0 OR AGE > 18)
DISPLAY "TUOI KHONG THOA MAN YEU CAU"
ELSE
INPUT MARK
IF(MARK >= 8 AND MARK =< 10)
DISPLAY "SINH VIEN XEP HANG A"
ELSE IF(MARK >= 6 And MARK <= 8)
DISPLAY "SINH VIEN XEP HANG B"
ELSE
DISPLAY "SINH VIEN XEP HANG C"
ENDIF
ENDIF
ELSE
DISPLAY "CHUA NHAP TEN SINH VIEN"
ENDIF
END
Cấu trúc LOOP (vòng lặp)
Như các cấu trúc chúng ta đã học phía trên, đến đây chúng ta có thể hiểu cơ bản chương trình máy tính sẽ thực thi các câu lệnh một cách tuần tự, nâng cao hơn, để chương trình mạnh mẽ hơn, khái niệm vòng lặp mang tới giải pháp thực hiện một công việc tương tự nhau nhiều lần. Nói dễ hiểu hơn là bảo máy tính thực thi liên tục và lặp lại một công việc cho tới khi chúng ta đưa ra tín hiệu dừng lại, trong ngữ cảnh này, chúng ta sử dụng kết quả kiểm tra điều kiện làm tín hiệu trên.
Xét mã giả bài toán phía trên với giải pháp sử dụng vòng lặp để hiểu rõ hơn. Với bài toán phía trên, khi người dùng nhập liệu, chúng ta nên yêu cầu người dùng nhập lại khi người dùng nhập liệu không thỏa mãn chứ không nên ngắt chương trình luôn, mã giả biểu diễn như sau:
BEGIN
NAME = ""
WHILE (COUNTCHARACTERS(NAME) <= 0)
DO LOOP
DISPLAY "NHAP VAO TEN SINH VIEN"
INPUT NAME
ENDLOOP
AGE = 0
WHILE (AGE < 0 OR AGE > 18)
DO LOOP
DISPLAY "NHAP VAO TUOI SINH VIEN"
INPUT AGE
ENDLOOP
// THUC THI NHAP VAO VA KIEM TRA DIEM
END
Dưới đây là tổng hợp những cấu trúc luồng chạy trong lập trình web888 giới thiệu cùng bạn đọc, nếu cảm thấy hay, hãy chia sẻ nó dùm tác giả, cảm ơn quý bạn đọc, chúc bạn học tập tốt !
Bài tập
Thực hành:
1. Vẽ lược đồ giải thuật và mã giả mô phỏng chương trình sau:
Chương trình yêu cầu người dùng nhập vào điểm thi học phần của sinh viên, bao gồm 3 điểm toán, văn, anh. Sau đó tính toán điểm trung bình và in ra màn hình
2. Vẽ lược đồ giải thuật và mã giả mô phỏng chương trình sau:
Chương trình tìm nghiệm của phương trình bậc 2 (ax2 + bx + c = 0) dựa vào 3 số a,b,c do người dùng nhập vào (không tính trường hợp delta phẩy) .
Hướng dẫn nhanh:
- Y/c người dùng nhập vào a,b,c.
- kiểm tra điều kiện xác định của a,b,c và tính delta để bẻ luồng chương trình
- x được tính toán ( pt vô nghiệm, 2 nghiệm hay nghiệm kép).
- in ra màn hình kết quả.
3. Vẽ lược đồ giải thuật và mã giả y/c người dùng nhập vào 2 số, tính toán kết quả phép cộng 2 số và kiểm tra có nhỏ hơn 10 hay không, nếu không thỏa mãn yêu cầu người dùng nhập lại
4. Vẽ lược đồ giải thuật + mã giả phép tính 2 số + với nhau, nếu kq nhỏ hơn 10 in ra "tong nho hon 10", ngược lại in ra "tong lon hon 10"
1 Comments