1

これが質問です。5つのパラメーターを持つ関数minMaxの定義を記述します。最初の3つのパラメーターは整数です。最後の2つは、関数によって最初の3つのパラメーターの値の最大値と最小値に設定されます。関数は値を返しません。

この関数は次のように使用できます。

int a = 31, b = 5, c = 19, big, small; 
minMax(a, b, c, &big, &small); /* big is now 31; small is now 5 */ 

これは私のコードです:

void minMax(int x, int y, int z, int* big, int* small)
{
  if (x < y && x < z)

    *small = x;

  else if (y < x && y < z)

    *small = y;

  else if (z < x && z < y)

    *small = z;

  if (x > y && x > z)

    *big = x;

    else if (y > x && y > z)

    *big = y;

  else if (z > x && z > y)

    *big = z;
  }

これは私が得ているエラーです:

関数はの値を変更しませんでしたsmall。関数で間接参照していることを確認してください。

何が問題なのかわかりませんか?

ありがとう。

4

3 に答える 3

6

差し迫った問題が1つあります。

1数字を渡す1とどうなると思います7か?

おそらく、andだけでなく、andの使用を検討することをお勧めし<=ます。>=<>

そのエラーメッセージは私が以前に見たコンパイラエラーのようには見えないので(そしてコード構文的に有効です)、メッセージはおそらく次のようなテストハーネスから来ていることをお勧めします:

  • big/small渡された数値以外の数値に値を設定します(例:) -9999
  • テストデータ(例1,1,7)を使用して関数を呼び出します。
  • 出力変数をチェックして、正しい値に変更されていることを確認します。

さらに、これは世界で最も読みやすいコードではありません(攻撃は意図されていません)。一目でその意図が明確になるようにコードを構造化できれば(適切な場合はコメントを含む)、将来のプログラマーの大群があなたの賞賛を歌い、あなたの名前を崇拝することになります:-)

このようなものは、それらの多くの構成要素よりも少し明確に意図を示しています(IMNSHO)else if

// Populate big/small based on max/min of x, y and z.

void minMax (int x, int y, int z, int *big, int *small) {
    // Set by default to x, only change if others are bigger.

    *big = x;
     if (y > *big)   *big = y;
     if (z > *big)   *big = z;

    // Same for small but with reversed comparisons.

    *small = x;
     if (y < *small) *small = y;
     if (z < *small) *small = z;
}
于 2012-12-12T01:54:05.177 に答える
4

何が機能していないのかわかりません。それは基本的には機能するようですが、より適切に構造化することができます。

多分このようなもの:

void minMax(int x, int y, int z, int* big, int* small)
{
    *big = *small = x;

    if (y > *big)
        *big = y;
    if (y < *small)
        *small = y;
    if (z > *big)
        *big = z;
    if (z < *small)
        *small = z;
  }
于 2012-12-12T01:56:34.753 に答える
0

エラーメッセージ

関数はの値を変更しませんでしたsmall。関数で間接参照していることを確認してください。

…先生から提供されたテストハーネスから来ているようです。

とにかく、それは正しいです。関数が何も割り当てない場所を選択できる値があります*small

たとえば、ab同じcを使用すると、関数は何もしません。


ともかく、

今後の質問のために、問題を実証する完全なサンプルプログラムを提供してください。

人々が信頼できないテレパシーを推測して使用する必要がないようにするためです。


また、割り当てでは、署名が不適切な関数を実装する必要があります。

関数を設計するためのBadWay™を教えています。

考えられる通常のC++関数シグネチャは次のとおりです。

void getMinAndMax( int& smallest, int& largest, int a, int b, int c )

最新のC++テクノロジを使用したさらに優れた署名は次のとおりです。

std::pair<int, int> minAndMax( int a, int b, int c )

後者の関数の名前に接頭辞がないのは、それがandgetのような式指向関数であるためです(または、あなたは書きませんか?)が、最初の関数の接頭辞が存在するのは単にこれは、式指向関数ではなく、アクション指向関数であることを反映するために必須の名前です。sincosgetSingetCos

もちろん、C ++ 11では、関数に任意の数の引数を受け入れさせることができます。私がこれを書いているときを除いて、VisualC++はまだそれを適切にサポートしていません。たとえばstd::min、C++11標準ライブラリの署名は次のとおりです。

template<class T, class Compare>
T min(initializer_list<T> t, Compare comp);

C ++ 03では、テンプレート型の単一のコンテナー引数を受け入れることで、ある程度それを行うことができます。

于 2012-12-12T02:01:58.983 に答える