Kiểm tra và lấy phần tử trùng trong mảng C | Laptrinhcanban.com

HOME › >>

Kiểm tra và lấy phần tử trùng trong mảng C

Hướng dẫn cách kiểm tra và lấy phần tử trùng trong mảng C. Bạn sẽ học được 2 cách căn bản để kiểm tra phần tử trùng trong mảng C cũng như ứng dụng chúng để lấy phần tử trùng nhau trong mảng C sau bài học này.

Chúng ta có 2 phương pháp kiểm tra phần tử trùng trong mảng C như sau:

  • Kiểm tra phần tử trùng trong mảng C bằng cách so sánh từng phần tử
  • Kiểm tra phần tử trùng trong mảng C bằng cách sắp xếp mảng

Và ứng dụng một trong 2 phương pháp kiểm tra ở trên, chúng ta cũng có thể tiến hành lấy phần tử trùng trong mảng C.

Kiểm tra phần tử trùng trong mảng C bằng cách so sánh từng phần tử

Để kiểm tra phần tử trùng trong mảng C, chúng ta có thể lấy lần lượt từng phần tử và so sánh xem có phần tử nào giống nó trong chuỗi ban đầu hay không.

Nếu tồn tại dù chỉ một cặp phần tử giống nhau, điều đó có nghĩa là tồn tại phần tử trùng nhau trong mảng ban đầu, và ngược lại nếu tất cả đều khác nhau thì không tồn tại phần tử trùng nhau trong mảng ban đầu.

Để làm được điều đó, chúng ta cần dùng tới một vòng lặp lồng để lấy và kiểm tra từng phần tử trong mảng ban đầu.

Và chúng ta viết hàm kiểm tra phần tử trùng trong mảng C trong chương trình như sau:

#include <stdio.h>

/*Tạo macro SIZE_OF_ARRAY để lấy độ dài (số phần tử) của mảng chỉ định*/
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

/*Tạo hàm kiểm tra phần tử trùng trong mảng C*/
int array_is_unique(const int* array, size_t size){
//flag = 1 => tồn tại phần tử trùng nhau
//flag = 0 => không tồn tại phần tử trùng nhau
int flag = 0;
for (size_t i = 0; i < size - 1; ++i) {
for (size_t j = i + 1; j < size; ++j) {
if (array[i] == array[j]) {
flag = 1;
break;
}
}
}

return flag;
}

int main(void){
//Khởi tạo mảng cần kiểm tra phần tử trùng nhau
int array1[] = {1,2,3,3,2,5}; //Mảng chứa phần tử trùng nhau
int array2[] = {1,2,3,4,5,6,7}; //Mảng không chứa phần tử trùng nhau


//Kiểm tra phần tử trùng nhau
int check1 = array_is_unique(array1,SIZE_OF_ARRAY(array1));
if (check1 == 1) printf("ton tai phan tu trung nhau");
else printf("khong ton tai phan tu trung nhau");
printf("\n");

//Kiểm tra phần tử trùng nhau
int check2 = array_is_unique(array2,SIZE_OF_ARRAY(array2));
if (check2 == 1) printf("ton tai phan tu trung nhau");
else printf("khong ton tai phan tu trung nhau");

return 0;
}

Kết quả phép kiểm tra phần tử trùng trong mảng C như sau:

ton tai phan tu trung nhau
khong ton tai phan tu trung nhau

Kiểm tra phần tử trùng trong mảng C bằng cách sắp xếp mảng

Ngoài cách so sánh từng phần tử trong mảng bằng vòng lặp lồng như trên, chúng ta cũng có thể kiểm tra phần tử trùng trong mảng C bằng cách sắp xếp mảng.

Ý tưởng ở đây là, sau khi sắp xếp mảng, thì các phần tử trùng nhau (nếu có) sẽ được xếp nằm cạnh nhau, do đó nếu chúng ta kiểm tra trong mảng sau khi sắp xếp có tồn tại phần tử nào giống với phần tử đằng sau nó, thì điều đó chứng tỏ mảng ban đầu có tồn tại phần tử trùng nhau.

