Trong bài viết này, chúng ta sẽ tìm hiểu cách tách mảng một chiều c++ thành hai mảng riêng biệt, một mảng chứa các số chẵn và một mảng chứa các số lẻ. Đây là một bài toán cơ bản nhưng rất quan trọng để hiểu rõ cách xử lý dữ liệu mảng trong C/C++.
Bài 15: số chính phương hay còn gọi là số hình vuông, là số tự nhiên có căn bậc 2 là một số nguyên. Hãy viết chương trình nhập vào các số nguyên đến khi gặp 0 thì dừng và kiểm tra số chính phương c++.
1. Bài toán tách 1 mảng thành 2 mảng chẵn lẻ C++
Bài 17: Hãy viết chương trình nhập vào một dãy số đến khi gặp số 0 thì dừng, sau đó tách các số chẵn và số lẻ ra 2 mảng khác nhau. Tính trung bình cộng các số chẵn dương và trung bình cộng các số lẻ âm.
Ví dụ dãy số đầu vào: 1, 4, 5, 6, 7, 11, 21, 42, 23, 6, 9. Sẽ được tách thành 2 dãy: 1, 5, 7, 11, 21, 23, 9 và 4, 6, 42, 6.
2. Mô tả thuật toán tách mảng
Ý tưởng: Tạo mảng mới chứa các phần tử chẵn của mảng đã nhập bằng cách khai báo 2 mảng a[c], b[l] chứa lần lượt các phần tử chẵn và lẻ sau khi tách dãy số nguyên nhập vào từ bàn phím. Tiến hành duyệt mảng a để tính tổng các phần tử chẵn, duyệt mảng b để tính tổng các phần tử lẻ.
2.1. Tách mảng c++
- Vòng lặp
do-while
được sử dụng để nhập các số nguyên từ người dùng cho đến khi gặp giá trị 0. Trong vòng lặp:- In ra thông báo “Nhap so nguyen n: “.
- Sử dụng
cin
để nhập giá trị người dùng vào biếnn
. - Kiểm tra nếu
n
khác 0:- Nếu
n
chia hết cho 2 (nghĩa là là số chẵn), thêmn
vào mảng chẵna[]
và tăng giá trị củac
lên 1. - Ngược lại, thêm
n
vào mảng lẻb[]
và tăng giá trị củal
lên 1.
- Nếu
- Lặp lại quá trình cho đến khi
n
bằng 0.
do { cout << "Nhap so nguyen n: "; cin >> n; if (n != 0) { if (n % 2 == 0) { a[c] = n; c++; } else { b[l] = n; l++; } } } while (n != 0);
2.2. In ra các số chẵn trong mảng c++
- Sử dụng vòng lặp
for
để duyệt qua các phần tử của mảng chẵna[]
và in ra giá trị của từng phần tử bằng cách sử dụngcout
. - Sử dụng hàm
setw(3)
để căn chỉnh độ rộng của giá trị in ra, đảm bảo các số được in cách đều nhau. - Tương tự, in ra mảng các số lẻ
b[]
.
cout << "Mang cac so chan: "; for (i = 0; i < c; i++) cout << setw(3) << a[i]; cout << endl; cout << "Mang cac so le: "; for (j = 0; j < l; j++) cout << setw(3) << b[j]; cout << endl;
2.3. Tính tổng các số lẻ trong mảng c++
- Khai báo các biến
demc, deml, tongA, tongB
để đếm số lượng số chẵn dương, số lẻ âm và tính tổng của từng mảng tương ứng. - Sử dụng vòng lặp
for
để duyệt qua từng phần tử trong mảng chẵna[]
và mảng lẻb[]
:- Nếu phần tử là số chẵn dương (lớn hơn 0), tăng giá trị của
demc
lên 1 và cộng giá trị của phần tử vào biếntongA
. - Nếu phần tử là số lẻ âm (nhỏ hơn 0), tăng giá trị của
deml
lên 1 và cộng giá trị của phần tử vào biếntongB
.
- Nếu phần tử là số chẵn dương (lớn hơn 0), tăng giá trị của
// tinh tong so chan, le int demc = 0, deml = 0, tongA = 0, tongB = 0; for (i = 0; i < c; i++) if (a[i] > 0) { demc++; tongA = tongA + a[i]; } for (j = 0; j < l; j++) if (b[j] < 0) { deml++; tongB = tongB + b[j]; }
2.4 Tính trung bình cộng các số lẻ trong mảng c++
tbcC = tongA / demc
tính trung bình cộng của các số chẵn dương.tbcL = tongB / deml
tính trung bình cộng của các số lẻ âm.
// tinh trung binh cong so chan tbcC = tongA / demc; // tinh trung binh cong so le tbcL = tongB / deml;
2.6. Gộp 2 mảng thành 1 mảng C++
for (int i = 0; i < c + l; i++) { if (i < c) c[i] = a[i]; else c[i] = b[i - c]; } /* for(i=m+1;i<=n;i++){ b[i]=c[i-m]; } */
3. Code mẫu chương trình tách mảng
#include<bits/stdc++.h> using namespace std; int main() { int n, i, j, c = 0, l = 0; double tbcC, tbcL; int a[250], b[250]; //tach mang, chia mang thanh 2 mang moi do { cout << "Nhap so nguyen n: "; cin >> n; if (n != 0) { if (n % 2 == 0) { a[c] = n; c++; } else { b[l] = n; l++; } } } while (n != 0); // in ra man hinh mang cac so chan cout << "Mang cac so chan: "; for (i = 0; i < c; i++) cout << setw(3) << a[i]; cout << endl; //in ra man hinh mang cac so le cout << "Mang cac so le: "; for (j = 0; j < l; j++) cout << setw(3) << b[j]; cout << endl; // tinh tong so chan, le int demc = 0, deml = 0, tongA = 0, tongB = 0; for (i = 0; i < c; i++) if (a[i] > 0) { demc++; tongA = tongA + a[i]; } for (j = 0; j < l; j++) if (b[j] < 0) { deml++; tongB = tongB + b[j]; } // tinh trung binh cong so chan tbcC = tongA / demc; // tinh trung binh cong so le tbcL = tongB / deml; // in ra man hinh cout << "Trung binh cong cac so chan duong la: " << setprecision(2) << tbcC << endl; cout << "Trung binh cong cac so le am la: " << setprecision(2) << tbcL; }
Ok, vậy mình đã hoàn thành bài toán tách 1 mảng thàng 2 mảng chẵn lẻ. Chúng ta khai báo một mảng ban đầu, sau đó sử dụng vòng lặp để duyệt qua mảng và phân loại các phần tử vào mảng chẵn hoặc lẻ dựa trên tính chẵn lẻ của chúng. Cuối cùng, chúng ta in ra hai mảng. Nếu có bất kỳ thắc mắc hoặc sai sót gì thì đừng ngần lại liên hệ với mình nhé! Cảm ơn các bạn đã tham khảo trên ttnguyen.net
Tải tài liệu thực hành C/C++ có lời giải:
Bài tiếp theo >> Bài 18: sắp xếp các số nguyên tố về đầu dãy, các số không phải là số nguyên tố về cuối dãy