Đề bài là cho mảng giá trị int, xác định các khoảng giá trị sẽ xuất hiện bao lần.
Ví dụ: giá trị mảng là salaryOfEm tại 250 sẽ đi về đoạn khoảng từ 200-299 (gần 300).
Mã giả như sau:
- Mảng Scale ghi lại vị trí khoảng từ 200 đến hơn 1000 chia thành 9 khoảng.
- Hàm checkRange sẽ cho ra giá trị vị trí thuộc khoảng nào với tham số low và high.
- Nếu giá trị >=1000 thì ra vị trí high.
- Tại else, chia đôi mảng lấy giá trị ở giữa với biến middle
- Chạy lặp sẽ gán low hoặc high thành middle nếu giá trị đối chiếu lớn/ nhỏ hơn giá trị tại middle, tìm tiếp cho đến khi chừng nào a[high]-a[low] == 100 khoảng giá trị mà đang tìm) thì sẽ return về low.
Code dưới đây với các số dưới 1000 thì lại return về cùng 1 giá trị là 100 mà ko rõ nó lấy ra kiểu gì. Mong các bạn chỉ điểm.
#define SIZE 10
int checkRange(const int a[], int salary, int low, int high);
int main(void)
{
int salaryOfEm[SIZE] = { 250,900,1000,700,400,398,650,727,809,1200 };
int rangeSalary[9] = { 200,300,400,500,600,700,800,900,1000 };
int scale[9] = { 0 };
size_t i;
for (i = 0; i < SIZE; i++)
{
printf("%d\n", checkRange(rangeSalary, salaryOfEm[i], 0, 8));
++scale[checkRange(rangeSalary, salaryOfEm[i], 0, 8)];
}
for (i = 0; i < 9; i++)
{
if (i == 8)
printf("1000 or more: %d\n", scale[8]);
else
printf("%d~%d: %d\n", rangeSalary[i], rangeSalary[i + 1] - 1, scale[i]);
}
system("pause");
}
int checkRange(const int a[], int salary, int low, int high)
{
int middle;
if (salary >= 1000)
{
return high;
}
else
{
do
{
middle = (high + low) / 2;
if ((a[high] - a[low]) == 100)
{
return low;
}
else
{
if (salary < a[middle])
{
high = middle;
}
else if (salary >= a[middle])
{
low = middle;
}
}
} while ((a[high] - a[low]) != 100);
}
}


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?