java语言的科学与艺术 第五章 课后编程

本博客介绍了一元二次方程的求解方法,并通过多个实例展示了如何使用Java进行图形绘制,包括房屋、火车等复杂图形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎大家转载,为保留作者成果,转载请注明出处,http://blog.youkuaiyun.com/netluoriver,有些文件在资源中也可以下载!如果你没有积分,可以联系我索要!

1、

package fifth_charter;
/*
* File: Formula.java
* ---------------------------
* 计算一元二次方程
* 第五章第一题
* 
* Author luoriver
*/

import acm.program.*;
import acm.graphics.*;
import java.awt.*;
public class Formula extends ConsoleProgram{
	public void run(){
		double a = readDouble("a: ");
		double b = readDouble("b: ");
		double c = readDouble("c: ");
		suqard(a, b, c);
	}
	
	private void suqard(double a, double b, double c){
		double sq = b * b - 4 * a * c;
		if(sq<0){
			println("此公式无解");
		}else{
			double x1 = (-b - Math.sqrt(sq))/(2 * a);
			println("第一个解为:" + x1);
			
			double x2  = (-b + Math.sqrt(sq))/(2 * a); 
			println("第二个解为:" + x2);
		}
	}
}

3、

package fifth_charter;
/*
* File: Square.java
* ---------------------------
* This program displays a target on the screen.
* 
* Author luoriver
*/

import java.awt.*;

import acm.graphics.*;
import acm.program.*;
public class Square extends ConsoleProgram {
	public void run() {
		println("本程序是计算2次幂");
		int k = readInt("请输入一个数:");
		raiseIntToPower(k);
	}
	
	private void raiseIntToPower(int k){
		int s = 1;
		println("2的0次方=1 ");
		for(int i = 1; i < k; i++){
			s *=2;
			println("2的" + i + "次方= " + s);
		}
	}
};

4、

package fifth_charter;

/*
* File: DigitNum.java
* ---------------------------
*本程序是来计算输入整数的位数
* 第五章第4题
* 
* Author luoriver
*/

import java.awt.*;
import acm.graphics.*;
import acm.program.*;

public class DigitNum extends ConsoleProgram{
	public void run(){
		println("本程序是来计算输入整数的位数");
		int i = readInt("请输入一个整数:");
		countDigits(i);
		
	}
	
	private void countDigits(int n){
		int m = 1;
		while(n / 10 > 0){
			 m += 1;
			n = n / 10;
		}
		print(n + "是" + m + "位数");
		
	}
}

5、

package fifth_charter;

/*
* File: Target.java
* ---------------------------
*打印靶程序
* 第五章第5题
* 
* Author luoriver
*/

import java.awt.*;
import acm.graphics.*;
import acm.program.*;

public class Target extends GraphicsProgram{
	public void run(){
		createFilledCircle();
		
	}
	
	private void createFilledCircle(){
		double dx = getWidth() / 2;
		double dy = getHeight() / 2;
		//N 代表每个圆圈之间的间距
		double N = (OUTER_RADIUS - INNER_RADIUS)  /4;
		
		for(int i = 0; i < 5; i ++){
			GOval c = new GOval(dx  - OUTER_RADIUS +  i * N, dy - OUTER_RADIUS + i * N, 2 * (OUTER_RADIUS - i * N), 2 * (OUTER_RADIUS - i * N)); 
			c.setFilled(true);
			if(i % 2 == 0){
				c.setFillColor(Color.RED);
			}else{
				c.setFillColor(Color.WHITE);
				c.setFilled(true);
			}
			add(c);
		} 
		
		GOval e = new GOval(dx - INNER_RADIUS, dy - INNER_RADIUS, 2 * INNER_RADIUS, 2 * INNER_RADIUS);
		e.setFilled(true);
		e.setFillColor(Color.RED);
		add(e);
		
		} 
	
	private static final int N_CIRCLES = 5;
	private static final  double OUTER_RADIUS = 75;
	private static final double INNER_RADIUS = 10;
}


6、

package fifth_charter;


/*
* File: DrawLight.java
* ---------------------------
* 编程练习第5章第6题
* 
* Author luoriver
*/

