如何在 C 中获取 float 数组的顶部索引并将其与存储在另一个数组中的字符串配对
How to get top indices of float array in C and pairing it with strings stored in an another array
我更新了代码以查找浮点数组的前 5 个索引。一些
它如何只更新最大索引的第 [0] 个元素。在里面
下面提到的最大索引示例如下 top[0] = 9, top[1]
=7,top[2]=5 等等。但它只更新 top[0]。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main() {
double *arr =malloc(sizeof(double)*10);
int N=10;
int n =5;
int *top =malloc(sizeof(int)*10);
arr[0] = 0.123;
arr[1] = 0.345;
arr[2] = 0.445;
arr[3] = 0.545;
arr[4] = 0.645;
arr[5] = 0.745;
arr[6] = 0.542;
arr[7] = 0.945;
arr[8] = 0.145;
arr[9] = 0.995;
int top_count = 0;
int i;
for (i=0;i<N;++i) {
// invariant: arr[top[0]] >= arr[top[1]] >= .... >= arr[top[top_count-1]]
// are the indices of the top_count larger values in arr[0],...,arr[i-1]
// top_count = max(i,n);
int k;
for (k=top_count;k>0 && arr[i]>arr[top[k-1]];k--);
// i should be inserted in position k
if (k>=n) continue; // element arr[i] is not in the top n
// shift elements from k to top_count
printf("6:: Iam here\n");fflush(stdout);
int j=top_count;
if (j>n-1) { // top array is already full
j=n-1;
} else { // increase top array
top_count++;
}
for (;j>k;j--) {
top[j]=top[j-1];
}
// insert i
top[k] = i;
printf("top[%0d] = %0d\n",k,top[k]);
printf("top_count=%0d\n",top_count);
}
return top_count;
}
int top_elems(double *arr, int N, int *top, int n);
int top_count = top_elems(&output, 10, top,5);
output
已经分解为 double *
您是否正在将指向 double
的指针的地址传递给一个应该接受指向 double 的指针的函数
- top 在函数调用之前没有初始化,所以 undefined 第一次使用它会取消引用这个未定义的指针
- ... 是的,我不打算更进一步。您的代码有一些严重但易于发现的问题。如果你制作了一个 MCV 示例,你应该已经看到了其中的一些,而不是仅仅在这里转储你的代码。
代码修改后:
I updated question to update the top five indices of float array into top[] array. but it is only updating top[0]th element. anything wrong with the code?
嗯,我更新了问题中代码的缩进,使其更具可读性。
你会注意到这个 for 循环之后没有缩进:
for (k=top_count;k>0 && arr[i]>arr[top[k-1]];k--);
这是因为这个循环的循环体是:
;
就是这样。它只是一个什么都不做的空语句。循环所做的只是设置变量,然后在后面的其余代码中对其进行修改,但由于它们不在循环内,因此只执行一次。
随着循环从 top_count
下降到 0
,很明显为什么它只是第一个索引被修改。
我更新了代码以查找浮点数组的前 5 个索引。一些 它如何只更新最大索引的第 [0] 个元素。在里面 下面提到的最大索引示例如下 top[0] = 9, top[1] =7,top[2]=5 等等。但它只更新 top[0]。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main() {
double *arr =malloc(sizeof(double)*10);
int N=10;
int n =5;
int *top =malloc(sizeof(int)*10);
arr[0] = 0.123;
arr[1] = 0.345;
arr[2] = 0.445;
arr[3] = 0.545;
arr[4] = 0.645;
arr[5] = 0.745;
arr[6] = 0.542;
arr[7] = 0.945;
arr[8] = 0.145;
arr[9] = 0.995;
int top_count = 0;
int i;
for (i=0;i<N;++i) {
// invariant: arr[top[0]] >= arr[top[1]] >= .... >= arr[top[top_count-1]]
// are the indices of the top_count larger values in arr[0],...,arr[i-1]
// top_count = max(i,n);
int k;
for (k=top_count;k>0 && arr[i]>arr[top[k-1]];k--);
// i should be inserted in position k
if (k>=n) continue; // element arr[i] is not in the top n
// shift elements from k to top_count
printf("6:: Iam here\n");fflush(stdout);
int j=top_count;
if (j>n-1) { // top array is already full
j=n-1;
} else { // increase top array
top_count++;
}
for (;j>k;j--) {
top[j]=top[j-1];
}
// insert i
top[k] = i;
printf("top[%0d] = %0d\n",k,top[k]);
printf("top_count=%0d\n",top_count);
}
return top_count;
}
int top_elems(double *arr, int N, int *top, int n);
int top_count = top_elems(&output, 10, top,5);
output
已经分解为double *
您是否正在将指向double
的指针的地址传递给一个应该接受指向 double 的指针的函数
- top 在函数调用之前没有初始化,所以 undefined 第一次使用它会取消引用这个未定义的指针
- ... 是的,我不打算更进一步。您的代码有一些严重但易于发现的问题。如果你制作了一个 MCV 示例,你应该已经看到了其中的一些,而不是仅仅在这里转储你的代码。
代码修改后:
I updated question to update the top five indices of float array into top[] array. but it is only updating top[0]th element. anything wrong with the code?
嗯,我更新了问题中代码的缩进,使其更具可读性。
你会注意到这个 for 循环之后没有缩进:
for (k=top_count;k>0 && arr[i]>arr[top[k-1]];k--);
这是因为这个循环的循环体是:
;
就是这样。它只是一个什么都不做的空语句。循环所做的只是设置变量,然后在后面的其余代码中对其进行修改,但由于它们不在循环内,因此只执行一次。
随着循环从 top_count
下降到 0
,很明显为什么它只是第一个索引被修改。