2012-02-12 9 views
0

Я делаю программу magicsquare, которая позволяет пользователю вводить числа> 0 для формирования магического кадра. Что такое магический квадрат, это почти квадрат, означающий, что n должно иметь n (квадрат) чисел. Подобно ticTacToe, все строки, столбцы и диагонали имеют одну и ту же сумму, чтобы считаться магическим квадратом. Когда я запускаю свою программу, она всегда путает набор 2D-массивов и утверждает, что набор чисел является магическим, когда обычно, это не обязательно так. Пожалуйста помоги!Программа не работает должным образом

import java.util.Scanner; 

public class SquareRunner 
{ 
public static void main(String[] args) 
{ 
    Scanner in = new Scanner(System.in); 
    Square test = new Square(); 
    System.out.println("Enter a row of integers. When you are finished, type 'n' in a new line"); 
    boolean flag = false; 
    while(!flag) 
    { 
     String numbers = in.next(); 
     if(numbers.equals("n")) 
     flag = true; 
     else 
     test.add(numbers); 
    } 
    test.isMagic(); 

} 
} 

public class Square 
{ 
    private int[][] values; 
    private int row; 

public Square() 
{ 
    row = 0; 
} 

public void add(String numbers) 
{ 
    int b = 1; 
    int amount = numbers.length(); 
    values = new int[amount][amount]; 

    for(int j =0;j<amount;j++) 
    { 
     String a = numbers.substring(j,b); 
     int convert = Integer.parseInt(a); 
     values[row][j] = convert; 

     b++; 
    } 
    row++; 

} 


public Boolean isMagic() 
{ 
    int checkAmountColumns = values[0].length; 
    int checkAmountRows = values.length; 
    int isSquare = checkAmountColumns * checkAmountRows; 

     for(int q = 0;q<values.length;q++) 
     { 
      for(int w=0;w<values[0].length;w++) 
      { 
       int checkZero = values[q][w]; 
       if(checkZero == 0) 
       { 
        System.out.print("To be a perfect square, your number of rows and columns, n must be a perfect "); 
        System.out.println("Square i.e. 9 total numbers is 3 numbers per row"); 
        return false; 
       } 
      } 
     } 
    if(checkAmountColumns != checkAmountRows || Math.sqrt(isSquare) != checkAmountColumns) 
    { 
     System.out.print("To be a perfect square, your number of rows and columns, n must be a perfect "); 
     System.out.println("Square i.e. 9 total numbers is 3 numbers per row"); 
     return false; 
    } 

    else 
    { 
     int magicNumber = 0; 
     int counter = 0; 
     int compareTo = 0; 

     //row to row 
     for(int i =0;i<values.length;i++) 
     { 
      for(int j = 0;j<values[0].length;j++) 
      { 

       values[i][j] += compareTo; 
       if(counter == 0) 
       values[i][j] += magicNumber; 

      } 
      counter ++; 
      compareTo = 0; 
      if(compareTo != magicNumber) 
      { 
       System.out.println("This Selection of numbers is not a perfect square"); 
       return false; 
      } 
     } 

     //column to column 
     for(int i =0;i<values[0].length;i++) 
     { 
      for(int j = 0;j<values.length;j++) 
      { 

        values[j][i] += compareTo; 
        if(counter == 0) 
        values[j][i] += magicNumber; 

       } 
       counter ++; 
       compareTo = 0; 
       if(compareTo != magicNumber) 
       { 
       System.out.println("This Selection of numbers is not a perfect square"); 
       return false; 
       } 

     } 
     System.out.println("This selection of numbers is a MagicSquare!"); 
     return true; 

    } 
} 
} 
+3

Это домашнее задание? –

ответ

0

Первое, что я заметил, это то, что ваш метод add(), вероятно, не будет работать правильно. Каждый раз, когда вы его вызываете, вы перезаписываете предыдущий член values с новым выделенным массивом. Это отбрасывает предыдущую строку, которую вы ввели.

+0

У меня было ощущение, что это так .. Я не уверен, как это исправить. Есть ли у вас какие-либо идеи? – James

+0

Одна идея состоит в том, чтобы выделить массив 'values' * один раз * в вашем конструкторе (передать параметр' size'), а затем заполнить значения в методе 'add()'. –

+0

Спасибо вам обоим – James

0

Тот же ответ, что и Грег. Добавьте это к вашему методу добавления и удалите инициализацию массива значений.

if(values == null){values = new int[amount][amount];} 
Смежные вопросы