NHẬP MÔN TIN HỌC CÁC CẤU TRÚC ĐIỀU KHIỂN

TS Đào Nam Anh

Tài liệu

Slides do TS.Đào Nam Anh thực hiện dựa trên tài liệu [1] và các mã nguồn [2]: 1. TS.Nguyễn Thị Thu Hà, TS.Nguyễn Hữu Quỳnh, TS.Nguyễn Thị Thanh Tân, Giáo trình Nhập môn tin học, Khoa CNTT, Đại học Điện lực, 2013

2. Programiz.com

CNTT

Nhập môn tin học

2

N

A

CÁC CẤU TRÚC ĐIỀU KHIỂN C P NH

U NG C

Y

CNTT

Nhập môn tin học

3

Nội dung

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Cấu trúc lựa chọn  Câu lệnh if  Câu lệnh if – else  Câu lệnh với nhiều lệnh if  Câu lệnh if lồng nhau  Câu lệnh switch.

 Vòng lặp

 Vòng lặp „for‟ trong C  Toán tử „phẩy‟  Vòng lặp lồng nhau  Vòng lặp „while‟ và vòng lặp „do-while‟

 Lệnh nhẩy

4

 Các lệnh „break‟, „continue‟ và „goto‟  Hàm „exit()‟.

GIỚI THIỆU

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Các cấu trúc lựa chọn cho phép chúng ta thay đổi luồng

chương trình. Dựa trên một điều kiện nào đó, một câu lệnh hay một chuỗi các câu lệnh có thể được thực hiện hoặc không.  Hầu hết các ngôn ngữ lập trình đều sử dụng lệnh if để đưa ra điều kiện. Nguyên tắc thực hiện như sau nếu điều kiện đưa ra là đúng (true), chương trình sẽ thực hiện một công việc nào đó, nếu điều kiện đưa ra là sai (false), chương trình sẽ thực hiện một công việc khác.

CNTT

Nhập môn tin học

5

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

n hay số lẻ, ta thực hiện như sau:

Nhập môn tin học

CNTT

6

Ví dụ : Để xác định một số là số 1. Nhập vào một số. 2. Chia số đó cho 2 để xác định số dư. 3. Nếu số dư của phép chia là 0, đó là số “Chẵn” HOẶC nếu số dư của phép chia khác 0, đó là số “Lẻ”. Bước 2 trong giải thuật trên kiểm tra phần dư của số đó khi chia cho 2 có bằng 0 không? Nếu đúng, ta thực hiện việc hiển thị thông báo đó là số chẵn. Nếu số dư đó khác 0, ta thực hiện việc hiển thị thông báo đó là số lẻ.

CÁC CẤU TRÚC ĐIỀU KHIỂN

Trong C một điều kiện được coi là đúng (true) khi nó có giá trị khác 0, là sai (false) khi nó có giá trị bằng 0. C cung cấp hai dạng câu lệnh lựa chọn:  Câu lệnh if  Câu lệnh switch Sau đây chúng ta hãy tìm hiểu hai câu lệnh lựa chọn này.

CNTT

Nhập môn tin học

7

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Câu lệnh if  Câu lệnh if cho phép ta đưa ra các quyết định dựa trên việc kiểm tra một điều kiện nào đó là đúng (true) hay sai (false).

 Sơ đồ quy trình thực hiện

8

của câu lệnh if. Khi xét điều kiện, nếu điều kiện trong trường hợp đúng công việc sẽ được thực hiện, còn nếu điều kiện sai, chương trình sẽ không thực hiện gì cả.

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Dạng tổng quát của câu lệnh if: if (biểu thức) Các câu lệnh;  Biểu thức phải luôn được đặt trong cặp dấu ngoặc (). Mệnh đề theo sau từ khoá if là một điều kiện (hoặc một biểu thức điều kiện) cần được kiểm tra. Tiếp đến là một lệnh hay một tập các lệnh sẽ được thực thi khi điều kiện (hoặc biểu thức điều kiện) có kết quả true.

CNTT

Nhập môn tin học

9

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

int a = 10, b = 2, max; if (a > b){ max = a ;

printf(“The max value is: %d”, max) ; }

1. U C A N

Ví dụ: #include void main() { }

CNTT

Nhập môn tin học

10

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Với a được gán giá trị 10, b được gán giá trị 2, biểu thức điều kiện (a>b) có giá trị đúng.

int a = 10, b = 2, max; if (a > b){ max = a ;

printf(“The max value is: %d”, max) ; }

1. U C A N

Ví dụ: #include void main() { }

CNTT

Nhập môn tin học

11

CÁC CẤU TRÚC ĐIỀU KHIỂN

int a = 10, b = 2, max; if (a > b){ max = a ;

printf(“The max value is: %d”, max) ; }

 Với a được gán giá trị 10, b được gán giá trị 2, biểu thức điều kiện (a>b) có giá trị đúng.  Do đó khối lệnh gắn với biểu thức if được thực thi và kết quả của chương trình như sau:

1. U C A N

Ví dụ: #include void main() { }

CNTT

Nhập môn tin học

12

The max value is: 10

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

 Khối lệnh sau lệnh if được đặt trong cặp ngoặc nhọn {}. Khi có nhiều lệnh cần được thực hiện, các câu lệnh đó được coi như một khối lệnh (block) và phải được đặt trong cặp dấu {}.

int a = 10, b = 2, max; if (a > b){ max = a ;

printf(“The max value is: %d”, max) ; }

Ví dụ: #include void main() { }

CNTT

Nhập môn tin học

13

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

int a = 10, b = 2, max; if (a > b) max = a ;

 Khối lệnh sau lệnh if được đặt trong cặp ngoặc nhọn {}. Khi có nhiều lệnh cần được thực hiện, các câu lệnh đó được coi như một khối lệnh (block) và phải được đặt trong cặp dấu {}.

 Nếu trong ví dụ trên ta

Ví dụ: #include void main() { }

không đưa vào dấu ngoặc nhọn ở câu lệnh if, chỉ có câu lệnh đầu tiên (max = a) được thực hiện khi điều kiện trong câu lệnh if là đúng.

CNTT

Nhập môn tin học

14

CÁC CẤU TRÚC ĐIỀU KHIỂN

int a = 10, b = 2, max; if (a > b && (a>3 || b<5)) max = a ;

 Nếu có nhiều biểu thức điều kiện cần kiểm tra, tùy vào trường hợp ta kết hợp các biểu thức dưới dạng phép (AND) ký hiệu &&, phép (OR) ký hiệu

||.

1. U C A N

Ví dụ: #include void main() { }

CNTT

Nhập môn tin học

15

CÁC CẤU TRÚC ĐIỀU KHIỂN

Ví dụ: kiểm tra một năm có phải là năm nhuận hay không. Năm nhuận là năm chia hết cho 4 hoặc 400 nhưng không chia hết cho 100.

CNTT

Nhập môn tin học

16

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

int y;

scanf(“%d”, &y);

Ví dụ: kiểm tra một năm có phải là năm nhuận hay không. Năm nhuận là năm chia hết cho 4 hoặc 400 nhưng không chia hết cho 100. Chúng ta sử dụng lệnh if để kiểm tra điều kiện.

CNTT

Nhập môn tin học

17

#include void main() { printf(“\nPlease enter a year:”); if (y% 4 == 0 && y % 100 != 0 || y % 400 == 0) printf(“\n%d is a leap year!”, y); getch(); }

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Ví dụ: kiểm tra một năm có

phải là năm nhuận hay không.

 Năm nhuận là năm chia hết

int y;

cho 4 hoặc 400 nhưng không chia hết cho 100.

 Chúng ta sử dụng lệnh if để

scanf(“%d”, &y);

kiểm tra điều kiện.

 Chương trình trên cho ra kết

quả như sau:

Please enter a year: 2012 2012 is a leap year!

CNTT

18

#include void main() { printf(“\nPlease enter a year:”); if (y% 4 == 0 && y % 100 != 0 || y % 400 == 0) printf(“\n%d is a leap year!”, y); getch(); }

Nhập môn tin học

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

int y;

scanf(“%d”, &y);

Điều kiện year % 4 == 0 && year % 100 != 0 || year % 400 == 0 trả về giá trị 1 nếu năm đó là năm nhuận. Khi đó, chương trình hiển thị thông báo gồm biến year và dòng chữ “is a leap year”. Nếu điều kiện trên không thỏa mãn, chương trình không hiển thị thông báo nào.

CNTT

19

#include void main() { printf(“\nPlease enter a year:”); if (y% 4 == 0 && y % 100 != 0 || y % 400 == 0) printf(“\n%d is a leap year!”, y); getch(); }

Nhập môn tin học

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Câu lệnh if...then...else  Ở trên ta đã biết dạng đơn giản nhất của câu lệnh if, cho phép ta lựa chọn để thực hiện hay không một câu lệnh hoặc một chuỗi các lệnh.  C cũng cho phép ta lựa

chọn trong hai khối lệnh để thực hiện bằng cách dùng cấu trúc if – else như sau:

20

CÁC CẤU TRÚC ĐIỀU KHIỂN

câu_lệnh_1;

Cú pháp câu lệnh rẽ nhánh dạng này được mô tả như sau: if (biểu thức) else

câu_lệnh_2;

CNTT

21

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Nếu biểu thức có giá trị đúng (khác 0) thì câu lệnh 1 được thực hiện.

 Nếu sai (bằng 0), câu lệnh 2

câu_lệnh_1;

được thực hiện.

câu_lệnh_2;

Cú pháp câu lệnh rẽ nhánh dạng này được mô tả như sau: if (biểu thức) else

 Khi có nhiều lệnh cần được thực hiện, các câu lệnh đó được coi như một khối lệnh (block) và phải được đặt trong cặp dấu {}.

CNTT

Nhập môn tin học

22

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Trở lại đoạn mã trong ví ở trên, dễ dàng nhận thấy biến max chỉ được gán giá trị khi a > b.

 Trong trường hợp ngược

1. U C A N

int a = 10, b = 2, max; if (a > b) max = a ;

Ví dụ: #include void main() { }

