Bài tập thực hành đếm số lần xuất hiện của từng phần tử trong mảng. Mỗi phần tử chỉ xuất hiện một lần


Bài tập thực hành đếm số lần xuất hiện của từng phần tử trong mảng. Mỗi phần tử chỉ xuất hiện một lần


YÊU CẦU
·        Nhập một mảng từ bàn phím
·        Cho biết:
o   Từng phần tử của mảng xuất hiện bao nhiêu lần trong mảng.
Lưu ý: Mỗi phần tử chỉ xuất hiện 1 lần
o   In ra danh sách gồm 2 cột: Giá trị phần tử và số lần xuất hiện




Cách giải quyết
Khai báo 1 mảng để lưu trữ những phần tử nào đã in để về sau khi gặp lại sẽ bỏ qua
Với mỗi phần tử, bổ sung thêm các việc như sau:
Nếu phần tử đó chưa có trong danh sách đã in thì mới thực hiện các việc sau:
   Đi đếm số lượng phần tử (như cách làm trước)
   Sau khi in xong, sẽ thực hiện thêm 2 việc:
   Đưa phần tử này vào danh sách đã in
   Tăng số lượng phần tử đã in lên

Khai báo sử dụng thư viện

#include <conio.h>
#include <stdio.h>



Bổ sung thêm phần khai báo 1 hàm để kiểm tra 1 phần tử đã có trong 1 danh sách hay chưa.

bool CoTrongDanhSach(int socankiemtra,int dsdain[],int soluongdain);


Khai báo một mảng các phần tử kiểu int với số lượng là 10 phần tử.

int ds[10];
int n;

Khai báo thêm một mảng và 1 biến để lưu số lượng phần tử đã in
int dsdain[10];
int soluongdain = 0;


Nhập vào số lượng phần tử của mảng

//Hien thong bao moi nguoi dung nhap
    printf("Nhap so luong phan tu:");
//Nhap vao tu ban phim
    scanf("%d",&n);

Nhập mảng từ bàn phím

for(int i = 0;i<10; i++)
   {
        printf("Nhap ds [%d]:",i);
        scanf("%d",&ds[i]);
   }

Hiện mảng đã nhập

printf("Danh sach da nhap la:");
    for (int i = n-1;i>=0;i--)
    {
        printf("ds[%d]=%d\n",i,ds[i]);
    }

Khai báo một biến để lưu trữ số lần xuất hiện của từng phần tử

int soluong = 0;

 

Thực hiện Tìm kiếm trên danh sách

Lần lượt duyệt qua từng phần tử trong mảng đã cho, với mỗi phần tử đó sẽ thực hiện:
+ Khởi tạo 1 biến đếm cho bằng 0
+ Chạy từ đầu đến cuối mảng đã cho để kiểm tra:
+ Nếu gặp phần tử nào bằng thì biến đếm tăng lên 1.
+ In ra phần tử + số lần sau đó xuống dòng


Bổ sung thêm điều kiện kiểm tra và xử lý sau đây:

Khai báo 1 mảng để lưu trữ những phần tử nào đã in để về sau khi gặp lại sẽ bỏ qua
Với mỗi phần tử, bổ sung thêm các việc như sau:
Nếu phần tử đó chưa có trong danh sách đã in thì mới thực hiện các việc sau:
   Đi đếm số lượng phần tử (như cách làm trước)
   Sau khi in xong, sẽ thực hiện thêm 2 việc:
   Đưa phần tử này vào danh sách đã in
   Tăng số lượng phần tử đã in lên

Code như sau:
for (int i = 0;i<n;i++)
    {
        //Neu ds[i] chua nam trong danh sach da in thi lam
        //if !CoTrongDanhSach(ds[i], dsdain) thi
        if (!CoTrongDanhSach(ds[i],dsdain,soluongdain))
        {
            soluong = 0;
            for (int j = 0; j<n; j++)
                {
                    if (ds[i] == ds[j])
                        {
                            soluong = soluong+1;
                        }
                }
                    //In ra
            printf("Gia tri [%d] xuat hien [%d] lan\n",ds[i], soluong);

            //In xong thi bo sung vao danh sach da in
            dsdain[soluongdain] = ds[i];
            soluongdain = soluongdain+1;
        }

    }

Viết code để thực hiện kiểm tra 1 phần tử đã có trong 1 danh sách hay chưa.

bool CoTrongDanhSach(int socankiemtra,int dsdain[],int soluongdain)
{
    //Duyet tu dau den cuoi danh sach.
    //Neu co thi tra ra ngoai la da co
    for (int i = 0; i<soluongdain; i++)
    {
        if (socankiemtra==dsdain[i])
        {
            return true;
        }
    }
    //Den het roi ma khong co thi tra ra la khong co
    return false;
}


Tổng hợp Code


#include <stdio.h>
#include <conio.h>
bool CoTrongDanhSach(int socankiemtra,int dsdain[],int soluongdain);
int main()
{
    int ds[10];
    int n;
    //Can 1 mang de luu nhung dong da in ra
    int dsdain[10];
    int soluongdain = 0;
    //Hien thong bao moi nguoi dung nhap
    printf("Nhap so luong phan tu:");
    //Nhap vao tu ban phim
    scanf("%d",&n);
    //In n ra
    printf("n=%d\n",n);
    //Nhap cac phan tu trong mang
    for (int i = 0; i<n; i++)
    {
        //In ra loi huong dan nhap phan tu thu may
        printf("Nhap phan tu thu [%d]:",i+1);
        scanf("%d",&ds[i]);
    }
    //In ra danh sach
    printf("Danh sach da nhap la:");
    for (int i = n-1;i>=0;i--)
    {
        printf("ds[%d]=%d\n",i,ds[i]);
    }

    printf("In danh sach phan tu trong mang:\n");
    int soluong = 0;
    for (int i = 0;i<n;i++)
    {
        //Neu ds[i] chua nam trong danh sach da in thi lam
        //if !CoTrongDanhSach(ds[i], dsdain) thi
        if (!CoTrongDanhSach(ds[i],dsdain,soluongdain))
        {
            soluong = 0;
            for (int j = 0; j<n; j++)
                {
                    if (ds[i] == ds[j])
                        {
                            soluong = soluong+1;
                        }
                }
                    //In ra
            printf("Gia tri [%d] xuat hien [%d] lan\n",ds[i], soluong);

            //In xong thi bo sung vao danh sach da in
            dsdain[soluongdain] = ds[i];
            soluongdain = soluongdain+1;
        }

    }
    getch();
}
bool CoTrongDanhSach(int socankiemtra,int dsdain[],int soluongdain)
{
    //Duyet tu dau den cuoi danh sach.
    //Neu co thi tra ra ngoai la da co
    for (int i = 0; i<soluongdain; i++)
    {
        if (socankiemtra==dsdain[i])
        {
            return true;
        }
    }
    //Den het roi ma khong co thi tra ra la khong co
    return false;
}






Giao diện kết quả




Phân tích kết quả:

Kết quả in ra đúng yêu cầu.
Mỗi phần tử chỉ xuất hiện 1 lần


No comments:

Powered by Blogger.