-2

我想使用函数创建第二个数组;用户将输入尺寸(x,y),函数将打印它;在第一行中必须出现数字 1,2,3...x,在第一列中必须出现字符 a,b,c,d,e....y(y 以数字形式给出)。

例如,如果用户输入 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;
    }  
 }
4

2 回答 2

4

使用字符代码表示和 'b' == 'a' + 1 (等等)这一事实。

如果你有一个从零开始的索引 I,并且你想将它转换为字母,它真的就像打印 'a' + I 一样简单。如果你想要大写,打印 'A' + I。

另请注意,您可以真正简化这些循环。没有理由嵌套三个循环。第一行需要一个 for 循环(生成数字列标题),然后是其余行的双重嵌套 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 列 X 行,则需要 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);

如果您想为“空”值保留下划线,您需要选择一些整数来表示一个 nil 值(零、负、INT_MAX 等)并用它填充向量。然后放入 if 条件,如果单元格值为 nil 值则打印下划线,否则直接打印单元格值。

于 2012-04-16T09:30:24.533 回答
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,它可能更适合您实际在做的事情。

于 2012-04-16T09:26:54.350 回答