Bắt đầu từ bài học này thì có thể xem như bạn đã bước sang một giai đoạn mới, đó là C++ cơ bản. Những bài học trước đây mình trình bày mới chỉ là nhập môn thôi bạn nhé. Bắt đầu từ bài học này, nội dung sẽ khó hơn một xíu và sẽ có nhiều bài tập hơn. Với mỗi một bài học trong phần cơ bản này mình sẽ cố gắng đưa ra các bài tập để bạn có thể vận dụng vào thực hành ngay.
Mở đầu cho phần cơ bản, mình sẽ trình bày một cấu trúc lệnh mới và cũng cực kỳ quan trọng. Đó là cấu trúc điều khiển, một số tài liệu gọi là cấu trúc rẽ nhánh hoặc cấu trúc if.
Cấu trúc tuần tự
Trước khi đi vào cấu trúc điều khiển (cấu trúc if), chúng ta hãy cùng ôn lại cấu trúc chương trình cơ bản đã nhé.
Trong một chương trình C++, các lệnh sẽ được thực hiện một cách tuần tự từ trên xuống dưới. Có nghĩa là câu lệnh này phải được thực hiện xong thì mới chuyển xuống thực hiện câu lệnh kế. Ví dụ: nếu bạn đang thực hiện lệnh 1, thì lệnh kế tiếp của bạn phải là lệnh 2 mà không được “nhảy cóc” sang lệnh 3. Bạn có thể xem lại sơ đồ hình bên để dễ hình dung hơn.
Đây chính là cấu trúc mà bạn phải nhớ và luôn tuân thủ trong lập trình C++.
➤ Ví dụ: Xây dựng chương trình tính tổng, hiệu, tích, thương của 02 số như sau.
Từ lưu đồ thuật toán ban đầu, bạn có thể ánh xạ ra chương trình C++ như trên. Và đoạn chương trình trên cũng chính là cấu trúc tuần tự đó bạn ạ. Các lệnh được thực hiện từ trên xuống dưới một cách tuần tự, lệnh này thực hiện xong thì mới thực hiện lệnh kế tiếp. Nhìn lưu đồ thuật toán bạn cũng có thể thấy rõ hướng thực hiện theo chiều “thẳng đứng” và không có nhánh.
Cấu trúc điều khiển (cấu trúc if)
Cấu trúc điều khiển hay còn gọi là cấu trúc rẽ nhánh là cấu trúc cho phép chương trình chọn thực hiện một khối lệnh nào đó dựa vào kết quả của một điều kiện cho trước (biểu thức quan hệ hay biểu thức so sánh). Sơ đồ của cấu trúc điều khiển (cấu trúc if) có dạng như sau:
Từ sơ đồ trên, bạn có thể thấy là sơ đồ không còn dạng thẳng nữa mà đã xuất hiện nhánh. Đó cũng chính là lý do vì sao nó còn được gọi là cấu trúc rẽ nhánh. Bạn có thể hiểu sơ đồ trên theo cách như sau: “Nếu biểu thức điều kiện đúng thì thực hiện lệnh hoặc khối lệnh nào đó. Ngược lại biểu thức điều kiện sai thì chương trình không làm gì cả”. Sau khi kết thúc cấu trúc sẽ nhánh thì lệnh n sẽ được thực hiện. Bạn lưu ý nhé, lệnh n sẽ luôn được thực hiện bất kể là biểu thức đúng hay sai.
Cú pháp
Từ sơ đồ trên, bạn có cú pháp tương ứng cho cấu trúc điều khiển như sau:
Ý nghĩa của cú pháp trên là, NẾU biểu thức điều kiện đúng THÌ sẽ thực thi khối lệnh bên trong cặp dấu “{” và “}“. Trong cấu trúc này thì bạn không cần mô tả trường hợp sai. Vì sai thì chương trình sẽ không thực hiện lệnh nào cả.
➤ Ví dụ: Bây giờ bạn hãy cùng làm ví dụ để nắm rõ hơn về cấu trúc này nhé.
- Đầu vào: một số nguyên k.
- Đầu ra: thông báo “So vua nhap khong hop le” nếu k nhỏ hơn 1 hoặc lớn hơn 10.
- Giải thuật: Mình sẽ vẽ lưu đồ thuật toán và chương trình tương ứng với lưu đồ luôn nhé.
Trong chương trình trên, từ dòng 10 đến dòng 15 chính là cấu trúc điều khiển (cấu trúc if). Cấu trúc này chỉ đơn giản là kiểm tra xem số nguyên k có nhỏ hơn 1 hoặc lớn hơn 10 hay không. Nếu đúng thì in ra màn hình “So vua nhap khong hop le”.
➤ Lưu ý: Cấu trúc if ở trên chỉ có một lệnh con bên trong, do đó không nhất thiết phải đặt trong cặp dấu “{” và “}“. Bạn có thể viết rút gọn cặp dấu ngoặc như sau:
Nhưng bạn phải nhớ là nếu có từ 02 câu lệnh trở lên thì tạo thành khối lệnh. Do đó bắt buộc phải đặt trong cặp dấu “{” và “}” nhé, đây là lỗi mà nhiều bạn mới học hay gặp phải.
Cấu trúc if…else
Cấu trúc if ở trên sẽ rất phù hợp nếu bạn chỉ quan tâm tới việc xử lý trường hợp đúng. Vậy thì trường hợp sai thì sao nhỉ? Lúc này, bạn sẽ cần mở rộng cấu trúc if ra bằng khối lệnh else, cú pháp như sau:
Ý nghĩa cú pháp trên như sau: “Nếu biểu thức điều kiện đúng thì thực hiện khối lệnh 1, ngược lại thực hiện khối lệnh 2″. Các bạn thấy đó, với cấu trúc if hay if…else thì các bạn nên biện luận theo mệnh đề “nếu…thì…ngược lại” thì sẽ rất dễ hiểu phải không.
➤ Ví dụ: Để nắm rõ hơn, bạn hãy xét ví dụ sau nhé:
- Đầu vào: một số nguyên a và b.
- Đầu ra: thông báo “a la boi so cua b” hoặc “a khong la boi so cua b”.
- Giải thuật: Lưu đồ thuật toán và chương trình tương ứng với lưu đồ như sau.
Chắc rằng, bạn cũng biết a sẽ là bội số của b khi a chia hết cho b phải không. Để kiểm tra xem a có chia hết cho b hay không thì mình sử dụng phép chia lấy dư. Nếu a chia cho b mà dư 0 thì có nghĩa là a chia hết cho b. Từ đó bạn có thể kết luận được a có phải là bội số của b hay không.
Cấu trúc if … else if … else
Cải tiến thêm từ cấu trúc if … else là cấu trúc if … else if … else. Đây là cấu trúc cho phép bạn kiểm tra được nhiều điều kiện khác nhau. Cú pháp như sau:
Với cú pháp trên, bạn đã có thể kiểm tra nhiều trường hợp trong một cấu trúc. Nếu biểu thức điều kiện 1 đúng thì thực hiện khối lệnh 1, ngược lại nếu biểu thức điều kiện 2 đúng thì thực hiện khối lênh 2,…, ngược lại thực hiện khối lệnh sai sau cùng.
➤ Ví dụ: Để nắm rõ hơn, bạn hãy xét ví dụ sau nhé:
- Đầu vào: một số nguyên a và b.
- Đầu ra: thông báo “a la so lơn nhat”, “b la so lơn nhat” hoặc “a va b bang nhau”.
- Giải thuật: Lưu đồ thuật toán và chương trình tương ứng với lưu đồ như sau.
Bạn có thể thấy rằng các điều kiện trong cấu trúc này cũng được xét tuần tự từ trên xuống dưới. Nếu có điều kiện nào đúng thì thực hiện lệnh hoặc khối lệnh tương ứng với điều kiện đó và bỏ qua tất cả các lệnh còn lại trong cấu trúc.
Cấu trúc if lồng
Đôi khi, bạn cần kiểm tra điều kiện cho các khối lệnh con bên trong của một cấu trúc if. Bạn sẽ phải chèn thêm một cấu trúc if khác vào bên trong khối lệnh của cấu trúc if đó. Hành động chèn thêm cấu trúc if vào khối lệnh con của một cấu trúc if được gọi là cấu trúc if lồng nhau.
➤ Cú pháp: Đối với cấu trúc if lồng sẽ không có cú pháp chính xác. Cú pháp mình đưa dưới đây cũng chỉ là một dạng ví dụ, tuỳ theo từng trường hợp cụ thể mà bạn có cách sử dụng if lồng cho phù hợp với ngữ cảnh.
➤ Ví dụ: Mình sẽ áp dụng lại ví dụ của bài trước nhé.
- Đầu vào: hai số nguyên a và b.
- Đầu ra: nghiệm của phương trình.
- Giải thuật: Lưu đồ thuật toán và chương trình tương ứng với lưu đồ như sau.
Chương trình trên là một trường hợp của cấu trúc if lồng thôi bạn nhé. Đối với cấu trúc này, bạn có thể lồng cấp nhiều cấu trúc if bên trong. Theo mình biết thì chưa có thử nghiệm nào để biết cấu trúc if có thể lồng tối đa bao nhiêu cấp. Nhưng nếu chương trình của bạn có cấu trúc if lồng nhiều cấp quá thì tốc độ chương trình sẽ giảm. Và theo kinh nghiệm của mình thì chỉ nên lồng khoảng 4 cấp là được. Còn nếu phải xét nhiều điều kiện thì bạn nên sử dụng cấu trúc “if … else if … else” ở trên sẽ tốt hơn.
Tổng kết
Trong bài viết này mình đã trình bày tới bạn cấu trúc điều khiển (cấu trúc if). Đây là một trong những cấu trúc cơ bản nhưng cực kỳ quan trọng. Kể cả với những người lập trình lâu năm thì cũng vẫn sử dụng cấu trúc này thường xuyên. Do đó bạn cần học và nắm vững cấu trúc if nhé. Bài sau mình sẽ trình bày tiếp một cấu trúc rẽ nhánh nữa sau đó sẽ ra bài tập để bạn thực hành luôn nhé.