Giới thiệu một số cấu trúc điều khiển

####Chào các bạn! Rất vui khi được gặp lại các bạn trong khóa học lập trình trực tuyến ngôn ngữ C++.

Như chúng ta đã tìm hiểu, khi chạy một chương trình C++, CPU bắt đầu thực thi các câu lệnh tại điểm trên cùng của hàm main, thực hiện lần lượt các câu lệnh từ trên xuống dưới, và kết thúc tại điểm dưới cùng của hàm main. Chuỗi các câu lệnh được CPU thực thi gọi là program’s path. Phần lớn các chương trình mà bạn từng thấy được thực thi theo dạng straight-line (tuần tự từ trên xuống dưới). Tuy nhiên, trong một số trường hợp, đây không phải là điều chúng ta muốn.

Ví dụ nếu chúng ta yêu cầu người dùng đưa ra một lựa chọn, và người dùng nhập vào lựa chọn không phù hợp, chúng ta nên yêu cầu người dùng đưa ra một lựa chọn khác. Với cấu trúc chương trình dạng straight-line, điều này là bất khả thi.

Một trường hợp khác, chúng ta muốn chương trình thực hiện lặp đi lặp lại một công việc nào đó với số lần thực hiện chưa biết trước. Ví dụ chúng ta muốn in ra điểm số của một trò chơi trên màn hình cho đến khi trò chơi kết thúc, chúng ta không thể biết chính xác thời điểm kết thúc trò chơi là khi nào.

Do đó, ngôn ngữ C++ cung cấp các cấu trúc điều khiển (control flow statements) nó cho phép lập trình viên thay đổi hướng đi của chương trình. Có một số dạng cấu trúc điều khiển khác nhau và mình sẽ giới thiệu sơ lược để các bạn có sự hình dung ban đầu.

###Halt

Cấu trúc điều khiển dừng (halt) là một cấu trúc thường gặp, nó yêu cầu chương trình ngừng làm việc ngay lập tức. Trong C++, cấu trúc Halt có thể được thực hiện thông qua hàm exit() trong thư viện cstdlib. Hàm exit nhận vào một giá trị số nguyên và nó sẽ được trả về cho hệ điều hành như một mã kết thúc chương trình, tương tự như giá trị trả về của hàm main.

Đây là đoạn chương trình mẫu cho việc thực hiện cấu trúc điều khiển Halt:

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
	cout << "This line is printed out." << endl;
	exit(-1); //Terminate and return -1 to operating system. 
	cout << "This line will never be printed out." << endl;

	system("pause");
	return 0;
}

###Jumps

Cấu trúc điều khiển tiếp theo mình muốn đề cập đến là Jump. Cấu trúc Jump không điều kiện khiến CPU nhảy đến thực thi một số các câu lệnh khác. goto, break, continue là các từ khóa được sử dụng trong cấu trúc Jump, chúng có kiểu Jump khác nhau, chúng ta sẽ được tìm hiểu chi tiết trong các bài học sắp tới.

###Cấu trúc rẽ nhánh có điều kiện

Cấu trúc rẽ nhánh có điều kiện khiến chương trình thay đổi hướng thực thi dựa trên giá trị của biểu thức điều kiện (hoặc các mệnh đề). Tiêu biểu cho cấu trúc rẽ nhánh là câu lệnh if.

int main()
{
	//do A

	if(expression)	
		//do B;
	else
		//do C;

	//do D

	return 0;
}

Chương trình này có 2 hướng có thể đi. Nếu biểu thức expression cho kết quả đúng (true), chương trình sẽ thực thi A rồi đến B và đến D. Nếu biểu thức expression cho kết quả sai (false), chương trình sẽ đi theo hướng A đến C rồi đến D. Cấu trúc này không còn dạng straight-line nữa mà là dạng cấu trúc rẽ nhánh (conditional branches).

###Cấu trúc vòng lặp (Loops)

Một cấu trúc vòng lặp khiến chương trình thực hiện lặp đi lặp lại một chuỗi các câu lệnh cho đến khi không còn thõa mãn một điều kiện nào đó.

int main()
{
	//do A
	//do B 0 or more times
	//do C
}

