NGÔN NGỮ LẬP TRÌNH
C/C++
Nguyễn Hải Châu Khoa Công nghệ thông tin Trường Đại học Công nghệ
(Bài giảng tuần 3-4)
2
Nội dung
zCác cấu trúc điều khiển rẽ nhánh và lặp
zLàm một số bài tập trên lớp
zKiểu dữ liệu mảng
zXâu ký tự
3
Cấu trúc điều khiển
4
Câu lệnh rẽ nhánh if…else
z Cú pháp:
if (<điều kiện>) <khối lệnh 1>
Nếu <điều kiện> đúng thì thực hiện <khối lệnh 1>
if (<điều kiện>) <khối lệnh 1> else <khối lệnh 2>
Nếu <điều kiện> đúng thì thực hiện <khối lệnh 1>
Ngược lại thực hiện <khối lệnh 2>
5
Ví dụ câu lệnh if…else
Ví dụ 1:
if (delta == 0)
printf(“Nghiem kep\n”);
if (delta == 0) {
x1 = x2 = nghiem;
printf(“Nghiem kep\n”);
}
Ví dụ 2:
if (delta < 0)
printf(“Vo nghiem\n”);
else if (delta == 0)
printf(“Nghiem kep\n”);
else
printf(“Hai nghiệm\n”);
6
Câu lệnh lựa chọn switch
zCâu lệnh if…else cho ta 2 lựa chọn
zKhi có nhiều lựa chọn: if…else lồng nhau
zC++ cung cấp câu lệnh khác để lựa chọn
nhiều khả năng: switch
Trang 2Câu lệnh lựa chọn switch: Cú pháp
switch (<điều kiện>)
{
case <biểu thức hằng 1>: [<dãy lệnh 1>];
case <biểu thức hằng 2>: [<dãy lệnh 2>];
……… : ;
case <biểu thức hằng n>: [<dãy lệnh n>];
[default: dãy lệnh n+1;]
}
8
Ví dụ câu lệnh switch
int th;
cout << “Cho biết tháng cần tính: “ ; cin >> th ; switch (th)
{
case 1: case 3: case 5: case 7: case 8: case 10:
case 12: cout << "tháng này có 31 ngày" ; break ; case 2: cout << "tháng này có 28/29 ngày" ; break;
case 4: case 6: case 9:
case 11: cout << "tháng này có 30 ngày" ; break;
default: cout << “Không có tháng này";
}
9
Câu lệnh nhảy goto
zCú pháp: goto <nhãn>
zNhãn là một tên gọi trong chương trình do
người lập trình đặt tên
zCách viết nhãn:
label: <câu lệnh>
zHạn chế dùng câu lệnh goto vì nếu lạm
dụng câu lệnh này sẽ làm cho chương
trình trở nên khó hiểu, dễ sinh lỗi
10
Ví dụ minh họa
void main() {
long m, n, kq = 0; // Các số cần nhân và kết quả kq
cout << “Nhập m và n: “ ; cin >> m >> n ;
if (m%2) kq += n; // nếu m lẻ thì cộng thêm n vào kq
m = m >> 1; // dịch m sang phải 1 bit tức m = m / 2
n = n << 1; // dịch m sang trái 1 bit tức m = m * 2
if (m) goto lap; // quay lại nếu m<>0
cout << “m nhân n =” << kq ; }
Lệnh lặp for
zfor (<dãy biểu thức 1>;<điều kiện
lặp>;<dãy biểu thức 2>) { <khối lệnh lặp>;}
zCác biểu thức trong các dãy biểu thức 1, 2
cách nhau bởi dấu phảy (,)
zĐiều kiện lặp là biểu thức lôgic
zHoạt động: Thực hiện <dãy biểu thức 1>
zkiểm tra <điều kiện lặp>, nếu đúng thực
hiện <khối lệnh lặp>, thực hiện <dãy biểu
thức 2>, quay lại kiểm tra <điều kiện lặp>
Ví dụ minh họa lệnh lặp for
void main() {
long m, n, kq; // Các số cần nhân và kết quả kq cout << “Nhập m và n: “ ; cin >> m >> n ;
for (kq = 0 ; m ; m >>= 1, n <<= 1)
if (m%2) kq += n ; cout << “m nhân n =” << kq ; }
Trang 3Ví dụ minh họa lệnh lặp for
void main()
{
int i, kq = 0;
for (i = 1 ; i <= 100 ; i ++) kq += i ;
cout << "Tổng = " << kq;
}
14
Lệnh lặp while
z Cú pháp:
while (<điều kiện>) { <khối lệnh lặp>; }
z Hoạt động: Lặp lại <khối lệnh lặp> trong khi <điều kiện> đúng
z <khối lệnh lặp> có thể không được thực hiện lần nào nếu <điều kiện> sai
15
Ví dụ lệnh lặp while
void main() // Bài toán cổ 100 chân, 36 con vừa gà vừa chó
{
int g, c ;
g = 0 ;
while (g <= 36) {
c = 0 ;
while (c <= 50) {
if (g + c == 36 && 2*g + 4*c == 100)
cout << g << c ; c++;
}
g++;
}
Ví dụ lệnh lặp while
void main() // Tìm UCLN theo thuật toán Euclide
{ int m, n, r;
cout << "Nhập m, n: " ; cin >> m >> n ;
if (m < n) { int t = m; m = n; n = t; } // nếu m<n đổi vai trò m,n
while (m != n) {
r = m - n ;
if (r > n) m = r; else { m = n ; n = r ; } }
cout << "UCLN = " << m ; }
17
Ví dụ lệnh lặp while
z Tìm nghiệm xấp xỉ của phương trình e x - 1.5 = 0, trên đoạn [0, 1]
với độ chính xác 10 -6 bằng phương pháp chia đôi
void main()
{
float a = 0, b = 1, c; // các điểm mút a, b và điểm giữa c
float fa, fc; // giá trị của f(x) tại các điểm a, c
while (b-a > 1.0e-6) // trong khi độ dài đoạn còn lớn hơn e
{
c = (a + b)/2; // tìm điểm c giữa đoạn [a,b]
fa = exp(a) - 1.5; fc = exp(c) - 1.5; // tính f(a) và f(c)
if (fa*fc == 0) break; // f(c) = 0 tức c là nghiệm
if (fa*fc > 0) a = c; else b = c;
}
cout << "Nghiem xap xi cua phuong trinh = " << c ;
}
18
Lệnh lặp do…while
do {<khối lệnh lặp>} while (<điều kiện>) ;
zHoạt động: Thực hiện <khối lệnh lặp>
trong khi <điều kiện> đúng
z<khối lệnh lặp> được thực hiện ít nhất một lần
Trang 4Ví dụ câu lệnh do…while
z Tính xấp xỉ số π theo công thức Euler
với void main()
{
int n = 1; float S = 0;
do S += 1.0/(n*n) while 1.0/(n*n) < 1.0e-6;
float pi = sqrt(6*S);
cout << "pi = " << pi ;
}
2 2 2
2
2
1 3
1 2
1
1
1
2 10
1 < −
n
20
Các lệnh break và continue
zbreak dùng để thoát ra khỏi một khối lệnh
(tức là tập các lệnh nằm trong {})
zcontinue dùng để quay lại đầu vòng lặp
mà không cần thực hiện hết tất cả các lệnh trong khối lệnh lặp
21
Ví dụ lệnh continue
// Tìm các số chính phương trong khoảng 1 100
int i ;
for (i = 1; i <= 100; i++) {
if (i là số chính phương) continue;
{ // dãy lệnh khác
.
.
}
}
22
So sánh cách dùng các câu lệnh lặp
zfor thường được sử dụng trong những
vòng lặp mà số lần lặp được biết trước
zNgược lại với for, while và do…while
thường dùng trong các vòng lặp mà số lần lặp không biết trước
zNgược lại với for, while và do…while
thường dùng trong các vòng lặp mà số lần lặp không biết trước
Mảng (Bảng) và xâu ký tự
Mảng một chiều
zMảng là một dãy các phần tử cùng kiểu được sắp kề nhau liên tục trong bộ nhớ
zCác phần tử được đánh số thứ tự để phân biệt
zNếu mảng có n phần tử thì các phần tử được đánh số từ 0 đến n-1
8 7 6 5 4 3 2 1 0
Trang 5Khai báo mảng
z<tên kiểu> <tên mảng>[<số thành phần>] ;
// không khởi tạo
z<tên kiểu> <tên mảng>[<số thành phần>] =
{ dãy giá trị } ; // có khởi tạo
z<tên kiểu> <tên mảng>[ ] = { dãy giá trị } ;
// có khởi tạo
26
Ví dụ về khai báo mảng
int a[10]; // Mảng 10 số nguyên không khởi tạo
// Mảng 3 số thực độ chính xác kép có khởi tạo
double b[3] = {1.0, 2.0, -3.4};
// Mảng 5 số thực độ chính xác đơn có khởi tạo
float f[] = {0.2, 0.3, 0.0, -4.5, -2.1}
27
Ví dụ: Tính tổng, tích của hai phân số
void main()
{
int a[2], b[2], tong[2], tich[2] ;
cout << "Nhập a Tử = " ; cin >> a[0] ;
cout << "mẫu = " ; cin >> a[1] ;
cout << "Nhập b Tử = " ; cin >> b[0] ;
cout << "mẫu = " ; cin >> b[1] ;
tong[0] = a[0]*b[1] + a[1]*b[0] ; tong[1] = a[1] * b[1] ;
tich[0] = a[0]*b[0]; tich[1] = a[1] * b[1] ;
cout << "Tổng = " << tong[0] << '/' << tong[1] ;
cout << "Tích = " << tich[0] << '/' << tich[1] ;
}
28
Ví dụ: Tìm số bé nhất trong một dãy
void main() {
float a[100], i, n, min, k; // a chứa tối đa 100 số
cout << "Nhập số phần tử của dãy: " ; cin >> n;
for (i=0; i<n; i++) { cout << "a[" << i << "] = " ; cin >> a[i];
} min = a[0]; k = 0;
for (i=1; i<n; i++) if (a[i] < min ) { min = a[i]; k = i; } cout << "Số bé nhất là " << min << "tại vị trí " << k;
}
29
Xâu ký tự
zLà mảng có kiểu các phần tử là char
zKhai báo:
char <tên xâu>[độ dài] ; // không khởi tạo
char <tên xâu>[độ dài] = <xâu kí tự> ;
// có khởi tạo
char <tên xâu>[] = xâu kí tự ;
// có khởi tạo
zCác xâu ký tự có ký tự kết thúc là ‘\0’
30
Ví dụ khai báo xâu ký tự
// Khai báo xâu độ dài 80, không khởi tạo
char tenfile[80];
// Khai báo xâu độ dài 80, có khởi tạo
char tenfile[80] = “autoexec.bat”;
// Khai báo xâu có khởi tạo
char tenfile = “config.sys”;
Trang 6Một số hàm xử lý xâu ký tự (1)
#include <string.h>
zstrcpy(s,t): gán nội dung của xâu t cho xâu s
zstrncpy(s, t, n): Sao n ký tự đầu tiên của
xâu t vào xâu s
zstrcat(s, t): Nối xâu t vào xâu s
zstrncat(s, t, n): Nối n ký tự đầu tiên của xâu
t vào xâu s
32
Một số hàm xử lý xâu ký tự (2)
zstrcmp(s, t): So sánh hai xâu s và t:
{Nếu s < t thì trả lại kết quả âm {Nếu s == t hàm trả kết quả bằng 0 {Nếu s > t hàm trả kết quả dương
zstrncmp(s, t, n): Giống strcmp nhưng chỉ
thao tác với n ký tự đầu tiên của hai xâu
zstrcmpi(s, t): Giống strcmp nhưng không
phân biệt chữ hoa và chữ thường
zstrlen(s): Trả lại độ dài của xâu s
33
Mảng hai chiều
zKhai báo:
<kiểu thành phần > <tên mảng>[m][n];
zVí dụ:
// Khai báo ma trận kích thước 10x20
double matran[10][20];
// Chỉ số hàng chạy từ 0 9
// Chỉ số cột chạy từ 0 19
34
Các vấn đề cần nhớ
zCác câu lệnh rẽ nhánh và lặp
zSự khác nhau giữa các câu lệnh if else và switch
zSự khác nhau giữa for, while và do…while
zCách sử dụng break và continue
zMảng 1 chiều, 2 chiều
zXâu ký tự, các hàm thư viện thao tác xâu ký tự
Bài tập
z45 bài tập từ trang 78 đến trang 82 trong
tập bài giảng
zGiải các bài tập trên trong giờ thực hành