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