第1章 变幻多姿的图表
ab=bc=ad=de,为保证两个圆相交,两个圆的圆心距离必须小于2r(r代表圆的半径)。f为ab的中点,adf组成直角三角形,af=ad/2,只要给定五个圆的任何一个圆心坐标,就可以推倒出其他几个圆的圆心坐标。我们这里使用数组来存放每个圆环的颜色、坐标。代码如下:
//clr[]存储颜色 private Color clr[]={Color.blue,Color.black,Color.red,Color.yellow,Color. green};
//x[]存储圆心的x坐标
private int[] x={100,136,172,118,154}; //y[]存储圆心的y坐标
private int[] y={60,60,60,91,91}; //r代表半径 Private r=20;
(3)画五环旗
根据上面给出的圆的圆心坐标,通过循环语句控制,依次画出每个圆环。代码如下:
for(int i=0;i<5;i++) { //设置颜色 g.setColor(clr[i]); //画圆,第一个参数代表圆心x坐标,第二个参数代表圆心y坐标 g.drawOval(x[i], y[i], d, d); }
(4)完整程序
现在我们就需要把刚才的程序进行组合,构成我们的完整程序:
import java.awt.*;
import java.awt.event.*; import java.applet.Applet; import java.awt.Color; import java.awt.Font;
public class Ch1_4 extends Applet { private Color clr[]={Color.blue,Color.black,Color.red,Color.yellow, Color.green}; //clr[]存储颜色 private int[] x={100,136,172,118,154}; //x[]存储圆心的x坐标 private int[] y={60,60,60,91,91}; //y[]存储圆心的y坐标 private int[][] xy={{100,60},{136,60},{172,60},{118,91},{154,91}}; //存储圆心的坐标 private int r=20,d=40; public void paint(Graphics g) //画图方法 { Font font = new Font(\楷体\//文字字体、大小 g.setFont(font); for(int i=0;i<5;i++) //循环5次,画5个圆环 { g.setColor(clr[i]); g.drawOval(x[i], y[i], d, d); //d代表椭圆外切矩形的长宽,相等代表圆 } g.setColor(Color.blue); //设置颜色 g.setFont(font);
·11·
Java趣味编程100例
}
}
g.drawString(\奥运五环旗\
(5)运行结果
再编写一个测试Ch1_4.html文件,内容参考前面的代码,把Ch1_4.java文件编译后的Ch1_4.class文件放到Ch1_4.html文件同一目录下,直接用IE浏览器打开Ch1_4.html,运行程序,结果如图1.9所示。
3.扩展训练
//END PAINT //END CLASS
图1.9所示奥运五环旗没有图1.7看着图1.9 程序输出结果 舒服,线条有点细,如果能加粗就好了,可
惜Graphics类创建的画笔的粗细是默认的,我们不能改变它。有人提出一个圆环可以由两个圆重叠而成,通过在一个圆的内部紧贴一个稍小的圆即可达到加粗线条的目的,这个思路是可以的,感觉比较麻烦哟,感兴趣可以试一下,有没有简单点的办法?答案是肯定的。我们可以通过Graphics2D类来实现,Graphics2D类扩展Graphics类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。参考代码如下:
public void paint(Graphics g) { Font font = new Font(\楷体\//文字字体、大小 BasicStroke a=new BasicStroke(3.0f); //粗细设置对象 ((Graphics2D)g).setStroke(a); //设置粗细 for(int i=0;i<5;i++) //循环5次,画5个圆环 { ((Graphics2D)g).setColor(clr[i]); //设置圆环的颜色 ((Graphics2D)g).drawOval(x[i], y[i], d, d); } g.setColor(Color.blue); //设置文字颜色 g.setFont(font); g.drawString(\奥运五环旗\} //END PAINT
1.5 杨 辉 三 角
1.问题描述
根据输入行数,打印出杨辉三角形,如图1.10所示。 2.问题分析
观察杨辉三角形的图案,可以发现其中的规律:三角形的竖边和斜边都是“1”,三角形里面的任意一个数字正好等于它正上方的数字和左上角的数字两个数字之和。第几行
·12 ·
第1章 变幻多姿的图表
就有几个数字,可以把它补充成如图1.11所示效果。
图1.10 杨辉三角形
图1.11 方阵
方阵(行列相等的矩阵)大家都很熟悉了,可以通过二维数组来处理方阵,一个双重循环就能实现,外循环控制行数,内循环控制列来完成方阵内数字的计算和存储。
(1)确定程序框架 由前面的问题分析可知,先从键盘接收杨辉三角的高度,然后通过二维数组计算存储杨辉三角,最后把杨辉三角打印出来。程序框架代码如下:
public class Ch1_5 { public static void main(String[] args) { System.out.print(\请输入行数:\ Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); //键盘接收行数 int[][] ary = getTriangle(num); //得到杨辉三角 print(ary); //打印杨辉三角 } }
(2)得到杨辉三角
由前面的问题分析可知,用二维数组计算存储杨辉三角,杨辉三角竖边、斜边都为1,可以先赋值,然后再给中间元素赋值,当前位置的值等于它的上方数和左上角上的数之和。程序代码如下:
private static int[][] getTriangle(int num) { int[][] ary = new int[num][num]; //用二维数组存储 for(int i = 0; i < ary.length; i++) //竖边、斜边置1 { ary[i][0] = 1; ary[i][i] = 1; } for(int i = 1; i < ary.length; i++) //外循环控制行数 {
·13·
Java趣味编程100例
}
for(int j = 1; j <= i; j++) //内循环控制列 { //里面部分,等于当前位置的上方和左上角之和 ary[i][j] = ary[i-1][j-1] + ary[i-1][j]; } }
return ary;
(3)打印杨辉三角
杨辉三角保存在二维数组中,通过一个双重循环就可以打印出来,但是要注意的是,不需要把所有元素都打印出来,内循环列的控制要小于等于当前行数。程序代码如下:
private static void print(int[][] ary) { for(int i=0;i (4)完整程序 现在我们就需要把刚才的程序进行组合,构成我们的完整程序: import java.util.Scanner; public class Ch1_5 { public static void main(String[] args) { System.out.print(\请输入行数:\ Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); int[][] ary = getTriangle(num); print(ary); } //得到杨辉三角 private static int[][] getTriangle(int num) { int[][] ary = new int[num][num]; for(int i = 0; i < ary.length; i++) { ary[i][0] = 1; ary[i][i] = 1; } for(int i = 1; i < ary.length; i++) { for(int j = 1; j <= i; j++) { //从键盘接收行数 //得到杨辉三角 //打印杨辉三角 //用二维数组存储 //竖边、斜边置1 //外循环控制行 //内循环控制列 ·14 · 第1章 变幻多姿的图表 } //里面部分,等于当前位置的上方和左上角之和 ary[i][j] = ary[i-1][j-1] + ary[i-1][j]; } } return ary; } private static void print(int[][] ary) { for(int i=0;i (5)运行结果 运行程序,结果如图1.12所示。 图1.12 程序输出结果 3.扩展训练 图1.12输出的杨辉三角是直角三角形,能不能输出等腰三角形呢?答案是肯定的。等腰三角形类似于前面的金字塔图案,参考前面介绍的思路,不难输出等腰三角形。 (1)参考代码 import java.util.*; public class Ch1_5_2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print(\请输入行号: \ int m = in.nextInt(); int n=2*m-1; //获取控制台输入对象 //从键盘接收输入 //列元素个数 ·15·