Chương trình này có thể thực hiện theo hướng ABC, ABBC, ABBBC, ABBB…BBBC, hoặc cũng có thể là AC. Như các bạn thấy, một lần nữa đây không phải là straight-line program, hướng thực thi các câu lệnh phụ thuộc vào số lần các câu lệnh trong vòng lặp được thực thi.

while, do…while, for là 3 cấu trúc vòng lặp mà ngôn ngữ C/C++ cung cấp. Chuẩn C++11 còn cung cấp cho chúng ta thêm cấu trúc vòng lặp tên là for each.

###Exceptions

Cuối cùng, exceptions là một cơ chế xử lý lỗi xảy ra bên trong hàm. Nếu một lỗi xảy ra bên trong hàm mà hàm không thể xử lý, hàm đó ném ra một ngoại lệ (exception). Điều này khiến chương trình nhảy đến khối lệnh chuyên dùng để xử lý ngoại lệ có kiểu tương ứng với ngoại lệ được hàm ném ra.

Xử lý ngoại lệ là một đặc trưng khá mới được hổ trợ trong ngôn ngữ C++.

###Kết luận

Mình vừa giới thiệu đến các bạn một số cấu trúc điều khiển thông dụng trong ngôn ngữ C++. Trong chương này, chúng ta sẽ tập trung nói về cấu trúc rẽ nhánh. Các phần còn lại sẽ được bàn đến trong các chương tiếp theo.


P/s: Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn

www.daynhauhoc.com


Link Videos khóa học

6 Likes

đề nghị diễn đàn cử ra 1 phát thanh viên để quay video cho khóa học này

Có khoá học trên Udemy mà bạn, đây là bản đọc thôi.

link đi, mình go liền

đợi thầy Đạt lâu quá, h cũng phải kiếm cái khác thôi

Giờ bạn ko đăng ký trc, giờ hết free rồi, bạn có visa hay paypal thì mua khoá học này với 25$

Linh đây: https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview

Anh Đạt còn cần ít kinh phí chứ (VD: bản quyền phần mềm, studio, máy, Mic,…)

Còn khoá miễn phí trên YouTube của anh Đạt (đây là khoá cũ năm 2013): Tổng hợp các videos C++ của Lê Trần Đạt ( khóa FREE )

P/S: Khoá này free nhé

1 Like

what? admin khóa này là… thầy Đạt. Ra lun rùi má ơi

Đây là lỗi gì v ad

Đào bới khiếp thật :’(

Lỗi có thể nằm ở code, environment, IDE, privileges, hay cả compiler nên quăng thông báo lỗi không thôi thì không ai biết đâu. Bạn post code lên sẽ rõ ràng hơn.

1 Like

code chương trình mẫu cho việc thực hiện cấu trúc điều khiển Halt í bạn

mình dùng bản visual 2017 nhé

Thì nó có exit(-1) rồi, trước cả lệnh system("pause"), cho nên nó sẽ thoát chương trình ngay lập tức chứ còn gì nữa

2 Likes

Vậy là bạn không đọc bài rồi
Hàm exit() sẽ trả về status code cho os để os biết được chương trình bảo dừng ngay lập tức và tình trạng chương trình.
status code = 0 tức chương trình không có lỗi. Ngược lại là có lỗi phát sinh
Để ý dòng The program ... has exited with code -1 giống với tham số -1 trong câu lệnh exit(-1)

2 Likes

bạn có thể giải thích cho mình lại con số giá trị trả về có ý nghĩa gì ko

Cái số đó gần như vô nghĩa nếu nó chỉ chạy rồi tắt (Chính nó là PID và PPID của chính nó).

Còn nếu nó được chạy trên một process khác, bạn có thể dùng nó để thực hiện các lệnh khác nhau.

Ví dụ trong VC++ ta sẽ có hàm ShellExecute, gọi một ứng dụng rồi chờ nó thoát, sau khi nó thoát (bằng bất cứ cách nào), nó sẽ trả về cho biến thực hiện hàm đó cái giá trị mà chương trình đó trả về, lúc đó tùy vào tình huống mà xử lí.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?