LẬP TRÌNH VỚI CẤU TRÚC LẶP
LÊ ĐỨC LONG-NGÔ QUỐC VIỆT 2011
NỘI DUNG
1. Nhắc lại các toán tử BIT 2. Ý nghĩa, cách hoạt động của vòng lặp 3. Lặp với lệnh for 4. Các lệnh ảnh hưởng đến lặp: break, continue. 5. Lặp với lệnh while. 6. Lặp với lệnh do… while. 7. Vòng lặp lồng nhau và so sánh các lệnh lặp
Ngô Quốc Việt-Lập trình cơ bản 2
NHẮC LẠI CÁC TOÁN TỬ BIT
Số nhị phân: một vị trí nhớ lưu trữ 8 bits. Ký hiệu
số nhị phân 01100100b.
Nguồn: O’Reilly 2003
Ngô Quốc Việt-Lập trình cơ bản 3
Toán tử BIT
Ngô Quốc Việt-Lập trình cơ bản 4
Toán tử & BIT
Kết quả của 45 & 71 là 41 ?.
Cần phân biệt && và &. Bài tập ngắn: viết hàm kiểm tra chẵn lẻ dựa trên &.
Ngô Quốc Việt-Lập trình cơ bản 5
Toán tử OR BIT (|)
Ngô Quốc Việt-Lập trình cơ bản 6
Toán tử XOR BIT (^)
Ngô Quốc Việt-Lập trình cơ bản 7
Toán tử left và right shift
Ngô Quốc Việt-Lập trình cơ bản 8
Ý nghĩa và sử dụng lệnh lặp Lặp: thực hiện một thao tác / hành động một số lần nhất định. Ví dụ: hít đất 20 cái; hát điệp khúc 2 lần; chạy quanh sân 10 vòng; Tính dãy Fibonacci với n = 100; Tính giai thừa của 1000;
Viết 100 lệnh hay 1000 lệnh “giống nhau”? Nnlt trình phải hỗ trợ làm điều này các lệnh
lặp.
Lệnh lặp thực hiện một khối lệnh với số lần lặp nhất định, hoặc khi chưa thoả điều kiện nào đó.
Ngô Quốc Việt-Lập trình cơ bản 9
Xét bài toán tính n!
Input: số nguyên dương n Output: giá trị của n!
Thuật giải thông thường
Bước 1: Gán gt = 1 Bước 2.1: Gán gt = gt * 1 = 1 Bước 2.2: Gán gt = gt * 2 = 1 * 2 Bước 2.3: Gán gt = gt * 3 = 1 * 2 * 3 Bước 2.4: Gán gt = gt * 4 = 1 * 2 * 3 * 4 …. Bước 2.i: Gán gt = gt * i = 1 * 2 * 3 * 4 * … * i … Bước 2.n: Gán gt = gt * n = 1 * 2 * 3 * 4 * … n Xuất giá trị gt
Ngô Quốc Việt-Lập trình cơ bản 10
Phân biệt các lệnh lặp
Lệnh lặp for: số lần lặp biết trước. Lệnh lặp while: lặp khi điều kiện lặp còn thỏa
hoặc lặp theo số lần biết trước (giống for).
Lệnh lặp do... while: giống lệnh lặp while nhưng
điều kiện lặp đặt ở cuối vòng lặp.
Lệnh lặp foreach: lặp theo các đối tượng trong
một tập hợp (khảo sát sau).
Ngô Quốc Việt-Lập trình cơ bản 11
Cấu trúc lặp for
Số lần lặp xác định trước. Dùng một biến đếm để
xác định số lần lặp đã làm
Ngô Quốc Việt-Lập trình cơ bản 12
Cấu trúc lặp for
Trường hợp lặp 1 câu lệnh
for(khởi tạo các biến đếm; kiểm tra số lần lặp; cập nhật các biến đếm số lần lặp)
câu lệnh;
Trường hợp lặp nhiều câu lệnh
for(khởi tạo các biến đếm; kiểm tra số lần lặp; cập nhật các biến đếm số lần lặp) {
lệnh 1; lệnh 2; lệnh 3;
// các lệnh trong khối lệnh }
Ngô Quốc Việt-Lập trình cơ bản 13
Cấu trúc lặp for
“khởi tạo các biến đếm”: các lệnh chỉ được chạy
đúng một lần trong lệnh for.
“kiểm tra số lần lặp” biểu thức logic: được kiểm tra khi mỗi khi khối lệnh được thực hiện xong.
“cập nhật các biến đếm số lần lặp” các lệnh
gán làm tăng/giảm giá trị biến đếm.
Ngô Quốc Việt-Lập trình cơ bản 14
Cấu trúc lặp for-ví dụ
#include "stdio.h" #include "conio.h"
void main() {
int n; printf("Nhap so nguyen n:"); scanf("%i",&n);
int gt = 1; for(int i = 1; i <= n; i++)
gt = gt * i; printf("n! = %i",gt); getch();
}
Ngô Quốc Việt-Lập trình cơ bản 15
Cấu trúc lặp for-ví dụ Tính tổng các số lẻ từ 0 đến n (giá trị nhập vào)
#include
int iDem, iN, iTongLe = 0; printf("Nhap vao so n: \n"); scanf("%d", &iN); iTongLe = 0; for(iDem = 0; iDem <= iN; iDem++) {
if (iDem % 2 != 0)
//neu iDem la so le
iTongLe= iTongLe + iDem;
} printf("Tong: %d", iTongLe); getch ();
}
Ngô Quốc Việt-Lập trình cơ bản 16
Cấu trúc lặp for-ví dụ
Lặp với biến đếm giảm - Ví dụ tính tổng các số lẻ
#include
int iDem, iN, iTongLe = 0; printf("Nhap vao so n: \n"); scanf("%d", &iN); iTongLe = 0; for(iDem = iN; iDem > 0; iDem--) {
if (iDem % 2 != 0)
//neu iDem la so le
iTongLe= iTongLe + iDem;
} printf("Tong: %d", iTongLe); getch ();
}
Ngô Quốc Việt-Lập trình cơ bản 17
Lệnh break trong vòng lặp Nhu cầu cần thoát khỏi vòng lặp khi số lần lặp chưa
đủ hay “điều kiện ngừng” chưa thoả mãn.
Cần thoát ra khi có “lỗi” hay “bất thường” trong
vòng lặp.
Ví dụ: cần đánh trứng 100 lần. Tuy nhiên ngừng đánh
trứng nếu “chén vỡ”.
for(int i = 0; i < 100; i ++) {
if(bChenVo == true) break; //Tiep tục đánh trứng
}
Ngô Quốc Việt-Lập trình cơ bản 18
Lệnh break trong vòng lặp
Lệnh break cần được kèm với lệnh if.
false
Ra khỏi lặp
Điều kiện lặp
Các lệnh trước lệnh break
true
Điều kiện break
false
Các lệnh sau break
Ngô Quốc Việt-Lập trình cơ bản 19
Lệnh break trong vòng lặp
Ví dụ: nhập N (input từ bàn phím) số nguyên từ bàn phím. Nếu gặp số
zero thì ngừng. Tính tổng các số đã nhập.
#include
int in, itong = 0;, iN printf("Nhap vao so luong so nguyen: \n"); scanf("%d", &iN);
for(int i = 0; i < iN; i ++) {
printf("Nhap vao 1 so nguyen: "); scanf("%d", &in); if (in == 0)
break; //in = 0 thoat vong lap
itong += in;
} printf("Tong: %d.\n", itong); getch();
}
Ngô Quốc Việt-Lập trình cơ bản 20
Lệnh continue trong vòng lặp
Dùng để không thực hiện các lệnh còn lại trong
lần lặp hiện tại, và quay trở lại đầu vòng lặp
false
Điều kiện lặp
Ra khỏi lặp
Các lệnh trước lệnh continue
true
continue
Điều kiện continue
false Các lệnh sau continue
Ngô Quốc Việt-Lập trình cơ bản 21
Lệnh continue trong vòng lặp
Lệnh continue cần được kèm với lệnh if, hoặc
lệnh lựa chọn switch.
Ví dụ: cần xếp 10000 trứng vào các hộp. Bỏ qua
trứng hư, và tiếp tục với các trứng còn lại.
false
iTrung < 10000
Ngừng xếp trứng
true
continue
Trứng iTrung hư
false
Xếp iTrung vô hộp
Ngô Quốc Việt-Lập trình cơ bản 22
Lệnh continue trong vòng lặp
#include "stdio.h" #include "conio.h" void main() {
char sUname[20], sPword[20]; int iSolan; printf("Nhap username/password: \n"); scanf("%s %s",&sUname, &sPword); for(iSolan = 0; iSolan < 3; iSolan ++) {
if(sUname != “abcde” || sPword != “12345”)
continue;
} if(iSolan == 3)
printf(“Ban da nhap sai uname, pword sai 3 lan\n”);
getch();
}
Ngô Quốc Việt-Lập trình cơ bản 23
Cấu trúc lặp while
Viết chương trình tìm n sao cho:
n! <= m (nhập
vào)
Không thể sử dụng cấu trúc for vì không biết số lần lặp
Ngô Quốc Việt-Lập trình cơ bản 24
Cấu trúc lặp while
while (điều kiện lặp) {
lệnh 1; lệnh 2; // .....
} điều kiện lặp biểu thức logic
Ngô Quốc Việt-Lập trình cơ bản 25
Cấu trúc lặp while
#include "stdio.h" #include "conio.h"; void main() {
int m; printf("Nhap m:"); scanf("%i",&m); int n = 1, gt = 1; while (gt <= m) {
n++; gt = gt * n;
} printf("n = %i",n - 1); getch();
}
Ngô Quốc Việt-Lập trình cơ bản 26
Cấu trúc lặp while
Biểu thức: có thể là một biểu thức hoặc nhiều biểu thức con. Nếu là nhiều biểu thức con thì cách nhau bởi dấu phẩy (,) và tính đúng sai của biểu thức được quyết định bởi biểu thức con cuối cùng.
Trong thân while (khối lệnh) có thể chứa một hoặc
nhiều cấu trúc điều khiển khác.
Trong thân while có thể sử dụng lệnh continue để chuyển đến đầu vòng lặp (bỏ qua các câu lệnh còn lại trong thân).
Muốn thoát khỏi vòng lặp while tùy ý có thể dùng các
lệnh break, goto, return như lệnh for .
Ngô Quốc Việt-Lập trình cơ bản 27
Cấu trúc lặp do ... while
Lặp không xác định số lần lặp. Tương tự lặp while, nhưng <điều kiện lặp> được
đặt cuối vòng lặp. Có lợi gì?
Ý nghĩa logic: cần phải làm gì đó trước, rồi kiểm tra nếu thầy chưa thỏa thì làm lại. Ví dụ: kiểm tra user name / password (cần nhập trước mới dữ liệu để kiểm tra) cho đến khi nào nhập đúng.
Ngô Quốc Việt-Lập trình cơ bản 28
Cấu trúc lặp do ... while
do {
lệnh 1; lệnh 2; // .....
} while (điều kiện lặp);
điều kiện lặp biểu thức logic
Biểu thức logic: có thể chứa nhiều biểu thức logic. Mỗi biểu thức cách nhau dấu phẩy. Chỉ xét điều kiện của biểu thức logic cuối cùng.
Ngô Quốc Việt-Lập trình cơ bản 29
Cấu trúc lặp do ... while-Ví dụ
#include
int in; do {
printf("Nhap vao password: \n"); scanf("%d", &in);
} while (in != PASSWORD)
}
Ngô Quốc Việt-Lập trình cơ bản 30
Vòng lặp lồng nhau
Cho phép trong một vòng lặp có một hay nhiều
vòng lặp khác.
Ví dụ: hãy vẽ hình chữ nhật sau x+++++++++++++++x x+++++++++++++++x x+++++++++++++++x x+++++++++++++++x x+++++++++++++++x x+++++++++++++++x
Ngô Quốc Việt-Lập trình cơ bản 31
switch, break và continue
Ngô Quốc Việt-Lập trình cơ bản 32
Vòng lặp lồng nhau
#include
int i, ij, iDai, iRong; printf("Nhap vao so ky tu cho chieu dai: \n"); scanf("%d", &iDai); printf(" Nhap vao so ky tu cho chieu rong : \n"); scanf("%d", &iRong); for (i = 0; i < iRong; i++) {
for (ij = 0; ij < iDai; ij++)
printf("*");
printf("\n"); //xuong dong khi in xong 1 hang
} getch();
}
Ngô Quốc Việt-Lập trình cơ bản 33
for vs. while
Ngô Quốc Việt-Lập trình cơ bản 34
Tóm tắt các lệnh lặp
Vòng lặp for thường sử dụng khi biết được số lần
lặp xác định.
Vòng lặp while, do…while sử dụng khi không
biết rõ số lần lặp
Khi gọi vòng lặp while, do…while, nếu biểu thức sai vòng lặp while sẽ không được thực hiện lần nào nhưng vòng lặp do…while thực hiện được 1 lần
Số lần thực hiện ít nhất của while là 0 và của
do…while là 1
Ngô Quốc Việt-Lập trình cơ bản 35
Bài tập
1. Viết lưu đồ và chương trình tính tổ hợp N chập
K (kiểm tra K <= N). Trong đó
2. Viết chương trình tính giá trị của đa thức. Cho phép nhập x, n, và các ai (0 i n) từ bàn phím
3. Viết chương trình vẽ một tam giác đều (có độ dài
cạnh nhập từ bàn phím) bằng các dấu *.
Ngô Quốc Việt-Lập trình cơ bản 36
Bài tập
4. Viết chương trình tính
(n
dấu căn)
5. Viết chương trình tính
6. Viết chương trình tính mỗi
loại trâu (đứng,
nằm, già) theo bài vè sau
Trăm trâu, trăm cỏ Trâu đứng ăn năm Trâu nằm ăn ba Ba trâu già ăn một
Ngô Quốc Việt-Lập trình cơ bản 37
CÁM ƠN ĐÃ THEO DÕI
LÊ ĐỨC LONG-NGÔ QUỐC VIỆT 2011