如何找到特定值范围内的数组元素的数量

How to find the number of the elements of an array that are in a specific range of values

所以我特别想要的是找到一个数组的哪些元素在两个不同的值之间,而不是两个不同的索引之间。到目前为止的代码如下所示:

#include <stdio.h>
#define SIZE 5
int main(void){
    float grades[SIZE];
    float g;
    int i;
    for (i=0;i<SIZE;i++){
        printf("Enter a grade: ");
        scanf("%f", &g);
        grades[i]= g;
    }
    float a,b;
    printf("Enter a grade range: \n");
    scanf("%f %f", &a,&b);
    return 0;
}

我想要的是告诉程序,在最后一次 scanf 之后,搜索用户输入的数字之间的数组值,然后打印所述值的数量。

这应该有效:

#include <stdio.h>

#define ARRAY_LEN(x)            (sizeof(x) / sizeof(*(x)))

size_t count_elems(const float * const arr, size_t arr_size, float min, float max)
{
    size_t count = 0;

    for (size_t i = 0; i < arr_size; i += 1)
    {
        if ((arr[i] >= min) && (arr[i] <= max))
        {
            count += 1;
        }
    }

    return count;
}

int main()
{
    float a[5] = {1.0, 0.5, 2, 3, 4};

    printf("%lu\n", count_elems(a, ARRAY_LEN(a), 0.5, 3));

    return 0;
}

该函数的工作方式是接收一个指向浮点数组的指针,并逐个元素地迭代以查看它是否落在正确的范围内。它需要 arr_size 的原因是因为它不能自己告诉数组长度。


值得注意的是 ARRAY_LEN() 只能用于静态分配的数组。

首先,您需要对数组进行排序:

#include <stdio.h>
#define SIZE 5
//We need a utility function for our integrated qsort algorithm:
int cmpfunc (const void * a, const void * b) {
   return ( *(int*)a - *(int*)b );
}

int main(void){
    float grades[SIZE];
    float g;
    int i;
    for (i=0;i<SIZE;i++){
        printf("Enter a grade: ");
        scanf("%f", &g);
        grades[i]= g;
    }
    float a,b;
    printf("Enter a grade range: \n");
    scanf("%f %f", &a,&b);

    //Call qsort() function
    qsort(grades, SIZE, sizeof(float), cmpfunc);
    
    //Now array grades[] is sorted
    int j = 0;
    for(j; grades[j] <= a && (j < SIZE); j++){
    }
    //grades[j] >= a
    for(j;grades[j] <= b && (j < SIZE); j++){
        printf("%f ", grades[j]);
    }
    printf("\n");
    
    return 0;
}

通过对数组进行排序,您创造了顺序搜索第一个元素的机会,即 >= a,这意味着您的任务将在 O(n) 复杂度(最坏的情况)中完成。

要获得更优的解决方案,您还可以使用二进制搜索。

找到第一个需要打印的元素后,您可以简单地 运行 遍历其余元素,如果它们是 [=12] 则打印它们=],直到你到达 bend of the array(这就是为什么那些 (j < SIZE) 东西也需要。

你能试试这个吗? 这样它不会排序,但会显示用户输入的数字之间的值

#include <stdio.h>
#define SIZE 5
int main(void){
    float grades[SIZE];
    float g;
    int i;
    for (i=0;i<SIZE;i++){
        printf("Enter a grade: ");
        scanf("%f", &g);
        grades[i]= g;
    }
    float a,b;
    printf("Enter a grade range: \n");
    scanf("%f %f", &a,&b);
    
    
    for (i=0;i<SIZE;i++){
        if(a>b){
            if(grades[i]>=b && grades[i]<=a){
                printf("%f ", grades[i]);
            }
        }else{
            if(grades[i]>=a && grades[i]<=b){
                printf("%f ", grades[i]);
            }
        }
    }
    
    return 0;
}