Lặp dựa trên biến đếm Bài toán: • Cần nhập 10 giá trị số thực, sau đó tính giá trị trung bình của 10 giá trị trên gán total tổ ng điể m bằng 0 gán biể n để m sổ lầ n nhập điể m bằng 1
Trang 1Chương 5
Vòng lặp
while / do-while / for
Presenter:
Trang 2Learning outcomes
L.O.3.1 – Liệt kê được các kiểu điều khiển và vẽ sơ đồ mô
tả chúng
L.O.3.2 – Mô tả được được nguyên tắc kết hợp các kiểu
điều khiển để mô tả các giải thuật
L.O.3.3 – Hiện thực được các kiểu điều khiển bằng ngôn
ngữ C
L.O.3.4 – Sử dụng các cấu trúc điều khiển để giải quyết bài
toán thực tế
Trang 6 Có thể phân loại vòng lặp theo các tiêu chuẩn sau :
• Điều kiện : đi trước hoặc đi sau.
• Số lần lặp
Trang 8Vòng lặp while
Cú pháp : while ( condition ) statement
Nghĩa là : trong khi điều kiện condition còn đúng thì làm
Trang 9Vòng lặp while
Lưu đồ vận hành
condition
Statement
Sai
Đúng
Điều kiện đi trước
Kết thúc lặp
Trang 10Vòng lặp while
Trang 11Vòng lặp while
Trang 12Vòng lặp while
Trang 13Lặp dựa trên biến đếm
Bài toán:
• Cần nhập 10 giá trị số thực, sau đó tính giá trị trung bình của 10 giá trị trên
gán total (tổ ng điể m) bằng 0 gán biể n để m sổ lầ n nhập điể m bằng 1
while biể n để m nho hơn hoặc bằng 10
yểu cầ u người dùng nhập giá trị tiể p theo đọc giá trị
cộng giá trị này vào total cộng biể n để m lển 1
Trang 14Lặp dựa trên biến đếm
Kỹ thuật sử dụng một biến để đếm số lần lặp
Vòng lặp dừng khi biến đếm vượt quá một số cho trước
Gọi là lặp dựa trên biến đếm (counter-controlled
repitition)
Lặp hữu hạn vì biết trước số lần lặp
Hãy hiện thực đoạn mã giả trên vào chương trình mẫu
Trang 15Lặp dựa trên biến đếm
Trang 16Lặp dựa trên biến đếm
Trang 17Lặp dựa trên biến cờ
Bài toán:
• Viết ứng dụng tính điểm trung bình cho lớp, với số sinh viên ngẫu nhiên trong mỗi lần nhập điểm
Khác với bài toán trước:
• Chúng ta không biết trước số lần nhập
• Làm sao biết khi nào dừng nhập điểm?
Trang 18Lặp dựa trên biến cờ
Dùng biến cờ (sentinel) để báo kết thúc nhập
Giá trị biến cờ phải không lẫn lộn với giá trị nhập vào có nghĩa
• Điểm là số nguyên không âm
Trang 19Từ trên xuống, tinh chỉnh từng
bước
Kỹ thuật xây dựng ứng dụng có cấu trúc chặt chẽ
Trên là một câu lệnh thể hiện chức năng chung của ứng
dụng
xác định điể m trung bình cu a lớp
Chỉ thể hiện ứng dụng, chưa đủ để viết ứng dụng C#
Bắt đầu tinh chỉnh
Trang 20Từ trên xuống, tinh chỉnh từng
bước
Chia trên thành các tác vụ nhỏ hơn và liệt kê theo thứ tự
thực hiện
Bước tinh chỉnh đầu tiên:
khơ i tạo biể n nhập giá trị, tính tổ ng lại rổ i để m sổ điể m đã nhập
tính toán và in ra điể m trung bình
Mỗi lần tinh chỉnh mô tả cùng giải thuật, chỉ khác về mức
độ chi tiết
Ba bước chung: khởi tạo, nhập và xử lý biến, tính toán
và xuất kết quả
Trang 21Từ trên xuống, tinh chỉnh từng
Trang 22Từ trên xuống, tinh chỉnh từng
while người dùng chưa nhập biể n cờ
thểm điể m vào total cộng biể n để m lển 1 nhắ c người dùng nhập điể m tiể p nhập điể m tiể p (có thể là biể n cờ)
Trang 23Từ trên xuống, tinh chỉnh từng
in "Khổng thầ y điể m nhập"
Trang 24Từ trên xuống, tinh chỉnh từng
Trang 25Từ trên xuống, tinh chỉnh từng
bước
Trang 26Phép chia số nguyên
Ta đã biết rằng phép chia số nguyên trả về phần nguyên, lược bỏ phần thập phân
float average;
average = total / counter;
Dù average có kiểu float, phép chia vẫn không phải
số thập phân như mong đợi
Chuyển đổi tạm thời các giá trị của total và counter
thành kiểu float.
Trang 27Phép chia số nguyên
Toán tử ép kiểu một ngôi
average = ( float ) total / counter;
Tạo ra một bản sao total (ở bên phải toán tử) tạm có kiểu số thực dấu chấm động
Giá trị lưu trong total vẫn là số nguyên
Sử dụng toán tử ép kiểu gọi là chuyển đổi tường minh
Trang 28Toán tử gán phức
Một biểu thức
biể n = biể n toánTư biể uThức;
Nếu toánTử là một trong các phép toán +, -, *, /, %
Đều có thể viết lại dưới dạng
biể n toánTư = biể uThức;
Trang 30Toán tử tăng và giảm
C có hai toán tử để thêm hoặc bớt 1 vào giá trị của một biến kiểu số
Toán tử tăng ++
Toán tử giảm
Đặt toán tử ở trước số hạng gọi là prefix
Đặt toán tử ở sau số hạng gọi là postfix
Có sự khác nhau giữa prefix và postfix
Trang 31Toán tử tăng và giảm
// demonstrate postfix increment operator
Trang 32Vòng lặp while
Ví dụ
Tính tổng các số nguyên S = 1 + 2 + 3 + + n
Để có thể sử dụng vòng lặp, ta cần đưa công thức tính dãy về dạng “từng bước”: S(n) = G[S(n-1)]
Theo dạng này, muốn tính giá trị bước thứ n, phải có giá trị bước thứ (n-1)
Xuất phát của vòng lặp là từ bước n=0
Ta có thể viết lại tổng trên như sau:
S(n) = 1 + 2 + 3 + + (n-1) + n (1)mặt khác ta cũng có:
S(n-1) = 1 + 2 + + (n-2) + (n-1) (2)Vậy, từ (1) và (2) ta suy ra:
Trang 33Vòng lặp while
Trang 34Vòng lặp while
Ví dụ
Trang 35Vòng lặp do-while
Tương tự như câu lệnh while
Kiểm tra điều kiện lặp-tiếp tục sau khi thực hiện thân
Trang 36Vòng lặp do-while
Cú pháp và vận hành
Cú pháp : do statement while (condition) ;
Nghĩa là : làm phát biểu statement trước 1 lần, sau đó xét
• condition là biểu thức cho kết quả đúng/sai, đúng thì lặp, sai thì kết thúc.
• statement có thể là phát biểu ghép { }.
Vòng lặp do-while là vòng lặp có điều kiện đi sau và số lần lặp không biết trước
Trang 37Vòng lặp do-while
Lưu đồ vận hành
condition
Statement
Sai Đúng
Điều kiện đi sau
Trang 38Vòng lặp do-while
Trang 39Vòng lặp do-while
Ví dụ tính giai thừa
• Kiều kiện lặp:
(i<=n)
Trang 40Vòng lặp do-while
Code ví dụ tính giai thừa
Trang 41Vòng lặp for
Nhắc lại: lặp dựa trên biến đếm đòi hỏi:
• Biến điều khiển (biến đếm số lần lặp)
• Giá trị ban đầu của biến điều khiển
• Độ tăng (hoặc giảm) của biến điều khiển sau mỗi lần lặp
• Điều kiện lặp-tiếp tục xác định xem có tiếp tục lặp hay không
Trang 42Vòng lặp for
Trang 43Vòng lặp for
test the condition ?
Execute the statement (s)
Trang 44Vòng lặp for
C cung cấp câu lệnh lặp for
Xác định các yếu tố lặp dựa trên biến đếm chỉ trong một dòng
for ( int counter = 1; counter <= 10; counter++ )
từ khóa for biến
Trang 45Vòng lặp for
Cú pháp và vận hành
Cú pháp : for (init opt ; cond opt ; loop opt ) statement
Nghĩa là : làm phát biểu statement trong khi điều kiện
• init opt : là phát biểu khởi động vòng lặp.
• cond opt : là biểu thức luận lý quyết định lặp hay dừng.
• loop opt : là phát biểu điều khiển vòng lặp.
• statement :có thể là phát biểu ghép.
Vòng lặp for cho phép thực hiện vòng lặp có số lần lặp biết trước nếu dùng các dạng sau :
Trang 46Vòng lặp for
Lưu đồ vận hành
Init opt
Sai Đúng
Điều kiện đi trước
Statement loop
Kết thúc lặp
Trang 47Vòng lặp for
Trang 48Vòng lặp for
Trang 49Vòng lặp for
Gửi 1000 $ vào ngân hàng với lãi suất 5% Biết rằng số tiền nhận được sau mỗi năm tính theo công thức:
a = p(1 + r)n
Với p là số tiền gốc ban đầu, r là lãi suất, n là số năm
Hãy in ra số tiền trong 10 năm đầu
Trang 50Vòng lặp for
float amount, principal = 1000.0, rate = 0.05;
amount = principal*pow(1.0 + rate, year);
printf("%d\t%.3f\n", year, amount);
}
Trang 51Vòng lặp for
Trang 52Vòng lặp for
Trang 53Vòng lặp for
In các số theo thứ tự từ 10 đến 1
int i;
for(i = 10; i>= 1; i )
printf(“%d\n", i);
Trang 54Vòng lặp for
Điều gì xảy ra nếu viết
int i;
for(i = 10; i>= 1; i++)
printf(“%d\n", i);
Trang 55Vòng lặp for
In các số chẵn từ 20 đến 2
int i;
for(i = 20; i>= 2; i-=2)
printf(“%d\n", i);
Trang 56Các lệnh lặp lồng nhau
Trang 57Các lệnh lặp lồng nhau
int i;
for(i = 1; i<=100; i++) {
printf("Hello ");
if(i % 10 == 0) printf("\n");
}
Trang 58Các lệnh lặp lồng nhau
Trang 59Các lệnh lặp lồng nhau
Trang 60Các lệnh lặp lồng nhau
Trang 61Các lệnh lặp lồng nhau
Có thể sử dụng các lệnh for, while, do … while lồng nhau
Số cấp lồng nhau có thể tùy ý
Có thể sử dụng các lệnh for, while, do … while hỗn hợp với nhau
Trang 63 Dùng break trong while, for, do while, switch
để thoát lập tức khỏi vòng lặp
Thực hiện lệnh kế tiếp sau vòng lặp
Chủ yếu để thoát sớm khỏi vòng lặp
Trang 64 Dùng continue trong while, for, do while
Bỏ các câu lệnh còn lại trong thân vòng lặp
Thực hiện lần lặp tiếp theo
while và do while: kiểm tra điều kiện ngay
for: tăng biến đếm, rồi kiểm tra điều kiện
Trang 66Vòng lặp for
Ví dụ sắp thứ tự dãy
Trang 67Vòng lặp for
Nhập trị ban đầu và xử lý dãy
Một trong những ứng dụng phổ biến của for là dùng để xử
lý các vấn đề liên quan đến dãy (array)
Trang 68Vòng lặp for
Vòng lặp lồng nhau
Dùng 2 vòng for lồng nhau để nhập ma trận
Nhập
Trang 69Vòng lặp for
In ma trận
Dùng 2 vòng for lồng nhau để in ma trận
In m
a trận
Trang 70Vòng lặp for
Tính tổng ma trận
Dùng 2 vòng for lồng nhau để tính tổng 2 ma trận
Tính tổng
Trang 71A B A && B
False False false
Trang 74Toán tử điều kiện AND (&&)
Đảm bảo hai điều kiện phải cùng true thì mới thực hiện một luồng thực thi
if ( gender == FEMALE && age >= 65 )
seniorFemales++;
Khi một trong hai điều kiện là false, không tăng biến
seniorFemales
Trang 75Toán tử điều kiện OR (||)
Thực thi nếu chỉ cần một trong hai điều kiện là true
if ( ( semesterAverage >= 90 ) || ( finalExam >= 90 ) )
printf( "Student grade is A" );
Khi cả hai điều kiện đều sai thì mới không thực thi câu lệnh in ra console
Toán tử && có độ ưu tiên cao hơn toán tử ||, đều kết hợp từ trái qua
Trang 76Thứ tự ưu tiên
-1 ! unary - ++ từ phải sang trái
4 < <= > >= từ trái sang phải
8 = += -= *= /= từ phải sang trái
Trang 78true
Trang 81Ví dụ
Có trăm trâu trăm cỏ:
Trâu đứng ăn 5,
Trâu nằm ăn 3,
Trâu già 3 con ăn 1 bó,
Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu già!
Trang 83Ví dụ