2016-10-10 4 views
0

Я новичок в C++, и мне нужна помощь с алгоритмом цикла for в моей функции doubleUp. Целью функции doubleUp является то, что массив имеет одинаковые последовательные значения, тогда каждое число будет удвоено. Например, если массив имеет элементы 4, 4, 4 и 4. Новый массив будет 8, 8, 8, 8 с помощью функции doubleUp. Еще раз спасибо ребятам! : DC++ Для алгоритма цикла

#include <iostream> 
using namespace std; 

void collectScores(double scores[], int SIZE); 
void printScores(double scores[], int stopPlace); 
void doubleUp(double scores[], int SIZE); 

void collectScores(double scores[], int SIZE) 
{ 
    for (int n = 0; n < SIZE; n++) 
    { 
     cout << "Please enter a value for element " << (n) << " : "; 
     cin >> scores[n]; 
    } 
    cout << endl; 
} 

void printScores(double scores[], int stopPlace) 
{ 
    for (int n = 0; n < stopPlace; n++) 
    { 
     cout << "The value of element " << (n) << " : " << scores[n] << endl; 
    } 
} 

void doubleUp(double scores[], int SIZE) 
{ 
    for (int n = 0; n < SIZE; n++) 
    { 
     if (scores[n] == scores[n + 1]) 
     { 
      scores[n] *= 2; 
     } 
    } 
} 

int main() 
{ 
    double r; 
    const int SIZE = 4; 
    double scores[SIZE]; 

    collectScores(scores, SIZE); 
    printScores(scores, SIZE); 

    cout << endl; 

    doubleUp(scores, SIZE); 
    printScores(scores, SIZE); 


    system("pause"); 
    return 0; 
} 
+0

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

+1

[Отладка резиновой утки] (https://en.wikipedia.org/wiki/Rubber_duck_debugging). Я могу видеть, не пытаясь: Завершить конец массива (неопределенное поведение), и вы никогда не будете удваивать последний в группе. – John3136

ответ

1

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

void doubleUp(double scores[], int SIZE) 
{ 
    if (SIZE < 2) return;  // 0 or 1 element just return 
    bool isDouble = false; 

    for (int n = 1; n < SIZE; n++) 
    { 
     if (scores[n] == scores[n - 1]) 
     { 
      isDouble = true; 
      scores[n - 1] = 2*scores[n - 1]; 
     } 
     else if (isDouble) 
     { 
      isDouble = false; 
      scores[n - 1] = 2*scores[n - 1]; 
     } 
    } 

    // edge case: possibly double the last element in the array 
    //   if it be identical to the second to last element 
    if (isDouble) scores[SIZE-1] = 2*scores[SIZE-1]; 
} 
-3

Я считаю, что ваша функция doubleUp должна быть слегка отредактирован:

void doubleUp(double scores[], int SIZE) 
{ 
    for (int n = 0; n < SIZE; n++) 
    { 
     if (n < SIZE-2) 
     {  
      if (scores[n] == scores[n + 1]) 
      { 
       scores[n] *= 2;    
      } 
     } 
     else 
     { 
      if (scores[n] == scores[n + 1]) 
      { 
       scores[n] *= 2; 
       scores[n+1] *= 2; 
       n++;    
      } 
     } 
    } 
} 

Добавленная секция по существу позволяет последний элемент массива будет в два раза, где, как исходный код не (там не является индексом n + 1 после последнего элемента в массиве.)

+2

Вы делаете ту же ошибку, что и OP, но делаете это дважды. – user4581301

0

Как люди указывали, ошибка в коде, что ваш последний элемент не получает doubled.This потому, что для последнего элемента в массиве, не сменив элемент, и это где «п + 1 "часть вашего кода выходит из строя. Существует довольно много способов решить эту проблему. Я использовал два для циклов - один для всех элементов, отличных от двух последних элементов, а другой для двух последних элементов.

void doubleUp(double scores[], int SIZE) 
{ 
    for (int n = 0; n < SIZE-2; n++) 
    { 
     if (scores[n] == scores[n + 1]) 
     { 
      scores[n] *= 2; 
     } 
    } 
    for (int n = SIZE-2; n <SIZE; n++) 
    { 
     if (scores[n] == scores[n + 1]) 
     { 
      scores[n] *= 2; 
      scores[n+1] *= 2; 
     } 
    } 
} 
Смежные вопросы