ksp gửi vào
- 111501 lượt xem
Giới thiệu
Hàm for có chức năng làm một vòng lặp. Vậy vòng lặp là gì? Hãy hiểu một cách đơn giản, nó làm đi làm lại một công việc có một tính chất chung nào đó. Chẳng hạn, bạn bật tắt một con LED thì dùng digitalWrite xuất HIGH delay rồi lại LOW rồi lại delay. Nhưng nếu bạn muốn làm nhiều hơn 1 con LED thì mọi đoạn code của bạn sẽ dài ra (không đẹp và khi chỉnh sửa thì chẳng lẻ ngồi sửa lại từng dòng?
Với 1 con led, bạn lập trình như thế này
digitalWrite(led1,HIGH); delay(1000); digitalWrite(led1,LOW); delay(1000);
Với 10 con led, nếu bạn không dùng for, đoạn code nó sẽ dài như thế này
digitalWrite(led1,HIGH); delay(1000); digitalWrite(led1,LOW); delay(1000); digitalWrite(led2,HIGH); delay(1000); digitalWrite(led2,LOW); delay(1000); ... digitalWrite(led10,HIGH); delay(1000); digitalWrite(led10,LOW); delay(1000);
Nếu như vậy thì bạn có còn muốn lập trình và suy nghĩ về một led ma trận có còn nữa không ? Chắc chắn là không rồi, vì vậy hàm for ra đời để giúp bạn nhìn cuộc sống một cách tươi đẹp hơn !
Bây giờ hãy lấy một ví dụ đơn giản như sau:
Tôi muốn xuất 10 chữ số (từ 1 - 10) ra Serial. Hãy giúp tôi lập trình trên Arduino để làm được việc ấy!
Nếu bạn chưa đọc bài này và cũng chưa biết kiến thức về for, bạn sẽ lập trình như sau:
void setup() { Serial.begin(9600); Serial.println(1); Serial.println(2); Serial.println(3); Serial.println(4); Serial.println(5); Serial.println(6); Serial.println(7); Serial.println(8); Serial.println(9); Serial.println(10); } void loop() { // không làm gì cả; }
Đoạn code khá dài và lặp đi lặp lại câu lệnh Serial.println
Nhưng sau khi biết về hàm for bạn chỉ cần một đoạn code cực kì ngắn như sau:
void setup(){ Serial.begin(9600); int i; for (i = 1;i<=10;i=i+1) { Serial.println(i); } } void loop(){ }
Cấu trúc
Theo quan điểm của tôi, nếu bạn chưa biết về vòng lặp hoặc hàm for, để hiểu được hàm for, bạn cần nắm được 4 phần:
- Hàm for là một vòng lặp có giới hạn - nghĩa là chắc chắn nó sẽ kết thúc (không sớm thi muộn).
- Nó sẽ bắt đầu từ một vị trí xác định và đi đến một vị trí kết thúc.
- Cứ mỗi bước xong, nó lại thực hiện một đoạn lệnh
- Sau đó, nó lại bước đi tiếp, nó có thể bước 1 bước hoặc nhiều bước, nhưng không được thay đổi theo thời gian.
Theo ví dụ trên, ta có đoạn code sử dụng hàm for như sau:
for (i = 1;i<=10;i = i + 1) { Serial.println(i); }
Hàm for trong ví dụ này sẽ :
- Chắc chắn nó sẽ xử lý đoạn code Serial.println(i); 10 lần
- Chạy từ vị trí xuất phát là 1, đến vị trí kết thúc là 10 // i = 1 ; i <= 10
- Cứ mỗi lần bước xong (tính luôn cả vị trí xuất phát tại thời điểm i = 1) thì nó lại chạy lệnh Serial.println(i);. Trong đó biến i, dân khoa học gọi là biến con chạy, còn tôi gọi là vị trí của thằng i
- Mỗi lần chạy xong, thằng i lại bước thêm 1 bước nữa. Chừng nào mà thằng i còn <= 10 thì nó còn quay về bước 3
Bạn có thấy nó dễ hiểu không? Bây giờ tôi sẽ nói nó theo một cách khoa học qua cú pháp của hàm for (tôi sẽ chia làm 2 loại để các bạn dễ dàng ứng dụng vào code của mình).
- For tiến (xuất phát từ một vị trí nhỏ chạy đến vị trí lớn hơn) <vị trí kết thúc> bé hơn <vị trí kết thúc>
for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> += <mỗi lần bước mấy bước>) { <đoạn câu lệnh>; }
- For lùi (xuất phát từ một vị trí lớn chạy về vị trí nhỏ hơn) <vị trí xuất phát> lớn hơn <vị trí kết thúc>
for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> -= <mỗi lần lùi mấy bước>) { <đoạn câu lệnh>; }
Và khi đã hiểu được một cách sâu sắc thì đây là cú pháp chính của hàm For:
for (<biến chạy> = <start>;<điều kiện>;<bước>) { //lệnh }
Xem thêm bài array để xem cách dùng for và array nhé!