정렬 된 정수 배열이있는 문제에 대해 작업 중이며 사용자로부터 입력을 받아 입력을 검색하고 첫 번째 인스턴스를 반환해야합니다. (존재하는 경우) 및 나타나는 횟수가 표시됩니다.C 숙제 도움말 : 배열을 통한 검색
다음 접근 방식으로 프로그램을 작성했습니다. 사용자로부터 입력을받습니다. 그런 다음 이진 검색을 사용하여 값을 찾습니다. 존재한다면 인덱스를 m
으로 저장합니다. 그 후 두 개의 while
루프를 작성합니다. 첫 번째 루프는 왼쪽에있는 값의 발생 횟수를 확인하고 두 번째 루프는 값을 같지만 오른쪽으로 계산합니다. 예를 들어, 2 진 검색은 5를 찾고있을 것입니다. 그러나, 그것은 제 3의 것에 상륙한다, 즉. {.....5,5,**5**,5....}
. 첫 번째 while
루프는 두 개를 계산하고 두 번째 루프는 한 개를 계산합니다. 그런 다음 모두 합계하여 총 인스턴스 수를 반환합니다. 입력 값이 없으면 앞에서 언급 한 코드를 건너 뛰고 간단히 -1을 반환합니다.
main
함수의 본문에서 반환 값을 확인합니다. 값이 -1 인 경우 값을 찾지 못했음을 사용자에게 알립니다. 반환 값이> = 0이면 필요한 정보를 인쇄합니다.
어쨌든 프로그램의 C 코드를 작성했지만 정상적으로 작동하지 않습니다. 나는 seg.를 얻는다. 오류 오류, 내가 뭘 잘못하고 있는지 모르겠다. 어쨌든, 어떤 도움을 주시면 감사하겠습니다. 나는이 문제에 대한 내 머리를 잠시 두드리고있다. 흥미롭고 힘들었습니다. 저는 올바른 논리를 가지고 있다고 생각합니다. 하지만 제대로 작동하지 않습니다. 뭔가 의미
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
/* function prototype */
int get_num_of_ints(const int* arr, size_t r, int N, size_t* f, size_t* count);
int main()
{
int i;
int N; /* input variable */
int arr[]={1,1,2,3,4,4,4,4,5,5,6,7,7,7,7,8,9,9}; /* array of sorted integers */
size_t r = sizeof(arr[i])/sizeof(int); /* right bound */
size_t f; /* first match index */
size_t *fPtr;
fPtr = &f;
size_t count; /* total number of matches */
size_t *countPtr;
countPtr = &count;
printf("\nPlease input the integer you would like to find.\n");
scanf("%d", &N);
int a = get_num_of_ints(arr, r, N, fPtr, countPtr);
if(a == -1)
printf("%d has not been found.\n", N);
else if(a >= 0){
printf("The first index is %d.\n", f);
printf("The total number of values is %d.\n", count);
}
return 0;
}
/* function definition */
int get_num_of_ints(const int* arr, size_t r, int N, size_t* f, size_t* count)
{
int l = 0;
int m;
int w=r;
size_t *fPtr;
size_t *countPtr;
while(l <= r){
m = l +(r - l)/2;
if(arr[m] < N)
l = m+1;
else if(arr[m] > N)
r = m-1;
else if(arr[m]==N)
m=m;
break;
}
if(l > r)
m = -1;
if(m >= 0){
int j = m-1;
int L = 0;
while(arr[j] == arr[m] && j >= 0){
L++;
j--;
}
if(j>= 0 && L > 0)
*fPtr=j;
else
*fPtr=m;
int h = m + 1;
int R = 0;
while(arr[h]==arr[m] && h <= w){
R++;
h++;
}
*countPtr = (R + L + 1);
return *fPtr;
}
else if(m==-1)
return -1;
}
아아 코드가 제대로 나오지 않았다 [여기 변수를 점검]. 나는 그것을 다시 게시 할 것이다. – Josh
게시물을 편집하고 실제로 새 게시물을 작성하지 마십시오. :-P –
와우 코드 예제에서 중첩 된 스크롤 막대가 있습니다 ... 공상 : - D (현재 수정 됨) (텍스트를 어떻게 든 구조화해야 더 쉽게 읽을 수 있습니다) –