2015-06-08 35 views
0

我想在二維數組中加倍每個數字。例如array1中的值將變爲{2,4,6}{4,8,12}{6,12,18}。問題是我的代碼只有第一個數字加倍。有人可以給我一些指導什麼做什麼?如何在2d數組中加倍值? C++

#include <iostream> 
#include <iomanip> 

using namespace std; 

const int N = 3; 

int doubleValues(int arr[][N]) 
{ 
    for (int i = 0; i < N; i++) 
    { 
     arr[i][N] *= 2; 

     for (int j = 0; j < N; j++) 
     { 
      arr[N][j] *= 2; 
      return arr[i][j]; 
     } 
    } 
} 

void showArray(int arr[][N]) 
{ 
    for (int i = 0; i < N; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      cout << setw(4) << arr[i][j] << " "; 
     } 

     cout << endl; 
    } 
} 

int main() 
{ 
    int array1 [N][N] = { 
     { 1, 2, 3 } , 
     { 2, 4, 6 } , 
     { 3, 6, 9 } 
    }; 

    int array2 [N][N] = { 
     { 3, 4, 5 } , 
     { 6, 8, 10 } , 
     { 9, 12, 15 } 
    }; 

    cout << "The values for array1 doubled are: \n"; 
    doubleValues(array1); 
    showArray(array1); 

    cout << "The values for array2 double are: \n"; 
    doubleValues(array2); 
    showArray(array2); 

    system("pause"); 
} 
+0

建議:不要使用任何數組函數參數(使用具有額外大小信息的指針)。避免多維數組。如果您想傳遞數組範圍,請使用模板。 –

回答

2

你在你的doubleValues功能的內循環有return arr[i][j]。在將第一個元素加倍後,您的函數將不會再做任何工作。

解決方案是刪除此return語句。 (和更改doubleValuesvoid功能,因爲它並不需要返回一個值。)

此外,您doubleValues功能似乎無論如何要修改錯誤的元素。您訪問arr[i][N]arr[N][j]訪問元素都超出了您聲明​​的數組大小的範圍。您應該在您的循環中修改arr[i][j]

0

如果你可以使用std::array這個項目(因爲你知道你的數組在編譯時的大小),你可以使用功能<algorithm>頭中輕鬆實現您的doubleValues功能,而不是擔心手寫的循環。

template<typename T, std::size_t size> 
void doubleValues(std::array<T,size>& arr) 
{ 
    std::transform(std::begin(arr),std::end(arr),std::begin(arr), [](auto x) { return 2 * x; }); 
} 

這種方法會需要你打破你的二維陣列結構分解成一個單一的維度,可以相對容易地實現。例如,

std::array<int,N*N> array1 = { 1, 2, 3, 2, 4, 6, 3, 6, 9 }; 
std::array<int,N*N> array2 = { 3, 4, 5, 6, 8, 10, 9, 12, 15} 

在該數組的大小可以動態改變的情況下,您可以std::vector換出std::array