2016-11-22 120 views
0

我正在生成一個隨機整數數組,並嘗試將值向右移一位,並用前一個元素替換第一個元素。將數組向右移動

輸出沒有排序,最後一個元素是一個隨機生成的整數。

#include <iostream> 
#include <cstdlib> 
#include <iomanip> 
using namespace std; 


    void shift(int values[], int size) { 
    int temp; 
    for (int i = 0; i < size; i++) {  
     temp = values[size - 1]; 
     values[i] = values[i + 1]; 
     values[0] = temp; 
     cout << values[i] << setw(4); 
    } 
    cout << endl; 
} 
int main() 
{ 
    cout << "Random 10 index array" << endl; 
    const int CAP = 10; 
    int numbers[CAP]; 

    srand(time(0)); 
    int i; 
    for (i = 0; i < CAP; i++) { 
     int rng = rand() % 100 + 1; 
     numbers[i] = rng; 
     cout << numbers[i] << setw(4); 

    } 
    cout << "shifting all elements to the right: " << endl; 
shift(numbers, CAP); 

    cout << endl; 
    system("pause"); 
    return 0; 
} 

我試過使用i < size - 1,但是我得到了9個我需要的10個數字。

+1

[你的橡皮鴨子想和你談談](https://en.wikipedia.org/wiki/Rubber_duck_debugging)。根據你的橡皮鴨,你的陣列的最後一個元素應該移動到第一個元素一次,作爲這個旋轉的一部分。這是不言而喻的,你的橡皮鴨想知道你期望如何工作,何時這樣做的代碼將在每次循環迭代中執行,而不僅僅是一次。看起來,你的代碼對你的橡皮鴨根本沒有任何意義。 –

+0

我錯過了什麼,呼叫轉移的地方。 – IronMan007

+0

'std :: deque'是比這個應用程序更好的選擇。 –

回答

1

這裏是有問題的代碼:

 temp = values[size - 1]; 

這種說法不使用循環變量。它爲什麼坐在循環中?這項任務將繼續發生size-1次。

 values[i] = values[i + 1]; 

你的循環不變爲i <size,但您嘗試訪問i+1。這只是要求麻煩:)。這就是爲什麼當你使用i < size-1時你不會得到垃圾值。

 values[0] = temp; 

此外,這不使用循環變量。它不屬於循環。你只需一遍又一遍地保持設置values[0]

這裏有這樣的作品,使用兩個臨時變量的解決方案:

void shift(int values[], int size) { 
    7  int temp = values[size-1], temp1; 
    8  for (int i = 0; i < size; i++) { 
    9   temp1 = values[i]; 
10   values[i] = temp; 
11   temp = temp1; 
12   cout << values[i] << setw(4); 
13  } 
14  cout << endl; 
15 } 
+0

我很感謝幫助,更多的解釋。 – Ozymandias

0

你嘗試

如果希望元素的循環移位:

的std ::旋轉(& ARR [0],& ARR 1,& ARR [10]); ......會做的。你需要#包括算法頭文件# 。

Optimal way to perform a shift operation on an array

編輯:正如指出的那樣,性病::旋轉。如果直接使用向左旋轉。 Here是例如在向量做右移了一些變化:

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

int main() 
{ 
    std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1}; 

    // simple rotation to the right 
    std::rotate(v.rbegin(), v.rbegin() + 1, v.rend()); 

    std::cout << "simple rotate right : "; 
    for (int n: v) 
     std::cout << n << ' '; 
    std::cout << '\n'; 

} 

輸出:

simple rotate right : 1 2 4 2 0 5 10 7 3 7 
+0

恐怕旋轉功能只能將東西旋轉到左邊。 – Ozymandias

+0

更新了答案 – maz