Bài giảng Kỹ thuật lập trình cơ bản: Chương 3 giới thiệu về cấu trúc điều khiển ngôn ngữ C. Các nội dung được trình bày trong chương này gồm có: Cấu trúc cơ bản của chương trình C; cấu trúc rẽ nhánh: if, if...else; cấu trúc lựa chọn: switch...case; cấu trúc lặp: while, for, do...while; lệnh break, continue;... Mời các bạn cùng tham khảo để nắm bắt các nội dung chi tiết.
Trang 1CHƯƠNG 3
CẤU TRÚC ĐIỀU KHIỂN
1
TRẦN MINH THÁI Email: minhthai@itc.edu.vn
Website: www.minhthai.edu.vn
Trang 2Cấu trúc điều khiển
2
TUẦN TỰ
RẼ NHÁNH CÓ ĐIỀU KIỆN LỰA CHỌN
LẶP
Lệnh 1; Lệnh 2; Lệnh 3;
do … while
Trang 3Cấu trúc tuần tự
Tuần tự thực thi tiến trình, mỗi lệnh được thực thi theo một chuỗi từ trên xuống, xong lệnh này rồi chuyển xuống lệnh kế tiếp.
3
Lệnh 1
Lệnh 2
Lệnh 3
Trang 4void main() {
int a, b, tong, hieu, tich;
printf(“Tich: %d\n“, tich); printf("Thuong: %f“, thuong); }
Trang 5void main() {
int a, b, tong, hieu, tich;
Trang 7printf(“Nhap mot so nguyen: “); scanf(“%d”, &n);
if (n<0) {
n=-n;
}
printf(“Gia tri tuyet doi= %d“, n); }
Trang 8}
cout<<“Gia tri tuyet doi= “<<n; }
Trang 9Xét cả hai trường hợp đúng và sai:
if (biểu thức điều kiện)
Nếu biểu thức điều kiện cho kết quả true thì thực hiện
khối lệnh 1, ngược lại thì cho thực hiện khối lệnh thứ 2
9
Trang 10VD: Nhập vào 2 số nguyên a và b, nếu a là bội số của b thì
in thông báo “a là bội số của b”, ngược lại in “a khong la boi so cua b”10
printf(“Nhap vao a: “); scanf(“%d”, &a);
printf(“Nhap vao b: “); scanf(“%d”, &b);
{ printf(“a la boi so cua b“); }
Trang 11printf(“a la boi so cua b”);
} else {
printf(“a khong la boi so cua b”); }
}
Trang 12VD: Nhập vào 2 số nguyên a và b, nếu a là bội số của b thì
in thông báo “a là bội số của b”, ngược lại in “a khong la boi so cua b”12
cout<<“Nhap vao a: “; cin>>a;
cout<<“Nhap vao b: “; cin>>b;
{ cout<<“a la boi so cua b“;
Trang 13cout<<“a la boi so cua b”;
} else {
cout<<“a khong la boi so cua b”; }
}
Trang 14Ví dụ 2: Giải và biện luận phương trình: ax+b=0
14
Trang 15printf("PT VSN”);
} else
{ printf("PT VN”);
} }
else { printf(“Nghiem x = %f“, -b/ a);
}
}
Trang 16cout<<"PT VSN”;
} else
{ cout<<"PT VN”;
} }
else { cout<<“Nghiem x = “<< - b/a;
}
}
Trang 17Bài tập – cho biết kết quả
printf(“Gia tri cua a la chan”);
//cout<<"Gia tri cua a la chan”;
printf(“Tong cua a va b la: %d“, a+b); //cout<<"Tong cua a va b la: " <<a + b; }
17
Trang 18//cout<<"a la so le”;
else printf(“a la so chan”; //cout<<"a la so chan”;
printf(“Gia tri cua a: “, a); //cout<<"Gia tri cua a: " <<a; }
18
Trang 19Bài tập viết chương trình
1 Nhập vào 2 số a và b, xuất ra số lớn nhất
2 Cho 3 số a, b và c, hãy tìm giá trị lớn nhất của
ba số trên và in ra kết quả
3 Cho 3 số a, b và c, hãy in ra màn hình theo
thứ tự tăng dần các số
4 Viết chương trình nhập vào một số nguyên n
gồm 3 chữ số Xuất ra màn hình chữ số lớn nhất ở vị trí nào?
VD: n=291 Chữ số lớn nhất nằm ở hàng
chục (9).
19
Trang 205 Nhập vào số nguyên n gồm 3 chữ số Xuất ra
màn hình theo thứ tự tăng dần của các chữ số
Ví dụ: n=291 Xuất ra 129.
6 Nhập vào ngày, tháng, năm Kiểm tra xem
ngày, tháng, năm đó có hợp lệ hay không? In kết quả ra màn hình
7 Nhập vào giờ, phút, giây Kiểm tra xem giờ,
phút, giây đó có hợp lệ hay không? In kết quả
ra màn hình
8 Nhập vào một năm (>0) Cho biết năm này có
phải là năm nhuận hay không? In kết quả ra màn hình
20
Trang 219 Tính tiền cước TAXI Biết rằng:
km đầu tiên là 13000 đ
mỗi km tiếp theo là 12000 đ
từ km 30 trở lên thì mỗi km thêm sẽ là 11000 đ
Hãy nhập số km sau đó in ra số tiền phải trả.
10 Nhập vào 3 số nguyên dương Kiểm tra xem 3 số
đó có lập thành tam giác không? Nếu có hãy cho biết tam giác đó thuộc loại nào? (Cân, vuông, đều,
…).
11 Nhập vào số nguyên dương n Kiểm tra xem n có phải là số chính phương hay không? (số chính phương là số khi lấy căn bậc 2 có kết quả là nguyên).
21
Trang 23ni là các hằng số nguyên hoặc ký tự.
Phụ thuộc vào giá trị của biểu thức viết
sau switch, nếu:
Giá trị này = ni thì thực hiện câu lệnh sau case ni
Khi giá trị biểu thức không thỏa tất cả các ni thì thực hiện câu lệnh sau
default nếu có, hoặc thoát khỏi câu
lệnh switch.
23
Trang 24Khi chương trình đã thực hiện xong câu
lệnh của case ni nào đó thì nó sẽ thực hiện
luôn các lệnh thuộc case bên dưới nó mà
không xét lại điều kiện (do các ni được xem như các nhãn)
Vì vậy, để chương trình thoát khỏi lệnh
switch sau khi thực hiện xong một trường
hợp, ta dùng lệnh break.
24
Trang 25Ví dụ: Nhập vào số nguyên n có giá trị từ 1 đến 5 In cách đọc của
số đó ra màn hình.
case 1: printf("So mot”); break;
case 2: printf("So hai”); break;
case 3: printf("So ba”); break;
case 4: printf("So bon”); break;
case 5: printf("So nam”); break;
default : printf(“Chua xu ly”);
}
}
25
Trang 26Ví dụ: Nhập vào số nguyên n có giá trị từ 1 đến 5 In cách đọc của
số đó ra màn hình.
case 1: cout<<"So mot”; break;
case 2: cout<<"So hai"; break;
case 3: cout<<"So ba”; break;
case 4: cout<<"So bon”; break;
case 5: cout<<"So nam”; break;
default : cout<<“Chua xu ly";
}
}
26
Trang 27Bài tập viết chương trình
13 Viết chương trình nhập vào 1 số nguyên dương gồm 3 chữ số, in ra cách đọc của số này
14 Viết chương trình nhập vào ngày tháng năm, kiểm tra xem ngày tháng năm có hợp lệ không?
In kết quả kiểm tra ra màn hình
27
Trang 28Yes
Trang 30Vòng lặp while
Khởi gán: Dùng để khởi gán giá trị ban
đầu cho vòng lặp
Điều kiện lặp: Dùng để kiểm tra điều
kiện trước khi thực hiện vòng lặp
Cập nhật: Dùng để cập nhật vòng lặp
(tăng hoặc giảm chỉ số lặp)
30
Trang 31 Bước 1: Khởi gán
Bước 2: Kiểm tra điều kiện
― Nếu điều kiện bằng true thì cho thực
hiện các lệnh của vòng lặp, thực hiện
cập nhật vòng lặp Quay trở lại bước 2.
― Ngược lại thoát khỏi lặp.
31
Trang 32Ví dụ: In ra màn hình 10 dòng chữ “Xin
printf("Xin chao\n“);
//cout<<“Xin chao”<<endl;
} }
32
Trang 33Ví dụ: Nhập vào số nguyên dương n In ra màn hình n dòng chữ “Xin chao”
printf("Xin chao\n“);
} }
33
Trang 34Ví dụ: Nhập vào số nguyên dương n In ra màn hình n dòng chữ “Xin chao”
cout<<"Xin chao”<<endl;
} }
34
Trang 36Ví dụ: In ra màn hình 10 dòng chữ “Xin
//cout<<"Xin chao“<<endl;
} }
36
Trang 37Tính tổng: , với n>0
i = i + 1
“Tổng = “ S
Trang 38}
Trang 39}
Trang 41Vòng lặp do … while
Thực hiện khối lệnh cho đến khi biểu thức có
giá trị bằng false.
Cấu trúc lặp do…while thường được dùng
cho trường hợp nhập dữ liệu có kiểm tra điều kiện
41
Trang 42Ví dụ: Nhập vào một số nguyên dương, nếu nhập sai thì thông
báo lỗi và yêu cầu nhập lại.
printf("Nhap sai, hay nhap lai!\n“);
} } while (n <= 0);
printf("Ban da nhap dung, ket thuc chuong trinh”);
}
42
Trang 43Ví dụ: Nhập vào một số nguyên dương, nếu nhập sai thì thông
báo lỗi và yêu cầu nhập lại.
cout<<"Nhap sai, hay nhap lai!“<<endl;
} } while (n <= 0);
cout<<"Ban da nhap dung, ket thuc chuong trinh”;
}
43
Trang 44 Ngược lại với cấu trúc lặp for và
while (kiểm tra điều kiện trước khi
thực hiện lặp), vòng lặp do…while
thực hiện lệnh lặp rồi mới kiểm tra
điều kiện Do đó vòng lặp do while
thực hiện lệnh ít nhất một lần.
44
Trang 45Lệnh break, return và continue
Lệnh break: thoát khỏi các cấu trúc
switch, while, for, do…while chứa nó
Lệnh return: Kết thúc hàm
Lệnh continue: bỏ qua các lệnh còn lại của vòng lặp
45
Trang 46VD: Cho phép người dùng nhập liên tục số nguyên
dương, nếu nhập số nguyên âm thì dừng
printf("Ket thuc vong lap”);
Trang 47VD: Cho phép người dùng nhập liên tục số nguyên
dương, nếu nhập số nguyên âm thì dừng
cout<<"Ket thuc vong lap”;
Trang 48VD: In ra màn hình giá trị từ 10 đến 20 trừ đi số
//cout<<k<<“\t";
} }
48
Trang 49VD: In ra màn hình giá trị từ 10 đến 20 trừ đi số 13 và số 17 – Dùng continue
printf(“%d\t”, k);
//cout<<k<<“\t";
} }
49
Trang 50Xác định kết quả
int a=18;
for(int i = 1; i <= a; i++) if(a%i == 0)
printf(“%d\t”, i);
//cout<<i <<“\t”;
for(int i = 0; i < 5; i++)
-{ for(int j = 0; j <= i; j++) printf(“%d\t”, j);
Trang 51int i = 10, s = 0;
while(i > 0) {
if(i%2 == 0) s+=i;
else if(i > 5) s+=2*i;
i ;
} printf(“s = %d”, s); //cout<<“s = ” <<s;
51
Trang 52} while(i <= a);
52
Trang 53int a = 11, b = 16, i = a; while( i < b )
{ if(i%2 == 0) {
printf(“%d\t”, i); //cout<<i<<"\t";
break;
} i++;
}
53
Trang 54int a = 10, s = 0, i = 0; while( i < a )
{ i++;
if (i % 2 == 0) continue; s=s+i;
} printf(“s = %d”, s);
//cout<<"s = " <<s;
54
Trang 55int i = 1, s = 0;
while(true) {
} printf(“s = %d”, s); //cout<<"s = " <<s;
55
Trang 5615 Viết chương trình đếm số ước số của số nguyên dương N.
Ví dụ: N=12
số ước số của 12 là 6
16 Nhập số nguyên dương n Kiểm tra
n có phải là số nguyên tố không?
17 Nhập vào 2 số nguyên dương a và
b Tìm ước số chung lớn nhất và bội số chung nhỏ nhất của a và b.
56
Trang 5718 In ra dãy số Fibonaci
f 1 = f 0 =1;
f n = f n-1 + f n-2 ; (n>1)
19 In hình chữ nhật có kích thước cd x cr
20 In hình tam giác vuông có chiều cao h
57
Trang 58Dùng công cụ debug xác định lỗi/ kết quả chương trình
Dùng để xác định lỗi logic (lỗi giải thuật) trong chương trình Mặc dù chương trình không còn lỗi nhưng khi chạy chương trình vẫn ra kết quả sai, những lỗi đó có thể là:
Dùng chấm phẩy sau: if, else, for, while mà chưa thực hiện lệnh;
Không dùng cặp dấu ngoặc ({}) để bao khối lệnh;
58
Trang 59DÙNG CÔNG CỤ DEBUG XÁC ĐỊNH LỖI/ KẾT QUẢ CHƯƠNG TRÌNH
Khai báo sai kiểu dữ liệu, không ép kiểu dữ liệu;
Chia cho 0;
Không có điều kiện dừng (điều kiện dừng sai);
Phân tích giải thuật thiếu (chưa vét hết các trường hợp) hoặc sai;
59
Trang 60 Bước 1: Đặt dấu nháy vào vị trí bắt đầu
cần kiểm tra lỗi 60
Trang 61 Bước 2: Nhấn phím Ctrl + F10
61
Trang 62Quan sát vị trí dấu mũi tên trên cửa sổ viết code để xác định dòng lệnh đang thực hiện.
Cửa sổ Locals (View\ Debug Windows\
Variables hoặc nhấn phím Alt+4) sẽ thể
hiện tên (name), giá trị (value) và kiểu (type) của các biến cục bộ trong đoạn chương trình
Cửa sổ Watch (View\ Debug Windows\
Watch hoặc nhấn Alt+3) cũng có thể quan
sát chi tiết biến tương tự như cửa sổ Locals, nhưng chỉ thể hiện những biến nào mà ta nhập tên biến tương ứng vào cửa sổ này
62
Trang 63 Bước 3: Nhấn phím F10 để thực hiện
lệnh kế tiếp (hoặc hàm kế tiếp)
Nếu muốn xem lệnh thực hiện bên trong của hàm thì nhấn phím F11 (nếu lệnh là lời gọi thực hiện hàm – lưu ý: không nên nhấn phím F11 khi thực hiện các hàm thư viện (ví dụ: cin, cout)
63
Trang 6464