如何编写一个函数来找到具有最低值的索引

Posted

技术标签:

【中文标题】如何编写一个函数来找到具有最低值的索引【英文标题】:How can I write a function that will find the index with the lowest value 【发布时间】:2020-10-19 00:04:01 【问题描述】:

我正在学习通过引用传递的函数。

我的问题是如何编写一个函数来找到从输入文本文件中获取的最低值的索引。

文本文件包含创建范围的最小和最大索引。该函数应返回存储在该范围内的最低值的索引。然后函数还应该检查范围内具有相同值的索引,然后返回这些索引中的第一个。


例子

index 0 1 2 3 4 5 6 7 8 9 10 11

value 8 3 6 7 9 5 3 8 6 7  4  5

如果从输入文本文件读取的最小索引为 0,从文本文件读取的最大索引为 11,则返回应该是索引 1。


使用的函数原型int findMinIndex(int data[], int low, int high);


完整程序

#include <stdio.h>

#define MAX 100

int findMinIndex(int data[], int low, int high);

int main() 
    int i, loop, n, queries, data[MAX];

    // Read in the schedule data.
    FILE* ifp = fopen("schedule.in", "r");
    fscanf(ifp, "%d", &n);
    for (i=0; i<n; i++)
        fscanf(ifp, "%d", &data[i]);

    // Process each query.
    fscanf(ifp, "%d", &queries);
    for (loop=0; loop<queries; loop++) 
        int low, high;
        fscanf(ifp, "%d%d", &low, &high);
        printf("%d\n", findMinIndex(data, low, high));
    

    return 0;


// Pre-condition:  low <= high and are both valid indexes to data.
// Post-condition: Returns the lowest index in [low, high] storing
//                 the minimum of array[low]�array[high].
int findMinIndex(int data[], int low, int high)      
    
     //Function needed


预期输出link

更新:我已经实现了 Ibram Reda 的功能,并且程序正在打印与预期输出相似的索引,但由于某种原因并不完全相同。

这是更新后的代码,我还附上了输出文件的链接。

#定义最大 100 int findMinIndex(int data[], int low, int high); int main() int i,循环,n,查询,数据[MAX]; // 读入调度数据。 文件* ifp = fopen("schedule.in", "r"); fscanf(ifp, "%d", &n); 对于 (i=0; i

【问题讨论】:

“通过引用传递”是什么意思? C 是按值传递。您可以通过传递地址来模拟按引用传递,但您不应将其视为“按引用传递”。 @RetiredNinja 我相信 OP 不需要数组长度,因为他采用“有效的低/高数据索引”。 @Kakarotto 如果您设置了low = 0,您将丢失从呼叫者那里获得的信息。要么使用不同的迭代变量,要么像现在一样增加low,但不提前将其归零。 @Al.G.Ah,我读错了。我认为最小值/最大值是数组中的值,他们正在寻找它们之间最小值的索引。 @WilliamPursell:按地址传递就是按引用传递。地址是参考。这个词在历史上就是这样使用的。 C++ 后来采用了“引用”一词来指代该语言中的特定功能,但它并没有改变 C++ 上下文之外的词的含义。无论是手动传递地址(使用&amp; 或指针计算)还是自动传递(依赖于数组的自动转换),传递的都是确实引用了预期对象的东西,所以它是英语意义上的引用和技术上的非 C++ 意义。 【参考方案1】:

函数的实现

int findMinIndex(int data[], int low, int high) 
    // make some checks on the argument  
    if (high < low) 
        // here must be error
        // TODO : throw an argument exption
        // update:
        // you need to handle this error according your logic 
        // you could swap them 
        // but for now just print an error msg
        printf("error happen : start index (%d),is bigger than end index(%d) ", low, high);
        return -1;
    
    if (data == NULL) 
        // here must be error
        // TODo: throw an argument exption null data 
        // update:
        // you need to handle this error according your logic 
        // for now just print an error msg
        printf("error happen :  data not found !! findMinIndex function require refrance for int array...  ");
        return -2;
    

    // assume that the minimumValue is first element in the reange
    int minimumValue = data[low];
    int index = low;
    for (int i = low;i < high;i++) 
        if (data[i] < minimumValue) 
            minimumValue = data[i];
            index = i;
        
    
    return index;


更新:

我更新了代码以返回负值并在发生错误时打印一些错误消息,您必须根据您的逻辑在函数中处理此错误 .. 因为如果使用错误的参数调用函数,它将有错误的行为...在 C它不支持错误异常的语言,所以我只返回负值表示该功能没有按预期工作......

如果您不喜欢直接从函数打印到控制台,并且您喜欢只打印来自您编写的代码的主函数的消息,那么

 int minmumLocation = findMinIndex(data, low, high);
 // cheke if error is hapen inside findMinIndex
 if (minmumLocation < 0) 
     // you could handle error here
     switch (minmumLocation)
          case -1: /*handle first type of error*/break;
          case -2: /*handle second type of erro*/break;
      
      // you could stop the program or if you handel it then continue normally 
      // return;
 
 // normall process when function has no error  
 printf("%d\n", minmumLocation);

错误类型可能发生在findIndex() 内部

所有错误类型都可能发生是参数错误..它是在将错误的参数传递给函数时出现的......您在文件中的查询可能是错误的查询,因此您必须在程序

    第一个错误是如果你传递的起始索引(int low)大于结束索引(int high)所以这里不合逻辑......所以这一定是一个错误......你可以交换它们或随心所欲地处理它 第二个错误是如果你传递一个null 数组,这显然是一个错误,因为你无法访问任何数据 第三个错误这在函数中没有实现...如果你传递一个大于数组最大大小的结束索引(int high)怎么办! ...这将导致访问数据超出范围(这在 C 中非常危险),因此为避免此错误,您必须更改函数签名以传递数组的最大大小,然后函数原型将类似于 int findMinIndex(int data[], int maxSize,int low, int high); 和那么你可以像这样添加更多的检查条件if (high &gt; maxSize) return -3;

如果错误仍然存​​在,您可以提交输入schedule.in文件!

【讨论】:

您好,感谢您的帮助。我现在唯一遇到的问题是输出在开始时打印了 3 个零,它应该只有 2 个零,知道为什么函数打印一个额外的零吗?所有其他输出都是正确的。前 2 个的预期输出为零。预期输出:0 0 2 2 2 2 2 2 2 2... 经过更多测试后,我注意到输出看起来相似但并不完全相同。这是预期的输出文件ufile.io/kja9uby2 @Kakarotto 此功能不会在控制台中打印任何内容! ...此函数仅返回在数据数组上定义的范围内的最小值的位置...您调用此函数,然后从主函数中打印...错误不是来自函数..它来自输入中的查询文件...如果你给我发schedule.in文件我可以帮你

以上是关于如何编写一个函数来找到具有最低值的索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 函数结果中表示“未找到索引”

如何在多个实例的python上找到特定字符的索引?

如何编写这个递归函数来找到我的对象的最大深度?

编写在数字数组中查找元素索引的函数[重复]

如何通过将向量元素传递给函数来更改它们

如何使用重复、while 循环或其他迭代技术编写一个根据某些规则返回输入向量索引的函数