2012-04-16 5 views
-2

Я хочу создать 2-й массив, используя функцию; пользователь вводит размеры (x, y), и функция будет печатать его; в первой строке должны отображаться числа 1,2,3 ... x и в первом столбце символы a, b, c, d, e .... y (y заданы как число).Как я могу напечатать этот 2d-массив?

Например, если пользователь вводит х = 5 у = 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.

Также обратите внимание, что вы действительно можете упростить эти циклы. Нет причин иметь три петли вложенных. Вам нужен одиночный цикл для первой строки (генерирующий числовые заголовки столбцов), а затем дважды вложенный цикл 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, что угодно) и заполнить вектор с этим. Затем поставьте условие if для печати подчеркивания, если значение ячейки является значением nil, и напечатайте значение ячейки напрямую в противном случае.

+0

спасибо .. я работаю над этим и пытаюсь исправить свой код. когда я пытаюсь распечатать буквы, которые он печатает номер ASCII .. знаете ли вы, что я должен делать? – nick

+0

таким образом я могу получить доступ к моим элементам? Например, если я хочу добавить число в столбце 5? – nick

+0

@nick: введите букву в тип символа; забыл, извините (обновит образец кода). Если вы хотите иметь данные в своих ячейках, вам нужно следовать советам Лучиана Григоре и динамически выделять память (или использовать 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

Но нет причин даже иметь этот массив вообще для печати. –

Смежные вопросы