In ra màn hình tam giác cân độ cao N gồm toàn các dấu ‘ * ’ có dạng bên 04/2010 Kiểu array – mng • Mảng là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa • Dùng biểu diễn c
Trang 1Chương 4: Cấu trúc lặp
04/2010
Khái niệm vòng lặp
• Một công việc nào đó ñược thực hiện
lặp đi lặp lại nhiều lần
• Ví dụ
– In ra màn hình các số từ 1 đến 10, mỗi số
trên một dòng
• Giải pháp đơn giản
– printf(“1\n”);
– printf(“2\n”);
– … – printf(“10\n”);
• Giải pháp tổng quát
– L ặ p i ch ạ y t ừ 1 t ớ i 10
printf(“%d\n”, i);
Trang 2Kỹ thuật lập trình C - Cấu trúc lặp 3 bangtqh@hotmail.com
Lặp dạng for
– Cú pháp
for ([B.Thức 1]; [B.thức 2]; [B.Thức 3] )
<Lệnh cần lặp>;
• Các phần trong cặp dấu “[” và “]” là không bắt buộc
• Các dấu “;” và cặp ngoặc “(” và “)” bắt buộc phải có
– Ví dụ:
04/2010
Lặp dạng for
Các bước hoạt động:
1.Tính B.Thức 1
2.Tính B.Thức 2
• Nếu sai thoát vòng lặp.
• Nếu đúng ñi vào thực hiện
việc cần lặp
3.Tính B.Thức 3 , sau đó
quay trở lại bước 2 ñể bắt
đầu các bước lặp mới.
FALSE
TRUE
Trang 3Kỹ thuật lập trình C - Cấu trúc lặp 5 bangtqh@hotmail.com
Lặp dạng for
• Biểu thức 1 : Thường là 1 phép gán để khởi tạo giá trị ban ñầu cho biến điều khiển
• Biểu thức 2 : Thường là 1 biểu thức điều kiện
• Biểu thức 3 : Cũng là 1 phép gán để thay ñổi giá trị biến điều khiển
04/2010
Trang 4Kỹ thuật lập trình C - Cấu trúc lặp 7 bangtqh@hotmail.com
N S
Tính = 3 + 6 + 9 + + 3
Vòng lặp chạy ngược từ N trở
về 1
04/2010
Lặp dạng for
• Nhận xét
– Biểu thức 1 chỉ ñược tính một lần
– Biểu thức 2 , biểu thức 3 và khối lệnh trong
thân lệnh for ñược lặp đi lặp lại nhiều lần
– Dựa các giá trị khởi tạo biến điều khiển, ñiều
kiện lặp và biểu thức 3 có thể tính được số lần
lặp.
• Khi biểu thức 2 vắng mặt thì nó ñược xem
là ñúng ( vòng lặp vô hạn ).
– Để thoát khỏi lệnh for trong trường hợp này
phải dùng lệnh break hoặc return
• Có thể sử dụng các lệnh for lồng nhau.
Trang 5Kỹ thuật lập trình C - Cấu trúc lặp 9 bangtqh@hotmail.com
Lặp dạng for
1 Tính TBC các số lẻ ≤ N
2 Tìm ước số chung lớn nhất ( UCLN ) của 2
số a, b
3 Kiểm tra xem số N có phải là số nguyên
tố không?
4 Số tiền nhiều nhất 1 người tham gia “ Đấu
trường 100 ” có thể ñạt được là bao nhiêu
?
5 Hiển thị tất cả các số nguyên tố ≤ N
6 In ra màn hình tam giác cân độ cao N
gồm toàn các dấu ‘ * ’ có dạng bên
04/2010
Kiểu array – mng
• Mảng là một kiểu dữ liệu có cấu trúc do
người lập trình định nghĩa
• Dùng biểu diễn các đối tượng dữ liệu ở dạng một dãy các thành phần có cùng kiểu với
nhau (kiểu cơ sở)
• NNLT C luôn chỉ ñịnh một khối nhớ liên tục
cho một biến kiểu mảng
• Kích thước của mảng ñược xác định ngay
khi khai báo và không bao giờ thay ñổi
Trang 6Kỹ thuật lập trình C - Cấu trúc lặp 11 bangtqh@hotmail.com
Khai báo array trong C
ki ể uc uc ơ ơ s s ở TênBi ế n[S ố ph ầ nt ử ];
kiểu của mỗi thành phần hằng số, số thành phần
tối đa của mảng
Do lập trình viên đặt tên
int a[100];
//a là mảng biểu diễn dãy gồm 100 số nguyên int
04/2010
Kiểu array – ví dụ
int a[5]; // a dãy g ồ m 5 s ố nguyên
long int big[ 100 ]; // big: chi ế m 400 bytes!
double d[ 100 ]; // d: chi ế m 800 bytes!
long double v[SIZE]; // v:10 long doubles
int a[ 5 ] = { 10, 20, 30, 40, 50};
double d[ 100 ] = { 1.5, 2.7};
short primes[] = { 1, 2, 3, 5, 7, 11, 13};
long b[ 50 ] = { 0 };
cách nhanh nhất để khởi tạo tất cả các thành phần bằng 0
Trình biên dịch xác định kích
thước gồm 7 thành phần
int i = 7 ;
const int c = 5 ;
int a[i];
double d[c];
short primes[];
2 thànhphần đầu tiên được khởi tạo, phần còn lại: 0
Trang 7Kỹ thuật lập trình C - Cấu trúc lặp 13 bangtqh@hotmail.com
Kiểu array – Lưu ý
• Các thành phần của mảng được truy xuất thông qua chỉ
số của chúng 0 n-1
• Thao tác truy xuất không kiểm tra giới hạn của chỉ số
int main()
{
int a[6];
int i = 7;
a[0] = 59;
a[5] = -10;
a[i/2] = 2;
a[6] = 0;
a[-1] = 5;
return 0;
}
int main()
{
int a[ 6 ];
int i = 7 ;
a[ 0 ] = 59 ;
a[ 5 ] = - 10 ;
a[i/ 2 ] = 2 ;
a[ 6 ] = 0 ;
a[ -1 ] = 5 ;
return 0;
}
0 a
1 2 3 4 5
59
-10 2
04/2010
Kiểu array – Thao tác cơ sở
Giới hạn chỉ
số mảng ?
Trang 8Kỹ thuật lập trình C - Cấu trúc lặp 15 bangtqh@hotmail.com
Lặp dạng for
1 Tính TBC các số lẻ trong dãy số a1,
a2,…,aN
2 Tìm giá trị min/max trong dãy a1, a2,…,aN
3 Đếm xem trong dãy a1, a2,…,aN có bao
nhiêu số nguyên tố ?
4 Cho dãy điểm M1(x1, y1), M2(x2,
y2),…,Mn(xn, yn) trên mặt phẳng Hãy:
• Tìm độ dài đường gấp khúc M1M2 Mn
• Tìm đoạn MiMj ( i≠j ) có ñộ dài lớn nhất
• Đếm xem có bao nhiêu ñoạn cắt trục 0y
• Có bao nhiêu ñiểm thuộc góc phần tư thứ
nhất
04/2010
Lặp dạng while
• Lệnh lặp while
– Cú pháp
while ( biểu thức )
khối lệnh cần lặp;
– Ý nghĩa
• Trong khi biểu thức có giá trị ñúng (khác 0 ) thì còn phải thực hiện khối lệnh Việc lặp dừng lại khi biểu thức có giá trị sai (bằng 0).
• Lặp while kiểm tra điều kiện trước khi thực hiện
khối lệnh.
– Hãy vẽ sơ ñồ khối biểu diễn lệnh while
Trang 9Kỹ thuật lập trình C - Cấu trúc lặp 17 bangtqh@hotmail.com
Lặp dạng while – Ví dụ
04/2010
Lặp dạng while – Lưu ý
• Nhận xét
– Biểu thức điều kiện luôn dược đặt trong cặp dấu
“(” và “)”
– Biểu thức điều kiện sẽ ñược tính toán đầu tiên
nên phải có giá trị xác định
• Câu lệnh sau làm gì ?
while ( 0 ) printf(“nothing\n”);
• Hãy chuyển lệnh for dạng tổng quát thành
Trang 10Kỹ thuật lập trình C - Cấu trúc lặp 19 bangtqh@hotmail.com
Lặp dạng do…while
• Cú pháp
do
khối lệnh;
• Ý nghĩa
– Thực hiện khối lệnh trong khi biểu thức có giá trị ñúng (khác 0)
– Thực hiện khối lệnh trước khi kiểm tra biểu thức điều kiện – Khối lệnh được thực hiện ít nhất 1 lần
• Hãy vẽ sơ ñồ khối biểu diễn lệnh do … while
04/2010
Trang 11Kỹ thuật lập trình C - Cấu trúc lặp 21 bangtqh@hotmail.com
1 Viết chương trình nhập vào số nguyên
N Hãy in ra màn hình biểu diễn của nó
ở dạng nhị phân ( Binary )
2 Viết chương trình tìm phần tử ñầu tiên
trong dãy a1, a2,…,an thỏa mãn: bằng
tổng các phần tử ñứng trước nó.
3 Viết lại chương trình kiểm tra xem số N
có nguyên tố hay không bằng cách sử
dụng do…while
4 Chuyển đoạn mã lệnh dạng do…while
thành dạng while
04/2010
Kỹ thuật bắt phím
• Đọc trong bộ ñệm bàn phím bằng hàm
getch() có ñược mã của phím bị nhấn.
• Nếu bộ ñệm bàn phím rỗng ñợi nhấn 1
phím.
– Phím bị nhấn là phím thường bộ ñệm bàn
phím nhận 1 mã x
– Nếu phím bị nhấn là phím điều khiển bộ ñệm bàn phím tiếp nhận 2 mã liên tiếp ( x và 0 )
• Hàm getch() sẽ ñọc các ký tự có trong bộ
đệm theo thứ tự ngược với thứ tự ñưa vào.
Trang 12Kỹ thuật lập trình C - Cấu trúc lặp 23 bangtqh@hotmail.com
Kỹ thuật bắt phím
phím nào bị nhấn không kbhit()
xử lý trường hợp phím điều khiển.
04/2010
Bắt phím
Trang 13Kỹ thuật lập trình C - Cấu trúc lặp 25 bangtqh@hotmail.com
Viết chương trình hiển thị lên màn hình 1 dấu ‘*’ sau ñó cho phép người dùng dùng các phím mũi tên di chuyển dấu ‘*’ khắp màn hình Chương trình sẽ kết thúc nếu người dùng bấm phím ESC.
Kỹ thuật bắt phím
…
…
Phím PgDn 0/81
Phím PgUp 0/73
Phím Delete 0/83
Phím F2 0/60
Phím F1 0/59
Phím ESC 27
Phím sang phải → 0/77
Phím sang trái ← 0/75
Phím xuống ↓ 0/80
Phím lên ↑ 0/72
Phím điều khiển Mã
04/2010
• Lệnh break thường được sử dụng kết hợp
lệnh lặp
– Dùng để thoát khỏi vòng lặp một cách bất
thường (không quan tâm tới điều kiện lặp)
– Nếu có nhiều lệnh lặp lồng nhau thì lệnh break
chỉ thoat vòng lặp trực tiếp chứa nó
• Lệnh continue
– Dùng để quay trở lại từ ñầu vòng lặp
– Thực hiện lần lặp mới mà không ñi hết các lệnh còn lại trong thân vòng lặp
Trang 14Kỹ thuật lập trình C - Cấu trúc lặp 27 bangtqh@hotmail.com