Aide du programme Magic Square (Java) [fermé]


Ce sont des devoirs pour mon cours d'informatique AP traitant des tableaux 2D. Fondamentalement, ce que le programme fait, c'est entrer des valeurs dans un Carré magique (toutes les lignes, colonnes et diagonales s'additionnent pour être le même nombre) et détermine s'il s'agit d'un carré magique. Mon algorithme met continuellement false (selon la méthode isMagic ()) pour quand il vérifie si c'est magique. Je crois que j'ai des problèmes dans mes méthodes row() et column() et si quelqu'un pouvait me fournir une solution qui serait grand.

public class Square
{
  private int [][] sq;
  private int position = 0;

  public Square(int size)
  {
    sq = new int[size][size];
  }

  /**
   * adds value to the matrix at the given position, row,col
   */

  public void add(int value, int row, int col)
  {
    sq[row][col] = value;
    // fill in code here.

  }

  public boolean fullSquare()
  {
    int numcheck = 1;
    boolean found = false;
    while (numcheck < sq.length*sq.length)
    {
      for(int i = 0; i < sq.length; i++)
        for(int j = 0; j < sq.length; j++)
      {
        if(sq[i][j] == numcheck)
        {
          found = true;
        }
      }
      numcheck++;

      //use nested for loops to loop through array sq.
      //if the value in sq == numcheck, set found to true

      //After the loop, check to see if numcheck was found 
      //if not found, return false, otherwise set found to false
      //and increment numcheck to be ready to check the next number
    }
    if(found == false)
      return false;
    else
      return true;
  }

  public boolean isMagic()
  {
    int targetNum = 0;
    boolean stuff = false;

    for (int c = 0; c < sq[0].length; c++)
    {
      targetNum += sq[0][c];
    }
    if(column(targetNum) == true && row(targetNum) == true && diagonalLeft(targetNum) == true && diagonalRight(targetNum) == true && fullSquare() == true)
    {
      return true;
    }
    else
      return false;
    //if the rows, columns, diagonals and fullSquare are all
    //true, return true, otherwise, return false.

  }

  public boolean diagonalLeft(int tN)
  {
    int sum = 0;
    //write loop to see if the diagonal from 
    //lower left to upper right is the same as tN
     for(int d = 0; d < sq[0].length; d++)
    {
      sum = sum + sq[d][(sq.length-1) - d];
    }
    return (sum == tN);
  }

  public boolean diagonalRight (int tN)
  {
    int sum = 0;
   //write loop to see if the diagonal from upper left
    //to lower right is the same as tN
    for (int d = 0; d < sq[0].length; d++)
    {
        sum = sum + sq[d][d];
    }

   return (sum == tN);
  }

  public boolean column (int tN)
  {
    boolean same = true;
    int sum = 0;

    //write nested loops to check each column's sum
    //if the sum is not the same as tN, set same to false.
    for(int i = 0; i < sq[0].length; i++)
    {
      for(int j = 0; j < sq[0].length; j++)
      {
        sum = sum + sq[j][i];
      }
    }
    if(sum == tN)
      same = true;
    else
      same = false;

    return same;
  }

  public boolean row(int tN)
  {
   boolean same = true;
    int sum = 0;

    //write nested loops to check each column's sum
    //if the sum is not the same as tN, set same to false.
    for(int i = 0; i < sq[0].length; i++)
    {
      for(int j = 0; j < sq[0].length; j++)
      {
        sum = sum + sq[i][j];
      }
    }
    if(sum == tN)
      same = true;
    else
      same = false;

    return same;
  }

  public String toString()
  {
    String s = "";
    for (int r = 0; r < sq.length; r++)
    {
      for (int c = 0; c < sq[r].length; c++)
      {
        s += sq[r][c] + " ";
      }
      s+= "\n";
    }
    return s;
  }
  }
Author: false, 2013-01-29

2 answers

Le principal problème que vous rencontrez est que vous vérifiez si la somme est la même en dehors de la boucle for. Je le réécrirais comme ceci:

public boolean rowAndColumn(int tN)
{
  int rowsum = 0, colsum = 0;
  for(int i = 0; i < sq[0].length; i++)
  {
    for(int j = 0; j < sq[0].length; j++)
    {
      rowsum = rowsum + sq[i][j];
      colsum = colsum + sq[j][i];
    }
    if(rowsum != tN || colsum != tN)
      return false; //no point checking the rest if the sums doesn't match
    rowsum = 0; //reset row count
    colsum = 0; //reset col count
  }
  return true; //if it doesn't return by here, all the sums match
}

Edit: fullSquare ne fonctionnera pas non plus comme prévu. Essayez quelque chose comme ceci:

public boolean fullSquare()
{
  int numcheck = 1;
  boolean found = false;
  while (numcheck < sq.length*sq.length)
  {
    for(int i = 0; i < sq.length;
      for(int j = 0; j < sq.length; j++)
        if(sq[i][j] == numcheck)
          found = true;

    if (!found)
      return false; //if the number wasn't found, it's not a full square
    found = false;
    numcheck++;
  }
    //use nested for loops to loop through array sq.
    //if the value in sq == numcheck, set found to true

    //After the loop, check to see if numcheck was found 
    //if not found, return false, otherwise set found to false
    //and increment numcheck to be ready to check the next number
  return true;
}
 2
Author: EAKAE, 2013-01-29 04:04:10
for(int i = 0; i < sq[0].length; i++)
    {
      for(int j = 0; j < sq[0].length; j++)
      {
        sum = sum + sq[j][i];
      }
    }

Vous ne réinitialisez pas la somme entre les exécutions de la boucle externe. Vérifiez la somme et réinitialisez-la avant de passer à la colonne suivante.

 2
Author: Aurand, 2013-01-29 01:21:38