2015-12-06 3 views
1

Я пытаюсь создать программу Magic Square на основе ввода текстового файла. Я застрял на массивах. Мне нужно получить размер массива из числа «n», а затем сохранить значения строк и столбцов в массиве 2d. Так вот пример из текстового файла:C++: Magic Square на основе txt-файла

3 
4 9 2 
3 5 7 
8 1 6 

3 будет п, то я был бы нужен 2d массив для хранения информации о п х п. Вот что я закодирован:

int main() { 
    int n; 
    ifstream inFile; 
    inFile.open("input.txt"); 
    inFile >> n; 
    int square[n][n]; 

    readSquare(n, square); 
} 

void readSquare(int n, int square[][]) { 
    ifstream inFile("input.txt"); 
    for (int r = 0; r < n; r++) 
    { 
     for (int c = 0; c < n; c++) 
     { 
      inFile >> square[r][c]; 
      cout << square[r][c]; 
      system("pause"); 
     } 
    } 
} 
+0

Вы делаете это, чтобы узнать C++, или получить рабочую программу? – Beta

+0

Вы не можете определить такие массивы (не постоянный размер), и вы не можете передавать многомерные массивы в качестве аргументов. Вместо этого вы должны использовать 'std :: vector >'. –

+0

@Beta Я делаю это для задания домашней работы. Поэтому я думаю, «учиться C++». –

ответ

0

Похоже, что вы не попали в std::vector еще, потому что теперь вы можете просто использовать простые массивы, которые на самом деле сложнее.

Создание массива 1D заключается в следующем:

int *square = new int[n*n]; 

Вы можете использовать это вместо 2D массива. Вы ставите row*n + column для доступа к каждому элементу по адресу row и col. Или вы можете использовать 2D-массив:

int **square = new int*[n]; 
for (int i = 0; i < n; i++) 
    square[i] = new int[n]; 

Затем вам необходимо передать массив по ссылке.

Смотрите также
Pass array by reference
Create 2D array

Собираем вместе:

void readSquare(int &n, int** &square) 
{ 
    std::ifstream inFile("input.txt"); 
    if (!inFile) 
     return; 

    inFile >> n; 
    if (n < 1) return; 

    square = new int*[n]; 
    for (int i = 0; i < n; i++) 
     square[i] = new int[n]; 

    int row = 0, col = 0; 
    while (inFile) 
    { 
     int temp = 0; 
     inFile >> temp; 
     square[row][col] = temp; 
     col++; 
     if (col == n) 
     { 
      col = 0; 
      row++; 
      if (row == n) 
       break; 
     } 
    } 
} 

int main() 
{ 
    int n = 0; 
    int **square = 0; 
    readSquare(n, square); 
    if (n) 
    { 
     //do stuff with n and square 
     //free memory which was allocated by readSquare: 
     for (int i = 0; i < n; i++) 
      delete[]square[i]; 
     delete[]square; 
    } 
    return 0; 
} 
+0

Hi. Я ценю ваш ответ. Но не могли бы вы объяснить смысл букв '**' и '&'? –

+1

'&' делает разные вещи в C++. В приведенной выше функции он используется, чтобы указать, что параметр «* передан по ссылке *». Это означает, что изменения в 'n' и' square' сохранены. '*' - это указатель, похожий на массив. Хотя '**' является указателем на указатель, который похож на «массив массива» или 2-мерный массив. Это важно в C++, вам нужно читать книги об этом, я не могу объяснить это больше в разделе комментариев. –

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