如何在 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,很明显为什么它只是第一个索引被修改。