Upload
nbb3i
View
657
Download
2
Embed Size (px)
Citation preview
Cấu trúc lặpCấu trúc lặp
Ngôn Ngữ Lập TrìnhC++
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
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
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;
}
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
…
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
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
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;
…
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
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
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.
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ị
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.
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
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
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
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
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
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
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
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;
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;
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;
}
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
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
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;
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 !!!";
}
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 !!!
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)
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.