【问题标题】:Simple Array Finding Index Position of Highest and Lowest Value简单数组查找最高值和最低值的索引位置
【发布时间】:2013-03-22 00:31:56
【问题描述】:

我正在尝试编写一个简单的逻辑程序来查找最高和最低值,这已经完成了。问题是如何找到索引位置是当它找到最高和最低值时。见附图。

#include <iostream>

using namespace std;


int main()
{

int number=0, min=0, max=0;
int *rangeOfNumbers = new int[];

cout<<"Enter 5 numbers: ";

for(int i=0; i<5;i++)
{
    cout<<"Enter number "<<i+1<<": ";
    cin>>rangeOfNumbers[i];
}

//max min array positions

min=rangeOfNumbers[0];
max=rangeOfNumbers[0];

//find max and mins
for(int j=0; j<5;j++)
{
if(max<rangeOfNumbers[j])
{
    max=rangeOfNumbers[j];
}
else if(min>rangeOfNumbers[j])
{
    min=rangeOfNumbers[j];
}
}

cout<<"\n\nMin number: "<<min;
cout<<"\nMax number: "<<max;

cin.get();
cin.get();

return 0;
}

【问题讨论】:

    标签: c++ arrays visual-c++ logic


    【解决方案1】:

    除了更新 min 和 max 之外,还保留一个索引变量并更新它。

    //max min array positions
    
    min=rangeOfNumbers[0];
    max=rangeOfNumbers[0];
    int minindex = 0;
    int maxindex = 0;
    
    //find max and mins
    for(int j=0; j<5;j++)
    {
      if(max<rangeOfNumbers[j])
      {
        max=rangeOfNumbers[j];
        maxindex = j;
      }
      if(min>rangeOfNumbers[j])
      {
        min=rangeOfNumbers[j];
        minindex = j;
      }
    }
    
    maxindex += 1;
    minindex += 1;
    

    【讨论】:

    • 索引永远不会改变,也不会显示正确的位置。每次出现 1 和 3。
    • 另外,它显示为 1 和 3,因为数组索引从 0 开始(即第一个元素是 0)。我已经编辑将 1 添加到索引中,以便您得到“正确”的答案。
    • 没意识到这么简单的问题...谢谢。
    • else 是一个错误。最小值和最大值可以相同——当列表的所有元素都相同时。 (我已经编程了 45 年,这远不是我第一次看到这个错误......在野外有很多它的实例。)
    • 实际上,该错误不会发生在这里,因为您将minmax 初始化为第一个元素......但这通常是一个错误,因为列表可能是空的......在这种情况下不是固定大小的列表。通常的方法是将min 设置为最大整数,将max 设置为最小整数......但是任何检测空列表的方法都可以。
    【解决方案2】:

    maxmin 更改为indexOfMaxindexOfMin,因为通过存储最大值的索引,您可以访问最大索引和最大值。

    所以你应该把max if改成这样:

    if(rangeOfNumbers[indexOfMax] < rangeOfNumbers[j])
    {
        indexOfMax = j;
    }
    

    自己对其他行继续此更改。

    【讨论】:

      【解决方案3】:

      不知道如何编译代码:

      int *rangeOfNumbers = new int[];
      

      新建整数数组时需要指定大小。

      int *rangeOfNumbers = new int[5];
      

      我在gcc 4.5.3下编译,得到如下错误:

       error: expected primary-expression before ‘]’ token
      

      扫描数组时,您还需要记住maxmin 的索引。

      例如: 在for 循环之前,初始化:

      int maxIndex = -1;
      

      for循环内部:

      if (max < A[i])
      {
         maxIndex = i;
         max = A[i];
      }
      

      应该为min 做类似的事情。

      【讨论】:

      • 这是在 Visual Studio '12 下编译的。
      【解决方案4】:

      这可能与您现在正在寻找的内容相去甚远。 但是,如果您要执行一些密集的算法(例如查找最大值和最小值),则应该习惯 stl 容器(向量、列表和所有这些东西)。

      好处是许多算法已经可用并且针对性能进行了优化。

      我认为您的示例只是一个练习。无论如何,如果不是,她会怎么做

      例如,这个问题非常适合使用向量。这是一个例子

      #include <iostream>
      #include<vector>
      #include<algorithm>
      
      using namespace std;
      
      
      int main()
      {
      
          int number=0, min=0, max=0;
          vector<int> rangeOfNumbers;
      
          cout<<"Enter 5 numbers: ";
      
          for(int i=0; i<5;i++)
          {
              cout<<"Enter number "<<i+1<<": ";
              cin>>number;
              rangeOfNumbers.push_back(number);
          }
      
          vector<int>::iterator maxelem = max_element(rangeOfNumbers.begin(), rangeOfNumbers.end());
          vector<int>::iterator minelem = min_element(rangeOfNumbers.begin(), rangeOfNumbers.end());
      
          cout << endl << "Max number: " << (*maxelem) << " at " << std::distance(rangeOfNumbers.begin(), maxelem) + 1;
          cout << endl << "Min number: " << (*minelem)<< " at " << std::distance(rangeOfNumbers.begin(), minelem) + 1;
      
          cin.get();
      
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        我会建议一个微小的优化,如果你在第 0 项初始化 minma​​x 为什么要再次要求相同的元素

        for (int I = 0;

        到位

        for (int I = 1;

        源代码:

        #include <iostream>
        
        using namespace std;
        
        #define SIZE 5
        
        int main()
        {
        
            int min=0, max=0;
            int *rangeOfNumbers = new int[SIZE];
        
            cout<<"Enter 5 numbers: ";
        
            for(int i=0; i < SIZE; i++)
            {
                cout<<"Enter number " << i + 1 <<": ";
                cin>>rangeOfNumbers[i];
            }
        
            //max min array positions
        
            min = rangeOfNumbers[0];
            max = rangeOfNumbers[0];
        
            int minindex = 0;
            int maxindex = 0;
        
            //find max and mins
            for(int j = 1; j < SIZE; j++)
            {
                if( max < rangeOfNumbers[j])
                {
                    max = rangeOfNumbers[j];
                    maxindex = j;
                }
                if( min > rangeOfNumbers[j])
                {
                    min = rangeOfNumbers[j];
                    minindex = j;
                }
            }
        
            maxindex += 1;
            minindex += 1;
        
            cout<<"\n\nMin number: "<<min;
            cout<<"\nMax number: "<<max;
        
            cin.get();
            cin.get();
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-25
          • 2017-09-29
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多