lại, sẽ không có thông báo nào được sinh ra hay nói một cách khác là đoạn mã này chưa thực hiện được yêu cầu tìm số lớn nhất trong 2 số a và b bất kỳ.

CNTT

Nhập môn tin học

23

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Trở lại đoạn mã trong ví ở trên, dễ dàng nhận thấy biến max chỉ được gán giá trị khi a > b.

 Trong trường hợp ngược

1. U C A N

max = a;

lại, sẽ không có thông báo nào được sinh ra hay nói một cách khác là đoạn mã này chưa thực hiện được yêu cầu tìm số lớn nhất trong 2 số a và b bất kỳ.  Điều đó được khắc phục

max = b;

int a = 10, b = 2, max; printf(“Input a = ” ) ; scanf(“%d”, &a); printf(“Input b = ” ) ; scanf(“%d”, &b ) ; if (a > b) else printf(“The max value is: %d”, max);

24

rất đơn giản bằng cấu trúc if-else

Ví dụ: #include void main() { }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Đoạn mã này chỉ hiển thị

thông báo “is a leap year” ra màn hình nếu là năm nhuận.  Trong trường hợp ngược lại,

int y;

scanf(“%d”, &y);

nếu năm nhập vào không phải là năm nhuận, sẽ không có bất kỳ thông báo nào được in ra.  Điều này có thể gây ra sự hiểu lầm và đôi chút khó chịu cho người sử dụng.

CNTT

Nhập môn tin học

25

1. U C A N

#include void main() { printf(“\nPlease enter a year:”); if (y% 4 == 0 && y % 100 != 0 || y % 400 == 0) printf(“\n%d is a leap year!”, y); getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Đoạn mã này chỉ hiển thị

thông báo “is a leap year” ra màn hình nếu là năm nhuận.  Trong trường hợp ngược lại,

int y;

scanf(“%d”, &y);

1. U C A N

printf(“\n%d is a leap year!”, y);

nếu năm nhập vào không phải là năm nhuận, sẽ không có bất kỳ thông báo nào được in ra.  Điều này có thể gây ra sự hiểu lầm và đôi chút khó chịu cho người sử dụng.

getch();

26

 Để khắc phục điều này, thay vì sử dụng cấu trúc if đơn giản, ta sử dụng cấu trúc if-else

#include void main() { printf(“\nPlease enter a year:”); if (y% 4 == 0 && y % 100 != 0 || y % 400 == 0) else printf(“\n%d is not a leap year!”, y); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Ví dụ: đổi một ký tự hoa thành

ký tự thường.

 Nếu ký tự không phải là một

ký tự hoa, nó sẽ được in ra mà không cần thay đổi.

27

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Ví dụ: đổi một ký tự hoa thành

ký tự thường.

 Nếu ký tự không phải là một

ký tự hoa, nó sẽ được in ra mà không cần thay đổi.

1. U C A N

 Chương trình sử dụng cấu trúc if-else để kiểm tra xem một ký tự có phải là ký tự hoa không, rồi thực hiện các thao tác tương ứng.

c + „a‟ – „A‟);

printf(“Character Entered: %c”, c);

28

/* Convert upper case to lower case*/ #include void main() { char c; printf(“Please enter a character: ”); scanf(“%c”, &c); if (c >= „A‟ && c <= „Z‟) printf(“haracter Converted: %c”, else }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Biểu thức c >= ‘A’ && c <= ‘Z’ kiểm tra ký tự nhập vào có là ký tự hoa không.

 Nếu biểu thức trả về true, ký

tự đó sẽ đổi thành ký tự thường bằng biểu thức c + ‘a’ – ‘A’, và được in ra màn hình qua hàm printf().

 Nếu giá trị của biểu thức là

c + „a‟ – „A‟);

printf(“Character Entered: %c”, c);

29

1. U C A N

false, câu lệnh sau else được chạy và chương trình hiển thị tự đó ra màn hình mà không cần thực hiện bất cứ sự thay đổi nào.

/* Convert upper case to lower case*/ #include void main() { char c; printf(“Please enter a character: ”); scanf(“%c”, &c); if (c >= „A‟ && c <= „Z‟) printf(“haracter Converted: %c”, else }

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Nhiều lựa chọn các câu lệnh if...then...else  Câu lệnh if cho phép ta lựa chọn thực hiện một hành động nào

đó hay không.

 Câu lệnh if – else cho phép ta lựa chọn thực hiện giữa hai hành

động.

 C cho phép ta có thể đưa ra nhiều lựa chọn hơn. Chúng ta mở rộng cấu trúc if – else bằng cách thêm vào cấu trúc else – if để thực hiện điều đó. Nghĩa là mệnh đề else trong một câu lệnh if – else lại chứa một câu lệnh if – else khác. Do đó nhiều điều kiện hơn được kiểm tra và tạo ra nhiều lựa chọn hơn.

CNTT

Nhập môn tin học

30

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Nhiều lựa chọn các câu lệnh if...then...else  Câu lệnh if cho phép ta lựa chọn thực hiện một hành động nào

đó hay không.

 Câu lệnh if – else cho phép ta lựa chọn thực hiện giữa hai hành

động.

 C cho phép ta có thể đưa ra nhiều lựa chọn hơn. Chúng ta mở rộng cấu trúc if – else bằng cách thêm vào cấu trúc else – if để thực hiện điều đó. Nghĩa là mệnh đề else trong một câu lệnh if – else lại chứa một câu lệnh if – else khác. Do đó nhiều điều kiện hơn được kiểm tra và tạo ra nhiều lựa chọn hơn.

Nhập môn tin học

31

CNTT

CÁC CẤU TRÚC ĐIỀU KHIỂN

if (biểu thức) câu_lệnh; …… else câu_lệnh;

1. U C A N

Nhiều lựa chọn các câu lệnh if...then...else  Cú pháp tổng quát trong trường hợp này như sau: if (biểu thức) câu_lệnh; else

CNTT

Nhập môn tin học

32

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. A C U

if (biểu thức) N câu_lệnh; else if (biểu thức) câu_lệnh; else if (biểu thức) câu_lệnh; . . . else

câu_lệnh;

if (biểu thức) câu_lệnh; …… else câu_lệnh;

Nhiều lựa chọn các câu lệnh if...then...else  Cú pháp tổng quát if (biểu thức) câu_lệnh; else  Cách canh lề (lùi vào trong) như trên giúp ta nhìn chương trình

một cách dễ dàng khi có một hoặc hai lệnh if.

 Tuy nhiên khi có nhiều lệnh if hơn cách viết đó dễ gây ra

33

nhầm lẫn vì nhiều câu lệnh sẽ phải lùi vào quá sâu. Vì vậy, lệnh if-else-if thường được canh lề theo dạng hình bên phải:

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Ví dụ sau đây cho phép người

tự tương

dùng nhập một ứng với một phép toán bất kỳ từ bàn phím.

 Xuất ra các thông báo tương ứng với mỗi phép toán được nhập.

34

#include #include int main() { char choice; printf("Enter a choice: " ) ; scanf("%c", &choice); printf("\nChoice :%c", choice); if (choice == '+') printf("\nChoice Addition"); else if (choice == '-') printf("\nChoice Subtraction"); else if (choice == '*') printf("\nChoice Multiplication"); else if (choice == '/') printf("\nChoice Division"); else printf("\nInvalid Choice!"); getch(); return 0; }

C A N 1. U

CÁC CẤU TRÚC ĐIỀU KHIỂN

Trong chương trình trên,  Nếu

tự nhập là dấu (+), chương

trình sẽ in ra dòng thông báo “Choice Addition ”.

 Nếu là dấu (-), chương trình sẽ in ra

dòng thông báo “Choice Subtraction”.

 Nếu là dấu (*) chương trình sẽ in ra

dòng thông báo “Choice Multiplication”.

 Nếu là dấu (/) chương trình sẽ in ra dòng thông báo “Choice Division”.  Nếu

hiệu nhập vào không phải

35

phép toán thì in ra thông báo “Invalid Choice!”;

#include #include int main() { char choice; printf("Enter a choice: " ) ; scanf("%c", &choice); printf("\nChoice :%c", choice); if (choice == '+') printf("\nChoice Addition"); else if (choice == '-') printf("\nChoice Subtraction"); else if (choice == '*') printf("\nChoice Multiplication"); else if (choice == '/') printf("\nChoice Division"); else printf("\nInvalid Choice!"); getch(); return 0; }

C A N 1. U

CÁC CẤU TRÚC ĐIỀU KHIỂN

U C A N 1.

 Muốn thực hiện nhiều hơn một lệnh sau mỗi câu lệnh if hay else, ta phải đặt các câu lệnh đó vào trong cặp dấu ngoặc nhọn {}.

printf("\nChoice Addition"); result = a + b; }

printf("\nChoice Subtraction"); result = a - b; }

 Các câu lệnh đó tạo thành một nhóm gọi là lệnh phức hay một khối lệnh.

printf("\nChoice Multiplication"); result = a * b; }

printf("\nChoice Division"); result = a / b; }

36

#include #include int main() { char choice; printf("Enter a choice: " ) ; scanf("%c", &choice); printf("\nChoice :%c", choice); if (choice == '+'){ else if (choice == '-'){ else if (choice == '*'){ else if (choice == '/'){ getch(); return 0; }

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Các cấu trúc if lồng nhau  Một cấu trúc if lồng nhau là

một lệnh if được đặt bên trong một lệnh if hoặc else khác.  Trong C, lệnh else luôn gắn

if (biểu thức_2) câu_lệnh1; if (biểu thức_3) câu_lệnh_2;

câu_lệnh_3;/* với if (biểu thức_3) */

với lệnh if không có else gần nó nhất, và nằm trong cùng một khối lệnh với nó.

37

if (biểu thức–1) { else } else câu_lệnh_4; /* với if (biểu thức_1) */

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Các cấu trúc if lồng nhau  Trong cấu trúc if ở trên, nếu giá trị của biểu_thức_1 là true thì lệnh if thứ hai sẽ được kiểm tra.

 Nếu biểu_thức_2 là true thì