import acm.program.*;
import acm.graphics.*;
import java.awt.*;

public class DrawLight extends GraphicsProgram {
	
	public void run(){
		double cx = getWidth() / 2;
		double cy = getHeight() / 2;
		double fx = cx - FRAME_WIDTH / 2;
		double fy = cy - FRAME_HEIGHT / 2;
		double dy = FRAME_HEIGHT / 4 + LAMP_RADIUS / 2;
		
		add(createFilledRect(fx, fy, Color.GRAY));
		add(createFilledCircle(cx, cy - dy, LAMP_RADIUS, Color.RED));
		add(createFilledCircle(cx, cy, LAMP_RADIUS, Color.YELLOW));
		add(createFilledCircle(cx, cy + dy, LAMP_RADIUS, Color.GREEN));
	}
	
	private GRect createFilledRect(double x, double y, Color color){
		GRect frame = new GRect(x, y, FRAME_WIDTH, FRAME_HEIGHT);
		frame.setFilled(true);
		frame.setColor(color);
		return frame;
	};
	private GOval createFilledCircle(double x, double y, double r, Color color){
	
		GOval circle = new GOval(x - r, y - r, 2 * r, 2 * r);
		circle.setFilled(true);
		circle.setColor(color);
		return circle;
	}

	/* Private constants */
	private static final double  FRAME_WIDTH = 50;
	private static final double  FRAME_HEIGHT = 100;
	private static final double  LAMP_RADIUS = 10;

}

7、

package fifth_charter;


/*
* File: Ask.java
* ---------------------------
* 编程练习第5章第7题
* 
* Author luoriver
*/

import acm.program.*;
import acm.graphics.*;

import java.awt.*;

public class Ask extends ConsoleProgram {
	
	public void run(){
		if (askYesNoQuestion(prompt)) {  
            println("Yes, I would like instructions.");  
        } else {  
            println("No, I wouldn'g like instructions.");  
        } 
	}
	
	private boolean askYesNoQuestion(String str) {
		String answer = readLine(str);
		while ( !answer.equals("yes") && !answer.equals("no")) {
			println("Please answer yes or no.");
			answer = readLine(str);
		}
		return (answer.equals("yes"));
	}
	
	/*
	 * 提示语句设置为常量
	 */
	private static final String prompt = "Would you like insatructions?";
}

8、

package fifth_charter;

/*
* File: Train.java
* ---------------------------
* 第五章  画一辆火车
* 
* Author luoriver
*/

import acm.program.*;
import acm.graphics.*;
import java.awt.*;

public class Train extends GraphicsProgram {
	
	public void run(){
		
		double trainWidth =3 * CAR_WIDTH + 4 * CONNECTOR;
		double x = (getWidth() - trainWidth) / 2;
		double y = getHeight();
		double dx = CAR_WIDTH + CONNECTOR;
		drawEngine(x, y);
		drawBoxcar(x + dx, y, Color.BLACK);
		drawCaboose(x + 2 * dx, y);
	}
	
	/*
	 * 这里画火车头
	 * @drawEngine
	 */
		private void drawEngine(double x, double y){
			drawCarFrame(x, y, Color.BLACK);
			drawSmokestack(x, y);
			drawCab(x, y);
			drawCowcatcher(x, y);			
		}
		
		/*
		 * 画烟囱的方法
		 * @patameter为双精度型
		 */
		private void drawSmokestack(double x, double y){
			GRect smoker =new GRect(x + SMOKESATCK_INSET, y - CAR_HEIGHT - CAR_BASELINE - WHEEL_RADIUS, SMOKESATCK_WIDTH, SMOKESATCK_HEIGHT );
			smoker.setFilled(true);
			smoker.setFillColor(Color.BLACK);
			add(smoker);
		}
		
		private void drawCab(double x, double y){
			GRect cab = new GRect(x + CAR_WIDTH - CAB_WIDTH + CONNECTOR, y - CAR_HEIGHT - CAR_BASELINE - WHEEL_RADIUS, CAB_WIDTH, CAB_HEIGHT);
			cab.setFilled(true);
			cab.setFillColor(Color.BLACK);
			add(cab);
		}
		
