【问题标题】:How to return largest two numbers in array in C?如何在C中返回数组中最大的两个数字?
【发布时间】:2017-06-24 12:18:15
【问题描述】:

所以,到目前为止我有这个。我试图在一个数组中找到两个最大的数字并返回它们。我在网上查了很多资源,大多数都说“引用调用”是要走的路。但我不知道如何使它与我的程序一起工作。比如我在网上看到这个例子:

void Calculate(int x, int y, int* prod, int* quot)
{
    *prod = x*y;
    *quot = x/y;
}

int x = 10,y = 2, prod, quot;
Calculate(x, y, &prod, &quot)

上述程序实际上是如何“返回”的?如何将返回值打印到控制台?

#include "stdio.h"


void largest_two( int numbers[], int len, int *largest, int *next_largest){


  int i, temp;

  *largest = numbers[0];
  *next_largest = numbers[1];

  if(*largest < *next_largest){
    temp = *next_largest;
    *largest = *next_largest;
    *next_largest = temp;
  }

  for (i=0; i<sizeof(numbers); i++) {
    if(numbers[i]>= *largest){
      *largest = numbers[i];
      *next_largest = *largest;
    }
    else if ( numbers[i] > *next_largest){
      *next_largest = numbers[i];
    }
  }
}

int main() {
  int numbers[] = {3, 1, 2, 3, 6, 2, 8, 0, 0, 0};
  int len = 3;
  int largest, next_largest;

  //==>??? printf("%d %d", largest_two(numbers, len, &largest, &next_largest));

  }

【问题讨论】:

  • for (i=0; i&lt;sizeof(numbers); i++) --> for (i=0; i&lt;len; i++)
  • 调用largest_two,就像你到目前为止所做的那样,然后printf("%d %d", largest, next_largest)
  • printf("largest=%d\nnext_largest=%d\n", largest, next_largest); 顺便说一句,你应该购买/阅读一本好的 c 书籍并学习一些关于指针的东西......

标签: c arrays pointers return function-pointers


【解决方案1】:

指针问题的侧面'(您应该阅读有关它们的教程/书籍),您的主要问题是您试图打印返回类型为 void 的函数的单个返回值,这意味着它不会根本不回来。

您的代码:

int main() {
  int numbers[] = {3, 1, 2, 3, 6, 2, 8, 0, 0, 0};
  int len = 10; // sizeof(numbers)
  int largest, next_largest;
  largest_two(numbers, len, &largest, &next_largest);
  printf("%d %d", largest, next_largest);
  }

请记住,这仍然不完全正确,但它确实解决了您打印数字的问题。

另外,传递 len 意味着你不应该这样做 for (i=0; i&lt;sizeof(numbers); i++) 而是这样做 for (i=0; i&lt;len; i++)

【讨论】:

    【解决方案2】:

    首先,这一行:

    for (i=0; i<sizeof(numbers); i++)
    

    不正确。您希望改为:

    for (i=0; i<len; i++)
    

    应该作为sizeof numbers/sizeof numbers[0]传递给largest_two(),这是数组的实际长度。

    我还建议将largestnext_largest&lt;limits.h&gt; 设置为INT_MIN,然后从它们中找到这些值。看来您也遇到了指针问题,最好仅在需要时使用它们。

    这是一个简化您的方法的示例,该方法在数组的一个循环中查找最大和第二大元素。它也只在需要时使用指针。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    
    #define ARRAYSIZE(x) (sizeof x/sizeof x[0])
    
    void largest_two(int numbers[], size_t len, int *largest, int *next_largest);
    
    int main(void) {
        int numbers[] = {3, 1, 2, 3, 6, 2, 8, 0, 0, 0};
        int largest, next_largest;
    
        largest_two(numbers, ARRAYSIZE(numbers), &largest, &next_largest);
    
        printf("largest = %d\nnext_largest = %d\n", largest, next_largest);
    }   
    
    void largest_two(int numbers[], size_t len, int *largest, int *next_largest) {
        int max, smax;
    
        max = smax = INT_MIN;
        for (size_t i = 0; i < len; i++) {
            if (numbers[i] > max) {
                smax = max;
                max = numbers[i];
            } else if (numbers[i] > smax && numbers[i] < max) {
                smax = numbers[i];
            }
        }
        *largest = max;
        *next_largest = smax;
    }
    

    输出:

    largest = 8
    next_largest = 6
    

    第二个数据集:

    int numbers[] = {3, 1, 6, 3, 6, 2, 8, 0, 8, 7};
    

    输出:

    largest = 8
    next_largest = 7
    

    【讨论】:

    • 您应该尝试使用两个或三个 8 的数据集,只是为了测试 numbers[i] 条件。我可以看到有人删除它,认为它已经被 numbers[i] > max 满足了。
    • @cup 代码用超过 8 个测试,工作正常。仅使用该条件会弄乱代码。您需要检查 numbers[i]smax
    • 感谢@RoadRunner!我了解您的代码,但是我将如何使用指针来执行此操作。我来自另一种语言,我一直在尝试解决指针问题。我的逻辑有问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2015-07-26
    • 2018-03-30
    • 2015-11-03
    • 2022-01-01
    相关资源
    最近更新 更多