bai giang 3

30
Cu trúc lp Cu trúc lp Ngôn NgLp Trình C++

Upload: nbb3i

Post on 21-Jun-2015

657 views

Category:

Education


2 download

TRANSCRIPT

Page 1: Bai Giang 3

Cấu trúc lặpCấu trúc lặp

Ngôn Ngữ Lập TrìnhC++

Page 2: Bai Giang 3

2Vòng lặp

Đề mụcĐề mục

Khái niệm về vòng lặpCâu lệnh while

Vòng lặp thực hiện các công việc giống nhauVòng lặp cộng dồnVòng lặp không biết trước số lần lặpVòng lặp nhập dữ liệu tuỳ biến

Khái niệm về vòng lặpCâu lệnh while

Vòng lặp thực hiện các công việc giống nhauVòng lặp cộng dồnVòng lặp không biết trước số lần lặpVòng lặp nhập dữ liệu tuỳ biến

Page 3: Bai Giang 3

3Vòng lặp

Khái niệm về vòng lặpKhái niệm về vòng lặp

Cấu trúc tuần tự : Các câu lệnh được thực hiện lần lượt.Cấu trúc rẽ nhánh (if/switch) : Các câu lệnh được thực hiệnphụ thuộc vào điều kiệnCấu trúc lặp : Các câu lệnh được thực hiện lặp đi lặp lại.Ví dụ:

Tính lương cho tất cả các công nhân trong một công tyHiển thị 100 kí tự ‘*’ ra màn hình

Sự lặp lại của một dãy các bước trong chương trình gọi làvòng lặp (loop)Các cấu trúc lặp trong C++ : while, for và do-while

Cấu trúc tuần tự : Các câu lệnh được thực hiện lần lượt.Cấu trúc rẽ nhánh (if/switch) : Các câu lệnh được thực hiệnphụ thuộc vào điều kiệnCấu trúc lặp : Các câu lệnh được thực hiện lặp đi lặp lại.Ví dụ:

Tính lương cho tất cả các công nhân trong một công tyHiển thị 100 kí tự ‘*’ ra màn hình

Sự lặp lại của một dãy các bước trong chương trình gọi làvòng lặp (loop)Các cấu trúc lặp trong C++ : while, for và do-while

Page 4: Bai Giang 3

4Vòng lặp

Vòng lặp thực hiện các công việc giống nhauVòng lặp thực hiện các công việc giống nhau

Ví dụ 1: In ra màn hình 100 kí tự ‘*’Phân tích:

Số kí tự in ra màn hình lúc đầu bằng 0Trong khi số kí tự đã in ra màn hình chưa đạt tới 100 thì

• In ra kí tự ‘*’• Tăng số kí tự đã in lên 1

Cài đặt:dem = 0;while (dem < 100){

cout<<‘*’;dem = dem + 1;

}

Ví dụ 1: In ra màn hình 100 kí tự ‘*’Phân tích:

Số kí tự in ra màn hình lúc đầu bằng 0Trong khi số kí tự đã in ra màn hình chưa đạt tới 100 thì

• In ra kí tự ‘*’• Tăng số kí tự đã in lên 1

Cài đặt:dem = 0;while (dem < 100){

cout<<‘*’;dem = dem + 1;

}

Page 5: Bai Giang 3

5Vòng lặp

Vòng lặp thực hiện các công việc giống nhauVòng lặp thực hiện các công việc giống nhau

Giải thích :dem = 0; // Khởi tạo biến demKiểm tra điều kiện (dem < 100) là đúng, vậy

In ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 1

Kiểm tra điều kiện (dem < 100) là đúng, vậyIn ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 2

Giải thích :dem = 0; // Khởi tạo biến demKiểm tra điều kiện (dem < 100) là đúng, vậy

In ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 1

Kiểm tra điều kiện (dem < 100) là đúng, vậyIn ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 2

Page 6: Bai Giang 3

6Vòng lặp

Vòng lặp thực hiện các công việc giống nhauVòng lặp thực hiện các công việc giống nhau

Giải thích :Kiểm tra điều kiện (dem < 100) là đúng, vậy

In ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 99

Kiểm tra điều kiện (dem < 100) là đúng, vậyIn ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 100

Kiểm tra điều kiện (dem < 100) là sai, vậyRa khỏi vòng lặp

Giải thích :Kiểm tra điều kiện (dem < 100) là đúng, vậy

In ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 99

Kiểm tra điều kiện (dem < 100) là đúng, vậyIn ra kí tự ‘*’Tăng biến dem lên 1, như vậy dem = 100

Kiểm tra điều kiện (dem < 100) là sai, vậyRa khỏi vòng lặp

Page 7: Bai Giang 3

7Vòng lặp

Vòng lặp thực hiện các công việc giống nhauVòng lặp thực hiện các công việc giống nhau

Ví dụ 2 : Tính lương cho 10 công nhân dựa trên sốsản phẩm (mỗi sản phẩm được trả 5 nghìn đồng)dem_cn = 0;while (dem_cn < 10){

cout<<“So san pham lam duoc : ";cin>>SoSP;Luong = SoSP * 5;cout<<“Luong cua ban la : "<<Luong<<" nghin dong"<<endl;dem_cn++;

} // end while

Ví dụ 2 : Tính lương cho 10 công nhân dựa trên sốsản phẩm (mỗi sản phẩm được trả 5 nghìn đồng)dem_cn = 0;while (dem_cn < 10){

cout<<“So san pham lam duoc : ";cin>>SoSP;Luong = SoSP * 5;cout<<“Luong cua ban la : "<<Luong<<" nghin dong"<<endl;dem_cn++;

} // end while

Page 8: Bai Giang 3

8Vòng lặp

Vòng lặp thực hiện các công việc giống nhauVòng lặp thực hiện các công việc giống nhau

Giải thích :dem_cn = 0; // Khởi tạo biến dem_cnKiểm tra điều kiện (dem_cn < 10) là đúng, vậy

Thực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 1;

Kiểm tra điều kiện (dem_cn < 10) là đúng, vậyThực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 2;

Giải thích :dem_cn = 0; // Khởi tạo biến dem_cnKiểm tra điều kiện (dem_cn < 10) là đúng, vậy

Thực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 1;

Kiểm tra điều kiện (dem_cn < 10) là đúng, vậyThực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 2;

Page 9: Bai Giang 3

9Vòng lặp

Vòng lặp thực hiện các công việc giống nhauVòng lặp thực hiện các công việc giống nhau

Giải thích :Kiểm tra điều kiện (dem_cn < 10) là đúng, vậy

Thực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 9;

Kiểm tra điều kiện (dem_cn < 10) là đúng, vậyThực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 10;

Kiểm tra điều kiện (dem_cn < 10) là sai, vậyRa khỏi vòng lặp

Giải thích :Kiểm tra điều kiện (dem_cn < 10) là đúng, vậy

Thực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 9;

Kiểm tra điều kiện (dem_cn < 10) là đúng, vậyThực hiện các câu lệnh nhập số sản phẩm và tính lươngdem_cn = dem_cn + 1 vậy dem_cn = 10;

Kiểm tra điều kiện (dem_cn < 10) là sai, vậyRa khỏi vòng lặp

Page 10: Bai Giang 3

10Vòng lặp

Sơ đồ minh hoạSơ đồ minh hoạ

true

dem_cn < 10false

Đọc dữ liệu

Tính và hiển thị lương

Tăng giá trị biến dem_cn

while

Page 11: Bai Giang 3

11Vòng lặp

Câu lệnh whileCâu lệnh while

Cú phápwhile (biểu thức logic)

<câu lệnh>; // hoặc <khối lệnh>Quá trình thực hiện của while

Kiểm tra điều kiện• Nếu điều kiện đúng thì thực hiện câu lệnh. Sau khi thực hiện xong câu lệnh lại

quay lại kiểm tra điều kiện…• Nếu điều kiện sai thì thoát khỏi vòng lặp.

Cú phápwhile (biểu thức logic)

<câu lệnh>; // hoặc <khối lệnh>Quá trình thực hiện của while

