2014-11-28 4 views
-1

Я старался изо всех сил, но я не могу решить проблему. В последней части «createArray» я выводил созданный конечный массив. Я имею в виду, что это повторяется один раз, но потом повторяется больше раз, чем я ожидаю. createArray - это итеративная функция. Если он повторяется 3 раза, то, наконец, созданный массив, который выполняет критерий, будет распечатан 3 + 1 раз.Итеративный цикл повторяется больше, чем я ожидаю

Я пытаюсь создать массив с 3 номерами 5 раз, в результате получается 2D-массив. 3 числа в массиве выбираются из 0-5. Я ввожу createArray (5,3,5). Затем эти 5 массивов сравниваются друг с другом, чтобы увидеть, есть ли повторения. Если есть, весь процесс начинается снова, 5 массивов с 3 номерами будут собраны снова и сравнены друг с другом. Если повторений нет, то будет напечатано 5 массивов.

#include <algorithm> 
#include <iterator> 


void deleteArray(int** array){ 
    delete[] array; 
} 


int** createArray(int simu_times, int randomrun,int numberofrun){ 

    vector<Int_t>fChosenRun; 
    int** Array = new int*[simu_times]; 

    for(int i = 0; i < simu_times; ++i) { 
     fChosenRun=getRandom(1,randomrun,numberofrun); 
     Array[i] = new int[randomrun]; 
     for(int j = 0; j < randomrun; ++j){ 
      Array[i][j] = fChosenRun[j];  
     } 
    } 

в следующем двухполюсном цикле, я сравниваю массивы друг с другом. Если есть какие-либо повторения, этот массив будет удален, и createArray вызывается для создания массивов снова.

for(int j=0;j<simu_times;++j){  
     for(int i=0+j;i<simu_times;++i){ 
      if(j!=i) { 
       if (std::equal(Array[j], Array[j]+ sizeof Array[j]/sizeof *Array[j], Array[i])){ 
        cout<<"same: "<< j<<" "<<i<<endl; 
        deleteArray(Array); 
        createArray(simu_times,randomrun,numberofrun); 
       } 
      } 
     } 
    } 

Когда массивы не имеют повторения, они будут распечатаны. Все массивы должны быть распечатаны один раз, но их распечатывают много раз.

for(int i=0;i<simu_times;++i){ 
     for(int j=0;j<randomrun;++j){ 
      cout<< i<<" "<<j<<" "<<Array[i][j]<<endl;; 
     } 
     cout<<endl; 
    } 

    return Array; 

} 
+3

* Пожалуйста, исправьте отступ – Borgleader

+3

Используйте отладчик, вот для чего они предназначены. – vsoftco

+0

Примечание: вы не удаляете весь массив должным образом. –

ответ

0

Кажется, вы выводите цикл внутри createArray(), что приводит к дополнительным выходам. Потому что:

  if (std::equal(Array[j], Array[j]+ sizeof Array[j]/sizeof *Array[j], Array[i])){ 
       cout<<"same: "<< j<<" "<<i<<endl; 
       deleteArray(Array); 
       createArray(simu_times,randomrun,numberofrun); 
// after having finally created an Array without duplicates, our successful method 
// returns to this point of its parent method. Now the parent method _also_ 
// will run the following lines of code ... 
      } 
     } 
    } 
} 

// ... and produce extra output at this point. 
for(int i=0;i<simu_times;++i){ 
    for(int j=0;j<randomrun;++j){ 
     cout<< i<<" "<<j<<" "<<Array[i][j]<<endl;; 
    } 
    cout<<endl; 
} 

return Array; 

Поэтому каждая попытка создания Array создаст выход. И поскольку вы работаете с указателем на массив, он будет выводить ваш окончательный, действительный массив каждый раз.

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