if (biểu thức_2) câu_lệnh1; if (biểu thức_3) câu_lệnh_2;

lệnh câu_lệnh_1 sẽ được thực hiện.

 Nếu biểu thức_3 là true,

câu_lệnh_3;/* với if (biểu thức_3) */

câu_lệnh_2 sẽ được thực hiện,

 nếu không câu_lệnh_3 được

thực hiện.

38

if (biểu thức–1) { else } else câu_lệnh_4; /* với if (biểu thức_1) */

 Nếu biểu thức_1 là false thì câu_lệnh_4 được thực hiện.

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Các cấu trúc if lồng nhau  Vì lệnh else trong cấu trúc

câu_lệnh_1;

else-if là không bắt buộc, nên có thể có một cấu trúc khác như dạng bên:

if (điều kiện_2) else câu_lệnh_2; câu_lệnh_kế_tiếp;

if (điều kiện-1)

39

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Các cấu trúc if lồng nhau  Vì lệnh else trong cấu trúc

câu_lệnh_1;

else-if là không bắt buộc, nên có thể có một cấu trúc khác như dạng bên

if (điều kiện_2) else

câu_lệnh_2;

if (điều kiện-1) câu_lệnh_kế_tiếp;

40

 Trong đoạn mã trên, nếu điều kiện-1 là true, chương trình sẽ chuyển đến thực hiện lệnh if thứ hai và điều kiện-2 được kiểm tra.

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Các cấu trúc if lồng nhau  Nếu điều kiện đó là true,

câu_lệnh_1;

câu_lệnh_1 được thực hiện, nếu không câu_lệnh_2 được thực hiện, sau đó chương trình thực hiện những lệnh trong câu lệnh kế tiếp.

if (điều kiện_2) else

câu_lệnh_2;

 Nếu điều kiện_1 là false,

if (điều kiện-1) câu_lệnh_kế_tiếp;

41

chương trình sẽ chuyển đến thực hiện những lệnh trong câu lệnh kế tiếp.

CÁC CẤU TRÚC ĐIỀU KHIỂN

câu_lệnh_1;

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Viết chương trình phân loại sinh viên theo điểm tổng kết, cụ thể như sau:  Loại xuất sắc (Excellent): Điểm

tổng kết

8.5

 Loại giỏi (Good): 8.0

Điểm

if (điều kiện_2) else

câu_lệnh_2;

tổng kết < 8.5

 Loại khá (Fair): 6.5

Điểm tổng

kết < 8

if (điều kiện-1) câu_lệnh_kế_tiếp;

 Loại trung bình (Normal): 5

Điểm tổng kết < 6.5

42

 Loại yếu (Bad): Điểm tổng kết <

5.

CÁC CẤU TRÚC ĐIỀU KHIỂN

U C A N 1.

Ví dụ Các cấu trúc if lồng nhau Viết chương trình phân loại sinh viên theo điểm tổng kết, cụ thể như sau:  Loại xuất sắc (Excellent): Điểm tổng

kết

8.5

 Loại giỏi (Good): 8.0

Điểm tổng

kết < 8.5

 Loại khá (Fair): 6.5

Điểm tổng kết

< 8

 Loại trung bình (Normal): 5

Điểm

tổng kết < 6.5

 Loại yếu (Bad): Điểm tổng kết < 5.

43

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Viết chương trình phân loại sinh viên theo điểm tổng kết, cụ thể như sau:  Loại xuất sắc (Excellent): Điểm tổng

kết

8.5

 Loại giỏi (Good): 8.0

Điểm tổng

kết < 8.5

 Loại khá (Fair): 6.5

Điểm tổng kết

< 8

 Loại trung bình (Normal): 5

Điểm

tổng kết < 6.5

if (AvgMark >= 8.5) printf("Excellent"); else if (AvgMark >= 8.0) printf("Good"); else if (AvgMark >= 6.5) printf("Fair"); else if (AvgMark >= 5) printf("Normal"); else printf("Bad");

 Loại yếu (Bad): Điểm tổng kết < 5.

44

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau  Giả sử người dùng nhập từ bàn phím giá trị AvgMark = 6.2 thì biểu thức điều kiện (AvgMark >= 8.5) sẽ nhận giá trị false.

if (AvgMark >= 8.5) printf("Excellent"); else if (AvgMark >= 8.0) printf("Good"); else if (AvgMark >= 6.5) printf("Fair"); else if (AvgMark >= 5) printf("Normal"); else printf("Bad");

45

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau  Giả sử người dùng nhập từ bàn phím giá trị AvgMark = 6.2 thì biểu thức điều kiện (AvgMark >= 8.5) sẽ nhận giá trị false.

 Do vậy biểu thức điều kiện

(AvgMark >= 8.0) gắn với else sẽ được kiểm tra.

if (AvgMark >= 8.5) printf("Excellent"); else if (AvgMark >= 8.0) printf("Good"); else if (AvgMark >= 6.5) printf("Fair"); else if (AvgMark >= 5) printf("Normal"); else printf("Bad");

46

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau  Giả sử người dùng nhập từ bàn phím giá trị AvgMark = 6.2 thì biểu thức điều kiện (AvgMark >= 8.5) sẽ nhận giá trị false.

 Do vậy biểu thức điều kiện

(AvgMark >= 8.0) gắn với else sẽ được kiểm tra.

if (AvgMark >= 8.5) printf("Excellent"); else if (AvgMark >= 8.0) printf("Good"); else if (AvgMark >= 6.5) printf("Fair"); else if (AvgMark >= 5) printf("Normal"); else printf("Bad");

47

 Do biểu thức này có giá trị false nên biểu thức điều kiện (AvgMark >= 6.5) sẽ tiếp tục được kiểm tra, được giá trị false,

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau  Giả sử người dùng nhập từ bàn phím giá trị AvgMark = 6.2 thì biểu thức điều kiện (AvgMark >= 8.5) sẽ nhận giá trị false.

 Do vậy biểu thức điều kiện

(AvgMark >= 8.0) gắn với else sẽ được kiểm tra.

 Do biểu thức này có giá trị false nên biểu thức điều kiện (AvgMark >= 6.5) sẽ tiếp tục được kiểm tra, được giá trị false,

if (AvgMark >= 8.5) printf("Excellent"); else if (AvgMark >= 8.0) printf("Good"); else if (AvgMark >= 6.5) printf("Fair"); else if (AvgMark >= 5) printf("Normal"); else printf("Bad");

48

 Xét biểu thức điều kiện tiếp theo (AvgMark >= 5), giá trị true nên dòng thông báo “Normal” sẽ được in ra và else cuối cùng được bỏ qua.

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Chúng ta cũng có thể thay cấu trúc if- else ở đoạn mã lệnh trên bằng cấu trúc if lồng nhau

if (AvgMark >= 5.0) if (AvgMark < 8.5) if (AvgMark < 8) if (AvgMark >= 6.5) printf("Fair"); else printf("Normal"); else printf("Good"); else printf("Excellent"); else printf("Bad");

49

CÁC CẤU TRÚC ĐIỀU KHIỂN

if (AvgMark >= 5.0) if (AvgMark < 8.5) if (AvgMark < 8) if (AvgMark >= 6.5) printf("Fair"); else printf("Normal"); else printf("Good"); else printf("Excellent"); else printf("Bad");

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Chúng ta cũng có thể thay cấu trúc if- else ở đoạn mã lệnh trên bằng cấu trúc if lồng nhau.  Với giá trị AvgMark = 6.2 được nhập từ bàn phím như trên, trước tiên điều kiện (AvgMark >= 5.0) sẽ được kiểm tra, có giá trị true.

50

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Chúng ta cũng có thể thay cấu trúc if- else ở đoạn mã lệnh trên bằng cấu trúc if lồng nhau.  Với giá trị AvgMark = 6.2 được nhập từ bàn phím như trên, trước tiên điều kiện (AvgMark >= 5.0) sẽ được kiểm tra, có giá trị true.

 Điều kiện tiếp theo (AvgMark <

if (AvgMark >= 5.0) if (AvgMark < 8.5) if (AvgMark < 8) if (AvgMark >= 6.5) printf("Fair"); else printf("Normal"); else printf("Good"); else printf("Excellent"); else printf("Bad");

51

8.5)sẽ được kiểm tra, được giá trị true

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Chúng ta cũng có thể thay cấu trúc if- else ở đoạn mã lệnh trên bằng cấu trúc if lồng nhau.  Với giá trị AvgMark = 6.2 được nhập từ bàn phím như trên, trước tiên điều kiện (AvgMark >= 5.0) sẽ được kiểm tra, có giá trị true.

if (AvgMark >= 5.0) if (AvgMark < 8.5) if (AvgMark < 8) if (AvgMark >= 6.5) printf("Fair"); else printf("Normal"); else printf("Good"); else printf("Excellent"); else printf("Bad");

 Điều kiện tiếp theo (AvgMark < 8.5) sẽ được kiểm tra, được giá trị true  Điều kiện (AvgMark < 8) được true

52

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Ví dụ Các cấu trúc if lồng nhau Chúng ta cũng có thể thay cấu trúc if- else ở đoạn mã lệnh trên bằng cấu trúc if lồng nhau.  Với giá trị AvgMark = 6.2 được nhập từ bàn phím như trên, trước tiên điều kiện (AvgMark >= 5.0) sẽ được kiểm tra, có giá trị true.

if (AvgMark >= 5.0) if (AvgMark < 8.5) if (AvgMark < 8) if (AvgMark >= 6.5) printf("Fair"); else printf("Normal"); else printf("Good"); else printf("Excellent"); else printf("Bad");

 Điều kiện tiếp theo (AvgMark < 8.5) sẽ được kiểm tra, được giá trị true  Điều kiện (AvgMark < 8) được true  Điều kiện (AvgMark >= 6.5) tiếp tục được kiểm tra, được giá trị false  Câu lệnh gắn với else sẽ được thực 53

y, dòng thông báo

thi. Như “Normal” sẽ được in ra màn hình.

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Các cấu trúc if lồng nhau  Vì lệnh else trong cấu trúc if-else là không bắt buộc, nên khi có lệnh else nào đó không được đưa vào trong chuỗi cấu trúc if lồng nhau chương trình trông