Kiểm tra điều kiện• Nếu điều kiện đúng thì thực hiện câu lệnh. Sau khi thực hiện xong câu lệnh lại

quay lại kiểm tra điều kiện…• Nếu điều kiện sai thì thoát khỏi vòng lặp.

Page 12: Bai Giang 3

12Vòng lặp

Biến điều khiểnBiến điều khiển

Các biến như dem, dem_cn gọi là biến điều khiểnvòng lặpGiá trị của biến điều khiển vòng lặp sẽ quyết địnhvòng lặp có tiếp tục hay khôngCó 3 bước liên quan đến biến điều khiển

Khởi tạoKiểm traCập nhật giá trị

Các biến như dem, dem_cn gọi là biến điều khiểnvòng lặpGiá trị của biến điều khiển vòng lặp sẽ quyết địnhvòng lặp có tiếp tục hay khôngCó 3 bước liên quan đến biến điều khiển

Khởi tạoKiểm traCập nhật giá trị

Page 13: Bai Giang 3

13Vòng lặp

Bài tậpBài tập

Viết chương trình in ra các số từ -10 đến 10, mỗi sốtrên 1 dòng.Viết chương trình in ra các số từ 1 đến 20 và căn bậc2 của chúng, mỗi cặp giá trị trên 1 dòng.

Viết chương trình in ra các số từ -10 đến 10, mỗi sốtrên 1 dòng.Viết chương trình in ra các số từ 1 đến 20 và căn bậc2 của chúng, mỗi cặp giá trị trên 1 dòng.

Page 14: Bai Giang 3

14Vòng lặp

Lời giảiLời giải

Viết chương trình in ra các số từ -10 đến 10, mỗi sốtrên 1 dòngPhân tích

so = -10;Trong khi (so <= 10)

• In ra so• Tăng so lên 1

Viết chương trình in ra các số từ -10 đến 10, mỗi sốtrên 1 dòngPhân tích

so = -10;Trong khi (so <= 10)

• In ra so• Tăng so lên 1

Page 15: Bai Giang 3

15Vòng lặp

Lời giảiLời giải

Viết chương trình in ra các số từ 1 đến 20 và căn bậc2 của chúng, mỗi cặp giá trị trên 1 dòng.Phân tích :

so = 1;Trong khi (so <= 20)

• In ra so và căn bậc 2 của so• Tăng so lên 1

Viết chương trình in ra các số từ 1 đến 20 và căn bậc2 của chúng, mỗi cặp giá trị trên 1 dòng.Phân tích :

so = 1;Trong khi (so <= 20)

• In ra so và căn bậc 2 của so• Tăng so lên 1

Page 16: Bai Giang 3

16Vòng lặp

Các toán tử tăng và giảmCác toán tử tăng và giảm

Toán tử tăng 1 đơn vị ++i++ : Tính toán rồi mới tăng i++i : Tăng i rồi mới tính toán

Toán tử giảm 1 đơn vị --i-- : Tính toán rồi mới giảm i--i : Giảm i rồi mới tính toán

Ví dụ: i = 3k = i ++ ; // gán giá trị 3 cho k rồi tăng i lên 1 là 4k = ++ i ; // tăng i lên 1 là 5 rồi gán 5 cho k k = i -- ; // gán giá trị 5 cho k và giảm i đi 1 còn 4k = -- i ; // giảmg i đi 1 còn 3 và gán 3 cho

Toán tử tăng 1 đơn vị ++i++ : Tính toán rồi mới tăng i++i : Tăng i rồi mới tính toán

Toán tử giảm 1 đơn vị --i-- : Tính toán rồi mới giảm i--i : Giảm i rồi mới tính toán

Ví dụ: i = 3k = i ++ ; // gán giá trị 3 cho k rồi tăng i lên 1 là 4k = ++ i ; // tăng i lên 1 là 5 rồi gán 5 cho k k = i -- ; // gán giá trị 5 cho k và giảm i đi 1 còn 4k = -- i ; // giảmg i đi 1 còn 3 và gán 3 cho

Page 17: Bai Giang 3

17Vòng lặp

