Tìm max và min trong mảng C | Laptrinhcanban.com

HOME › >>

Tìm max và min trong mảng C

Hướng dẫn cách tìm max và min trong mảng C. Bạn sẽ học được 2 cách căn bản để tìm phần tử lớn nhất và nhỏ nhất trong mảng mảng C sau bài học này.

Chúng ta có 2 phương pháp để tìm max và min trong mảng C như sau:

  • Tự tạo hàm tìm phần tử lớn nhất và nhỏ nhất trong mảng C
  • Sắp xếp mảng để tìm phần tử lớn nhất và nhỏ nhất trong mảng C

Tìm max và min trong mảng C bằng hàm tự tạo

Logic tìm max và min trong mảng C

Ví dụ chúng ta có mảng int như sau:

int array[] = {2, 0, 3, 1, 4};

Để tìm phần tử lớn nhất trong mảng C, chúng ta sử dụng ý tưởng rất đơn giản. Giả sử max (giá trị lớn nhất của mảng) là số đầu tiên của mảng. Chúng ta sẽ lấy lần lượt các số còn lại trong mảng đem so sánh với max, nếu số này lớn hơn max thì đổi giá trị của max thành số đó. Và làm như thế cho tới số cuối cùng trong mảng được kiểm tra.

Tìm max trong mảng C

Với mảng ở trên thì chúng ta sẽ tìm max bằng cách kiểm tra lần lượt các phần tử như sau:

  1. Giả sử max là số đầu tiên của mảng và bằng 2. Tiến hành tìm kiếm số lớn hơn 2 về phía cuối mảng

  2. Tìm thấy 3 lớn hơn 2. Do đó gán 3 vào max và tiến hành tìm kiếm số lớn hơn 3 về phía cuối mảng

  3. Tìm thấy 4 lớn hơn 3. Do đó gán 4 vào max. Do 4 là phần tử cuối cùng nên kết thúc xử lý.

Với việc tìm phần tử nhỏ nhất trong mảng C, chúng ta cũng sử dụng logic tương tự. Tuy nhiên thay vì tìm số đầu tiên lớn hơn số đang xét, thì chúng ta sẽ làm ngược lại là tìm số đầu tiên nhỏ hơn số đang xét mà thôi.

Hàm tìm max và min trong mảng C

Để hiện thực được logic ở trên, chúng ta sử dụng vòng lặp và viết các hàm tìm phần tử lớn nhất và nhỏ nhất trong mảng mảng C như sau:

Hàm tìm max trong mảng C:

#include <assert.h>

/*Hàm tìm max trong mảng C*/
int maxElement(const int* array, size_t size){
/*Kiểm tra và báo lỗi nếu đối số truyền vào không thoả mãn điều kiện chạy hàm*/
assert(array != NULL);
assert(size >= 1);

//Giả định giá trị lớn nhất là giá trị đầu tiên của mảng.
int max = array[0];

/*So sánh từng phần tử trong mảng với giá trị đầu tiên để tìm ra giá trị lớn nhất*/
for (size_t i = 1; i < size; ++i) {
if (max < array[i]) { //Thay đổi giá trị max nếu tìm ra số lớn hơn
max = array[i];
}
}
return max;
}

Hàm tìm min trong mảng C:

#include <assert.h>

/*Hàm tìm min trong mảng C*/
int minElement(const int* array, size_t size){
/*Kiểm tra và báo lỗi nếu đối số truyền vào không thoả mãn điều kiện chạy hàm*/
assert(array != NULL);
assert(size >= 1);

//Giả định giá trị nhỏ nhất là giá trị đầu tiên của mảng.
int min = array[0];

/*So sánh từng phần tử trong mảng với giá trị đầu tiên để tìm ra giá trị nhỏ nhất*/
for (size_t i = 1; i < size; ++i) {
if (min > array[i]) { //Thay đổi giá trị min nếu tìm ra số nhỏ hơn
min = array[i];
}
}
return min;
}