không rõ ràng.

if ( b > c) min = c; else min = b;

if (a > b)

 Một lệnh else luôn được gắn với lệnh if gần nó nhất mà lệnh if này chưa được kết hợp với một lệnh else nào.Ví dụ:

54

CÁC CẤU TRÚC ĐIỀU KHIỂN

min = a;

if (a > b) { if ( b > c) min = c; } else

1. U C A N

Các cấu trúc if lồng nhau  Lệnh else đi với lệnh if bên trong. Việc viết lùi vào trong dòng là một cách thể hiện mối quan hệ đó. Tuy nhiên canh lề không có chức năng gắn else với lệnh if. Cặp dấu ngoặc nhọn {} giúp chúng ta thực hiện chức năng đó một cách chính xác.

55

CÁC CẤU TRÚC ĐIỀU KHIỂN

Ví dụ: đổi một ký tự hoa thành ký tự thường.  Nếu ký tự không phải là một

ký tự hoa, nó sẽ được in ra mà không cần thay đổi.

1. U C A N

 Chương trình sử dụng cấu trúc if-else để kiểm tra xem một ký tự có phải là ký tự hoa không, rồi thực hiện các thao tác tương ứng

if (AvgMark >= 8.5) printf("Excellent"); else if (AvgMark >= 8.0) printf("Good"); else if (AvgMark >= 6.5) printf("Fair"); else if (AvgMark >= 5) printf("Normal"); else printf("Bad");

56

 Việc phân loại này có thể được biểu diễn bởi cấu trúc if-else như sau

CÁC CẤU TRÚC ĐIỀU KHIỂN

Hình bên dưới biểu diễn sự kết hợp giữa if và else trong một chuỗi các lệnh if lồng nhau.

1. U C A N

if ( b > c) min = c;

min = c;

min = b;

min = a;

if (a > b) else else kết hợp với if

gần nhất

if (a > b) { if ( b > c) } else else kết hợp với if đầu tiên, bởi vì cặp dấu ngoặc nhọn đã đặt lệnh if bên trong.

CNTT

Nhập môn tin học

57

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Theo chuẩn ANSI, có thể lồng nhau đến 15 mức. Tuy nhiên, hầu hết trình biên dịch cho phép nhiều hơn thế.

scanf("%f",&a); scanf("%f",&b); scanf("%f",&c);

 Ví dụ sau đây sẽ tiến hành tìm số lớn nhất trong 3 số a,b,c bằng câu lệnh if-else và if lồng nhau.

if (b>c) max = b; else max = c;

58

float a,b,c,max ; printf("input three number a,b,c\n"); printf("a="); printf("b="); printf("c="); if (a < b) else if ( a

#include #include void main() { }

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Theo chuẩn ANSI, có thể lồng nhau đến 15 mức. Tuy nhiên, hầu hết trình biên dịch cho phép nhiều hơn thế.

scanf("%f",&a); scanf("%f",&b); scanf("%f",&c);

 Ví dụ sau đây sẽ tiến hành tìm số lớn nhất trong 3 số a,b,c bằng câu lệnh if-else và if lồng nhau.

if (b>c) max = b; else max = c;

59

float a,b,c,max ; printf("input three number a,b,c\n"); printf("a="); printf("b="); printf("c="); if (a < b) else if ( a

#include #include void main() { }

1. U C A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

ng sau:

60

1. U C A N

Toán tử ? Toán tử điều kiện (?) được sử dụng khá hiệu quả khi biểu diễn thay thế một câu lệnh if đơn giản theo Biểu thức 1 ? biểu thức 2: biểu thức 3; Ví dụ câu lệnh sau sẽ xác định số lớn nhất trong 2 số a và b để gán cho z. z = (a > b) ? a : b; Câu lệnh này tương đương với: if (a>b) z = a; else z = b;

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Câu lệnh switch  Thực hiện nhiều công việc trong nhiều nhánh khác nhau.

 Lệnh switch tính biểu thức

61

trong ngoặc và so sánh giá trị tính được của biểu thức với các giá trị đứng sau case. Hay nói cách khác, công việc sau mỗi case tương ứng với từng trường hợp giá trị khác nhau có thể xảy ra của biểu thức trong ngoặc.

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Cú pháp tổng quát của lệnh switch switch (biểu_thức)

{

case

hằng_1:

chuỗi_câu_lệnh;

break;

case

hằng_2:

chuỗi_câu_lệnh;

break;

case

hằng_3:

chuỗi_câu_lệnh;

break;

default:

chuỗi_câu_lệnh;

Nhập môn tin học

62

} CNTT

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Cú pháp tổng quát của lệnh switch switch (biểu_thức) {

hằng_1:

case

chuỗi_câu_lệnh;

 switch, case và default là các từ khoá, chuỗi_câu_lệnh có thể là lệnh đơn hoặc lệnh ghép và không cần đặt trong cặp dấu ngoặc.

break;

case

hằng_2:

 Biểu_thức theo sau từ khóa

chuỗi_câu_lệnh;

break;

case

hằng_3:

chuỗi_câu_lệnh;

switch phải được đặt trong dấu ngoặc ( ), và toàn bộ phần thân của lệnh switch phải được đặt trong cặp ngoặc nhọn { }.

break;

 Kiểu dữ liệu kết quả của

default:

chuỗi_câu_lệnh;

63

}

biểu_thức và kiểu dữ liệu của các hằng theo sau từ khoá case phải đồng nhất.

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Cú pháp tổng quát của lệnh switch switch (biểu_thức) {

hằng_1:

case

chuỗi_câu_lệnh;

 Hằng số sau case chỉ có thể là một hằng số nguyên hoặc hằng ký tự.

break;

 Nó cũng có thể là các hằng

case

hằng_2:

chuỗi_câu_lệnh;

break;

biểu thức – những biểu thức không chứa bất kỳ một biến nào.

case

hằng_3:

chuỗi_câu_lệnh;

 Tất cả các giá trị của case phải

break;

khác nhau.

default:

chuỗi_câu_lệnh;

64

}

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Biểu thức được xác định giá

1. U C A N

Cú pháp tổng quát của lệnh switch switch (biểu_thức) {

hằng_1:

case

chuỗi_câu_lệnh;

break;

case

hằng_2:

trị, giá trị của nó được so sánh với từng giá trị gắn với từng case theo thứ tự đã chỉ ra.  Nếu một giá trị trong một

chuỗi_câu_lệnh;

break;

case

hằng_3:

case trùng với giá trị của biểu thức, các lệnh gắn với case đó sẽ được thực hiện.

chuỗi_câu_lệnh;

break;

default:

chuỗi_câu_lệnh;

 Lệnh break (sẽ nói ở phần sau) cho phép thoát ra khỏi câu

nh switch.

65

}

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. U C A N

Cú pháp tổng quát của lệnh switch switch (biểu_thức) {

hằng_1:

case

chuỗi_câu_lệnh;

 Các câu lệnh gắn với default sẽ được thực hiện nếu không có case nào thỏa mãn.

break;

case

hằng_2:

chuỗi_câu_lệnh;

break;

case

hằng_3:

 Lệnh default là tùy chọn. Nếu không có lệnh default và không có case nào thỏa mãn, không có hành động nào được thực hiện.

chuỗi_câu_lệnh;

break;

 Có thể thay đổi thứ tự của

default:

chuỗi_câu_lệnh;

66

case và default.

}

CÁC CẤU TRÚC ĐIỀU KHIỂN

char choice; printf("Enter a choice: " ) ; scanf("%c", &choice); switch (choice){

1. U C A N

Cú pháp tổng quát của lệnh switch switch (biểu_thức) {

hằng_1:

case

chuỗi_câu_lệnh;

break;

case

hằng_2:

chuỗi_câu_lệnh;

break;

case

hằng_3:

chuỗi_câu_lệnh;

break;

default:

chuỗi_câu_lệnh;

67

}

void main() { case '+': printf("\nChoice :%c", choice); break; case '-': printf("\nChoice Subtraction"); break; case '*': printf("\nChoice Multiplication"); break; case '/': printf("\nChoice Division"); break; default: printf("\nInvalid Choice!"); break; } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

char choice; printf("Enter a choice: " ) ; scanf("%c", &choice); switch (choice){

68

void main() { case '+': printf("\nChoice :%c", choice); break; case '-': printf("\nChoice Subtraction"); break; case '*': printf("\nChoice Multiplication"); break; case '/': printf("\nChoice Division"); break; default: printf("\nInvalid Choice!"); break; } getch(); }

#include #include int main() { char choice; printf("Enter a choice: " ) ; scanf("%c", &choice); printf("\nChoice :%c", choice); if (choice == '+') printf("\nChoice Addition"); else if (choice == '-') printf("\nChoice Subtraction"); else if (choice == '*') printf("\nChoice Multiplication"); else if (choice == '/') printf("\nChoice Division"); else printf("\nInvalid Choice!"); getch(); return 0; }

C 1. U A N

CÁC CẤU TRÚC ĐIỀU KHIỂN

char ch;

printf(“\nCharacter not a lower cased alphabet”);

 Ví dụ sau yêu cầu người tự ở dùng nhập vào một dạng chữ thường và hiển thị thông báo tự đó là nguyên âm, là chữ z hay là một phụ âm.

printf(“\nCharacter is a vowel”); break;

printf (“\nLast Alphabet (z) was entered”); break;

printf(“\nCharacter is a consonant”);

scanf(“%c”, &ch); if (ch < „a‟ || ch > „z‟) else

switch (ch){ case „a‟: case „e‟: case „i‟: case „o‟: case „u‟: case „z‟: default: break; }

1. U C A N

 Nếu nó không phải ba loại ở trên, chương trình hiển thị thông báo “Character not a lower cased alphabet”.

69

#include void main () { printf(“\nEnter a lower cased alphabet (a - z): ”); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

char ch;

printf(“\nCharacter not a lower cased alphabet”);

A N C U 1.

cả case cuối cùng hoặc default mặc dù về mặt logic là không cần thiết.

printf(“\nCharacter is a vowel”); break;

 Nhưng điều đó rất có ích nếu sau này chúng ta đưa thêm case vào cuối.

printf (“\nLast Alphabet (z) was entered”); break;

printf(“\nCharacter is a consonant”);

scanf(“%c”, &ch); if (ch < „a‟ || ch > „z‟) else

switch (ch){ case „a‟: case „e‟: case „i‟: case „o‟: case „u‟: case „z‟: default: break; }

70

#include void main () { printf(“\nEnter a lower cased alphabet (a - z): ”);  Nên sử dụng lệnh break trong }

Chương trình sau đây sẽ hiển thị 5 dòng thông báo tương ứng với 5 chức năng cho phép người dùng lựa chọn.

71

void main() { CÁC CẤU TRÚC ĐIỀU KHIỂN int choice; printf("1.Check whether an integer is a prime number\n"); printf("2.Calculate and return area of a rectangle\n"); printf("3.Find the sum of two integer numbers\n"); printf("4.Find the maximum value in an array\n"); printf("5.Exit\n"); printf(“Enter choice [1..5]:”); scanf("%d", &choice); switch (choice){ case 1: printf("\nChoice :%d", choice); break; case 2: printf("\nChoice: %d", choice); break; case 3: printf("\nChoice: %d", choice); break; case 4: printf("\nChoice: %d", choice); break; default: printf("bye bye!"); break; } getch(); }

A N C U 1.

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Một trong những điểm mạnh lớn nhất của máy tính là khả

năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập trình.

 Vòng lặp là một đoạn mã lệnh trong chương trình được thực

hiện lặp đi lặp lại cho đến khi thỏa mãn một điều kiện nào đó. Vòng lặp là một khái niệm cơ bản trong lập trình cấu trúc.

CNTT

Nhập môn tin học

72

2. NG P

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Một trong những điểm mạnh lớn nhất của máy tính là khả

năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập trình.

 Vòng lặp là một đoạn mã lệnh trong chương trình được thực

hiện lặp đi lặp lại cho đến khi thỏa mãn một điều kiện nào đó. Vòng lặp là một khái niệm cơ bản trong lập trình cấu trúc.

Trong C có các loại vòng lặp sau:  Vòng lặp for  Vòng lặp while  Vòng lặp do…while Ta sử dụng các toán tử quan hệ và toán tử logic trong các biểu thức điều kiện để điều khiển sự thực hiện của vòng lặp.

73

2. NG P

CÁC CẤU TRÚC ĐIỀU KHIỂN

Khởi tạo giá trị cho biến điều khiển

2. NG P

Vòng lặp for

Thay đổi giá trị

biến điều khiển

Khối lệnh

Biểu thức

điều kiện

Điều kiện đúng

Điều kiện sai

74

CÁC CẤU TRÚC ĐIỀU KHIỂN

Khối lệnh;

2. NG P

Vòng lặp for Cú tổng quát của vòng lặp for: for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay đổi giá trị của biến điều khiển) { }

75

CÁC CẤU TRÚC ĐIỀU KHIỂN

Khối lệnh;

2. NG P

Vòng lặp for Cú tổng quát của vòng lặp for: for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay đổi giá trị của biến điều khiển) { }  Khởi tạo giá trị cho biến điều khiển là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước khi thực hiện vòng lặp. Lệnh này chỉ được thực hiện duy nhất một lần.

 Biểu thức điều kiện là một biểu thức quan hệ, xác định điều kiện thoát cho

vòng lặp.

76

 Biểu thức thay đổi giá trị của biến điều khiển xác định biến điều khiển sẽ

bị thay đổi như thế nào sau mỗi lần vòng lặp được lặp lại

CÁC CẤU TRÚC ĐIỀU KHIỂN

Khối lệnh;

2. NG P

Vòng lặp for Cú tổng quát của vòng lặp for: for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay đổi giá trị của biến điều khiển) { }  Bình thường vòng lặp for sẽ có đầy đủ 3 thành phần, tuy nhiên trong một

