Giáo trình Ngôn ngữ lập trình C++ - Chương 3: Cấu trúc điều khiển và dữ liệu kiểu mảng
Nói chung việc thực hiện chương trình là hoạt động tuần tự, tức thực hiện từng
lệnh một từcâu lệnh bắt đầu của chương trình cho đến câu lệnh cuối cùng. Tuy nhiên,
đểviệc lập trình hiệu quảhơn hầu hết các NNLT bậc cao đều có các câu lệnh rẽnhánh
và các câu lệnh lặp cho phép thực hiện các câu lệnh của chương trình không theo trình
tựtuần tựnhưtrong văn bản.
Phần này chúng tôi sẽtrình bày các câu lệnh cho phép rẽnhánh nhưvậy. Để
thống nhất mỗi câu lệnh được trình bày vềcú pháp (tức cách viết câu lệnh), cách sử
dụng, đặc điểm, vídụminh hoạvà một vài điều cần chú ý khi sửdụng lệnh.
i báo 2 ma trận 4 hàng 5 cột A, B chứa các số nguyên:
int A[3][4], B[3][4] ;
− Khai báo có khởi tạo:
int A[3][4] = { {1,2,3,4}, {3,2,1,4}, {0,1,1,0} };
với khởi tạo này ta có ma trận:
1 2 3 4
3 2 1 4
0 1 1 0
trong đó: A[0][0] = 1, A[0][1] = 2, A[1][0] = 3, A[2][3] = 0 …
74
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
− Trong khai báo có thể vắng số hàng (không được vắng số cột), số hàng này
được xác định thông qua khởi tạo.
float A[][3] = { {1,2,3}, {0,1,0} } ;
trong khai báo này chương trình tự động xác định số hàng là 2.
− Phép khai báo và khởi tạo sau đây là cũng hợp lệ:
float A[][3] = { {1,2}, {0} } ;
chương trình cũng xác định số hàng là 2 và số cột (bắt buộc phải khai báo) là 3
mặc dù trong khởi tạo không thể xác định được số cột. Các phần tử chưa khởi tạo sẽ
chưa được xác định cho đến khi nào nó được nhập hoặc gán giá trị cụ thể. Trong ví dụ
trên các phần tử A[0][2], A[1][1] và A[1][2] là chưa được xác định.
c. Ví dụ minh hoạ
Ví dụ 1 : Nhập, in và tìm phần tử lớn nhất của một ma trận.
#include
#include
#include
main()
{
float a[10][10] ;
int m, n ; // số hàng, cột của ma trận
int i, j ; // các chỉ số trong vòng lặp
int amax, imax, jmax ; // số lớn nhất và chỉ số của nó
clrscr(); cout > m >> n ;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
{
cout > a[i][j] ;
}
amax = a[0][0]; imax = 0; jmax = 0;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
if (amax < a[i][j])
75
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
{
amax = a[i][j]; imax = i; jmax = j;
}
cout << "Ma trận đã nhập\n" ;
cout << setiosflags(ios::showpoint) << setprecision(1) ;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
{
if (j==0) cout << endl;
cout << setw(6) << a[i][j] ;
}
cout << "Số lớn nhất là " << setw(6) << amax << endl;
cout << "tại vị trí (" << imax << "," << jmax << ")" ;
getch();
}
Ghi chú: Khi làm việc với mảng (1 chiều, 2 chiều) do thói quen chúng ta thường
tính chỉ số từ 1 (thay vì 0), do vậy trong mảng ta có thể bỏ qua hàng 0, cột 0 bằng cách
khai báo số hàng và cột tăng lên 1 so với số hàng, cột thực tế của mảng và từ đó có thể
làm việc từ hàng 1, cột 1 trở đi.
Ví dụ 2 : Nhân 2 ma trận. Cho 2 ma trận A (m x n) và B (n x p). Tính ma trận C = A x
B, trong đó C có kích thước là m x p. Ta lập vòng lặp tính từng phần tử của C. Giá trị
của phần tử C tại hàng i, cột j chính là tích vô hướng của hàng i ma trận A với cột j ma
trận B. Để tránh nhầm lẫn ta qui ước bỏ các hàng, cột 0 của các ma trận A, B, C (tức
các chỉ số được tính từ 1 trở đi).
#include
#include
#include
main()
{
float A[10][10], B[10], C[10][10] ;
int m, n, p ; // số hàng, cột của ma trận
int i, j, k ; // các chỉ số trong vòng lặp
76
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
clrscr();
cout > m >> n >> p;
// Nhập ma trận A
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
{
cout > A[i][j] ;
}
// Nhập ma trận B
for (i=1; i<=n; i++)
for (j=1; j<=p; j++)
{
cout > B[i][j] ;
}
// Tính ma trận C = A x B
for (i=1; i<=m; i++)
for (j=1; j<=p; j++)
{
C[i][j] = 0; for (k=1; k<=n; k++) C[i][j] += A[i][k]*B[k][j] ;
}
// In kết quả
cout << "Ma trận kết quả\n" ;
cout << setiosflags(ios::showpoint) << setprecision(2) ;
for (i=1; i<m; i++)
for (j=1; j<n; j++)
{
if (j==1) cout << endl;
cout << setw(6) << a[i][j] ;
}
getch();
}
77
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
BÀI TẬP
Lệnh rẽ nhánh
1. Nhập một kí tự. Cho biết kí tự đó có phải là chữ cái hay không.
2. Nhập vào một số nguyên. Trả lời số nguyên đó: âm hay dương, chẵn hay lẻ ?
3. Cho n = x = y và bằng: a. 1 b. 2 c. 3 d. 4
Hãy cho biết giá trị của x, y sau khi chạy xong câu lệnh:
if (n % 2 == 0) if (x > 3) x = 0;
else y = 0;
4. Tính giá trị hàm
a.
⎩⎨
⎧
≤+
>+=
04
03
x,e
x,xx)x(f
x
b.
⎜⎜
⎜⎜
⎝
⎛
−≤−+
<<−+
≥+
=
112
1153
11
2
2
x,xx
x,x
x,x
)x(f
5. Viết chương trình giải hệ phương trình bậc nhất 2 ẩn: ⎩⎨
⎧
=+
=+
feydx
cbyax
6. Nhập 2 số a, b. In ra max, min của 2 số đó. Mở rộng với 3 số, 4 số ?
7. Nhập 3 số a, b, c. Hãy cho biết 3 số trên có thể là độ dài 3 cạnh của một tam giác ?
Nếu là một tam giác thì đó là tam giác gì: vuông, đều, cân, vuông cân hay tam giác
thường ?
8. Nhập vào một số, in ra thứ tương ứng với số đó (qui ước 2 là thứ hai, …, 8 là chủ
nhật).
9. Nhập 2 số biểu thị tháng và năm. In ra số ngày của tháng năm đó (có kiểm tra năm
nhuận).
10. Lấy ngày tháng hiện tại làm chuẩn. Hãy nhập một ngày bất kỳ trong tháng. Cho
biết thứ của ngày vừa nhập ?
Lệnh lặp
78
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
11. Giá trị của i bằng bao nhiêu sau khi thực hiện cấu trúc for sau:
for (i = 0; i < 100; i++);
12. Giá trị của x bằng bao nhiêu sau khi thực hiện cấu trúc for sau:
for (x = 2; i < 10; x+=3) ;
13. Bạn bổ sung gì vào lệnh for sau:
for ( ; nam < 1997 ; ) ;
để khi kết thúc nam có giá trị 2000.
14. Bao nhiêu kí tự ‘X’ được in ra màn hình khi thực hiện đoạn chương trình sau:
for (x = 0; x 0; y --) cout << ‘X’;
15. Nhập vào tuổi cha và tuổi con hiện nay sao cho tuổi cha lớn hơn 2 lần tuổi con.
Tìm xem bao nhiêu năm nữa tuổi cha sẽ bằng đúng 2 lần tuổi con (ví dụ 30 và 12,
sau 6 năm nữa tuổi cha là 36 gấp đôi tuổi con là 18).
16. Nhập số nguyên dương N. Tính:
a.
N
N...S ++++= 3211
b. 22222 321 N...S ++++=
17. Nhập số nguyên dương n. Tính:
a. 33331 ++++= ...S n dấu căn
b.
2
12
12
12
1
2
...
S
+
+
+
= n dấu chia
18. Nhập số tự nhiên n. In ra màn hình biểu diễn của n ở dạng nhị phân.
19. In ra màn hình các số có 2 chữ số sao cho tích của 2 chữ số này bằng 2 lần tổng
của 2 chữ số đó (ví dụ số 36 có tích 3*6 = 18 gấp 2 lần tổng của nó là 3 + 6 = 9).
20. Số hoàn chỉnh là số bằng tổng mọi ước của nó (không kể chính nó). Ví dụ 6 = 1 +
2 + 3 là một số hoàn chỉnh. Hãy in ra màn hình tất cả các số hoàn chỉnh < 1000.
21. Các số sinh đôi là các số nguyên tố mà khoảng cách giữa chúng là 2. Hãy in tất cả
cặp số sinh đôi < 1000.
79
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
22. Nhập dãy kí tự đến khi gặp kí tự ‘.’ thì dừng. Thống kê số chữ cái viết hoa, viết
thường, số chữ số và tổng số các kí tự khác đã nhập. Loại kí tự nào nhiều nhất ?
23. Tìm số nguyên dương n lớn nhất thoả mãn điều kiện:
a. 1019992
12
1
5
1
3
11 .
n
... <−++++ .
b. . 20001999 10 <− nlogen
24. Cho ε = 1e−6. Tính gần đúng các số sau:
a. Số pi theo công thức Euler: 2222
2 1
3
1
2
1
1
1
6 n
... ++++=π dừng lặp khi
6
2 10
1 −<
n
.
b. ex theo công thức:
!n
x...
!
x
!
xe
n
x ++++=
21
1
21
dừng lặp khi 610−<
!n
xn .
c.
)!n(
x)(...
!
x
!
xxxsin
n
n
12
1
53
1253
+−+++−=
+
, dừng lặp khi 6
12
10
12
−
+
<+ )!n(
x n .
d. )a(a 0> theo công thức: , dừng khi
⎩⎨
⎧
>+
==
−− 02
0
1
2
1 ns/)as(
na
s
nn
n
6
1 10
−
− <− nn ss .
25. In ra mã của phím bất kỳ được nhấn. Chương trình lặp cho đến khi nhấn ESC để
thoát.
26. Bằng phương pháp chia đôi, hãy tìm nghiệm xấp xỉ (độ chính xác 10−6) của các
phương trình sau:
a. ex − 1.5 = 0, trên đoạn [0, 1].
b. x2x − 1 = 0, trên đoạn [0, 1].
c. a0xn + a1xn-1 + ... + an = 0, trên đoạn [a, b]. Các số thực ai, a, b được nhập từ
bàn phím sao cho f(a) và f(b) trái dấu.
Mảng
27. Nhập vào dãy n số thực. Tính tổng dãy, trung bình dãy, tổng các số âm, dương và
tổng các số ở vị trí chẵn, vị trí lẻ trong dãy. Tìm phần tử gần số trung bình nhất
80
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
của dãy.
28. Tìm và chỉ ra vị trí xuất hiện đầu tiên của phần tử x trong dãy.
29. Nhập vào dãy n số. Hãy in ra số lớn nhất, bé nhất của dãy.
30. Nhập vào dãy số. In ra dãy đã được sắp xếp tăng dần, giảm dần.
31. Cho dãy đã được sắp tăng dần. Chèn thêm vào dãy phần tử x sao cho dãy vẫn sắp
xếp tăng dần.
32. Hãy nhập vào 16 số nguyên. In ra thành 4 dòng, 4 cột.
33. Nhập ma trận A và in ra ma trận đối xứng của nó.
34. Cho một ma trận nguyên kích thước m*n. Tính:
− Tổng tất cả các phần tử của ma trận.
− Tổng tất cả các phần tử dương của ma trận.
− Tổng tất cả các phần tử âm của ma trận.
− Tổng tất cả các phần tử chẵn của ma trận.
− Tổng tất cả các phần tử lẻ của ma trận.
35. Cho một ma trận thực kích thước m*n. Tìm:
− Số nhỏ nhất, lớn nhất (kèm chỉ số) của ma trận.
− Số nhỏ nhất, lớn nhất (kèm chỉ số) của từng hàng của ma trận.
− Số nhỏ nhất, lớn nhất (kèm chỉ số) của từng cột của ma trận.
− Số nhỏ nhất, lớn nhất (kèm chỉ số) của đường chéo chính của ma trận.
− Số nhỏ nhất, lớn nhất (kèm chỉ số) của đường chéo phụ của ma trận.
36. Nhập 2 ma trận vuông cấp n A và B. Tính A + B, A − B, A * B và A2 - B2.
Xâu kí tự
37. Hãy nhập một xâu kí tự. In ra màn hình đảo ngược của xâu đó.
38. Nhập xâu. Thống kê số các chữ số '0', số chữ số '1', …, số chữ số '9' trong xâu.
39. In ra vị trí kí tự trắng đầu tiên từ bên trái (phải) một xâu kí tự.
40. Nhập xâu. In ra tất các các vị trí của chữ 'a' trong xâu và tổng số lần xuât hiện của
nó.
41. Nhập xâu. Tính số từ có trong xâu. In mỗi dòng một từ.
81
Chương 3. Cấu trúc điều khiển và dữ liệu kiểu mảng
42. Nhập xâu họ tên, in ra họ, tên dưới dạng viết hoa.
43. Thay kí tự x trong xâu s bởi kí tự y (s, x, y được đọc vào từ bàn phím)
44. Xoá mọi kí tự x có trong xâu s (s, x được đọc vào từ bàn phím). (Gợi ý: nên xoá
ngược từ cuối xâu về đầu xâu).
45. Nhập xâu. Không phân biệt viết hoa hay viết thường, hãy in ra các kí tự có mặt
trong xâu và số lần xuất hiện của nó (ví dụ xâu “Trach − Van − Doanh” có chữ a
xuất hiện 3 lần, c(1), d(1), h(2), n(2), o(1), r(1), t(1), −(2), space(4)).
82
File đính kèm:
Giáo trình Ngôn ngữ lập trình C++ - Chương 3 Cấu trúc điều khiển và dữ liệu kiểu mảng.pdf

