我正在处理一个问题,我给出了一个排序的整数数组,我应该从用户那里获取一个输入,搜索输入,并返回该输入的第一个实例(如果它存在) )和它出现的次数。
我用以下方法编写了一个程序:我从用户那里获取了一个输入。然后我使用二进制搜索来查找值。如果存在,则将索引存储为m
。之后,我写了两个while
循环。第一个循环检查左侧值的出现次数,第二个循环检查相同,但右侧。例如,二进制搜索可能正在寻找5,并且它找到它。然而,它落在第三个,即。 {.....5,5,**5**,5....}
。第一个while
循环将计算左边的两个,而第二个while循环将计算右边的一个。然后我将它们全部加起来并返回实例总数。如果输入值不存在,那么我跳过上述代码并简单地返回-1。
在main
函数的主体中,然后检查返回值。如果是-1,我告诉用户该值尚未找到。如果返回值>> = 0,则打印所需信息。
无论如何,我已经为程序编写了C代码,但我无法让它正常工作。我得到一个段。错误错误,我不知道我做错了什么。无论如何,任何帮助将不胜感激。我一直在为这个问题敲打头脑。这很有趣也很难,我认为我有正确的逻辑;但我不能让它正常工作。无论如何,这是代码:
#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;
}
答案 0 :(得分:5)
while(arr[j] == arr[m] && j >= 0)
您应该在此处切换这两个条件的顺序,否则您将尝试阅读arr[-1]
。第二个while循环也是一样。
另一个问题是,r
应该比数组大小少1,因为arr[array_size]
已经过了结束。
编辑:
一个严重的问题是,当您应该写信countPtr
和fPtr
时,您正在写入未初始化的指针*count
和*f
。这可能是导致段错误的原因。这很容易在调试器中发现。
答案 1 :(得分:3)
使用含义的变量名称。您可能会立即发现问题。
在调试器中运行程序并逐步执行代码;你应该很快就能看到出错的地方。 (提示,fPtr
中使用的get_num_of_ints
是什么?还有其他人指出的其他错误。
答案 2 :(得分:1)
由于您需要出现的次数,您需要搜索每个元素,对吗?
为什么不简化事情并进行线性扫描?这是一些伪代码:
function get_num_of_ints(arr, n){
first_index = -1
count = 0
for(i = 0; i < length(arr); i++)
if(x == n){
count++
if(first_index == -1)
first_index = i
}
return count, first_index
}
答案 3 :(得分:1)
我现在坐的计算机里没有C编译器,所以我无法测试它,但我看到你在函数的第一个while循环中说:
else if(arr[m]==N)
m=m;
break;
在这种情况下,break
语句在if之外,因此while循环每次只执行一次。
我不知道这是否会导致错误。
答案 4 :(得分:1)
分段错误来自第74,77和87行中的get_num_of_ints()。
if( j>= 0 && L > 0 )
*fPtr=j;
else
*fPtr=m;
...
*countPtr = (R + L + 1);
您尚未为指针分配内存地址,因此您在这些行中使用了任意内存位置。
似乎没有任何真正的理由为这些变量使用指针。尝试将它们从指向size_t的指针更改为size_t类型的变量。
size_t fPtr;
size_t countPtr;
答案 5 :(得分:0)
在get_num_of_ints()函数中,您使用指针fptr而不为其分配内存。
答案 6 :(得分:0)
感谢大家的评论,我能够找到程序中的所有错误,并使用gdb调试器。无论如何,我不再拥有我的seg。运行程序时出现错误;但是,当我提示用户输入并说用户键入4时,我遇到某种逻辑问题,那么出现的#of和第一次出现的位置的输出都是垃圾值。
我明白了:
Please input the integer you would like to find.
4
The first index is -1075300456.
The total number of values is 12169204.
这围绕我之前在函数中使用最后两个参数的问题。在底部,在函数定义中,我希望count是在列表中找到的总出现次数。
#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)/sizeof(arr[0]) - 1; /* right bound */
size_t f; /* first match index */
size_t count; /* total number of matches */
printf( "\nPlease input the integer you would like to find.\n" );
scanf( "%d", &N );
int a = get_num_of_ints( arr, r, N, f, count );
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;
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( j >= 0 && arr[j] == arr[m] ){
L++;
j--;
}
if( j>= 0 && L > 0 )
f=j;
else
f=m;
int h = m + 1;
int R = 0;
while( arr[h]==arr[m] && h <= w ){
R++;
h++;
}
count = (R + L + 1);
return f;
}
else if( m==-1)
return -1;
}
答案 7 :(得分:0)
正如大家所指出的,countPtr
和fPtr
需要分配内存
size_t * fPtr = malloc(sizeof(size_t));
确保在使用之前使用某个值初始化“i”
使用# gcc -g -Wall <your c file name> -o
arraysort
启动调试器,逐步查看代码,找到r的几个有趣的值,arr [m],
#gdb ./arraysort
b 跑 [在这里检查变量]
HTH