【问题标题】:Finding the highest number in an array C++查找数组 C++ 中的最大数
【发布时间】:2014-07-15 09:47:20
【问题描述】:

所以这就是我想要做的 - 编写一个包含 50 个值的数组的程序,获取数组中的最高数字并将其打印出来。不过,我撞到了一堵砖墙。我很确定我对函数中的返回感到非常困惑,例如为什么 findSmall 和 findBig 函数的 for 循环中的索引“未定义”?

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int findSmallest(int array[], int size, int index)
{
    int index_of_smallest_value = index;
    for (int i = index + 1; i < size; i++)
    {
        if (array[i] < array[index_of_smallest_value])
        {
            index_of_smallest_value = i;
        }
    }
    return index_of_smallest_value;
}

int findBiggest(int array[], int size, int index)
{
    int index_of_biggest_value = index;
    for (int i = index + 1; i < size; i++)
    {
        if (array[i] > array[index_of_biggest_value])
        {
            index_of_biggest_value = i;
        }
    }
    return index_of_biggest_value;
}

int findSmall(int array[], int size)
{
    int index = 0;
    for (int i = 0; i < size; i++)
    {
        index = findSmallest(array, size, i);
        //cout << index << endl;
    }
    return index;
}

int findBig(int array[], int size)
{
    int index = 0;
    for (int i = 0; i < size; i++)
    {
        index = findBiggest(array, size, i);
        //cout << index << endl;
    }
    return index;
}

int main()
{
    int array[50];
    srand(time(NULL));

    for (int i = 0; i < 50; i++)
        array[i] = rand() % 100;

    cout << "The smallest digit is " << findSmall(array, 50) << endl;
    cout << "The biggest digit is " << findBig(array, 50);
    cin.get();
}

我已经编辑了上面的代码,但是我不断从 findSmall 和 findBig 函数返回 49。

【问题讨论】:

  • 我认为findBigfindSmall 没有任何用处,除了观察关于检查不同范围的数组值的不同结果。另外,您确定要那些返回 0 吗?
  • 这是学校的工作吗?否则有很多不错的algorithmic functions in the standard library,包括a function to get the maximum value in a range
  • “未定义”是什么意思?除了srand 中的类型转换警告外,请调用所有内容
  • 为什么findBigfindBiggest 50 次?我不明白你为什么不只做一次findBiggest 并且有你的答案。
  • 有很多更好的方法可以做到这一点,你应该看看std::max_elementstd::min_elementstd::sortstd::set

标签: c++ arrays function


【解决方案1】:

您可以使用 C++/STL 方式进行操作。这不仅适用于数组,也适用于其他 STL 容器。

#include <iterator>
#include <algorithm>

int minelem = *std::min_element(begin(array), end(array));
int maxelem = *std::max_element(begin(array), end(array));

这段代码在数组上循环了两次。出于性能原因,您可能会考虑合并循环。或者在 C++11 中你甚至可以

auto result = std::minmax_element(begin(array), end(array));

【讨论】:

  • 我不会试图从这个答案的内容中拿走任何东西;它它的完成方式。但是,当 op 显然是一个苦苦挣扎的学生并且肯定不能使用 STL 来执行他们试图学习的任务时,似乎没有人注意到或关心它,这让我一直感到惊讶。这些“当您知道自己在做什么时,您就是这样做的”类型的答案很少尝试回答 op 的问题,但它们几乎总是被投票赞成。 :o
  • @ChiefTwoPencils 似乎 OP 应该自己实现它,但他没有明确说明。所以最好的方法不是重新发明轮子,而是使用 STL。然而,如果他想自己实现该函数,那么给定的 STL 函数是一个很好的起点,因为它们的源代码是直接可用的(也可以用于复制和修改)。
【解决方案2】:

你可以按照这个答案。如果您在这里不清楚,那么您可以问/说我实际需要什么。我的回答中没有什么。

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int findSmallest(int * begin, int * end)
{
    int small = *begin;
    while(begin != end){
        if(small > (*begin)) small = *begin;
        begin++;
    }
    return small;
}

int findBiggest(int * begin, int * end)
{
    int big = *begin;
    while(begin != end){
        if(big < (*begin)) big = *begin;
        begin++;
    }
    return big;
}

int main()
{
    int array[50];
    srand(time(NULL));

    for (int i = 0; i < 50; i++)
        array[i] = rand() % 100;
    cout << "The smallest digit is " << findSmallest(array, array+50) << endl;
    cout << "The biggest digit is " << findBiggest(array, array+50) << endl;
    return 0;
}

要清楚了解我的功能,您可以关注linkUse of array and a function to print first n elements in C [as like as sort(a+m, a+n)]

