2016-10-25 3 views
0

Итак, у меня есть назначение для моего класса C++. В основном нам нужно создать многомерный массив 3x3, вычислить сумму строк, сумму столбцов, сумму диагональных значений и сумму антидиагональных значений, я обычно просто вводю 1 2 3 4 5 6 7 8 9 в качестве значений в качестве стартового точка.C++ Для циклов и многомерных массивов

Теперь я не пытаюсь быть грубым, но мой учитель не очень хорош, мы в основном тратим 2 часа на одну проблему, не делая много объяснений. Кроме этого, я начал с C++ Primer and Programming: Principles and Practice Using C++, поэтому я считаю, что смогу самостоятельно научиться самостоятельно.

Во всяком случае мои вопросы, наверное, довольно глупо, но если кто-то чувствует, как помочь, вот они:

  1. Моей/**/комментировал цикл для анти-диагонального значения дает мне неправильно сумма. Я предполагаю, что это имеет какое-то отношение к характеру for-loops, или я просто печатаю его неправильно, но пока не понял. Решение

2.The учителя для расчета анти-диагональные значения заключается в следующем:

for (i = 0; i < row_num; ++i) 
    for (j = 0; j < col_num; ++j) 
     if (i + j == row_num - 1) 
      anti-diagonal += A[i][j]; 

Как это отличается от моего подхода? Я считаю, что моя проще и работает лучше.

3.In линия:

int sumRows[row_num] = { 0 }; 

Почему {} должны быть использованы? Наш учитель не стал объяснять это. Я пробовал без {}, но у меня ошибка.

Вот полный код для моей версии:

#include "../../std_lib_facilities.h" 
#include <iostream> 
using namespace std; 

#define row_num 3 //no. of rows 
#define col_num 3 //no. of columns 

    int main() 
    { 
     int i = 0; 
     int j = 0; 
     int diagonal = 0; 
     int antidiagonal = 0; 

     int sumRows[row_num] = { 0 }; 
     int sumCol[col_num] = { 0 }; 

     int A[row_num][col_num]; 

     //Input to matrix 
     for(i=0; i<row_num; i++) 
      for (j = 0; j < col_num; j++) 
      { 
       cout << "A[" << i << "]" << "[" << j << "]: "; 
       cin >> A[i][j]; 

       sumRows[i] += A[i][j]; 
       sumCol[j] += A[i][j]; 
      } 

     cout << endl; 

     //Print out the matrix 
     for (i = 0; i < row_num; i++) 
     { 
      for (j = 0; j < col_num; j++) 
       cout << A[i][j] << '\t'; 
       cout << endl; 
     } 

     //prints sum of rows 
     for (i = 0; i < row_num; i++) 
      cout << "Sum of row " << i + 1 << " "<< sumRows[i] << endl; 

     //prints sum of columns 
     for (j = 0; j < row_num; j++) 
      cout << "Sum of column " << j + 1 << " " << sumCol[j] << endl; 

     //Sum of diagonal values 
     for (i = 0; i < row_num; i++) 
      diagonal += A[i][i]; 

     //Sum of antidiagonal values 
     for (i = 0, j = 2; i < row_num, j >= 0; i++, j--) 
      antidiagonal += A[i][j]; 

     /*for(i=0; i<row_num; i++) 
      for (j = 2; j >= 0; j--) 
      { 
       antidiagonal += A[i][j]; 
      } 
     */ 
     cout << "\nSum of diagonal values: " << diagonal << endl; 
     cout << "Sum of antdiagonal values: " << antidiagonal << endl; 

     return 0; 
    } 
+1

Запятые не работают так, как вы думаете, они делают – dwcanillas

+0

Это простой способ заполнить массив конкретным значением. int sumRows [row_num] = {0}; –

+1

Ваша петля учителей легче читать и исправлять, а ваша нет (даже если ошибка не появляется, но ваше состояние прерывания неверно) – user463035818

ответ

2

1) Ваш закомментирована цикл суммирует все значения, а не только те, вдоль антидиагонали.

2) Он отличается от вашего подхода тем, что он будет перебирать все значения в матрице, но тогда он будет только прибавлять к сумме, если он обнаружит, что он находится в одной из соответствующих ячеек. Ваше решение выполняет только итерации по соответствующим ячейкам и не должно оценивать if s, поэтому оно будет более эффективным. Однако вам необходимо изменить условие цикла на i < row_num && j >= 0. Использование запятой здесь отменит результат одной из проверок.

3) int sumRows[row_num] = { 0 }; Инициализирует весь массив sumRows с 0.

+1

просто примечание, сочетающее петли, здесь хорошо, о чем он спрашивает. – dwcanillas

+0

Да, вы правы, я пропустил 'if' в петле учителя. Я отредактирую свой ответ. – 0x5453

+1

Я не думаю, что прокомментированный цикл рассчитал правильное значение – user463035818

2

1) Это

for(i=0; i<row_num; i++) 
     for (j = 2; j >= 0; j--) 
     { 
      antidiagonal += A[i][j]; 
     } 

это неправильно, потому что для i=0 вы перебора всех j значений, т.е.

i=0 , j=2,1,0 then i=1 

2) Ваш цикл учителей легче читать и правильно. У вашего есть неправильное состояние перерыва:

for (i = 0, j = 2; i < row_num, j >= 0; i++, j--) 
           ^------------------------ WRONG 

Читайте о запятой, чтобы понять, что на самом деле происходит здесь. Вы просто не поняли проблему, потому что два условия являются случайным эквивалентом.

3) Вам не нужно использовать его, это просто новый и причудливый способ инициализации массива.

+0

Спасибо, что указали мою ошибку! Использование вместо && было действительно глупым. – Bayaz

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