		private void drawCowcatcher(double x, double y){
			GLine a = new GLine(x, y - CAR_BASELINE, x + CONNECTOR, y - CAR_BASELINE - 5);
			GLine b = new GLine(x, y - CAR_BASELINE, x + CONNECTOR ,  y - CAR_BASELINE- 10);
			GLine c = new GLine(x, y - CAR_BASELINE, x + CONNECTOR,  y - CAR_BASELINE- 15);
			add(a);
			add(b);
			add(c);
		}
		
		private  void drawBoxcar(double x, double y,Color color){
			drawCarFrame(x, y, Color.GREEN);
			double xRight = x + CONNECTOR + CAR_WIDTH / 2;
			double xLeft = xRight - DOOR_WIDTH;
			double yDoor = y - CAR_BASELINE - DOOR_HEIGHT;
			add(new GRect(xLeft, yDoor, DOOR_WIDTH, DOOR_HEIGHT));
			add(new GRect(xRight, yDoor, DOOR_WIDTH, DOOR_HEIGHT));
		}
		
		private void drawCaboose(double x, double y){
			drawCarFrame(x, y, Color.RED);
			GRect caboose = new GRect(x + CONNECTOR + CAR_WIDTH / 2 - CUPOLA_WIDTH / 2, y - CAR_BASELINE - CAR_HEIGHT - CUPOLA_HEIGHT,CUPOLA_WIDTH, CUPOLA_HEIGHT);
			caboose.setFilled(true);
			caboose.setFillColor(Color.RED);
			add(caboose);
		}
		
		private void drawCarFrame(double x, double y, Color color){
			double x0 = x + CONNECTOR;
			double y0 = y - CAR_BASELINE;
			double top  = y0 - CAR_HEIGHT;
			add (new GLine(x, y0, x + CAR_WIDTH + 2 * CONNECTOR, y0));
			drawWheel(x0 + WHEEL_INSET, y - WHEEL_RADIUS);
			drawWheel(x0 + CAR_WIDTH - WHEEL_INSET, y - WHEEL_RADIUS);
			GRect r = new GRect(x0, top, CAR_WIDTH, CAR_HEIGHT);
			r.setFilled(true);
			r.setFillColor(color);
			add(r);
		}	
		
		
		private void drawWheel(double x, double y){
			double r = WHEEL_RADIUS;
			GOval wheel = new GOval(x -r, y -r, 2 * r, 2 * r);
			wheel.setFilled(true);
			wheel.setFillColor(Color.GRAY);
			add(wheel);
		}
		
	

	/* 定义火车的框架 */
	private static final double  CAR_WIDTH = 75;
	private static final double  CAR_HEIGHT = 36;
	
	/* 定义画布底部到火车底部的距离*/
	private static final double CAR_BASELINE = 10;
	
	/* 定义两列火车连接器的宽度*/
	private static final double CONNECTOR = 6;
	
	/* 定义轮子的半径 */
	private static final double WHEEL_RADIUS = 8;
	
	/* 定义火车轮到两侧的距离 */
	private static final double WHEEL_INSET = 16;
	
	/* 定义引擎的大小 */
	private static final double CAB_WIDTH = 35;
	private static final double CAB_HEIGHT = 8;
	
	/*定义烟囱的大小和离火车前端的位置 */
	private static final double SMOKESATCK_WIDTH = 8;
	private static final double SMOKESATCK_HEIGHT = 8;
	private static final double SMOKESATCK_INSET = 8;
	
	/*定义火车门的大小*/
	private static final double DOOR_WIDTH = 18;
	private static final double DOOR_HEIGHT = 32;
	
	/*定义炮塔的大小 */
	private static final double CUPOLA_WIDTH = 35;
	private static final double CUPOLA_HEIGHT = 8;
	
}

9、

package fifth_charter;

/*
* File: House.java
* ---------------------------
*本程序是画出一个房子
* 第五章第9题
* 
* Author luoriver
*/

import java.awt.*;
import acm.graphics.*;
import acm.program.*;

public class House extends GraphicsProgram{
	
