C家庭作业帮助:通过数组搜索

时间:2010-01-24 18:31:07

标签: c arrays

我正在处理一个问题,我给出了一个排序的整数数组,我应该从用户那里获取一个输入,搜索输入,并返回该输入的第一个实例(如果它存在) )和它出现的次数。

我用以下方法编写了一个程序:我从用户那里获取了一个输入。然后我使用二进制搜索来查找值。如果存在,则将索引存储为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;
}   

8 个答案:

答案 0 :(得分:5)

while(arr[j] == arr[m] && j >= 0)

您应该在此处切换这两个条件的顺序,否则您将尝试阅读arr[-1]。第二个while循环也是一样。

另一个问题是,r应该比数组大小少1,因为arr[array_size]已经过了结束。

编辑:

一个严重的问题是,当您应该写信countPtrfPtr时,您正在写入未初始化的指针*count*f。这可能是导致段错误的原因。这很容易在调试器中发现。

答案 1 :(得分:3)

  1. 使用含义的变量名称。您可能会立即发现问题。

  2. 在调试器中运行程序并逐步执行代码;你应该很快就能看到出错的地方。 (提示,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)

  1. 正如大家所指出的,countPtrfPtr需要分配内存

    size_t * fPtr = malloc(sizeof(size_t));

  2. 确保在使用之前使用某个值初始化“i”

  3. 使用# gcc -g -Wall <your c file name> -o arraysort

    编译程序(如果您在Linux中)

    启动调试器,逐步查看代码,找到r的几个有趣的值,arr [m],

    #gdb ./arraysort

      
        

    b     跑     [在这里检查变量]

      
  4. HTH