2016-11-16 6 views
-2

latin squareを作成するC++ void関数で正方形の2D配列(arr [n] [n])を使用する必要がありますが、nのサイズはで与えられていませんプログラムの開始。ユーザーは配列のサイズを入力する必要があります。私のコードの例(失敗している):2D配列を関数に使用するC++

int n; 
    void arrayz(int n , int arr[][]) 
    { 
     for (int i = 0; i < n; i++) 
      { 
       for (int k = 0; k < n; k++) 
       { 
        for (int e = 1; e <= n; e++) 
        { 
         arr[i][k] = e; 
        } 
       } 
      } 
    } 
    int main() 
    { 
      int arr[n][n]; 
      cin >> n; 
      void arrayz (n, arr[n][n]) 
    } 

私はこの問題を手伝ってください!

+3

それは正確にどのようにコードを言うことは通常礼儀ですので、ここでnは、実際には任意の(有効な)値を持つことができ<vector>実装は、です関連するエラーを投稿してください。 – kabanus

+3

'int arr [n] [n];'は無効ですC++。 –

+0

malloc()のような関数を呼び出して動的に割り当てる必要があります –

答えて

1

あり、あなたのコードにはいくつかの問題があり、あなたは自分の仕事があなたのために行わ取得しようとしているかどうかは不明だので、私は教育的なアプローチを試してみましょう:あなたの場合、

  1. としては述べました配列のサイズをユーザ入力にしたい、動的に割り当てたい場合は、malloc関数が必要です。 arr変数がint**と定義されている場合は、その領域を割り当てることになります。

  2. 配列cのスタイルを送信するとき、あなただけのアドレスに送信、戻り値の型(最後の行にボイド)

  3. を書いていない機能を呼び出す - いいえ、ARR(この場合は配列名を[] [])。

  4. 多次元配列を関数の引数として定義する場合、少なくとも最初のサイズを送信する必要があります。あなたはそれを知らないので、ユーザーがそれを与えるので、ポインタ(int **など)を受け入れてください。

これらの調整を行う方法がわからない場合は、Cチュートリアルを検索することをおすすめします。

+0

ありがとうございました!これらのヒントは確かに私を助けました! –

-1

これはC++では実行できません。 C++されていないn、時定数をコンパイルする配列型のすべてのサイズが必要です。

#include <stdio.h> 

void arrayz(int n , int arr[n][n]) { 
    for (int i = 0; i < n; i++) { 
     for (int k = 0; k < n; k++) { 
      for (int e = 1; e <= n; e++) { 
       arr[i][k] = e; 
      } 
     } 
    } 
} 

int main() { 
    int n; 
    if(scanf(" %i", &n) != 1) return -1; 
    int arr[n][n]; 
    arrayz (n, arr); 
} 

これがないC++、Cです。ただし、C99以来、Cでそれを行うことができます。

+0

私は今OPのコードをコピー/ペーストから構文エラーを修正しました。これ以上downvotesの理由はありません。 – cmaster

1

前述のとおり、nは定数でなければならないため、実装できません。あなたがvecをプリントアウトした場合

#include <iostream> 
#include <vector> 

void arrayz(std::vector<std::vector<int>> &vec){ 
    int count{ 0 }; 
    for (auto &x : vec){ 
     for (int i = 0; i < vec.size(); ++i){ 
      x[i] = (i + count) % vec.size() + 1; 
     } 
     ++count; 
    } 
} 

int main(){ 
    std::size_t n{0}; 
    std::cout << "Type in the size of the 2d array: "; 
    std::cin >> n; 
    std::vector<std::vector<int>> vec(n, std::vector<int>(n)); 
    arrayz(vec); 

    return 0; 
} 

:(例:運転)

Type in the size of the 2d array: 9 
1 2 3 4 5 6 7 8 9 
2 3 4 5 6 7 8 9 1 
3 4 5 6 7 8 9 1 2 
4 5 6 7 8 9 1 2 3 
5 6 7 8 9 1 2 3 4 
6 7 8 9 1 2 3 4 5 
7 8 9 1 2 3 4 5 6 
8 9 1 2 3 4 5 6 7 
9 1 2 3 4 5 6 7 8 
+1

ですが、これはラテンの正方形ではありません。正規化されたラテン方陣になる '(count + i)%n'を返します。 – Baldrickk

+1

ああ、ありがとう。それを編集しました。 –

+0

私はPythonを学んできました。 def latin_square(n):範囲(n)内のxについてreturn [[(y + x)%n]]同じ考え方。 – Baldrickk