Mọi người giúp em cái bài tập này với :
Đề bài cho 1 bảng như sau :
a b c d e f g h i j k l m n o p q r s t u v w x y z
a A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
b A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
...................................
...................................
y A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Yêu cầu là nhập vào 1 keyword (VD calculus) , sau đó nhập vào 1 plaintext (VD beammeupscotty) sau đó mã hoá cái plaintext như sau :
-Lấy từng chữ cái tương ứng của keyword và plaintext (VD chữ thứ 1 của keyword là c ,chữ thứ nhất của plaintext là b )
-Tra chữ của keyword theo cột thứ nhất của bảng (cột chữ thường)
Tra chữ của plaintext theo hàng thứ nhất của bảng (hàng chữ thường)
Sau đó lấy chữ cái hoa tương ứng ,đưa vào kết quả .

Đề còn 1 số yêu cầu nữa nhưng thắc mắc chính của em là về cái này
Đây là code của em :

Mã:
import java.util.Scanner;
public class Ciphers
{
 char [][] lookupTable=new char[28][28];
 String keyword=new String();
 
 
 //constructor
 public Ciphers()
 {int i,j;
  char temp1='a',temp2;
  for(j=1;j<lookupTable.length;j++)
   {lookupTable[0][j]=temp1;
	 lookupTable[j][0]=temp1;
	 temp1=(char)(  (int)(temp1) + 1 );
	}
	temp1='A';
  for(i=1;i<lookupTable.length;i++)
   {lookupTable[1]=temp1;
	 temp2=temp1;
	 for(j=1;j<lookupTable.length;j++)
	  { lookupTable[j]=temp2;
	   if( (  (int)(temp2)+1 ) > (int)('Z')  )  
		  temp2=(char)(  (int)(temp2)+1-26  );
		else temp2=(char)(  (int)(temp2)  + 1);
	  }
	 temp1=(char)(  (int)(temp1) + 1 );
	}
 }
 
  // encrypt method
  public String encrypt(String plaintext)
  {StringBuffer temp=new StringBuffer();
   int i=0,j=1,k=1;
	while (i<plaintext.length())
	{while(keyword.charAt(i%keyword.length())!=lookupTable[j][0])
	  j+=1;
	 while(plaintext.charAt(i)!=lookupTable[0][k])
	  k+=1;
	 temp.insert(i,lookupTable[j][k]);
	  i+=1;
	}
	return(temp.toString());
  }
  
  //decrypt method
  public String decrypt(String ciphertext)
  {int i=0,j=1,k=1;
  StringBuffer temp=new StringBuffer();
  while(i<ciphertext.length())
  {
   {while(lookupTable[j][0]!=keyword.charAt(j%keyword.length()))
	  j+=1;
	while( ciphertext.charAt(i)!= lookupTable[j][k])
	  k+=1;
	temp.insert(i,lookupTable[0][k]);
   }
	i+=1;
  }
  return(temp.toString());
  }
  
  //readInKeyword method
  public void readInKeyword()
  {Scanner sc=new Scanner(System.in);
  System.out.print("Keyword:");
  keyword=sc.nextLine();
  }
  
  //encryptText method
  public void encryptText()
  {Scanner sc=new Scanner(System.in);
  String temp=new String();
  System.out.print("Enter text needed to encrypt:");
  temp=sc.nextLine();
  System.out.println("Encrypted text:"+encrypt(temp));
  }
  
  //decryptText method
  public void decryptText()
  {Scanner sc=new Scanner(System.in);
  String temp=new String();
  System.out.print("Cipher text:");
  temp=sc.nextLine();
  System.out.println("Decrypted text:"+decrypt(temp));
  }





Còn đây là code của cái class ứng dụng :

Mã:
 public static void main(String[]args)
 {Ciphers cipher1=new Ciphers();
 int i,j,choice;
 Scanner sc=new Scanner(System.in);
 
 for(i=0;i<27;i++)
  {for(j=0;j<27;j++)
   System.out.print(cipher1.lookupTable[j]+" ");
	System.out.println();
  }
  
 System.out.println();
 cipher1.readInKeyword();
 System.out.println("You have the following options:");
 System.out.println("(1) Encrypt a plaintext message");
 System.out.println("(2) Decrypt a ciphertext message");
 System.out.println("(3) Quit the program");
 System.out.println();
 
 do{
 System.out.print("Enter the number of your choice:");
 choice=sc.nextInt();
 switch(choice){
  case 1: cipher1.encryptText();
         break;
  case 2: cipher1.decryptText();
         break;
  case 3: System.out.println("Program terminating...");
               }
	}
	while (choice!=3);
	
	}
}

Vấn đề là khi chạy thì nó lại in ra bảng như sau:
0 0 a b c d ...
a A B C D ............
b B C D E.............
...........................

Nghĩa là hàng đầu tiên có thêm 2 số 0 và lùi vào như trên.
Khi em tiếp tục chọn encrypt thì sau khi đánh vào keyword và plaintext thì nó xuất hiện cái exception :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 28
at Ciphers.encrypt(Ciphers.java9)
at Ciphers.encryptText(Ciphers.java:77)
at CiphersApp.main(CiphersApp.java:27)

Em có post 1 bài hỏi bên javavietnam nhưng chưa thấy ai trả lời cả nên mang lên đây hỏi mọi người luôn :p
Với cả mọi người xem có phải chương trình của em nó rắc rối quá không? Có cách nào đơn giản hơn ko?