Bài học cùng chủ đề
Báo cáo học liệu
Mua học liệu
Mua học liệu:
-
Số dư ví của bạn: 0 coin - 0 Xu
-
Nếu mua học liệu này bạn sẽ bị trừ: 0 coin\Xu
Để nhận Coin\Xu, bạn có thể:
I. Lý thuyết SVIP
Nội dung này do giáo viên tự biên soạn.
II.1. Cấu trúc rẽ nhánh
II.1.1. Rẽ nhánh
Thường ngày, có rất nhiều việc chỉ được thực hiện khi một điều kiện cụ thể nào đó được thoả mãn.
Ví dụ, Châu và Ngọc thường cùng nhau chuẩn bị các bài thực hành môn Tin học.
Một lần Châu hẹn với Ngọc: "Chiều mai nếu trời không mưa thì Châu sẽ đến nhà Ngọc".
Một lần khác, Ngọc nói với Châu: "Chiều mai nếu trời không mưa thì Ngọc sẽ đến nhà Châu, nếu mưa thì sẽ gọi điện cho Châu để trao đổi".
Câu nói của Châu cho ta biết một việc làm cụ thể (Châu đến nhà Ngọc) sẽ được thực hiện nếu một điều kiện cụ thể (trời không mưa) thoả mãn. Ngoài ra không đề cập đến việc gì sẽ xảy ra nếu điều kiện đó không thoả mãn (trời mưa).
Cách diễn đạt như vậy ta nói thuộc dạng mệnh đề thiếu:
Nếu... thì…
Câu nói của Ngọc khẳng định một trong hai việc cụ thể (Ngọc đến nhà Châu hay Ngọc gọi điện cho Châu) chắc chắn sẽ xảy ra. Tuy nhiên, việc nào trong hai việc sẽ được thực hiện thì tuỳ thuộc vào điều kiện cụ thể (trời không mưa) thoả mãn hay không.
Cách diễn đạt như vậy ta nói thuộc dạng mệnh đề đủ:
Nếu… thì…, nếu không thì…
Từ đó có thể thấy, trong nhiều thuật toán, các thao tác tiếp theo sẽ phụ thuộc vào kết quả nhận được từ các bước trước đó.
Cấu trúc dùng để mô tả các mệnh đề có dạng như trên được gọi là cấu trúc rẽ nhánh.
Ví dụ, để giải phương trình bậc hai:
ax2 + bx + c = 0, (a ¹ 0)
trước tiên ta tính biệt số delta D = b2 – 4ac.
Nếu D không âm, ta sẽ đưa ra các nghiệm. Trong trường hợp ngược lại, ta phải thông báo là phương trình vô nghiệm.
Như vậy, sau khi tính D, tuỳ thuộc vào giá trị của D, một trong hai thao tác sẽ được thực hiện (h. 4).
Mọi ngôn ngữ lập trình đều có các câu lệnh để mô tả cấu trúc rẽ nhánh.
| Nhập a, b, c |
| Tính D ¬ b2 – 4ac |
| Delta ³0 ? |
| Thông báo vô nghiệm, rồi kết thúc |
| Tính và đưa ra nghiệm thực, rồi kết thúc
|
Sai |
Đúng |
Hình 4. Sơ đồ thể hiện cấu trúc rẽ nhánh
II.1.2. Câu lệnh if
Để mô tả cấu trúc rẽ nhánh, C++ có hai dạng câu lệnh if:
a) Dạng thiếu
if (<Điều kiện>)
{
Các_lệnh;
}
b) Dạng đủ
if (<Điều kiện>)
{ Câu lệnh 1;
}
else
{
Câu lệnh 2;
}
trong đó:
· Điều kiện: Biểu thức quan hệ hoặc lôgic.
· Câu lệnh, câu lệnh 1, câu lệnh 2 là một câu lệnh của C++
| Điều kiện |
| Câu lệnh |
| Đúng |
| Sai |
| Điều kiện |
| Câu lệnh 1 |
| Đúng |
| Sai |
| Câu lệnh 2 |
Hình 5 Hình 6
Ở dạng thiếu: điều kiện sẽ được tính và kiểm tra. Nếu điều kiện đúng (có giá trị true) thì câu lệnh sẽ được thực hiện, ngược lại thì câu lệnh sẽ bị bỏ qua (h. 5).
Ở dạng đủ: điều kiện cũng được tính và kiểm tra. Nếu điều kiện đúng thì câu lệnh 1 sẽ được thực hiện, ngược lại thì câu lệnh 2 sẽ được thực hiện (h. 6).
II.1.3. Một số ví dụ
Ví dụ 1. Tìm nghiệm thực của phương trình bậc hai:
ax2 + bx + c = 0 , với a ¹ 0.
Input: Các hệ số a, b, c nhập từ bàn phím.
Output: Đưa ra màn hình các nghiệm thực hoặc thông báo "Phuong trinh vo nghiem".
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
float a,b,c,x1,x2;
cout << "Nhap a:";
cin>>a;
cout << "\n Nhap b:";
cin>>b;
cout << "\n Nhap c:";
cin>>c;
float D=b*b-4*a*c;
if (D<0)
{
cout << "\n Phuong trinh vo nghiem";
}
else
{
x1= (-b-sqrt(D))/(2*a);
x2=(-b+sqrt(D))/(2*a);
cout<<"\n x1 = "<< x1<<"\n x2 = "<<x2;
}
return 0;
}
II.1.4. Câu lệnh switch
Lệnh switch cung cấp phương thức lựa chọn giữa một tập các khả năng dựa trên giá trị của biểu thức. Hình thức chung của câu lệnh switch là:
switch (biểu thức) {
case hằng 1 : các lệnh;
...
case hằng n :các lệnh;
default : các lệnh;
};
Biểu thức (gọi là thẻ switch) được ước lượng trước tiên và kết quả được so sánh với mỗi hằng số (gọi là các nhãn) theo thứ tự chúng xuất hiện cho đến khi một so khớp được tìm thấy. Lệnh ngay sau khi so khớp được thực hiện sau đó. Chú ý số nhiều: mỗi case có thể được theo sau bởi không hay nhiều lệnh (không chỉ là một lệnh). Việc thực thi tiếp tục cho tới khi hoặc là bắt gặp một lệnh break hoặc tất cả các lệnh xen vào đến cuối lệnh switch được thực hiện.Trường hợp default ở cuối cùng là một tùy chọn và được thực hiện nếu như tất cả các case trước đó không được so khớp.
Ví dụ, chúng ta phải phân tích cú pháp một phép toán toán học nhị hạng thành ba thành phần của nó và phải lưu trữ chúng vào các biến operator, operand1, và operand2. Lệnh switch sau thực hiện phép toán và lưu trữ kết quả vào result.
switch (operator) {
case '+': result = operand1 + operand2;
break;
case '-': result = operand1 - operand2;
break;
case '*': result = operand1 * operand2;
break;
case '/': result = operand1 / operand2;
break;
default: cout << "unknown operator: " << operator << '\n';
break;
}
Như đã được minh họa trong ví dụ, chúng ta cần thiết chèn một lệnh break ở cuối mỗi case. Lệnh break ngắt câu lệnh switch bằng cách nhảy đến điểm kết thúc của lệnh này. Ví dụ, nếu chúng ta mở rộng lệnh trên để cho phép x cũng có thể được sử dụng như là toán tử nhân, chúng ta sẽ có:
switch (operator) {
case '+': result = operand1 + operand2;
break;
case '-': result = operand1 - operand2;
break;
case 'x':
case '*': result = operand1 * operand2;
break;
case '/': result = operand1 / operand2;
break;
default: cout << "unknown operator: " << operator << '\n';
break;
}
Bởi vì case 'x' không có lệnh break nên khi case này được thỏa thì sự thực thi tiếp tục thực hiện các lệnh trong case kế tiếp và phép nhân được thi hành.
Chúng ta có thể quan sát rằng bất kỳ lệnh switch nào cũng có thể được viết như nhiều câu lệnh if-else. Ví dụ, lệnh trên có thể được viết như sau:
if (operator == '+')
result = operand1 + operand2;
else if (operator == '-')
result = operand1 - operand2;
else if (operator == 'x' || operator == '*')
result = operand1 * operand2;
else if (operator == '/')
result = operand1 / operand2;
else cout << "unknown operator: " << ch << '\n';
Người ta có thể cho rằng phiên bản switch là rõ ràng hơn trong trường hợp này. Tiếp cận if-else nên được dành riêng cho tình huống mà trong đó switch không thể làm được công việc (ví dụ, khi các điều kiện là phức tạp không thể đơn giản thành các đẳng thức toán học hay khi các nhãn cho các case không là các hằng số).
Bạn có thể đăng câu hỏi về bài học này ở đây