Các toán tử gộpCác toán tử gộp

Một số ví dụ minh hoạa + = b a = a + ba - = b a = a – ba * = b a = a * ba / = b a = a / ba & = b a = a & b

Một số ví dụ minh hoạa + = b a = a + ba - = b a = a – ba * = b a = a * ba / = b a = a / ba & = b a = a & b

Page 18: Bai Giang 3

18Vòng lặp

Vòng lặp cộng dồnVòng lặp cộng dồn

Ví dụ : Mở rộng bài toán tính lương công nhânNhập số sản phẩm mà mỗi công nhân làm đượcTính lương cho công nhân đó (1 sp = 5000 đ)Tính tổng lương của các công nhân

Ví dụ : Mở rộng bài toán tính lương công nhânNhập số sản phẩm mà mỗi công nhân làm đượcTính lương cho công nhân đó (1 sp = 5000 đ)Tính tổng lương của các công nhân

Page 19: Bai Giang 3

19Vòng lặp

Bài toán : Tính LươngBài toán : Tính Lương

Phân tích bài toánDữ liệu vào :

• Số lượng công nhân• Số lượng sản phẩm mà từng công nhân làm được

Dữ liệu ra : • Số tiền lương phải trả cho từng công nhân• Tổng lương phải trả cho tất cả các công nhân

Phân tích bài toánDữ liệu vào :

• Số lượng công nhân• Số lượng sản phẩm mà từng công nhân làm được

Dữ liệu ra : • Số tiền lương phải trả cho từng công nhân• Tổng lương phải trả cho tất cả các công nhân

Page 20: Bai Giang 3

20Vòng lặp

Bài toán : Tính LươngBài toán : Tính Lương

Thiết kế thuật toánNhập số lượng công nhânKhởi tạo giá trị tổng lương cho tất cả các công nhân là 0Với mỗi công nhân

• Nhập số sản phẩm mà công nhân làm được• Tính số tiền lương phải trả cho công nhân• Hiển thị số tiền phải trả cho công nhân• Thêm vào tổng lương số tiền lương của công nhân vừa tính

Hiển thị tổng lương phải trả cho tất cả các công nhân

Thiết kế thuật toánNhập số lượng công nhânKhởi tạo giá trị tổng lương cho tất cả các công nhân là 0Với mỗi công nhân

• Nhập số sản phẩm mà công nhân làm được• Tính số tiền lương phải trả cho công nhân• Hiển thị số tiền phải trả cho công nhân• Thêm vào tổng lương số tiền lương của công nhân vừa tính

Hiển thị tổng lương phải trả cho tất cả các công nhân

Page 21: Bai Giang 3

21Vòng lặp

Bài toán : Tính LươngBài toán : Tính Lương

Làm mịn thuật toán cho bước 2 và 3Tổng Lương = 0 ;Đếm = 0;Trong khi (Đếm < Số công nhân)

• Nhập số lượng sản phẩm• Tính số tiền lương phải trả

– Lương = Số sản phẩm * 5 (nghìn đồng)• Hiển thị số tiền phải trả• Thêm vào tổng lương

– Tổng Lương = Tổng Lương + Lương;

Làm mịn thuật toán cho bước 2 và 3Tổng Lương = 0 ;Đếm = 0;Trong khi (Đếm < Số công nhân)

• Nhập số lượng sản phẩm• Tính số tiền lương phải trả

– Lương = Số sản phẩm * 5 (nghìn đồng)• Hiển thị số tiền phải trả• Thêm vào tổng lương

– Tổng Lương = Tổng Lương + Lương;

Page 22: Bai Giang 3

22Vòng lặp

Bài toán : Tính LươngBài toán : Tính Lương

Cài đặt#include <iostream.h>

