Code kia dài dòng quá, anh viết lại như thế này em hiểu không?
int vi_tri_lon_nhat(int mang[], int size)
{
int max = mang[0];
int vi_tri_max = 0;
for(int i = 1; i < size; ++i)
if (max < mang[i])
{
max = mang[i];
vi_tri_max = i;
}
return vi_tri_max;
}
Phức tạp hơn tí, code của thầy em chắc em chép sai hay sao mà không tìm được phần tử lớn thứ 2. Nên anh không giải thích nhé. Đây là code anh viết.
int vi_tri_lon_thu_hai_dau_tien(int mang[], int size)
{
int max = mang[0];
int second = max;
int vi_tri_max = 0;
int vi_tri_lon_thu_hai = vi_tri_max;
for(int i = 0; i < size; ++i)
{
if (max < mang[i])
{
second = max;
vi_tri_lon_thu_hai = vi_tri_max;
max = mang[i];
vi_tri_max = i;
}
else if (second < mang[i] && max != mang[i])
{
second = mang[i];
vi_tri_lon_thu_hai = i;
}
}
return vi_tri_lon_thu_hai;
}
Tương tự, code thầy em sử dụng nhiều biến i,j,k,g,h,tg
nên anh cũng chả hiểu gì. Anh viết lại sử dụng hàm hoán vị, và hàm kiểm tra số chẵn nhé.
void hoan_vi(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
int so_chan(int n)
{
return n % 2 == 0;
}
void sep_chan_le(int mang[], int size)
{
int vi_tri_moi = 0;
for(int i = 1; i < size; ++i)
if (so_chan(mang[i]))
hoan_vi(&mang[i], &mang[vi_tri_moi++]);
}
Tổng hợp 3 bài
#include <stdio.h>
int vi_tri_lon_nhat(int mang[], int size)
{
int max = mang[0];
int vi_tri_max = 0;
for(int i = 1; i < size; ++i)
if (max < mang[i])
{
max = mang[i]; // gán max bằng giá trị mới, lớn hơn
vi_tri_max = i; // lưu lại vị trí đó
}
return vi_tri_max;
}
int vi_tri_lon_thu_hai_dau_tien(int mang[], int size)
{
int max = mang[0];
int second = max;
int vi_tri_max = 0;
int vi_tri_lon_thu_hai = vi_tri_max;
for(int i = 0; i < size; ++i)
{
if (max < mang[i])
{
second = max; // second gán bằng max
vi_tri_lon_thu_hai = vi_tri_max; // lưu lại vị trí second
max = mang[i]; // lấy giá trị mới, lớn hơn
vi_tri_max = i; // lưu vị trí mới
}
else if (second < mang[i] && max != mang[i])
{
second = mang[i]; // trường hợp này để tìm giá trị second nhỏ hơn max
vi_tri_lon_thu_hai = i;
}
}
return vi_tri_lon_thu_hai;
}
// Code này em chép nhầm nên không tìm được phần tử thứ 2 nhé.
void tim_phan_tu_lon_thu_2_dau_tien(int a[],int spt)
{
int i,j,k;
for(i=0; i<spt; i++)
{
k=1;
for(j=0; j<spt; j++)
{
if(a[i]<a[j])
k++;
}
if(k==2)
{
printf("phan tu lon thu 2 = %d",a[i]);
printf("\nvi tri: %d",i+1);
break;
}
}
}
void hoan_vi(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
int so_chan(int n)
{
return n % 2 == 0;
}
void sep_chan_le(int mang[], int size)
{
int vi_tri_moi = 0;
for(int i = 1; i < size; ++i)
if (so_chan(mang[i])) // nếu chẵn
hoan_vi(&mang[i], &mang[vi_tri_moi++]); // thì đổi chỗ
}
#define SIZE 10
int main()
{
int mang[SIZE] = {5,9,3,1,6,7,9,9,7,4};
printf("Mang hien tai\n");
for(int i = 0; i < SIZE; ++i)
printf("%d ", mang[i]);
printf("\n");
int lon_nhat = vi_tri_lon_nhat(mang,SIZE);
printf("vi tri lon nhat cua mang %d gia tri %d\n", lon_nhat, mang[lon_nhat]);
int lon_nhi = vi_tri_lon_thu_hai_dau_tien(mang,SIZE);
printf("vi tri lon nhat cua mang %d gia tri %d\n", lon_nhi, mang[lon_nhi]);
// Khong tim duoc phan tu lon thu 2
tim_phan_tu_lon_thu_2_dau_tien(mang,SIZE);
sep_chan_le(mang,SIZE);
printf("Mang sau khi sap xep\n");
for(int i = 0; i < SIZE; ++i)
printf("%d ", mang[i]);
return 0;
}