2013-04-04 6 views
-3

Я продолжаю получать ошибку ArrayIndexOutOfBounds: 4 в строке 21. Линия - Спираль [VIndx] [HIndx] = номер. Предполагается, что эта программа создаст спираль чисел при заданном измерении. Например, если задано измерение 3, массив 3x3 2d, который сжимает числа. Вот что спираль должна быть:ArrayIndexOutOfBounds. Java Spiral Program

Почему мои петли не работает?

import java.util.*;import java.io.*; 
    public class Spiral{ 

    public static void Spiral(int dimensions, int [][] Spiral) 
    { 
    int endNumber = (int)Math.pow(dimensions, 2); 
    int number = 1; 

    int rightmovement = 1; 
    int downmovement = 1; 
    int leftmovement = 2; 
    int upmovement = 2; 

    int HIndx = (dimensions-1)/2; 
    int VIndx = (dimensions-1)/2; 

    while(number<=endNumber) 
    { 
for(int i = 0;i<=rightmovement;i++) 
{ 
    Spiral[VIndx][HIndx]=number; 
    number++; 
    HIndx++; 
    if(number==endNumber)break; 
} 
rightmovement++; 


for(int i = 0;i<=downmovement;i++) 
{ 
Spiral[VIndx][HIndx]=number; 
number++; 
VIndx++; 
if(number==endNumber)break; 
} 
downmovement++; 


for(int i = 1;i<=leftmovement;i++) 
{ 
Spiral[VIndx][HIndx]=number; 
number++; 
HIndx--; 
if(number==endNumber)break; 
} 
leftmovement++; 


for(int i = 1;i<=upmovement;i++) 
{ 
Spiral[VIndx][HIndx]=number; 
number++; 
VIndx--; 
if(number==endNumber)break; 
} 
upmovement++; 

} 

} 
public static void main(String[]args)throws IOException 
{ 
File file = new File("spiral.txt"); 
Scanner input = new Scanner(file); 
String [] numbers = new String [2]; 
int i =0; 
while (input.hasNextLine()) 
{ 
String line = input.nextLine(); 
numbers[i]=line; 
i++; 
} 
int dimensions = 0; 
input.close(); 
int [][] Spiral = new int [dimensions][dimensions]; 

dimensions = Integer.parseInt(numbers[0]); 
int range = Integer.parseInt(numbers[1]); 
    if(dimensions%2==0) 
    { 
    dimensions+=1; 
    } 

Spiral(dimensions, Spiral); 

for(i = 0; i<dimensions;i++){ 
    for(int j = 0; j<dimensions;j++){ 
    System.out.println(Spiral[i][j]); 
         } 
     } 

    } 
      } 
+0

Соглашение об именовании продолжает меня путать! – Smit

+0

Вы пытались использовать отладчик?! – Vitaly

ответ

0

Во-первых, ваше состояние цикл должен использовать <, а не <=.

Во-вторых, если вы думаете о спирали, вы поймете, что вы всегда заканчиваете правильным движением. Вы попали в break в первый раз у вас есть

if(number==endNumber)break; 

, но это не выходит из вас из цикла while - это только выходит из цикла for. Итак, вы идете в нисходящее движение for и получаете исключение индекса за пределы.

В-третьих, вам нужно сначала ввести центральное число перед циклом.

Кроме того, rightmovement, leftmovement, ... должны быть увеличены на 2 каждый раз. Причина этого легче увидеть в большей сетке.

21 22 23 24 25 
20 7 8 9 10 
19 6 1 2 11 
18 5 4 3 12 
17 16 15 14 13 

Обратите внимание на первое правое движение пишет 2, то следующий один пишет 8 9 10, а последний пишет 22 23 24 25 и написал бы 26, если бы вы продолжить.

Чтобы устранить проблему с помощью break, не выходя из цикла while, просто измените его на инструкцию return.