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 #include void main(void) {

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 #include void main(void) {

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 #include void main(void) {

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 # define PASSWORD “0123456789” void main(void) {

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 #include void main(void) {

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