下面是一个Applet程序,其功能是构造n阶魔方阵,魔方阵是这样一个方阵,它的每一行,每一列和对角线之和均相等,例如三阶魔方阵为: 8 1 6 3 5 7 4 9 2 要求用Applet实现上述魔方阵,窗口中包括提示栏,

admin2009-01-15  93

问题 下面是一个Applet程序,其功能是构造n阶魔方阵,魔方阵是这样一个方阵,它的每一行,每一列和对角线之和均相等,例如三阶魔方阵为:
   8  1  6
   3  5  7
   4  9  2
   要求用Applet实现上述魔方阵,窗口中包括提示栏,提示输入0~15之间的奇数:输入框,输入方阵的阶数:按钮,点击则输出魔方阵;画布用于输出结果。请改正程序中的错误(有下划线的语句),使程序能输出正确的结果。
   注意:不改动程序的结构,不得增行或删行。程序运行结果如下:
     
      import java.awt.*;
      import java.awt.event.*;
      import java.applet.Applet;
      import java.lang.Math.*;
      /*
      <applet code="ex19_3.class" width=800 height=400 >
      </applet>
      */
      public class ex19_3 extends Applet implements ActionListener {
         Panel pane=new Panel();
         drawWnd dw;
         Label 11 = new Label("输入 (0~15的奇数) : ");
         TextField tf1 = new TextField(5);
         Button btn = new Button("OK");
         int[] [] a=new int[16] [16];
         int n=15;
         public void init(){
            pane.setLayout(new FlowLayout(FlowLayout.CENTER,25,5));
            pane.add(11);
            pane.add(tf1);
            pane.add(btn);
            pane.addActionListener(this);
            add("North",pane);
            dw=new drawWnd();
            add("South",dw);
       }
       class drawWnd extends Canvas {
            drawWnd()  {
               setSize(300,300);
               setBackground(Color.GRAY);
            }
            public void paint(Graphics g)  {
                g.setColor(Color. GREEN);
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        g.drawString(Integer.toString(a [j]),i*20,j*20);
             }
       }
       public void actionPerformed(ActionEvent ae)  {
         try{
            n=Integer.parseInt(tf1.getText());
            int i=1,j=1;
            for(i=1;i<=n;i++)
               for(j=1;j<=n;j++)
                  a [j]=0;
               j=n/2+1;
               a [j]=1;
               for(int k=1;k<=n*n;k++){
                    i--;
                    j++;
                    if((i<1)&&(j>n)) {
                       i=i+2;
                       j--;
                    }
                    else{
                         if(i<1)
                             i=n;
                         if (j>n)
                             j=1;
                         }
                         if (a [j]==0)
                             a [j]=k;
                    else{
                              i=i+2;
                              j--;
                              a [j]=k;
                         }
                 }
                 dw. repaint ( );
         }
         catch(NumberFormatException nfe){
            tf1.setText("error!");
         }
     }
   }
   ex19_3.html
   <HTML>
   <HEAD>
     <TITLE>ex19_3</TITLE>
   </HEAD>
   <BODY>
   <applet code="ex19_3.class" width=800 height=400
   </applet>
  </BODY>
  </HTML>

选项

答案btn.addActionListener(this) a[1]][j]=1 int k=2;k<=n*n;k++

解析 本题主要考查Applet图形界面编程和for循环语句的使用以及对数组操作。解题关键是明白魔方阵的基本原理,并能看得懂这个问题的算法,熟悉数组操作,for循环语句以及Applet界面构件及其事件处理机制。魔方阵的排列规律是:首先将 1放在第一行中间一列;然后从2开始直到n*n为止,各数依次按如下规则存放:每一个数存放的行比前一个数的行数减1、列数加1;然后如果上一个数的行数为1,则下一个数的行数为n;再次当上一个数的列数为n时,下一个数的列数应改为1,行数减1;最后如果按以上规则确定的位置上的已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。本题中,第一处,事件监听器应该是btn对象的,不是pane对象;第二处,应该按照上述规则第一条,将1放在第一行中间一列;第二处,循环变量应该从2开始,如果是1得不到正确答案。
转载请注明原文地址:https://kaotiyun.com/show/hIID777K
0

随机试题
最新回复(0)