số trường hợp đặc biệt vòng for chỉ có 2 thành phần thứ nhất và thành phần thứ 3, còn thành phần thứ 2 mất đi.

 Lúc này biểu thức điều kiện luôn đúng. Vì vậy, vòng lặp for trở lại một chu

77

trình vô hạn, vì thế ta cần có những câu lệnh điều khiển vòng lặp như break, continue, return

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG

P Quá trình thực hiện vòng lặp này như sau: 1. Khởi tạo giá trị cho biến điều khiển: i = 1. Lệnh này được thực hiện duy nhất một lần khi vòng lặp bắt đầu được thực hiện, và biến i được đặt giá trị là 1.

Vòng lặp for  Ví dụ đoạn mã lệnh sau sẽ hiển thị các số tự nhiên từ 1 đến 10 ra màn hình:

for (i = 1; i<=10; i++) printf("%d ", i); printf(“\nFinish!”)

78

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG

2. Kiểm tra biểu thức điều kiện: i < =10 ?

P Quá trình thực hiện vòng lặp này như sau: 1. Khởi tạo giá trị cho biến điều khiển: i = 1. Lệnh này được thực hiện duy nhất một lần khi vòng lặp bắt đầu được thực hiện, và biến i được đặt giá trị là 1.

Vòng lặp for  Ví dụ đoạn mã lệnh sau sẽ hiển thị các số tự nhiên từ 1 đến 10 ra màn hình:

Chương trình kiểm tra xem giá trị hiện tại của biến i có nhỏ hơn hay bằng 10 hay không. Nếu đúng, các câu lệnh trong thân vòng lặp sẽ được thực hiện.

for (i = 1; i<=10; i++) printf("%d ", i); printf(“\nFinish!”)

79

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG

2. Kiểm tra biểu thức điều kiện: i < =10 ?

P Quá trình thực hiện vòng lặp này như sau: 1. Khởi tạo giá trị cho biến điều khiển: i = 1. Lệnh này được thực hiện duy nhất một lần khi vòng lặp bắt đầu được thực hiện, và biến i được đặt giá trị là 1.

Vòng lặp for  Ví dụ đoạn mã lệnh sau sẽ hiển thị các số tự nhiên từ 1 đến 10 ra màn hình:

Chương trình kiểm tra xem giá trị hiện tại của biến i có nhỏ hơn hay bằng 10 hay không. Nếu đúng, các câu lệnh trong thân vòng lặp sẽ được thực hiện.

3. Thân của vòng lặp có duy nhất một lệnh

for (i = 1; i<=10; i++) printf("%d ", i); printf(“\nFinish!”)

printf("%d\n", i);

80

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG

2. Kiểm tra biểu thức điều kiện: i < =10 ?

P Quá trình thực hiện vòng lặp này như sau: 1. Khởi tạo giá trị cho biến điều khiển: i = 1. Lệnh này được thực hiện duy nhất một lần khi vòng lặp bắt đầu được thực hiện, và biến i được đặt giá trị là 1.

Vòng lặp for  Ví dụ đoạn mã lệnh sau sẽ hiển thị các số tự nhiên từ 1 đến 10 ra màn hình:

Chương trình kiểm tra xem giá trị hiện tại của biến i có nhỏ hơn hay bằng 10 hay không. Nếu đúng, các câu lệnh trong thân vòng lặp sẽ được thực hiện.

3. Thân của vòng lặp có duy nhất một lệnh

for (i = 1; i<=10; i++) printf("%d ", i); printf(“\nFinish!”)

printf("%d\n", i);

4. Biểu thức thay đổi giá trị của biến điều

khiển i++, tăng giá trị của biến i lên 1 cho lần lặp kế tiếp.

81

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG

2. Kiểm tra biểu thức điều kiện: i < =10 ?

P Quá trình thực hiện vòng lặp này như sau: 1. Khởi tạo giá trị cho biến điều khiển: i = 1. Lệnh này được thực hiện duy nhất một lần khi vòng lặp bắt đầu được thực hiện, và biến i được đặt giá trị là 1.

Vòng lặp for  Ví dụ đoạn mã lệnh sau sẽ hiển thị các số tự nhiên từ 1 đến 10 ra màn hình:

Chương trình kiểm tra xem giá trị hiện tại của biến i có nhỏ hơn hay bằng 10 hay không. Nếu đúng, các câu lệnh trong thân vòng lặp sẽ được thực hiện.

3. Thân của vòng lặp có duy nhất một lệnh

for (i = 1; i<=10; i++) printf("%d ", i); printf(“\nFinish!”)

printf("%d\n", i);

4. Biểu thức thay đổi giá trị của biến điều

khiển i++, tăng giá trị của biến i lên 1 cho lần lặp kế tiếp.

5. Lặp lại các bước 2, 3, 4 cho đến khi biểu

82

thức điều kiện là sai.

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Vòng lặp for  Ví dụ đoạn mã lệnh sau sẽ hiển thị các số tự nhiên từ 1 đến 10 ra màn hình:

 Như vậy, vòng lặp trên sẽ được thực hiện

10 lần với giá trị của i thay đổi từ 1 đến 10.  Khi i tăng lên 11. Do giá trị này lớn hơn 10,

for (i = 1; i<=10; i++) printf("%d ", i); printf(“\nFinish!”)

vòng lặp kết thúc và câu lệnh printf(“Finish!”) sau vòng lặp được thực hiện.

83

 Kết quả thực hiện đoạn mã trên như sau: 1 2 3 4 5 6 7 8 9 10 Finish!

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Đoạn chương trình trên yêu cầu

2. NG P

người dùng nhập vào một số nguyên bất kỳ (n), sau đó sử dụng vòng lặp for để tính tổng n số tự nhiên đầu tiên.

 Sau khi vòng lặp kết thúc, giá trị

tổng sẽ được hiển thị ra màn hình.

84

Vòng lặp for.Ví dụ #include #include main() { int i,s,n; printf("please enter a number:"); scanf("%d",&n); i=0;s=0; for(i=0; i<=n; i++) s+=i; printf("Sum of %d first natural numbers is: %d",n,s); getch(); return 0; }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Đoạn chương trình trên yêu cầu

2. NG P

