2012-01-12 11 views
1

2つの静的配列を比較する実装方法に問題があります。2つの静的配列を比較する

string bufferNames[]={"apple","orange","banana","pomegranate","pear"}; 
string bufferPictures[] = {"apple.bmp","orange.bmp","banana.bmp","pomegranate.bmp","pear.bmp"}; 

bufferNamesの各項目は、bufferPicturesの画像が画面にロードされたときに、誰かに与えられた選択肢を提示します。たとえば、もし私がそのリストを反復するrand()関数を使ってorange.bmpを取得すると、同じ要素をオレンジ色にし、2つのランダムな要素が正しくない要素を得ることができます。どんな助けもありがとう。

ありがとうございます。

P.S.問題をさらに突破する必要がある場合は、それだけを言います。

+0

これは宿題のようです。なぜそれをタグ付けしないのですか? – Gangnus

+0

これは宿題ではなく、インターネット上のどこにもこの問題を解決する方法がないので、私はここに来ました。 @ pmr優れた提案!:) –

答えて

1

これはそれを行う必要があります。コードはC++ 11の機能を利用しています。 はそれを宿題として渡すためにそれを適応させる必要があります。

#include <string> 
#include <iostream> 
#include <algorithm> 
#include <vector> 

struct Picture { 
    std::string name, file; 
    bool operator==(const Picture& x) const { return this->name == x.name && this->file == x.file; } 
    bool operator!=(const Picture& x) const { return !(*this == x); } 

}; 

int main() 
{ 
    std::vector<Picture> pics = 
    { 
     {"apple", "apple.bmp"}, 
     {"orange", "orange.bmp"}, 
     {"banana", "banana.bmp"}, 
     {"pear", "pear.bmp"}, 
    }; 

    // determined by random choice 
    const Picture& choice = pics[0]; 

    std::vector<Picture> woChoice; 
    std::copy_if(pics.begin(), pics.end(), std::back_inserter(woChoice), 
       [&choice](const Picture& x) { 
       return x != choice; 
       }); 

    // random shuffle the remainder and pick the first 
    // two. alternatively and for more efficience use std::random to 
    // generate indices 
    std::random_shuffle(woChoice.begin(), woChoice.end()); 
    std::cout << woChoice[0].name << std::endl; 
    std::cout << woChoice[1].name << std::endl; 

    return 0; 
} 
+0

うまくやった!それは私にとって非常に有用であり、私は他のすべてを願っています。 –

+0

@DzekTrek私はそのようなものについて不平を言うのは嫌です。しかし、どうしてアップホントでそれを尊重しないのですか? – pmr

+0

実際には問題ではないかもしれませんが、これはメモリとCPU使用率が非常に非効率的であることを指摘する価値があります。 –

1

だから、私はたとえばrand()関数を使用してorange.bmp得ればそのそのリストを反復処理、私は同じ1つの対応する要素オレンジと他の二つのランダムではない正しい要素を取得することができますか。

あなたは(そこには配列内の5の異なる値であることに基づいて)包括0〜4(のはxそれを呼びましょう)番号を取得するためにrand()を使用する場合は、あなたが見つけることが両方の配列にその番号を使用することができます関連単語と画像。

他のランダムな誤った要素を取得するには、x以外の値が得られるまで、rand()をループで呼び出すことができます。それをyとしましょう。

不正な不正な要素を追加するには、xy以外の値が得られるまで、rand()をループで呼び出すことができます。

これを行うには他にも方法がありますが、これはおそらく理解しやすく実装するのが最も簡単です。

+0

素敵なものですが、私はこのような文字列でビューの私のポイントを変更する必要があります 'string [5] [128] = {" apple "、" orange "、" banana "、" pomegranate "、" pear "};' 'FruitPictures [5] [128] = {" apple.bmp "、" orange.bmp "、" banana.bmp "、" pomegranate.bmp "、" pear.bmp "};' –

+0

@DzekTrek : "しかし" - 正しい答えのための 'rand()'を得ることは私が提案したものです - 'rand()'への他の提案された呼び出しは誤った要素のためです:-)。しかし 'std :: vector 果物を使う方が良いでしょう。 fruits.push_back( "apple"); fruits.push_back( "orange"); 'など、' int x = rand()%fruits.size(); 'です。あなたの例では、 'fruits [x] +" .bmp "'と言ってイメージのファイル名を取得し、2番目の配列/ベクトルを削除することができます。 –

+0

:)それはまさにガンズが私にそう言ったことです、そして私は彼に耳を傾けました。ベクトルサイズの場合、それはまったく悪い考えではなく、何かを作ろうとします。この偉大な努力をありがとう。 :) –

0
  1. アレイ内の名前は、互いに対応しています。したがって、フルーツが必要な場合は 番のi、bufferNames [i]とbufferPictures [i]を並列に取ります。

  2. 名前が並行であることを確認してください。単純に2番目の配列を最初の配列要素の要素である とする。範囲内のランダムについて

  3. 0..n-1除く要素は番号i、jを(j> i)は、それを数える:

    TEMPを=ランダム(N-3)。 k =(temp> = i-temp + 1:temp);k =(k≧j≧k + 1:k)。

また、bufferNames [k]とbufferPictures [k]を取ります。

シンプルではなく、とても簡単です。

+0

これは私が必要なものです!それは私がそうするための最善の方法です! –

+0

ありがとうございます。私は単に答えをより適切なものにしようとしました。問題の単純な構造 - >単純な構造の答えです。それがあなたにとって最善のものなら、MINEの答えを最高にしてください。あなたはいつでもこの緑の物を動かすことができます。あなたはもう一度正しい答えを自分自身でupvoteすることはできませんが、私はこのコメントを送った直後にやります。ランダムはそれほど良いわけではありませんが、動作します。そして人々は正しい - 将来、あなたは2つのセットを対応させて、ペアの1組を代わりにしたい。それは多くのエラーからあなたを救うでしょう。 – Gangnus

+0

私はpread答えをupreaded alreadu持っている – Gangnus