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