【讨论】:

    【解决方案3】:

    这取自link,但已针对您的问题稍作更改。这是否符合您的要求?

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int array[50] = {5,123,5,9,1,5,7,89.....};
        int temp = 0;
    
        for(int i=0;i<50;i++)
        {
            if(array[i]>temp)
            temp=i;
        }
        cout << "The biggest number is: " << temp << endl;
        return 0;
    }
    

    您显然必须更改代码以适合您的代码。

    【讨论】:

    • 他的代码找到了最大元素的索引(尽管他没有做任何事情)
    • 您的 temp 变量既是索引又是值...:/
    • 我只想说我以前从未真正做过C++!这只是通过一些简单的谷歌搜索发现的。请原谅它有多垃圾。
    • 如果数组中的所有数字都是负数,这将失败。
    • 你知道解决这个问题的任何方法吗?
    【解决方案4】:

    这是一个版本,我还使用了 std::vector 和迭代器。返回值的更好方法是例如自定义结构或可能使用 std::tuple ,因此您不必跟踪向量索引。

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <vector>
    
    using namespace std;
    
    int findBigOrSmall(bool bigOrSmall, int a[], int s){
    int big=a[0];
    int small=a[0];
    for(int i=0; i<s; ++i){
        if(a[i]>big) big=a[i];
        if(a[i]<small) small=a[i];
    }
    if(bigOrSmall) return big;
    else return small;
    }
    std::vector<int> findBigOrSmallVec(std::vector<int> a){
    int big=a[0];
    int bigIndex;
    int smallIndex;
    int small=a[0];
    
    for(std::vector<int>::iterator it=a.begin();it!=a.end();++it){
        if(*it>big) {
            big=*it;
            bigIndex = std::distance(a.begin(),it);
        }
        if(*it<small) {
            small=*it;
            smallIndex = std::distance(a.begin(),it);
        }
    }
    
    std::vector<int> res;
    res.push_back(bigIndex);
    res.push_back(big);
    res.push_back(smallIndex);
    res.push_back(small);
    return res;
    
    }
    
    
    int main()
    {
    int array[50];
    srand(time(NULL));
    std::vector<int> randVec;
    
    for (int i = 0; i < 50; i++){
        int randInt= rand() % 100;
        array[i] =randInt;
        randVec.push_back(randInt);
    
    }
    
    for(int i=0;i<50;++i) cout<<i<<": "<<array[i]<<endl;
    cout<<"\n\nBiggest val="<<findBigOrSmall(true,array,50)<<endl;
    cout<<"Smallest val="<<findBigOrSmall(false,array,50)<<endl;
    
    //Now more c++-like
    std::vector<int> res =findBigOrSmallVec(randVec);
    
    cout<<"Biggest value is at position "<<res[0]<< " and is "<<res[1]<<endl;
    cout<<"Smallest value is at position "<<res[2]<< " and is "<<res[3]<<endl;
    
    }
    

    【讨论】:

      【解决方案5】:

      对于单元素数组,唯一的元素是最大的元素。对于任何更长的数组,最大元素要么是最后一个子数组中的最大元素,要么是最后一个子数组中的最大元素。所以这就是代码的样子:

      int findBiggest(int array[], int size)
      {
          int big = 0;
          for (int i = 1; i < size; i++)
              if (array[i] > array[big])
                  big = i;
      
          return big;
      }
      

      仅此而已:

      int index2 = findBiggest(array, 50);
      cout << "\nThe biggest digit is " << array[index2] << " at position " << index2;
      

      【讨论】:

        【解决方案6】:

        一种无分支的方式(可用于 int/float/double)

        int findBiggest(int array[],int size){
          int hi = 0;
          for (int p = 0; p < size; p++) {
        
            int comp = (array[hi] < array[p]);
        
            int diff = (p - hi);
        
            // this is just to debug and see what is going on
            printf("\np = %d, array[hi] = %d, array[p] = %d; comp = %d, diff = %d", p, array[hi], array[p], comp, diff);
        
            hi += diff * comp;
        
        }
        
        printf("\nindex of the highest number (%d) is %f", size[hi], hi);
        

        }

        对于我们这些喜欢一个(少数)衬里的人来说,循环的版本是:

        int hi = 0;
        for(int p = 0; p < size; p++)
            hi += (array[hi] < array[p]) * (p - hi);
        
        return array[hi];// the biggest number or...
        return hi; // the index of the biggest number
        

        【讨论】:

          猜你喜欢
          • 2016-05-25
          • 1970-01-01
          • 2021-06-20
          • 2013-11-28
          • 2020-10-26
          • 2015-07-04
          • 2013-04-24
          相关资源
          最近更新 更多