void main(){

// Khai báo các biếnint SoCN;int SoSP;int Luong;int TongLuong;int Dem;

// Nhập vào số lượng công nhâncout<<"Nhap vao so cong nhan: ";cin>>SoCN;

//Khởi tạo các biếnDem = 0;TongLuong=0;

Cài đặt#include <iostream.h>

void main(){

// Khai báo các biếnint SoCN;int SoSP;int Luong;int TongLuong;int Dem;

// Nhập vào số lượng công nhâncout<<"Nhap vao so cong nhan: ";cin>>SoCN;

//Khởi tạo các biếnDem = 0;TongLuong=0;

Page 23: Bai Giang 3

23Vòng lặp

Bài toán : Tính LươngBài toán : Tính Lươngwhile (Dem < SoCN){

//Nhập số sản phẩm cho 1 công nhâncout<<"Nhap so san pham: ";cin>>SoSP;

//Tính lương phải trả cho công nhân nàyLuong = SoSP * 5;cout<<"Luong: "<<Luong<<" nghin dong"<<endl;

//Thêm vào tổng lươngTongLuong += Luong;

//Tăng biến ĐếmDem++;

} // end while

//Hiển thị tổng lương phải trảcout<<“Tong luong: "<<TongLuong<<" nghin dong"<<endl;

}

while (Dem < SoCN){

//Nhập số sản phẩm cho 1 công nhâncout<<"Nhap so san pham: ";cin>>SoSP;

//Tính lương phải trả cho công nhân nàyLuong = SoSP * 5;cout<<"Luong: "<<Luong<<" nghin dong"<<endl;

//Thêm vào tổng lươngTongLuong += Luong;

//Tăng biến ĐếmDem++;

} // end while

//Hiển thị tổng lương phải trảcout<<“Tong luong: "<<TongLuong<<" nghin dong"<<endl;

}

Page 24: Bai Giang 3

24Vòng lặp

Vòng lặp không biết trước số lần lặpVòng lặp không biết trước số lần lặp

Bài toán : Mô phỏng hiện tượng rơi tự do của một vậtLập một bảng cho biết độ cao của vật sau mỗi giây

Phân tích :Input : Độ cao ban đầu của vậtOutput : Bảng độ cao sau mỗi giâyTrong khi vật rơi, độ cao mà nó đã rơi qua được tính theocông thức : khoảng cách = ½ gt2 (g = 9.80665)Như vậy sau một thời gian t, độ cao của vật so với mặtđất là : Độ cao ban đầu - độ cao đã rơi sau thời gian t

Bài toán : Mô phỏng hiện tượng rơi tự do của một vậtLập một bảng cho biết độ cao của vật sau mỗi giây

Phân tích :Input : Độ cao ban đầu của vậtOutput : Bảng độ cao sau mỗi giâyTrong khi vật rơi, độ cao mà nó đã rơi qua được tính theocông thức : khoảng cách = ½ gt2 (g = 9.80665)Như vậy sau một thời gian t, độ cao của vật so với mặtđất là : Độ cao ban đầu - độ cao đã rơi sau thời gian t

Page 25: Bai Giang 3

25Vòng lặp

Bài toán mô phỏng rơi tự doBài toán mô phỏng rơi tự do

Thiết kế thuật toánNhập dữ liệu độ cao ban đầuLập bảng cho biết độ cao của vật sau mỗi giây

Làm mịn bước lập bảngKhởi tạo độ cao hiện tại của vật là độ cao ban đầuKhởi tạo thời gian là 0Trong khi (độ cao hiện tại > 0)

• Hiển thị thời gian và độ cao hiện tại• Tăng thời gian lên 1 (giây)• Tính lại độ cao hiện tại

Thiết kế thuật toánNhập dữ liệu độ cao ban đầuLập bảng cho biết độ cao của vật sau mỗi giây

Làm mịn bước lập bảngKhởi tạo độ cao hiện tại của vật là độ cao ban đầuKhởi tạo thời gian là 0Trong khi (độ cao hiện tại > 0)

• Hiển thị thời gian và độ cao hiện tại• Tăng thời gian lên 1 (giây)• Tính lại độ cao hiện tại

Page 26: Bai Giang 3

26Vòng lặp

Bài toán mô phỏng rơi tự doBài toán mô phỏng rơi tự do

Cài đặt#include <iostream.h>#include <iomanip.h>