	/*
	 * 定义房子的一些常量
	 * (non-Javadoc)
	 * @see acm.program.ConsoleProgram#run()
	 */
	// 定义房子的基线
	private static final double BASELINE = 20;
	
	//设置房顶的高度
	private static final double ROOF_HEIGHT = 30;
	
	//定义房子的主框架
	private static final double FRAME_WIDTH = 100;
	private static final double FRAME_HEIGHT = 80;
	
	/*
	 * 定义房子中窗户的大小,从图中可以看到,窗户可以分成为2个或3个组成的矩形
	 */
	private static final double WINDOW_WIDTH = 4;
	private static final double WINDOW_HEIGHT = 6;
	
	
	/*
	 * 定义门的大小
	 */
	private static final double DOOR_WIDTH = 20;
	private static final double DOOR_HEIGHT = 40;
	
	/*
	 * 定义锁的半径、高度及偏离门的位置
	 */
	private static final double LOCK_RADIUS = 2;
	private static final double LOCK_HEIGHT = 20;
	private static final double LOCK_INSERT = 4;
	
	public void run(){
		double dx = getWidth() / 2;
		double dy = getHeight();
		
		double fx = dx - FRAME_WIDTH / 2;
		double fy = dy - BASELINE;
		double fz = dy - BASELINE - FRAME_HEIGHT;
	
		drawRoof(dx, fz - ROOF_HEIGHT);
		drawFrame(fx, fy - FRAME_HEIGHT);
		drawLeftTopWindows(dx - FRAME_WIDTH / 4 - WINDOW_WIDTH, fy - FRAME_HEIGHT / 4 * 3);
		drawRightTopWindows(dx + FRAME_WIDTH / 4 - WINDOW_WIDTH, fy - FRAME_HEIGHT/4 * 3);
		
		drawLeftLowWindows(dx - FRAME_WIDTH / 4 - WINDOW_WIDTH / 2 * 3, fy - FRAME_HEIGHT / 4);
		drawRightLowWindows(dx + FRAME_WIDTH / 4 - WINDOW_WIDTH / 2 * 3, fy - FRAME_HEIGHT / 4);
		drawDoor(dx - DOOR_WIDTH / 2, fy - DOOR_HEIGHT); 
		
	}
	
	/*
	 * 这里用到了本章学习的数学函数:
	 * Math.sqrt(x)	返回值x的平方根
	 * 和
	 * Math.pow(x,y)返回x的y次幂
	 * 主要来求平面坐标中两条直线的距离
	 * 
	 */
	
	private void drawRoof(double x, double y){
		/*
		 * 这里的if语句表示三角形的两条边的和必须大于第三边,否则就不能构成一个三角形
		 * 平面中两条直线的距离等于两个横坐标的平方与纵坐标的平方的和再求根,求得的根即为三角形的一条边,因两端的线都一样,所以再乘以2
		 * 三角形两条边的和来判断是否大于房子的宽度
		 * 如果两条的边的和小于第三条边,给出提示信息:将房顶的高度设置大一些
		 */
		if(Math.sqrt(Math.pow(x - FRAME_WIDTH / 2, 2) + Math.pow(y - FRAME_WIDTH / 2, 2 )) * 2 > FRAME_WIDTH){
			add(new GLine(x,y, x - FRAME_WIDTH / 2, getWidth() - BASELINE - FRAME_HEIGHT));
			add(new GLine(x,y, x + FRAME_WIDTH / 2, getWidth() - BASELINE - FRAME_HEIGHT));
		}else{
			println("请将ROOF_HEIGHT的值设置大一些!!!!");
		}
	}
	
	private void drawFrame(double x, double y){
		GRect frame = new GRect(x, y, FRAME_WIDTH, FRAME_HEIGHT);
		add(frame);
	}
	
	private void drawLeftTopWindows(double x, double y){
		for(int i = 0; i < 2; i++){
			for(int j = 0; j < 2; j++){
			add(new GRect(x + i * WINDOW_WIDTH  , y + j * WINDOW_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT));
			}
		}
		
		
	}
	
