2016-10-25 1 views
0

J'ai donc une affectation pour ma classe C++. Fondamentalement, nous devons créer un tableau multidimensionnel 3x3, calculer la somme des rangées, la somme des colonnes, la somme des valeurs diagonales et la somme des valeurs anti-diagonales, je viens d'entrer 1 2 3 4 5 6 7 8 9 comme valeurs de départ point.C++ For loops and multidimensional arrays

Maintenant, je n'essaie pas d'être impoli mais mon professeur n'est pas très bon, nous passons essentiellement 2 heures sur un seul problème sans qu'elle explique beaucoup. Autre que cela, j'ai commencé avec C++ Primer et Programming: Principes et Pratique en C++, donc je crois que je serai capable d'apprendre beaucoup par moi-même.

Quoiqu'il en soit mes questions sont probablement tout à fait stupide, mais si quelqu'un se sent comme aider, ils sont là:

  1. Mon/**/commenté pour la boucle pour la valeur anti-diagonale me donne une somme mauvaise. Je suppose que cela a quelque chose à voir avec la nature des boucles for-loops ou je tape juste mal, mais je ne l'ai pas encore compris.

2. La solution de l'enseignant pour le calcul des valeurs anti-diagonale est la suivante:

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]; 

Comment est-il différent de mon approche? Je crois que le mien est plus simple et fonctionne mieux.

3.In ligne:

int sumRows[row_num] = { 0 }; 

Pourquoi {} doivent être utilisées? Notre professeur n'a pas pris la peine d'expliquer cela. J'ai essayé sans {} mais j'ai eu une erreur.

Voici le code complet pour ma version:

#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

Les virgules ne fonctionnent pas comme vous le pensez – dwcanillas

+0

Il est plus facile de remplir le tableau avec une valeur particulière. int sumRows [row_num] = {0}; –

+1

votre boucle d'enseignants est plus facile à lire et à corriger, la vôtre n'est pas (même si l'erreur ne s'affiche pas, mais votre condition de rupture est erronée) – user463035818

Répondre

2

1) Votre commentée résume la boucle toutes valeurs, pas seulement ceux le long de la antidiagonale.

2) Il est différent de votre approche en ce sens qu'il va parcourir toutes les valeurs de la matrice, mais il ne fera qu'ajouter au total s'il détecte qu'il se trouve dans l'une des cellules appropriées. Votre solution n'émet que sur les cellules appropriées et n'a pas à évaluer if s, donc elle sera plus efficace. Cependant, vous devez modifier la condition de votre boucle à i < row_num && j >= 0. L'utilisation d'une virgule ici annulera le résultat de l'un des contrôles.

3) int sumRows[row_num] = { 0 }; initialise l'ensemble du tableau sumRows avec des 0.

+1

juste une note, combinant les boucles ici est bien avec ce qu'il demande à propos de – dwcanillas

+0

Oui, vous avez raison, j'ai raté le 'si 'dans la boucle de l'enseignant. Je vais modifier ma réponse. – 0x5453

+1

Je ne pense pas que la boucle commentée calculé la valeur correcte – user463035818

2

1) Cette

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

est faux, parce que pour i=0 vous itérer toutes j valeurs, à savoir

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

2) Votre boucle d'enseignants est plus facile à lire et à corriger. La vôtre a une mauvaise condition de coupure:

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

Lisez à propos de l'opérateur virgule pour comprendre ce qui se passe réellement ici. Vous n'avez tout simplement pas réalisé le problème, car les deux conditions sont par hasard équivalent.

3) Vous n'avez pas besoin de l'utiliser, c'est juste une façon nouvelle et originale d'initialiser le tableau.

+0

Merci d'avoir signalé mon erreur! Utiliser, au lieu de && était vraiment stupide. – Bayaz