Bài tập số 18: Đếm số phần tử khác nhau trong mảng một chiều với ngôn ngữ C/C++. Bài toán giúp bạn hoàn thiện hơn ngôn ngữ lập trình của mình.
Mục lục bài viết
1. Giới thiệu bài toán
Đề bài:
Viết hàm đếm số lượng các phần tử khác nhau trong mảng 1 chiều a có n phần tử. Ví dụ: 1 6 2 3 2 4 2 6 5 ==> Có 6 phần tử khác nhau là 1 6 2 3 4 5.
Một bài toán cần vận dụng khá nhiều kiến thức lập trình để giải quyết. Giải được bài toán này, chính tỏ kiến thức lập trình C/C++ trong làm việc với mảng tương đối vững .
2. Giải quyết bài toán
Để giải được bài toán yêu cầu bạn đọc nắm vững kiến thức về vòng lặp for và mảng, bài này cần vận dụng nhiều hơn các bài tập khác.
2.1 Ý tưởng giải quyết bài toán
Ý tưởng giải bài này của mình khá trừu tượng:
Tách các phần tử khác các phần tử còn lại ra mảng thứ 2. Số phần tử của mảng thứ 2 chính là số phần tử khác nhau trong mảng ban đầu.
Có thể bạn chưa biết cách tách, rồi so sánh xem phần tử khác nhau kiểu gì, từ từ mình sẽ giải thích nhé!
Mình sẽ viết hàm trả về số lượng phần tử khác nhau. Nếu thích bạn có thể in luôn các phần tử khác nhau giống với đề bài.
Trong hàm cần khai báo những thứ sau:
- Một khai báo mảng b (tối đa n phần tử cho đỡ tốn bộ nhớ)
- Một biến x =1 là số phần tử ban đầu
Mình sẽ gán phần tử đầu tiên của mảng b là phần tử đầu tiên của mảng a để thực hiện so sánh. b[0]=a[0]
Cho vòng lặp for chạy từ vị trí 1 tới cuối mảng a.
Trong vòng lặp for ta tiến hành so sánh a[i] với các phần tử trong mảng b bằng một vòng lặp for và một biến đếm. Nếu biến đếm này =0 tức là không có phần tử giống. Tiến hành thêm phần tử vào mảng b và tăng x.
Đọc thì có vẻ khó hiểu nhưng bạn xem code bên dưới là hiểu ngay nhé!
2.2 Hàm đếm số phần tử khác nhau trong mảng
Dựa trên ý tưởng của mình bên trên, mình code hàm đếm số phần tử khác nhau sau:
int Count(int a[], int n){
int b[n];
int x=1;
b[0]=a[0];
for(int i=1;i<n;i++){
int dem=0;
for(int j=0;j<x;j++){
if(a[i]==b[j])
dem++;
}
if(dem==0){
b[x]=a[i];
x++;
}
}
return x;
}
Hàm trả về giá trị là số phần tử khác nhau trong mảng.
Nếu bạn muốn viết hàm đưa ra giá trị và in các phần tử khác nhau thì đơn giản, thêm hàm xuat mảng là được. (Mình sẽ sửa ở phần chương trình hoàn chỉnh cho bạn xem).
2.3 Chương trình đếm số phần tử khác nhau trong mảng
Bạn thêm phần nhập xuất mảng để làm việc với mảng, tùy chỉnh kết quả theo ý thích của bạn nhé!
Code C++ tham khảo:
(lưu ý code C chỉ cần sửa một chút về cú pháp câu lệnh nhập xuất là được)
#include<bits/stdc++.h>
using namespace std;
void nhap(int a[], int &n){
do{
cout<<("Nhap n: ");
cin>>n;
}
while(n<2||n>99);
for(int i=0; i<n; i++){
cout<<"a["<<i<<"]: ";
cin>>a[i];
}
}
void xuat(int a[], int n){
for(int i=0;i<n;i++){
cout<<" "<<a[i];
}
}
void Count(int a[], int n){
int b[n];
int x=1;
b[0]=a[0];
for(int i=1;i<n;i++){
int dem=0;
for(int j=0;j<x;j++){
if(a[i]==b[j])
dem++;
}
if(dem==0){
b[x]=a[i];
x++;
}
}
cout<<"\nCo "<<x<<" phan tu khac nhau la: ";
xuat(b,x);
}
int main(){
int a[100];
int n;
nhap(a,n);
Count(a,n);
return 0;
}
Kết quả của chạy chương trình trên:

Bài viết đến đây là hết, rất mong nhận được ý kiến đóng góp, đánh giá bài viết của mình để hoàn thiện hơn.
Xem tiếp bài 19: Tìm phần tử xuất hiện nhiều nhất trong mảng
Xem lại bài 17: Chèn phần tử x vào vị trí k trong mảng
Tải về 67 đề cương bài tập lập trình C/C++
mình khuyên bạn nên đặt phần chú thích trong mỗi câu lệnh đẻ cho người đọc hiểu rõ hơn
Dạ cảm ơn bạn đã góp ý ^^!
quynh mai
bạn có thể giải thích giúp mình b[x] = a[i]; là như thế nào không ạ ,mình chưa hiểu lắm
Chào Huy, đoạn đó dùng để lưu giá trị đã xuất hiện rồi vào mảng b. Mảng b chỉ gồm các phần tử khác nhau nhé.
=)) này không đếm được số 0 à
theo em hiểu lẽ ra phàn giá trị khác nhau thì chỉ cần chỉ ra các giá trị khác nhau thôi chứ nếu số 1 với số 2 của a là thành 2 số giống nhau ròi thì đưa vào làm gì ạ:v
Để mình kiểm tra lại nhé