Để sắp xếp mảng trong C, chúng ta sẽ sử dụng tới hàm qsort() mà Kiyoshi đã hướng dẫn trong bài:

Và chúng ta viết hàm kiểm tra phần tử trùng trong mảng C trong chương trình như sau:

#include <stdio.h>
#include <stdlib.h>

/*Tạo macro SIZE_OF_ARRAY để lấy độ dài (số phần tử) của mảng chỉ định*/
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

/*Tạo hàm so sánh tăng dần sử dụng trong hàm qsort*/
int compareIntAsc(const void* a, const void* b)
{
int aNum = *(int*)a;
int bNum = *(int*)b;

return aNum - bNum;
}

/*Tạo hàm kiểm tra phần tử trùng trong mảng C*/
int array_is_unique(const int* array, size_t size){
//flag = 1 => tồn tại phần tử trùng nhau
//flag = 0 => không tồn tại phần tử trùng nhau
int flag = 0;
for (size_t i = 0; i < size - 1; ++i) {
if (array[i] == array[i + 1]) {
flag = 1;
break;
}
}


return flag;
}

int main(void){
//Khởi tạo mảng cần kiểm tra phần tử trùng nhau
int array1[] = {1,2,3,3,2,5}; //Mảng chứa phần tử trùng nhau
int array2[] = {1,2,3,4,5,6,7}; //Mảng không chứa phần tử trùng nhau

//Sắp xếp mảng theo thứ tự tăng dần
qsort(array1, SIZE_OF_ARRAY(array1), sizeof(int), compareIntAsc);
qsort(array2, SIZE_OF_ARRAY(array2), sizeof(int), compareIntAsc);

//Kiểm tra phần tử trùng nhau
int check1 = array_is_unique(array1,SIZE_OF_ARRAY(array1));
if (check1 == 1) printf("ton tai phan tu trung nhau");
else printf("khong ton tai phan tu trung nhau");
printf("\n");


int check2 = array_is_unique(array2,SIZE_OF_ARRAY(array2));
if (check2 == 1) printf("ton tai phan tu trung nhau");
else printf("khong ton tai phan tu trung nhau");

return 0;
}

Kết quả phép kiểm tra phần tử trùng trong mảng C như sau:

ton tai phan tu trung nhau
khong ton tai phan tu trung nhau

Lấy phần tử trùng trong mảng C

Bằng cách sử dụng một trong hai phương pháp ở trên, chúng ta có thể biến tấu chương trình để có thể lấy phần tử trùng trong mảng C.

Ví dụ, chúng ta sử dụng cách 1 và thay đổi chút xíu hàm kiểm tra phần tử trùng nhau để tạo ra hàm lấy phần tử trùng trong mảng C như sau:

#include <stdio.h>

/*Tạo macro SIZE_OF_ARRAY để lấy độ dài (số phần tử) của mảng chỉ định*/
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))


/*Tạo hàm in phần tử trong mảng*/
void show_array(int array[], int length){
for(short i = 0; i < length; i++) printf("%d ", array[i]);
printf("\n");
}

/*Thay đổi hàm kiểm tra phần tử trùng nhau ở phương pháp một*/
/*Và tạo hàm lấy phần tử trùng trong mảng C*/
void take_duplicate_element(const int* array, size_t size){
int result[100], count=0;

for (size_t i = 0; i < size - 1; ++i) {
for (size_t j = i + 1; j < size; ++j) {
if (array[i] == array[j]) {
result[count]=array[i];
++ count;
}
}
}

show_array(result, count);
}

int main(void){
int array1[] = {1,2,3,3,2,5};
int array2[] = {1,1,2,3,2,5,5,8,9,6};

//Lấy phần tử trùng nhau
take_duplicate_element(array1,SIZE_OF_ARRAY(array1));
take_duplicate_element(array2,SIZE_OF_ARRAY(array2));


return 0;
}

Kết quả phép lấy phần tử trùng trong mảng C như sau:

2 3 
1 2 5

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách kiểm tra phần tử trùng trong mảng C cũng như cách lấy phần tử trùng nhau trong mảng C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/mang-trong-c/kiem-tra-phan-tu-trung-trong-mang-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.