2012-04-16 19 views
-2

関数を使用して2番目の配列を作成したいと思います。ユーザは次元(x、y)を入力し、関数はそれを印刷します。最初の行に数字1,2,3 ... xが表示され、最初の列に文字a、b、c、d、e .... y(yは数字として表示されます)が表示されます。例えばこの2次元配列をどのように印刷できますか?

ユーザーは、x = 5 yと入力した場合= 7それが印刷されます:

1 2 3 4 5 
a _ _ _ _ _ 
b _ _ _ _ _ 
c _ _ _ _ _ 
d _ _ _ _ _ 
f _ _ _ _ _ 
h _ _ _ _ _ 
i _ _ _ _ _ 

は、私はいくつかのコードを書いたが、私は手紙でこれを行う方法を知りません。

void function(int x,int y) 
{ 
    char th[x][y]; 

    for (int i = 1; i < x; i++) 
    { 
     for (int j = 1; j < y; j++) 
     { 
      if(i==1) 
      { 
      for (int k = 1; k < x; k++) 
      { 
       th[i][j]=k; 
      } 
      } 
      else if(j==1) 
      { 
      th[i][j]='a'; 
      } 
      else 
      { 
      th[i][j]='_'; 
      } 
      std:: cout << th[i][j] <<'\t'; 
     } 

     cout << std::endl; 
    } 
} 
+0

私はあなたが関数の字下げを修正することを提案し、特に欠けている閉じ括弧を追加することをお勧めしますか? –

+0

'y'の上限はいくらですか?おそらくアルファベット* a-z *をオーバーランします。何をしたらいいですか? –

答えて

4

文字コード表現と、 'b' == 'a' + 1(など)という事実を使用してください。

ゼロベースのインデックスIがあり、それを文字に変換する場合は、実際に 'a' + Iを印刷するのと同じくらい簡単です。大文字にしたい場合は、 'A' + Iを印刷します。

これらのループを実際に単純化することもできます。ネストされた3つのループを持つ理由はありません。最初の行に1つのforループ(数値の列ヘッダーを生成する)が必要であり、残りの行に対して2重に入れ子にされたforループが必要です。以下の(完全にテストされていない)コードのようなもの:

// print header 
std::cout << ' '; 
for (int i = 0; i != x; ++i) 
    std::cout << ' ' << i; 
std::cout << '\n'; 

// print body 
for (int j = 0; j != y; ++j) 
{ 
    // column leader 
    std::cout << char('a' + j); 

    // column body 
    for (int i = 0; i != x; ++i) 
    std::cout << " _"; 
    std::cout << "\n"; 
} 

は、セル内のデータを持っているあなたの欲求にフォローアップでは、あなたは彼らのためにスペースを割り当てる必要があります。 X行Y行がある場合は、X * Yセルが必要です。 X * j + iを使ってこれらのインデックスを付けることができます。ここで、i、jはアクセスする列、行です。何かのように:あなたは「空」の値のアンダースコアを維持したい場合は

std::vector<int> cells(x * y); 

// inside the loop, in place of printing " _", use: 
std::cout << ' ' << cells(x * j + i); 

は、あなたが(ゼロ、負、INT_MAX、何でも)nilの値を表しており、それにベクトルを埋めるために、いくつかの整数を選択する必要があります。次に、セル値がnil値である場合にアンダースコアを印刷するif条件を入れ、それ以外の場合はセル値を直接出力します。

+0

私はこれに取り組み、コードを修正しようとしています。私が文字を印刷しようとすると、ASCII番号が印刷されます。何をしなければならないか分かりますか? – nick

+0

この方法で私の要素にアクセスできますか?たとえば、5列に数値を追加する場合などです。 – nick

+0

@nick:文字をchar型にキャストします。忘れてしまいました、残念です(コードサンプルが更新されます)。セルにデータを入れたい場合は、Luchian Grigoreのアドバイスに従って、メモリを動的に割り当てるか、std :: vectorを使いたいでしょう。 –

0

あなたは、動的配列を割り当てると行われたときにメモリを解放する必要があります:

char** th = new char*[x]; 
for (int i = 0 ; i < x ; i++) 
    th[i] = new char[y]; 

//rest of the code 

for (int i = 0 ; i < x ; i++) 
    delete[] th[i]; 
delete[] th; 

私はあなたにもstd::vectorに見てください必要があり、それはあなたが実際にしているものに適しかもしれませんやって

+0

もし彼がただそれを印刷したいのであれば、何かを割り当てる理由はありません。または私はその質問を誤解しましたか? –

+0

@seanmiddleditch 'char th [x] [y];'はC++では不正です。 –

+0

しかし、配列を印刷するだけの理由はありません。 –

関連する問題