void main(){

// Khai bao hang va bienconst float g = 9.80655;float do_cao_ban_dau;float thoi_gian;float do_cao_hien_tai;

// Nhap du lieucout<<"Nhap do cao ban dau cua vat : ";cin>>do_cao_ban_dau;

Cài đặt#include <iostream.h>#include <iomanip.h>

void main(){

// Khai bao hang va bienconst float g = 9.80655;float do_cao_ban_dau;float thoi_gian;float do_cao_hien_tai;

// Nhap du lieucout<<"Nhap do cao ban dau cua vat : ";cin>>do_cao_ban_dau;

Page 27: Bai Giang 3

27Vòng lặp

Bài toán mô phỏng rơi tự doBài toán mô phỏng rơi tự do

Cài đặt// Lap bang do caocout<<setw(10)<<"Thoi gian"<<setw(8)<<"Do cao"<<endl;thoi_gian = 0;do_cao_hien_tai = do_cao_ban_dau;

cout.setf(ios::fixed);cout.precision(2);while (do_cao_hien_tai > 0){

cout<<setw(10)<<thoi_gian<<setw(8)<<do_cao_hien_tai<<endl;thoi_gian ++;do_cao_hien_tai = do_cao_ban_dau - 0.5*g*thoi_gian*thoi_gian;

}

cout<<endl;cout<<"CHAM DAT !!!";

}

Cài đặt// Lap bang do caocout<<setw(10)<<"Thoi gian"<<setw(8)<<"Do cao"<<endl;thoi_gian = 0;do_cao_hien_tai = do_cao_ban_dau;

cout.setf(ios::fixed);cout.precision(2);while (do_cao_hien_tai > 0){

cout<<setw(10)<<thoi_gian<<setw(8)<<do_cao_hien_tai<<endl;thoi_gian ++;do_cao_hien_tai = do_cao_ban_dau - 0.5*g*thoi_gian*thoi_gian;

}

cout<<endl;cout<<"CHAM DAT !!!";

}

Page 28: Bai Giang 3

28Vòng lặp

Bài toán mô phỏng rơi tự doBài toán mô phỏng rơi tự do

Kiểm tra chương trìnhNhap do cao ban dau cua vat : 100Thoi gian Do cao

0.00 100.001.00 95.102.00 80.393.00 55.874.00 21.55

CHAM DAT !!!

Kiểm tra chương trìnhNhap do cao ban dau cua vat : 100Thoi gian Do cao

0.00 100.001.00 95.102.00 80.393.00 55.874.00 21.55

CHAM DAT !!!

Page 29: Bai Giang 3

29Vòng lặp

Xuất dữ liệu có định dạngXuất dữ liệu có định dạng

Đặt độ rộng để hiển thị giá trịcout.width(4)cout<<setw(4)

Đặt dạng hiển thị của số thựccout.setf(ios::fixed) // hiển thị ở dạng dấu chấmcout.setf(ios::scientific) // hiển thị ở dạng khoa học

Đặt số chữ số sau dấu chấmcout.precision(2)cout<<setprecision(2)

Đặt độ rộng để hiển thị giá trịcout.width(4)cout<<setw(4)

Đặt dạng hiển thị của số thựccout.setf(ios::fixed) // hiển thị ở dạng dấu chấmcout.setf(ios::scientific) // hiển thị ở dạng khoa học

Đặt số chữ số sau dấu chấmcout.precision(2)cout<<setprecision(2)

Page 30: Bai Giang 3

30Vòng lặp

Vòng lặp không biết trước số lần lặpVòng lặp không biết trước số lần lặp

Mở rộng bài toán :Viết hàm để lập bảng độ cao sau từng giây. Hàm có đầuvào là độ cao ban đầu của vật.Sửa chương trình để cho phép in ra độ cao sau mộtkhoảng thời gian bất kỳ, thay vì sau mỗi giây.

Mở rộng bài toán :Viết hàm để lập bảng độ cao sau từng giây. Hàm có đầuvào là độ cao ban đầu của vật.Sửa chương trình để cho phép in ra độ cao sau mộtkhoảng thời gian bất kỳ, thay vì sau mỗi giây.