Ra subscript mảng không mong muốn

Đề 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);
	}
}


main.c:32:1: warning: control may reach end of non-void function [-Wreturn-type]

Nghĩa là hàm không có trả về :smiley:

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