如何找到特定值范围内的数组元素的数量
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] 则打印它们=],直到你到达 b
或 end 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;
}
所以我特别想要的是找到一个数组的哪些元素在两个不同的值之间,而不是两个不同的索引之间。到目前为止的代码如下所示:
#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] 则打印它们=],直到你到达 b
或 end 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;
}