2012-01-12 4 views
1

У меня проблема с реализацией для сравнения двух статических массивов, т.е.Сравнение двух статических массивов

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

Каждый элемент в bufferNames представляет выбор, который кому-то было дано, когда картина из bufferPictures была загружена на экран. Итак, если я, например, получаю orange.bmp, используя функцию rand(), которая выполняет итерацию через этот список, как я могу получить один и тот же соответствующий элемент оранжевый и два других случайных неправильных элемента. Любая помощь будет оценена по достоинству.

Заранее благодарен.

P.S. Если требуется дальнейшее нарушение проблемы, просто скажите это.

+0

Кажется, это домашнее задание. Почему бы не пометить его так? – Gangnus

+0

Это не домашнее задание, и, поскольку в Интернете нет нигде, как это решить, я пришел сюда[email protected] Отличное предложение! :) –

ответ

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

Не то, чтобы это, вероятно, имело значение практически, но стоит отметить, что это замечательно неэффективно в использовании памяти и процессора .... –

1

Итак, если я, например, получаю orange.bmp, используя функцию rand(), которая выполняет итерацию через этот список, как я могу получить один и тот же соответствующий элемент оранжевый и два других случайных неправильных элемента.

Если вы используете rand() получить номер (давайте назовем его x) от 0 до 4 включительно (на основе там быть 5 различных значений в массивах), то вы можете использовать этот номер в обоих массивах, чтобы найти связанное слово и изображение.

Чтобы получить еще один случайный неправильный элемент, вы можете позвонить rand() в цикле, пока не получите значение, отличное от x. Назовем это y.

Чтобы получить еще один случайный неправильный элемент, вы можете позвонить по номеру rand() в цикле, пока не получите значение, отличное от x и y.

Есть и другие способы сделать это, но это, вероятно, проще всего понять и реализовать.

+0

Ницца, но мне нужно будет изменить точку зрения на что-то вроде этой строки: «Фрукты [5] [128] = {« яблоко »,« оранжевое »,« банан »,« гранат »,« груша » "},' 'string FruitPictures [5] [128] = {" apple.bmp "," orange.bmp "," banana.bmp "," pomegranate.bmp "," pear.bmp "};' –

+0

@DzekTrek : «однако» - получение одного «rand()» для правильного ответа. То, что я предложил, - другие предлагаемые вызовы на «rand()» - для неправильных элементов :-). Но было бы лучше использовать «std :: vector фрукты; fruits.push_back ("яблоко"); fruit.push_back ("orange"); 'и т. д., затем' int x = rand()% fruits.size(); '. Обратите внимание, что в вашем примере вы можете сказать «фрукты [x] +« .bmp », чтобы получить имя файла изображения, исключая второй массив/вектор, хотя если имена не были так последовательно связаны, что это не сработало. –

+0

:) Именно так Ганг сказал мне это сделать, и я слушал его. AS для размера вектора, это неплохая идея, и попытаться что-то сделать. Спасибо вам за это большое усилие. :) –

0
  1. Имена в массивах соответствуют друг другу. Итак, если вам нужен номер номер i, возьмите bufferNames [i] и bufferPictures [i] параллельно.

  2. Убедитесь, что имена параллельны. Просто создавая второй массив элементов из первых элементов массива.

  3. Что касается случайным в диапазоне 0..n-1 за исключением элементов номер I, J (J> я), считать это так:

    темп = случайная (п-3); k = (temp> = i? Temp + 1: temp); k = (k> = j? K + 1: k);

И снова возьмите имена буфера [k] и bufferPictures [k].

Это не просто, это очень просто.

+0

Вот что мне нужно! Это лучший способ для меня сделать это! –

+0

Спасибо. Я просто попытался сделать ответ более адекватным вопросу. Простые структуры в вопросе -> простые структуры в ответе. Если это лучше для вас, отметьте MINE как лучший, пожалуйста. Вы можете перемещать или включать/выключать эту зеленую игру в любое время. Вы еще не можете выдвинуть еще один правильный ответ, но я сделаю это сразу после отправки этого комментария. Случайность там не так хороша, но она работает. И люди правы - в будущем вы хотите сохранить 2 набора в переписке, вместо этого сделайте один набор пар. Это избавит вас от многих ошибок. – Gangnus

+0

У меня есть alreadu upvoted pwr answer – Gangnus

Смежные вопросы