Brian Shook
Brian Shook

Reputation: 13

Magic Square Method needs to output if it is a magic square and the sum of rows and columns

I'm working on an assignment that takes a data file with a number matrix and determines if it is a magic square. If it is then it also needs to report the sum of the rows and columns. With the output:

The matrix is a magic square. The sum of all the rows and columns is 34.

I'm not sure how to go about this with one method, I feel like its asking me to return 2 values. The closest I have came is by adding a System.out.println with the sum at the end of my method when it returns true.

But the issue with that is that my output is backwords:

The sum of all the rows and columns is 34. The matrix is a magic square.

How do I get the sum when I've only been asked to create one method? Below is my code, the instructor gave the bottom 3 methods so I'm only concerned with the first 2.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class chp8magic
{
    public static void main(String args[])
    {
        int matrix[][] = initMatrix();
        printData(matrix); 

        if (isMagic(matrix)) {
            System.out.println("The matrix is a magic square.");
        }
        else {
            System.out.println("Not a magic square");
        }
    }

    public static boolean isMagic(int[][] mat)
    {
        int n = mat.length;
        int nSquare = n*n;
        int M = (n*n*(n*n+1)/2)/n;
        int sumRow = 0, sumColoumns = 0, sumPriDiag = 0, sumSecDiag = 0;
        boolean[] flag = new boolean[n*n];

        for(int row = 0; row < n; row++){

            sumRow = 0;
            sumColoumns = 0;

            for(int col = 0; col < n; col++)
            {
                if( mat[row][col] < 1 || mat[row][col] > nSquare )
                    return false;
                if(flag[mat[row][col]-1] == true) 
                    return false;

                flag[mat[row][col]-1] = true;
                sumRow += mat[row][col];
                sumColoumns += mat[col][row];
            }
            sumPriDiag += mat[row][row];
            sumSecDiag += mat[row][n-row-1];
            if(sumRow!=M || sumColoumns!=M)
                return false;
        }
        if(sumPriDiag!=M || sumSecDiag!=M) 
            return false;
        else
            return true;
    }

    public static int[][] initMatrix()
    {
        int matrix[][];
        Scanner filein = null;

        try {

            filein = new Scanner(new File("matrix.txt"));
            int numRows = Integer.parseInt(filein.nextLine());
            matrix = new int[numRows][];
            parseData(matrix, filein);
            filein.close();

            return matrix;

        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
            if(filein != null)
                filein.close();
            return null;
        }
    }

    public static void parseData(int matrix[][], Scanner in)
    {
        for(int r = 0; r < matrix.length; r++)
        {
            String splitLine[] = in.nextLine().split(" ");
            matrix[r] = new int[splitLine.length];

            for(int c = 0; c < matrix[r].length; c++){
                matrix[r][c] = Integer.parseInt(splitLine[c]);
            }
        }
    }

    public static void printData(int matrix[][])
    {
        for(int r = 0; r < matrix.length; r++){
            for(int c = 0; c < matrix[r].length; c++){
                System.out.print(matrix[r][c] + " ");
            }
            System.out.println();
        }
    }
}

Upvotes: 0

Views: 1667

Answers (1)

maraca
maraca

Reputation: 8743

Probably you just need to do:

System.out.println("is magic: " + isMagic);
System.out.ptintln("sum: " + sum);

However this is not really returning the values, just printing them. To return two values there are several options. You could return an object:

public class MagicSquareProperties {

    private boolean magic;
    private int sum;

    public MagicSquareProperties(boolean magic, int sum) {
        this.magic = magic;
        this.sum = sum;
    }

    public boolean isMagic() {
        return magic;
    }

    public int getSum() {
        return sum;
    }
}

// now to return both values: return new MagicSquareProperties(true, 34);

But in my opinion the best solution would be the following:

  1. Create a class MagicSquare.
  2. Add property declarations (e.g. private int sum).
  3. Add a constructor, for example MagicSquare(File file), this constructor reads the file and populates the properties.
  4. Add getters and setters if needed (e.g. getSum())
  5. Execute the main method in another class and call new MagicSquare(...) to create a magic square object. Afterwards you can call the getters on the object whenever you need the value.

Upvotes: 2

Related Questions