	private void drawRightTopWindows(double x, double y){
		for(int i = 0; i < 2; i++){
			for(int j = 0; j < 2; j++){
			add(new GRect(x + i * WINDOW_WIDTH  , y + j * WINDOW_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT));
			}
		}
	}
	
	private void drawLeftLowWindows(double x, double y){
		for(int i = 0; i < 3; i++){
			for(int j = 0; j < 2; j++){
			add(new GRect(x + i * WINDOW_WIDTH  , y + j * WINDOW_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT));
			}
		}
	}
	
	private void drawRightLowWindows(double x, double y){
		for(int i = 0; i < 3; i++){
			for(int j = 0; j < 2; j++){
			add(new GRect(x + i * WINDOW_WIDTH  , y + j * WINDOW_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT));
			}
		}
	}
	
	private void drawDoor(double x, double y){
		add(new GRect(x, y, DOOR_WIDTH, DOOR_HEIGHT));
		drawLock(x + DOOR_WIDTH - LOCK_INSERT - LOCK_RADIUS * 2, y + DOOR_HEIGHT / 2 - LOCK_RADIUS);
	}
	
	private void drawLock(double x, double y){
		add(new GOval(x, y, LOCK_RADIUS * 2, LOCK_RADIUS * 2));
	}
	

}

10、

package fifth_charter;

/*
* File: HouseOfUsher.java
* ---------------------------
*本程序是画出一个房子
* 第五章第10题
* 
* Author luoriver
*/

import java.awt.*;

import acm.graphics.*;
import acm.program.*;

public class HouseOfUsher extends GraphicsProgram{
	
	/*
	 * 定义房子的一些常量
	 *
	 */
	// 定义房子的基线
	private static final double BASELINE = 10;
	
	//定义房子离画布左边的距离
	private static final double HOUSE_INSERT = 10;
	
	//定义塔的大小
	private static final double TOWER_WIDTH = 30;
	private static final double TOWER_HEIGHT = 120;
	
	//定义塔顶上三角的高度
	private static final double TOWER_ROOF_HEIGHT = 30;
		
	//定义房子的大小
	private static final double HOUSE_WIDTH = 100;
	private static final double HOUSE_HEIGHT = 80;
	
	//设置房顶上三角的高度
		private static final double HOUSE_ROOF_HEIGHT = 30;
	/*
	 * 定义房子中窗户的大小及高度
	 */
	private static final double WINDOW_RADIUS = 4;
	private static final double WINDOW_HEIGHT = 50;
	private static final double WINDOW_INSERT = 10;
	
	/*
	 * 定义门的大小
	 */
	private static final double DOOR_WIDTH = 20;
	private static final double DOOR_HEIGHT = 40;
	private static final double DOOR_ROOF_HEIGHT = 8;
	
	//定义草的大小
	private static final double GRASS_WIDTH = 10;
	private static final double GRASS_HEIGHT = 50;
	//定义草上三角的高度
	private static final double GRASS_ROOF_HEIGHT = 20;
	
	//定义草之间的距离
	private static final double GRASS_DISTANCE = 15;
	
	public void run(){
		drawLeftTower();
		drawHouse();
		drawRightTower();
		drawGrass();
	}
	
	private void drawLeftTower(){
		drawModel(HOUSE_INSERT, getHeight() - TOWER_HEIGHT - BASELINE, TOWER_WIDTH, TOWER_HEIGHT, TOWER_ROOF_HEIGHT);
	}
	
	private void drawRightTower(){
		drawModel(HOUSE_INSERT + TOWER_WIDTH + HOUSE_WIDTH, getHeight() - TOWER_HEIGHT - BASELINE, TOWER_WIDTH, TOWER_HEIGHT, TOWER_ROOF_HEIGHT);
	}
	
	private void drawHouse(){
	 	drawModel(HOUSE_INSERT + TOWER_WIDTH, getHeight() - BASELINE - HOUSE_HEIGHT, HOUSE_WIDTH, HOUSE_HEIGHT, HOUSE_ROOF_HEIGHT);
	 	drawDoor();
	 	drawWindows();
	}
	