người dùng nhập vào một số nguyên bất kỳ (n), sau đó sử dụng vòng lặp for để tính tổng n số tự nhiên đầu tiên.

 Sau khi vòng lặp kết thúc, giá trị

tổng sẽ được hiển thị ra màn hình.  Kết quả thực hiện của đoạn chương

85

trình trên như sau: please enter a number:5 Sum of 5 first natural numbers is: 15

Vòng lặp for.Ví dụ #include #include main() { int i,s,n; printf("please enter a number:"); scanf("%d",&n); i=0;s=0; for(i=0; i<=n; i++) s+=i; printf("Sum of %d first natural numbers is: %d",n,s); getch(); return 0; }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Một trong những điểm mạnh lớn nhất của máy tính là khả

năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập trình.

 Vòng lặp là một đoạn mã lệnh trong chương trình được thực

hiện lặp đi lặp lại cho đến khi thỏa mãn một điều kiện nào đó. Vòng lặp là một khái niệm cơ bản trong lập trình cấu trúc.

CNTT

Nhập môn tin học

86

2. NG P

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Toán tử ‘phẩy (comma)’:  Phần biểu thức trong

ng

p for có thể được mở rộng để thêm vào các lệnh khởi tạo hay các lệnh thay đổi giá trị của biến. Cú pháp như sau:

biểu_thức_1 , biểu_thức_2

 Các biểu thức trên được phân cách bởi toán tử „phẩy‟ ( , ), và

được thực hiện từ trái sang phải.

 Thứ tự của các biểu thức là quan trọng trong trường hợp giá trị của biểu thức thứ hai phụ thuộc vào giá trị của biểu thức thứ nhất.

 Toán tử này có độ ưu tiên thấp nhất trong các toán tử của C.

Nhập môn tin học

87

CNTT

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

 Ví dụ: in ra một bảng các phép cộng với kết quả không đổi để minh họa khái niệm về toán tử phẩy rõ ràng hơn.

 Kết quả thực hiện của đoạn chương trình trên như sau:

