7

整数の配列の中で最小の要素を持つインデックスを返そうとしています。私は何かが足りないのですか?整数を入力した後、インデックスが返されません。

更新:int main()アレイスタックが破損していることについての最後にエラーが発生します。ありがとうございました。私のコードは次のとおりです。

#include <iostream>
#include <conio.h>

using namespace std;

int indexofSmallestElement(double array[], int size);

int main()
{    
int size = 10; 
double array[10];

for (int i = 0; i <= size; i++)
{
    cout << "Enter an integer: " << endl;
    cin >> array[i];
}

indexofSmallestElement(array, size);
}

int indexofSmallestElement(double array[], int size)
{
int index = 0;

if (size != 1)
{

    int n = array[0];
    for (int i = 1; i < size; i++)
    {
        if (array[i] < n)
        {
            n = array[i];
            index = i;
        }
    }
}
return index;
}
4

3 に答える 3

15

多くの人が の変種を見せてくれましたindexofSmallestElement。私はそれがより良いと思う理由の説明とともに私のものを含めます:

int indexofSmallestElement(double array[], int size)
{
    int index = 0;

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

    return index;
}

nこれまでに遭遇した最小値を保持するために使用した変数を削除していることに気付くでしょう。これを行ったのは、私の経験では、2 つの異なるものを同期させておく必要があると、微妙なバグの原因になる可能性があるためです。この単純なケースでさえ、それは複数のバグの原因でした。そのうちの少なくとも 1 つは、nが宣言されてintいたのに、その中に型の値を代入doubleしていたことです。

結論:n変数を使用せずに、インデックスだけを追跡します。


更新: もちろん、C++17 では、この質問に対する真に受け入れられる唯一std::min_elementの答えは、次を使用することであることは言うまでもありません。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdint>
#include <array>
#include <vector>

template <typename Iter>
auto indexofSmallestElement(Iter first, Iter last)
{
    return std::distance(first,
        std::min_element(first, last));
}

template <typename T, std::size_t N>
auto indexofSmallestElement(std::array<T, N> arr)
{
    return std::distance(std::begin(arr),
        std::min_element(std::begin(arr), std::end(arr)));
}

template <typename T>
auto indexofSmallestElement(std::vector<T> vec)
{
    return std::distance(std::begin(vec),
        std::min_element(std::begin(vec), std::end(vec)));
}


int main(int, char **)
{
    int arr[10] = { 7, 3, 4, 2, 0, 1, 9, 5, 6, 8 };

    auto x = indexofSmallestElement(std::begin(arr), std::end(arr));

    std::cout
        << "The smallest element in 'arr' is at index "
        << x << ": " << arr[x] << "\n";

    std::array<float, 5> fa { 0.0, 2.1, -1.7, 3.3, -4.2 };

    auto y = indexofSmallestElement(fa);

    std::cout
        << "The smallest element in 'fa' is at index "
        << y << ": " << fa[y] << "\n";

    return 0;
}
于 2012-11-26T03:16:53.020 に答える
3

n = array[0]の代わりにする必要がありarray[0] = nます。これは、配列の最初の要素が最初に最小であると想定し、それを他の要素と比較していることを意味します。

さらに、ループでは、配列の境界を超えています。for ループは untili < sizeおよび notで実行する必要がありi <= sizeます。

あなたのコードは次のようになるはずです..

int indexofSmallestElement(double array[], int size)
{
  int index = 0 ;
  double n = array[0] ;
  for (int i = 1; i < size; ++i)
  {
    if (array[i] < n)
    {
        n = array[i] ;
        index = i ;
    }
  }
 return index;
}
于 2012-11-26T03:02:36.400 に答える
0

ループ内では、array[i] と index = i を使用します。サイズが境界です:)

于 2012-11-26T03:01:27.840 に答える