	private void drawDoor(){
		drawModel(HOUSE_INSERT + TOWER_WIDTH + HOUSE_WIDTH / 2 - DOOR_WIDTH / 2, getHeight() - BASELINE - DOOR_HEIGHT, DOOR_WIDTH, DOOR_HEIGHT, DOOR_ROOF_HEIGHT);
	}
	
	private void drawWindows(){
		drawLeftWindow();
		drawRightWindow();
	}
	
	private void drawLeftWindow(){
		add(new GOval(HOUSE_INSERT + TOWER_WIDTH + WINDOW_INSERT + WINDOW_RADIUS, getHeight() - BASELINE - WINDOW_HEIGHT, WINDOW_RADIUS, WINDOW_RADIUS));
	}
	
	private void drawRightWindow(){
		add(new GOval(HOUSE_INSERT + TOWER_WIDTH + HOUSE_WIDTH - WINDOW_INSERT - WINDOW_RADIUS, getHeight() - BASELINE - WINDOW_HEIGHT, WINDOW_RADIUS, WINDOW_RADIUS));
	}
	
	private void drawGrass(){
		for(int i = 0; i < 3; i++){
			drawModel(HOUSE_INSERT + TOWER_WIDTH * 2 + HOUSE_WIDTH + i * GRASS_DISTANCE + GRASS_WIDTH, getHeight() - GRASS_HEIGHT - BASELINE, GRASS_WIDTH, GRASS_HEIGHT, GRASS_ROOF_HEIGHT);
		}
	}
	
	private void drawModel(double x, double y, double width, double height, double roof_height){
		/*
		 * 
		 */
		if(Math.sqrt(Math.pow(width/2, 2) + Math.pow(roof_height, 2 )) * 2 > width){
			add(new GLine(x, y, x + width/2,y - roof_height));
			add(new GLine(x + width, y, x + width / 2,y - roof_height));
		}else{
			println("请将ROOF_HEIGHT的值设置大一些!!!!");
		}
		
		add(new GRect(x, y, width, height));
	}
}

11、

package fifth_charter;

/*
* File: Prime.java
* ---------------------------
*本程序是计算素数
* 第五章第11题
* 
* 
* 
* Author luoriver
*/

import java.awt.*;
import acm.graphics.*;
import acm.program.*;

public class Prime extends ConsoleProgram{
	public void run(){
		for(int i = 2; i < MAX; i++){
			if(isPrime(i)){
				println(i + "是素数");
			}
		}
	}
	
	private static boolean isPrime(int num){
		   
       for(int i = 2; i <= Math.sqrt(num); i++) {//程序默认2是素数,当j=2时,循环不执行
           if(num % i == 0){
             return false;
           }
       }
       		return true;
	}
		
	private static final int MAX = 1000;
}

12、这个题自己没有按照书上的,自己写了一个约数的公式,反正是做出来了,

package fifth_charter;

/*
* File: PerfectNum.java
* ---------------------------
*本程序是计算完全数
* 第五章第12题
* 
* 
* 
* Author luoriver
*/

import java.awt.*;
import acm.graphics.*;
import acm.program.*;

public class PerfectNum extends ConsoleProgram{
	public void run(){
		println("本程序是显示一定范围内的完全数");
		for(int i = MIN; i < MAX; i++){
			isPerfectNum(i);
		}
	}
	
	/*
	 * 约数:如果一个整数能被两个整数整除,那么这个数就是着两个数的约数。
	 * 约数是有限的,一般用最大公约数。 一个整数最小的约数是1,最大的约数是其本身
	 * 由此可知
	 */
	private void isPerfectNum(int n){
	
		int y = n / 2;
		int sum  = 0;
		for(int i = 1; i < y; i++){
			for(int j = 1; j <= n; j++){
				if(n % i == 0 && n % j ==0 && i <= j && i * j == n ){
						int s = i + j;
						sum += s;
					//	println (i + "*" + j + "=" + j * i);
				}
			}
		}
		
		// println(n);
		if(sum - n == n){
			println(n + "是完全数");
		}
	}
	
	//定义寻找完全数的范围
	private static final int MIN = 1;
	private static final int MAX = 9999;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值