int i, j, max; printf(“Please enter the maxinum value

printf(“for which a table can be printed:

scanf(“%d”, &max); for (i = 0, j = max; i < = max; i++, j--) printf(“\n%d + %d = %d”, i, j, i + j);

Please enter the maxinum value for which a table can be printed: 5 0 + 5 = 5 1 + 4 = 5 2 + 3 = 5 3 + 2 = 5 4 + 1 = 5 5 + 0 = 5

Vòng lặp for.Ví dụ #include Void main() { \n”); “); }

88

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Chú ý trong vòng lặp for, phần

khởi tạo giá trị là:

i = 0, j = max

int i, j, max; printf(“Please enter the maxinum value

 Khi vòng lặp bắt đầu chạy, i được gán giá trị 0 và j được gán giá trị của max.

printf(“for which a table can be printed:

 Phần thay đổi giá trị của biến điều

khiển gồm hai biểu thức:

i++, j--

scanf(“%d”, &max); for (i = 0, j = max; i < = max; i++, j--) printf(“\n%d + %d = %d”, i, j, i + j);

2. NG P

Vòng lặp for.Ví dụ #include Void main() { \n”); “); }

 Sau mỗi lần thực hiện thân vòng lặp, i được tăng lên 1 và j giảm đi 1. Tổng của hai biến đó luôn bằng max và được in ra màn hình.

89

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Vòng lặp for lồng nhau:  Một vòng lặp for được gọi là lồng nhau khi nó nằm bên trong một vòng lặp for khác. Các vòng lặp for lồng nhau sẽ có cú pháp như sau:

. . .

. . . for (j = 0; j < m; j++) { } . . .

90

for (i = 1; i < n; i++) { }

CÁC CẤU TRÚC ĐIỀU KHIỂN

P

Qúa trình thực hiện vòng lặp ở đây như sau: 1. Khởi tạo giá trị cho biến điều khiển vòng lặp ngoài

cùng: i = 1.

91

2. NG

Vòng lặp for.Ví dụ Chương trình sau đây sẽ in ra 10 hàng, mỗi hàng gồm 5 chữ số từ 1 đến 5: int main() { int i, j; for (i = 1; i<=10; i++){ for (j=1; j<=5; j++) printf("%d ", j); printf("\n"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

P

Qúa trình thực hiện vòng lặp ở đây như sau: 1. Khởi tạo giá trị cho biến điều khiển vòng lặp ngoài

cùng: i = 1.

2. Kiểm tra biểu thức điều kiện vòng lặp ngoài cùng

(i <= 10)? Do giá trị hiện tại của i = 1 nên biểu thức điều kiện này nhận giá trị đúng và khối lệnh trong thân vòng lặp được thực hiện.

92

2. NG

Vòng lặp for.Ví dụ Chương trình sau đây sẽ in ra 10 hàng, mỗi hàng gồm 5 chữ số từ 1 đến 5: int main() { int i, j; for (i = 1; i<=10; i++){ for (j=1; j<=5; j++) printf("%d ", j); printf("\n"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

P

Qúa trình thực hiện vòng lặp ở đây như sau: 1. Khởi tạo giá trị cho biến điều khiển vòng lặp ngoài

cùng: i = 1.

2. Kiểm tra biểu thức điều kiện vòng lặp ngoài cùng

(i <= 10)? Do giá trị hiện tại của i = 1 nên biểu thức điều kiện này nhận giá trị đúng và khối lệnh trong thân vòng lặp được thực hiện.

3. Thân của vòng lặp này chứa một vòng lặp nữa (biến j) và lệnh xuống dòng printf("%d\n", i). Thực hiện vòng lặp bên trong hoàn toàn tương tự như vòng lặp bên ngoài. Vòng lặp này sẽ thực hiện 5 lần với giá trị của j thay đổi từ 1 đến 5. Khi j tăng lên 6, mỗi lần thực hiện sẽ in ra màn hình giá trị tương ứng của j. Do giá trị này lớn hơn 5 nên vòng lặp trong kết thúc. Lệnh xuống dòng được thực hiện . Sau đó, thực hiện vòng lặp bên ngoài.

93

2. NG

Vòng lặp for.Ví dụ Chương trình sau đây sẽ in ra 10 hàng, mỗi hàng gồm 5 chữ số từ 1 đến 5: int main() { int i, j; for (i = 1; i<=10; i++){ for (j=1; j<=5; j++) printf("%d ", j); printf("\n"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

P

Qúa trình thực hiện vòng lặp ở đây như sau: 1. Khởi tạo giá trị cho biến điều khiển vòng lặp ngoài

cùng: i = 1.

2. Kiểm tra biểu thức điều kiện vòng lặp ngoài cùng

(i <= 10)? Do giá trị hiện tại của i = 1 nên biểu thức điều kiện này nhận giá trị đúng và khối lệnh trong thân vòng lặp được thực hiện.

3. Thân của vòng lặp này chứa một vòng lặp nữa (biến j) và lệnh xuống dòng printf("%d\n", i). Thực hiện vòng lặp bên trong hoàn toàn tương tự như vòng lặp bên ngoài. Vòng lặp này sẽ thực hiện 5 lần với giá trị của j thay đổi từ 1 đến 5. Khi j tăng lên 6, mỗi lần thực hiện sẽ in ra màn hình giá trị tương ứng của j. Do giá trị này lớn hơn 5 nên vòng lặp trong kết thúc. Lệnh xuống dòng được thực hiện . Sau đó, thực hiện vòng lặp bên ngoài.

4. Biểu thức thay đổi giá trị của biến điều khiển i++, tăng giá trị của biến i lên 1 cho lần lặp kế tiếp.

94

2. NG

Vòng lặp for.Ví dụ Chương trình sau đây sẽ in ra 10 hàng, mỗi hàng gồm 5 chữ số từ 1 đến 5: int main() { int i, j; for (i = 1; i<=10; i++){ for (j=1; j<=5; j++) printf("%d ", j); printf("\n"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

P

Qúa trình thực hiện vòng lặp ở đây như sau: 1. Khởi tạo giá trị cho biến điều khiển vòng lặp ngoài

cùng: i = 1.

2. Kiểm tra biểu thức điều kiện vòng lặp ngoài cùng

(i <= 10)? Do giá trị hiện tại của i = 1 nên biểu thức điều kiện này nhận giá trị đúng và khối lệnh trong thân vòng lặp được thực hiện.

3. Thân của vòng lặp này chứa một vòng lặp nữa (biến j) và lệnh xuống dòng printf("%d\n", i). Thực hiện vòng lặp bên trong hoàn toàn tương tự như vòng lặp bên ngoài. Vòng lặp này sẽ thực hiện 5 lần với giá trị của j thay đổi từ 1 đến 5. Khi j tăng lên 6, mỗi lần thực hiện sẽ in ra màn hình giá trị tương ứng của j. Do giá trị này lớn hơn 5 nên vòng lặp trong kết thúc. Lệnh xuống dòng được thực hiện . Sau đó, thực hiện vòng lặp bên ngoài.

95

4. Biểu thức thay đổi giá trị của biến điều khiển i++, tăng giá trị của biến i lên 1 cho lần lặp kế tiếp. 5. Lặp lại các bước 2, 3, 4 cho đến khi biểu thức điều

kiện là sai.

2. NG

Vòng lặp for.Ví dụ Chương trình sau đây sẽ in ra 10 hàng, mỗi hàng gồm 5 chữ số từ 1 đến 5: int main() { int i, j; for (i = 1; i<=10; i++){ for (j=1; j<=5; j++) printf("%d ", j); printf("\n"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Các trường hợp khác của vòng lặp for:  Vòng lặp for có thể được sử dụng mà không cần phải có đầy

đủ các thành phần của nó. Ví dụ:

printf(“Input i = “); scanf(“%d”,&i); . . .

. . . for (i = 1; i!= 10;) { }

 Đoạn mã trên sẽ yêu cầu nhập giá trị cho biến i, vòng lặp

96

không có phần thay đổi giá trị của biến điều khiển và sẽ kết thúc khi biến i có giá trị 10.

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Các trường hợp khác của vòng lặp for:  Một dạng khác, vòng lặp for có thể thiếu phần khởi tạo giá trị

cho biến điều khiển vòng lặp như sau:

printf("%d ", i); i++;

97

printf("Input i = "); scanf("%d", &i); for(; i < 10; ) { }  Vòng lặp trên không có phần khởi tạo tham số và phần thay đổi giá trị của tham số i. Tuy nhiên, giá trị của i đã được thay đổi trong thân vòng lặp để tránh trường hợp lặp vô

n.

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Các trường hợp khác của vòng lặp for:  Vòng lặp for khi không có bất kỳ thành phần nào sẽ là

một vòng lặp vô

n.

. . .

for ( ; ; ) { }  Tuy nhiên, lệnh break bên trong vòng lặp sẽ cho phép

thoát khỏi vòng lặp. for ( ; ; ) { ch = getchar(); if (ch == „E‟ || i == „e‟); break; }

98

 Vòng lặp trên sẽ được thực hiện cho đến khi người dùng

nhập vào E hoặc e.

CÁC CẤU TRÚC ĐIỀU KHIỂN

) có thể không có bất k

2. NG P

Các trường hợp khác của vòng lặp for:  Vòng lặp for (hay vòng lặp bất k

lệnh nào trong phần thân của nó. K thuật này giúp tăng tính hiệu quả trong một vài giải thuật và để tạo ra độ trễ về mặt thời gian. Chẳng hạn có thể tạo ra một độ trễ trong khoảng thời gian MAX_TIME như sau:

for (i = 0; i < MAX_TIME; i++);

99

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Vòng lặp while  Cú pháp tổng quát như sau: while (điều_kiện là đúng) câu_lệnh;

CNTT

Nhập môn tin học

100

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Vòng lặp while  Cú pháp tổng quát như sau: while (điều_kiện là đúng) câu_lệnh;  Trong đó, câu_lệnh có thể là rỗng, hay một lệnh đơn, hay một

khối lệnh.

 Nếu vòng lặp while chứa một tập các lệnh thì chúng phải được n { }. điều_kiện có thể là biểu thức bất

đặt trong cặp ngoặc kỳ.

 Vòng lặp sẽ được thực hiện lặp đi lặp lại khi điều kiện trên là đúng (true). Chương trình sẽ chuyển đến thực hiện lệnh tiếp sau vòng lặp khi điều kiện trên là sai (false).

101

CÁC CẤU TRÚC ĐIỀU KHIỂN

102

2. NG P

Vòng lặp while.Ví dụ Chương trình ví dụ sau đây cho phép người dùng nhập liên tục các số nguyên bất kỳ từ bàn phím. Việc nhập sẽ kết thúc khi người dùng nhập vào số 0. void main() { int x; printf("Input a number: "); scanf("%d", &x); while (x!=0){ printf("%d\n",x); printf("Input a next number: "); scanf("%d", &x); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. Đầu tiên chương trình yêu cầu người dùng

nhập vào một số.

2. NG P

2. Nếu người dùng nhập vào số 0 thì biểu thức điều kiện (x!=0) nhận giá trị sai, vòng lặp while sẽ kết thúc và không thực hiện lần nào.

103

Vòng lặp while.Ví dụ Chương trình ví dụ sau đây cho phép người dùng nhập liên tục các số nguyên bất kỳ từ bàn phím. Việc nhập sẽ kết thúc khi người dùng nhập vào số 0. void main() { int x; printf("Input a number: "); scanf("%d", &x); while (x!=0){ printf("%d\n",x); printf("Input a next number: "); scanf("%d", &x); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. Đầu tiên chương trình yêu cầu người dùng

nhập vào một số.

2. NG P

2. Nếu người dùng nhập vào số 0 thì biểu thức điều kiện (x!=0) nhận giá trị sai, vòng lặp while sẽ kết thúc và không thực hiện lần nào. 3. Ngược lại, nếu người dùng nhập vào số khác 0 thì biểu thức điều kiện nhận giá trị đúng và khối lệnh trong thân vòng lặp được thực hiện. 4. Trước tiên printf("%d\n",x)sẽ in giá trị của số đã nhập ra màn hình sau đó yêu cầu người dùng nhập vào số tiếp theo.

104

Vòng lặp while.Ví dụ Chương trình ví dụ sau đây cho phép người dùng nhập liên tục các số nguyên bất kỳ từ bàn phím. Việc nhập sẽ kết thúc khi người dùng nhập vào số 0. void main() { int x; printf("Input a number: "); scanf("%d", &x); while (x!=0){ printf("%d\n",x); printf("Input a next number: "); scanf("%d", &x); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

1. Đầu tiên chương trình yêu cầu người dùng

nhập vào một số.

2. NG P

2. Nếu người dùng nhập vào số 0 thì biểu thức điều kiện (x!=0) nhận giá trị sai, vòng lặp while sẽ kết thúc và không thực hiện lần nào. 3. Ngược lại, nếu người dùng nhập vào số khác 0 thì biểu thức điều kiện nhận giá trị đúng và khối lệnh trong thân vòng lặp được thực hiện. 4. Trước tiên printf("%d\n",x)sẽ in giá trị của số đã nhập ra màn hình sau đó yêu cầu người dùng nhập vào số tiếp theo.

5. Sau khi người dùng nhập xong, sẽ quay lại

kiểm tra biểu thức điều kiện, nếu đúng vòng lặp tiếp tục được thực hiện, nếu sai vòng lặp kết thúc và lệnh getch()sau vòng lặp sẽ được thực hiện.

6. Lặp lại các bước 2, 3, 4 cho đến khi biểu thức

105

điều kiện là sai.

Vòng lặp while.Ví dụ Chương trình ví dụ sau đây cho phép người dùng nhập liên tục các số nguyên bất kỳ từ bàn phím. Việc nhập sẽ kết thúc khi người dùng nhập vào số 0. void main() { int x; printf("Input a number: "); scanf("%d", &x); while (x!=0){ printf("%d\n",x); printf("Input a next number: "); scanf("%d", &x); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

 Giống như vòng lặp for, vòng lặp while kiểm tra điều kiện ngay khi bắt đầu thực hiện vòng lặp. Do đó các lệnh trong thân vòng lặp sẽ không được thực hiện nếu ngay từ ban đầu điều kiện đó là sai.  Biểu thức điều kiện trong vòng lặp có thể phức tạp tùy theo yêu cầu của bài toán.

106

 Các biến trong biểu thức điều kiện có thể bị thay đổi giá trị trong thân vòng lặp, nhưng cuối cùng điều kiện đó phải sai (false) nếu không vòng lặp sẽ không bao giờ kết thúc.

Vòng lặp while.Ví dụ Chương trình ví dụ sau đây cho phép người dùng nhập liên tục các số nguyên bất kỳ từ bàn phím. Việc nhập sẽ kết thúc khi người dùng nhập vào số 0. void main() { int x; printf("Input a number: "); scanf("%d", &x); while (x!=0){ printf("%d\n",x); printf("Input a next number: "); scanf("%d", &x); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Giá trị i luôn luôn có giá trị bằng 1 và vì vậy biểu thức điều kiện luôn trả về giá trị đúng. Do vậy vòng lặp không bao giờ kết thúc.

107

2. NG P

Vòng lặp while.Ví dụ Sau đây là ví dụ về một vòng lặp while vô hạn. void main() { int i = 1; while (i < 10){ printf("\n This is iteration %d\n", i); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Giá trị i luôn luôn có giá trị bằng 1 và vì vậy biểu thức điều kiện luôn trả về giá trị đúng. Do vậy vòng lặp không bao giờ kết thúc.

 Có thể khắc phục điều này một cách đơn giản bằng cách bổ sung thêm biểu thức thay đổi giá trị của biến điểu khiển vòng lặp như sau:

i++;

108

2. NG P

Vòng lặp while.Ví dụ Sau đây là ví dụ về một vòng lặp while vô hạn. void main() { int i = 1; while (i < 10){ printf("\n This is iteration %d\n", i); } getch(); }

void main() { int i = 1; while (i < 10){ printf("\n This is iteration %d\n", i); } getch(); }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Vòng lặp này sẽ thực hiện 3 lần, lần lặp thứ nhất j sẽ là 10, lần lặp kế tiếp j bằng 8 và lần lặp thứ ba j sẽ bằng 6.

 Khi đó i vẫn nhỏ hơn 100 ( i

... i++; j -= 2;

109

int i, j; i = 0; j = 10; while (i < 100 && j > 5) { } ...

bằng 3), j nhận giá trị 4 và điều kiện j > 5 trở thành false, vì vậy vòng lặp kết thúc.

2. NG P

Vòng lặp while.Ví dụ Nếu có hơn một điều kiện được kiểm tra để kết thúc vòng lặp, vòng lặp sẽ kết thúc khi có ít nhất một điều kiện trong các điều kiện đó là false. Ví dụ sau sẽ minh họa điều này. #include main() { }

CÁC CẤU TRÚC ĐIỀU KHIỂN

2. NG P

Vòng lặp do...while  Vòng lặp do ... while

còn được gọi là vòng lặp do trong C.

 Không giống như vòng lặp for và while, vòng lặp này kiểm tra điều kiện tại cuối vòng lặp.

 Điều này có nghĩa là vòng

lặp do ... while sẽ được thực hiện ít nhất một lần, ngay cả khi điều kiện là sai (false) ở lần chạy đầu tiên.

110

CÁC CẤU TRÚC ĐIỀU KHIỂN

câu_lệnh;

n {} là không cần thiết khi chỉ có một câu

p dấu

2. NG P

Vòng lặp do...while do{ } while (điều_kiện); • Cặp dấu ngoặc

lệnh hiện diện trong vòng lặp, nhưng việc sử dụng ngoặc

n {} là một thói quen tốt.

• Vòng lặp do ... while lặp đến khi điều_kiện mang giá trị false. Trong vòng lặp do ... while, câu_lệnh (khối các câu lệnh) sẽ được thực thi trước, và sau đó điều_kiện được kiểm tra.

111

• Nếu điều kiện là true, chương trình sẽ quay lại thực hiện lệnh do. Nếu điều kiện là false, chương trình chuyển đến thực hiện lệnh nằm sau vòng lặp.

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Đoạn chương trình trên yêu cầu

người dùng nhập số bất kỳ từ bàn phím, nếu số đó nằm ngoài khoảng 1..10 (có nghĩa là nhỏ hơn 1 hoặc lớn hơn 10) thì yêu cầu nhập lại.

112

2. NG P

Vòng lặp do..while.Ví dụ #include #include main() { int val; do { printf("Please enter a number between 1 and 10: "); scanf("%d",&val); if(val<1||val>10) printf("The number is not between 1 and 10.\n"); }while(val<1||val>10); printf("You entered a %d.",val); getch(); return 0; }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Đoạn chương trình trên yêu cầu

người dùng nhập số bất kỳ từ bàn phím, nếu số đó nằm ngoài khoảng 1..10 (có nghĩa là nhỏ hơn 1 hoặc lớn hơn 10) thì yêu cầu nhập lại.

 Kết quả thực hiện của chương

trình này như sau:

Please enter a number between 1 and 10: 11 The number is not between 1 and 10. Please enter a number between 1 and 10: 12 The number is not between 1 and 10. Please enter a number between 1 and 10: 0 The number is not between 1 and 10. Please enter a number between 1 and 10: 2 113 You entered a 2.

2. NG P

Vòng lặp do..while.Ví dụ #include #include main() { int val; do { printf("Please enter a number between 1 and 10: "); scanf("%d",&val); if(val<1||val>10) printf("The number is not between 1 and 10.\n"); }while(val<1||val>10); printf("You entered a %d.",val); getch(); return 0; }

u

CÁC CẤU TRÚC ĐIỀU KHIỂN

dùng nhập vào một k

 Sau khi nhập, chương trình sẽ hỏi người dùng có muốn nhập tiếp k tự khác hay không (Y/N)?

 Nếu trả lời „n‟ hoặc „N‟, chương

trình kết thúc.

tự cho đến khi người dùng

}while (c != 'E' && c != 'e');

scanf("%c", &x); fflush(stdin);

114

 Nếu trả lời „y‟ hoặc „Y‟ , sẽ cho phép người dùng nhập liên tục các k nhập vào kí tự „e‟ hoặc „E‟.  Lúc này, chương trình sẽ hỏi lại tự người dùng có muốn nhập k không và lặp lại các bước thực hiện như trên.

2. NG

u

P  Chương trình trên yêu cầu người tự bất kỳ. Các vòng lặp „while lồng nhau‟ và „do ... while‟ int main(){ char x, c; printf("Enter a character: "); scanf("%c", &c); printf("Character entered: %c\n", c); fflush(stdin); printf("Enter more characters (Y/N)?"); scanf("%c", &x); fflush(stdin); while (x == 'Y' || x == 'y'){ do{ printf("Enter a character: "); scanf("%c", &c); fflush(stdin); printf("Character entered: %c\n", c); printf("Enter more characters (Y/N)?"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Kết quả thực hiện của đoạn chương trình trên như sau:

}while (c != 'E' && c != 'e');

Enter a character: b Character entered: b Enter more characters (Y/N)? y Enter a character:c Character entered:c Enter a character:e Character entered:c Enter more characters (Y/N)? n

scanf("%c", &x); fflush(stdin);

115

2. NG

u

P Các vòng lặp „while lồng nhau‟ và „do ... while‟ int main(){ char x, c; printf("Enter a character: "); scanf("%c", &c); printf("Character entered: %c\n", c); fflush(stdin); printf("Enter more characters (Y/N)?"); scanf("%c", &x); fflush(stdin); while (x == 'Y' || x == 'y'){ do{ printf("Enter a character: "); scanf("%c", &c); fflush(stdin); printf("Character entered: %c\n", c); printf("Enter more characters (Y/N)?"); } }

CÁC CẤU TRÚC ĐIỀU KHIỂN

 C có bốn câu lệnh thực hiện sự rẽ nhánh không điều kiện:

3. C NH Y

return, goto, break, và continue.

 Sự rẽ nhánh không điều kiện nghĩa là sự chuyển điều khiển từ

một điểm đến một lệnh xác định.

 Trong các lệnh chuyển điều khiển trên, return và goto có thể

dùng bất kỳ vị trí nào trong chương trình, trong khi lệnh break và continue được sử dụng kết hợp với các câu lệnh vòng lặp.

CNTT

Nhập môn tin học

116

CÁC CẤU TRÚC ĐIỀU KHIỂN

3. C NH Y

Lệnh break Câu lệnh break có hai cách dùng.  Nó có thể được sử dụng để kết thúc một case trong câu lệnh switch hoặc để kết thúc ngay một vòng lặp, mà không cần kiểm tra điều kiện vòng lặp.

 Khi chương trình gặp lệnh break trong một vòng lặp, ngay lập tức vòng lặp được kết thúc và quyền điều khiển chương trình được chuyển đến câu lệnh theo sau vòng lặp.

CNTT

Nhập môn tin học

117

CÁC CẤU TRÚC ĐIỀU KHIỂN

int n,i ; printf("Input n = "); scanf("%d",&n);

ng lặp trên sẽ

Đoạn chương trình trên yêu cầu người dùng nhập một số nguyên bất kỳ từ bàn phím (n). Sau đó sẽ in ra dãy số theo thứ tự ngược từ n tới 1. Về nguyên tắc, thực hiện n lần. Tuy nhiên, do có câu lệnh: if (i==5) break; nên vòng lặp này sẽ bị kết thúc giữa chừng sau lần lặp thứ 5 (i = 5).

if (i==5) break; printf("%d ",i) ;

for (i=n;i>=1;i--) { }

118

3. C NH Y

Ví dụ 3.16: #include main() { printf("So vua nhap la: %d\n",n); }

u

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Kết quả thực hiện của chương

trình như sau:

int n,i ; printf("Input n = "); scanf("%d",&n);

Input n = 10 So vua nhap la: 10 10 9 8 7 6

if (i==5) break; printf("%d ",i) ;

for (i=n;i>=1;i--) { }

119

3. C NH Y

Ví dụ 3.16: #include main() { printf("So vua nhap la: %d\n",n); }

u

CÁC CẤU TRÚC ĐIỀU KHIỂN

3. C NH Y

Lệnh break  Một điểm khác cần lưu ý là việc sử dụng câu lênh break trong các lệnh lặp lồng nhau. Khi chương trình thực thi đến một lệnh break nằm trong một vòng lặp for lồng bên trong một vòng lặp for khác, quyền điều khiển được chuyển trở về vòng lặp for bên ngoài.

CNTT

Nhập môn tin học

120

CÁC CẤU TRÚC ĐIỀU KHIỂN

3. C NH Y

Lệnh continue  Lệnh continue kết thúc lần lặp hiện hành và bắt đầu lần lặp kế tiếp. Khi gặp lệnh này trong chương trình, các câu lệnh còn lại trong thân của vòng lặp được bỏ qua và quyền điều khiển được chuyển đến bước đầu của vòng lặp trong lần lặp kế tiếp.

 Trong trường hợp vòng lặp for, continue thực hiện biểu thức thay đổi giá trị của biến điều khiển và sau đó kiểm tra biểu thức điều kiện.

 Trong trường hợp của lệnh while và do…while, quyền điều khiển chương trình được chuyển đến biểu thức kiểm tra điều kiện.

CNTT

Nhập môn tin học

121

CÁC CẤU TRÚC ĐIỀU KHIỂN

int n,i ; printf("Input n = "); scanf("%d",&n);

if (i%2!=0) continue; printf("%d ",i) ;

Chương trình trên yêu cầu người dùng nhập vào một số nguyên bất kỳ (n) và in ra mà hình tất cả những số chẵn trong khoảng từ 1 đến n. Tại mỗi bước lặp, nếu điều kiện (i%2!=0) thỏa mãn lệnh continue sẽ được thực hiện. Như vậy, câu lệnh printf("%d ",i)- in giá trị của i ra màn hình sẽ bị bỏ qua và vòng lặp kế tiếp được bắt đầu

122

3. C NH Y

Ví dụ 3.17: #include #include #include main() { printf("So vua nhap la:%d\n",n); for (i=1;i<=n;i++) { } getch(); }

u

CÁC CẤU TRÚC ĐIỀU KHIỂN

 Kết quả thực hiện của chương

trình trên như sau:

int n,i ; printf("Input n = "); scanf("%d",&n);

if (i%2!=0) continue; printf("%d ",i) ;

Input n = 100 So vua nhap la: 100 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100

123

3. C NH Y

Ví dụ 3.17: #include #include #include main() { printf("So vua nhap la:%d\n",n); for (i=1;i<=n;i++) { } getch(); }

u

CÁC CẤU TRÚC ĐIỀU KHIỂN

3. C NH Y

Lệnh return  Lệnh return dùng để quay lại vị trí gọi hàm sau khi các lệnh

trong hàm đó được thực thi xong. Trong lệnh return có thể có một giá trị gắn với nó, giá trị đó sẽ được trả về cho chương trình.

return biểu_thức;

 Biểu_thức là một tùy chọn (không bắt buộc). Có thể có hơn một lệnh return được sử dụng trong một hàm. Tuy nhiên, hàm sẽ : quay trở về vị trí gọi hàm khi gặp lệnh return đầu tiên.

124

int f(n) { Các công việc.... return giá trị trả về; }

CÁC CẤU TRÚC ĐIỀU KHIỂN TÓM TẮT

 Cấu trúc lựa chọn  Câu lệnh if  Câu lệnh if – else  Câu lệnh với nhiều lệnh if  Câu lệnh if lồng nhau  Câu lệnh switch.

 Vòng lặp

 Vòng lặp „for‟ trong C  Toán tử „phẩy‟  Vòng lặp lồng nhau  Vòng lặp „while‟ và vòng lặp „do-while‟

 Lệnh nhẩy

125

 Các lệnh „break‟, „continue‟ và „goto‟  Hàm „exit()‟.

https://sites.google.com/site/daonamanhedu/intro2informatics

Cám ơn