Ứng dụng các hàm trên, chúng ta viết chương trình tìm max và min trong mảng C như sau:

#include <stdio.h>
#include <assert.h>

/*Hàm tìm max trong mảng C*/
int maxElement(const int* array, size_t size){
/*Kiểm tra và báo lỗi nếu đối số truyền vào không thoả mãn điều kiện chạy hàm*/
assert(array != NULL);
assert(size >= 1);

//Giả định giá trị lớn nhất là giá trị đầu tiên của mảng.
int max = array[0];

/*So sánh từng phần tử trong mảng với giá trị đầu tiên để tìm ra giá trị lớn nhất*/
for (size_t i = 1; i < size; ++i) {
if (max < array[i]) { //Thay đổi giá trị max nếu tìm ra số lớn hơn
max = array[i];
}
}
return max;
}

/*Hàm tìm min trong mảng C*/
int minElement(const int* array, size_t size){
/*Kiểm tra và báo lỗi nếu đối số truyền vào không thoả mãn điều kiện chạy hàm*/
assert(array != NULL);
assert(size >= 1);

//Giả định giá trị nhỏ nhất là giá trị đầu tiên của mảng.
int min = array[0];

/*So sánh từng phần tử trong mảng với giá trị đầu tiên để tìm ra giá trị nhỏ nhất*/
for (size_t i = 1; i < size; ++i) {
if (min > array[i]) { //Thay đổi giá trị min nếu tìm ra số nhỏ hơn
min = array[i];
}
}
return min;
}
int main(void){
int array[100], n;
printf(">>Nhap so phan tu: ");
scanf("%d", &n);

printf(">>Nhap phan tu:\n");
for (int i = 0; i < n; i++) scanf("%d", &array[i]);

/*Tìm max trong mảng*/
int max = maxElement(array,n);
printf("max= %d\n", max);

/*Tìm min trong mảng*/
int min = minElement(array,n);
printf("min= %d\n", min);

}

Kết quả của phép tìm phần tử lớn nhất và nhỏ nhất trong mảng C bằng hàm tự tạo sẽ như dưới đây. Bạn hãy thử chạy chương trình và kiểm tra nhé.

>>Nhap so phan tu: 5
>>Nhap phan tu:
2
5
8
1
6
max= 8
min= 1

Tìm phần tử lớn nhất và nhỏ nhất trong mảng C bằng cách sắp xếp mảng

Ngoài cách kiểm tra từng phần tử để tìm ra max và min, chúng ta cũng có thể sắp xếp mảng theo thứ tự tăng dần hoặc giảm dần rồi sau đó mới tìm các giá trị lớn nhất và nhỏ nhất.

Ví dụ, sau khi sắp xếp mảng theo thứ tự tăng dần, thì phần tử đầu tiên sẽ là phần tử nhỏ nhất, và phần tử cuối cùng sẽ là phần tử lớn nhất.

Ngược lại thì sau khi sắp xếp mảng theo thứ tự giảm dần, thì phần tử đầu tiên sẽ là phần tử lớn nhất, và phần tử cuối cùng sẽ là phần tử nhỏ nhất.

Về cách sắp xếp mảng trong C, Kiyoshi cũng đã trình bày ở bài viết sau đây:

Sau đây là ví dụ về cách tìm phần tử lớn nhất và nhỏ nhất trong mảng C bằng cách sắp xếp mảng giảm dần.

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

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


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

return bNum - aNum;
}

int main(void){
int array[] = {5, 4, 7, 2, 8, 7, 3};
int length= SIZE_OF_ARRAY(array);

/*Sử dụng hàm qsort để sắp xếp mảng giảm dần*/
qsort(array, length, sizeof(int), compareIntDesc);


/*max là phần tử đầu tiên, min là phần tử cuối cùng*/
printf("max= %d\n", array[0]);
printf("min= %d\n", array[length-1]);

return 0;
}

Kết quả:

max= 8
min= 2

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách tìm max và min 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/tim-max-va-min-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.