1、第 1 章 变幻多姿的图表1.1 金字塔图案1问题描述打印出金字塔图案,如图 1.1 所示。2问题分析这个问题是一个很经典的循环应用的题目。我们都知道,打印输出的时候,都是从最左端输出,而这里,第一个星号是在中间。这实际是因为星号之前有很多空格。当我们使用问号来表示空格,实际的输出效果应该是图 1.2 的形式。图 1.1 金字塔 图 1.2 金字塔的分析图从图 1.2 分析,我们就可以发现这个题目的奥秘了。(1)确定程序框架从图 1.2 中,我们可以发现,一共需要打印 5 行,而每一行都是打印几个空格,然后再打印几个星号。这样我们就可以写出程序框架了。程序框架代码如下:public class
2、 Ch1_1 public static void main(String args) *for(i=1;i余弦曲线测试width=900height=600(6)运行结果把 Ch1_3.java 文件编译后的 Ch1_3.class 文件放到 Ch1_3.html 网页同一目录下,直接用 IE 浏览器打开 Ch1_3.html,运行程序,结果如图 1.6 所示。3扩展训练前面介绍的余弦曲线的绘制,我们看到的是一个完整的静态图形,能否动态地展现绘制的过程?答案是肯定的,我们可以采用线程的方式来实现,参考代码如下:import java.applet.Applet;import java.awt
3、.Color;import java.awt.Graphics;public class donghua_cos extends Applet implements Runnable/通过实现 Runnable 接口实现线程操作int x,y;double a;int xpos=0;Thread runner;boolean painted=false;public void init() /Applet 创建即启动执行,坐标初始化/ TODO Auto-generated method stubGraphics g=getGraphics(); /画画之前,必须先取得画笔for(x=0;x=
4、(m+i) /输出等腰三角形两边空格System.out.print(“ “);else if(j=(m-i-1)|(j=(m+i-1)/计算并输出等腰三角形两个腰arrij=1;System.out.printf(“%-3d“,arrij);else if(i+j)%2=0else /计算并输出中间数字arrij=arri-1j-1+arri-1j+1;System.out.printf(“%-3d“,arrij);System.out.println(); /输出换行(2)运行结果运行程序,结果如图 1.13 所示。图 1.13 程序输出结果Java 趣味编程 100 例161.6 国际象
5、棋棋盘1问题描述打印出国际象棋棋盘,如图 1.14 所示。2问题分析观察国际象棋棋盘的图案,可以发现其中的规律:棋盘由八行八列黑白方块相间组成,可以用 i 控制行,j 来控制列,根据 i+j 的和的变化来控制输出黑方块还是白方块。这里我们使用了 Swing 的标签组件 JLable,通过设置 JLabel 组件的背景色和透明度来实现黑白方块。(1)确定程序框架这是一个绘图案例,这里我们采用 JFrame 创建窗口,然后在窗口里添加 JLabel 标签组件,通过前面的问题分析可知,JLabel 标签要设置一些属性实现黑白方块,然后显示窗口,实现如图 1.14 所示的效果。程序框架代码如下:pub
6、lic class Ch1_6 public static void main(String args) JFrame f=new JFrame(“国际象棋棋盘“);/窗口属性设置JLabel l = new JLabel(); /生成标签实例/标签属性设置f.add(l); /添加标签f.setVisible(true); /显示窗口(2)窗口属性设置窗口属性设置包括窗口大小、位置等设置,其中窗口大小要满足能够容纳黑白方格,这里指定黑白方格大小为:20 *20,那么窗口属性大小大概为:168 *195。窗口位置可以随便指定,这里指定为:(350,200)。程序代码如下:/窗口设置大小f.se
7、tSize(168,195); /边框的长和宽/窗口设置位置Point point=new Point(350,200);f.setLocation(point);ublic class Ch1_6 (3)标签属性设置标签的属性主要是标签的位置及背景色,棋盘是由八行八列黑白方块相间组成,可以图 1.14 国际象棋棋盘Error! No text of specified style in document.17通过双重循环来实现,用 i 控制行, j 来控制列,位置很容易设置,根据 i+j 的和的变化来设置背景色,表示黑方块还是白方块。程序代码如下:int grids=8; /行数和列数int
8、 gridsize=20; /单元格的高和宽for(int i=0; igrids; i+)for(int j=0; jgrids; j+)JLabel l = new JLabel(); /生成标签实例l.setSize(gridsize,gridsize); /设置标签大小l.setLocation(i*gridsize,j*gridsize); /设置标签位置if(i+j)%2=0) /当小方格的坐标和刚好是偶数时,l.setBackground(Color.black); /设置方格为黑色l.setOpaque(true); /设置为不透明 elsel.setBackground(Co
9、lor.white); /设置方格为白色l.setOpaque(true); /设置为不透明 l.setBorder(BorderFactory.createLineBorder(Color.black); /设置边界为黑色(4)完整程序现在我们就需要把刚才的程序进行组合,构成我们的完整程序:import java.awt.Color;import java.awt.Point;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JLabel;public class Ch1_6 publi
10、c static void main(String args) JFrame f=new JFrame(“国际象棋棋盘“); /创建窗口/窗口设置大小f.setSize(168,195); /边框的长和宽/窗口设置位置Point point=new Point(350,200);f.setLocation(point);int grids=8; /行数和列数int gridsize=20; /单元格的高和宽for(int i=0; igrids; i+) /外循环控制行Java 趣味编程 100 例18for(int j=0; jgrids; j+) /内循环控制列JLabel l = new
11、 JLabel(); /生成标签实例l.setSize(gridsize,gridsize); /设置标签大小l.setLocation(i*gridsize,j*gridsize); /设置标签位置if(i+j)%2=0) /当小方格的坐标和刚好是偶数时,l.setBackground(Color.black); /设置方格为黑色l.setOpaque(true); /设置为不透明 elsel.setBackground(Color.white); /设置方格为白色l.setOpaque(true); /设置为不透明 l.setBorder(BorderFactory.createLineB
12、order(Color.black); /设置边界为黑色f.add(l); /添加标签f.setVisible(true); /显示窗口。图 1.15 国际象棋棋盘1.7 心 形 图1问题描述打印心形图案,如图 1.16 所示。Error! No text of specified style in document.19图 1.16 心形图案2问题分析心形图案的实现,重点是心形函数 r=a(1sin),据说这是笛卡尔死前寄出的最后一封情书的内容,这里面隐藏着一个刻骨铭心的秘密:“一生只为等待能手绘这个函数给我的人”。心形函数要做直角坐标系转换,然后投影到 xOy 平面上,就可以调用画椭圆方法
13、来实现画心形图案。(1)确定程序框架为了提高图像的显示效果,须采用双缓冲技术。首先初始化缓冲区,接着绘制图像,然后再显示在 Applet 窗口中。程序框架代码如下:public class Ch1_7 extends Applet int width, height; Image image; /缓冲区对象Graphics g1; public void init() /Applet 初始化时调用 setBackground(Color.black); /设置背景this.setSize(350, 310); width = getSize().width; /获得窗口宽度height = g
14、etSize().height; image = createImage(width, height); /创建图像对象g1 = image.getGraphics(); public void paint(Graphics g) /绘图方法 g1.clearRect(0, 0, width, height); g1.setColor(Color.red); /在缓冲区绘制心形图案 /显示缓存区的可变 Image 对象g.drawImage(image, 0, 0, this); Java 趣味编程 100 例20(2)绘制图案由前面的问题分析可知,心形函数为 r=a(1sin),要做直角坐标
15、系转换,然后投影到xOy 平面上,坐标确定下来后调用画椭圆方法来画心形图案上的点。程序代码如下:for(i = 0; i = 90; i+) /控制横向变化for(j = 0; j = 90; j+) /控制竖向变化 /转换为直角坐标r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j) * 18; x = r * Math.cos(Math.PI / 45 * j) * Math.sin(Math.PI / 45 * i) + width / 2; /为了在中间显示,加了偏移量y = -r * Math.sin(Math.PI / 45 * j) + height / 4;/为了在中间显示,加了偏移量g1.fillOval(int) x, (int)y, 2,2); /绘制点