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

admin2009-01-15  38

问题 下面是一个Applet程序,其功能是构造n阶魔方阵,魔方阵是这样一个方阵,它的每一行,每一列和对角线之和均相等,例如3阶魔方阵为
   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="ex10_3.class" width=800 height=400>
   </applet>
   */
   public class ex10_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!");
       }
   }
   }
   ex10_3.html
   <HTML>
    <HEAD>
      <TITLE>ex10_3</TITLE>
    </HEAD>
    <BODY>
   <applet code="ex10_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列时,则把下一个数放在上一个数的下面。本题中,第1处,事件监听器应该是btn对象的,不是pane对象;第 2处,应该按照上述规则第一条,将1放在第一行中间一列:第2处,循环变量应该从2开始,如果是1得不到正确答案。
转载请注明原文地址:https://jikaoti.com/ti/Xqb0FFFM
0

最新回复(0)