Nội dung
z Các cấu trúc điều khiển rẽ nhánh và lặp
z Làm một số bài tập trên lớp
z Kiểu dữ liệu mảng
z Xâu ký tự
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)
1
2
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>
Cấu trúc điều khiển
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>
3
Ví dụ câu lệnh if…else
Câu lệnh lựa chọn switch
Ví dụ 1:
Ví dụ 2:
if (delta == 0)
printf(“Nghiem kep\n”);
if (delta < 0)
printf(“Vo nghiem\n”);
else if (delta == 0)
printf(“Nghiem kep\n”);
else
printf(“Hai nghiệm\n”);
if (delta == 0) {
x1 = x2 = nghiem;
printf(“Nghiem kep\n”);
}
4
5
z Câu lệnh if…else cho ta 2 lựa chọn
z Khi có nhiều lựa chọn: if…else lồng nhau
z C++ cung cấp câu lệnh khác để lựa chọn
nhiều khả năng: switch
6
1
Câu lệnh lựa chọn switch: Cú pháp
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";
}
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;]
}
7
8
Câu lệnh nhảy goto
Ví dụ minh họa
z Cú pháp: goto <nhãn>
z Nhãn là một tên gọi trong chương trình do
người lập trình đặt tên
z Cách viết nhãn:
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 ;
lap:
// đây là nhãn để chương trình quay lại
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 ;
}
label:
<câu lệnh>
z Hạ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
9
10
Lệnh lặp for
Ví dụ minh họa lệnh lặp for
z for (<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>;}
z Cá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
z Hoạt động: Thực hiện <dãy biểu thức 1>
z kiể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
thức 2>, quay lại kiểm tra <điều kiện lặp>..
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 ;
}
11
12
2
Ví dụ minh họa lệnh lặp for
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.
void main()
{
int i, kq = 0;
for (i = 1 ; i <= 100 ; i ++) kq += i ;
cout << "Tổng = " << kq;
}
13
14
Ví dụ lệnh lặp while
Ví dụ lệnh lặp while
void main() // Bài tố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++;
}
15
}
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
while (m != n) {
r=m-n;
if (r > n) m = r; else { m = n ; n = r ; }
}
cout << "UCLN = " << m ;
}
Ví dụ lệnh lặp while
Lệnh lặp do…while
Tìm nghiệm xấp xỉ của phương trình ex - 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 ;
}
z Cú pháp:
do {<khối lệnh lặp>} while (<điều kiện>) ;
z Hoạ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
z
17
16
18
3
Ví dụ câu lệnh do…while
Các lệnh break và continue
z Tính xấp xỉ số π theo công thức Euler
z break 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 {})
z continue 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
π2
1 1 1
1
1
= 2 + 2 + 2 + ... + 2 với 2 <10 −6
n
6 1 2 3
n
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 ;
}
19
20
So sánh cách dùng các câu lệnh lặp
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
.
.
}
}
z for thường được sử dụng trong những
vòng lặp mà số lần lặp được biết trước
z Ngượ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
z Ngượ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
21
22
Mảng một chiều
z Mả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ớ
z Các phần tử được đánh số thứ tự để phân
biệt
z Nếu mảng có n phần tử thì các phần tử
được đánh số từ 0 đến n-1
Mảng (Bảng) và xâu ký tự
0
23
1
2
3
4
5
6
7
8
24
4
Khai báo mảng
Ví dụ về khai 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
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}
25
26
Ví dụ: Tính tổng, tích của hai phân số
Ví dụ: Tìm số bé nhất trong một dãy
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] ;
}
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
cout << "a[" << i << "] = " ; cin >> a[i];
}
min = a[0]; k = 0;
for (i=1; i
cout << "Số bé nhất là " << min << "tại vị trí " << k;
}
27
Xâu ký tự
28
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];
z Là mảng có kiểu các phần tử là char
z Khai 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
z Các xâu ký tự có ký tự kết thúc là ‘\0’
// 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”;
29
30
5
Một số hàm xử lý xâu ký tự (1)
Một số hàm xử lý xâu ký tự (2)
#include <string.h>
z strcpy(s,t): gán nội dung của xâu t cho xâu s
z strncpy(s, t, n): Sao n ký tự đầu tiên của
xâu t vào xâu s
z strcat(s, t): Nối xâu t vào xâu s
z strncat(s, t, n): Nối n ký tự đầu tiên của xâu
t vào xâu s
31
z strcmp(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
z strncmp(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
z strcmpi(s, t): Giống strcmp nhưng không
phân biệt chữ hoa và chữ thường
z strlen(s): Trả lại độ dài của xâu s
32
Mảng hai chiều
Các vấn đề cần nhớ
z Khai báo:
<kiểu thành phần > <tên mảng>[m][n];
z Ví dụ:
z Các câu lệnh rẽ nhánh và lặp
z Sự khác nhau giữa các câu lệnh if..else và
switch
z Sự khác nhau giữa for, while và do…while
z Cách sử dụng break và continue
z Mảng 1 chiều, 2 chiều
z Xâu ký tự, các hàm thư viện thao tác xâu ký
tự
// 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
33
34
Bài tập
z 45 bài tập từ trang 78 đến trang 82 trong
tập bài giảng
z Giải các bài tập trên trong giờ thực hành
35
6