4. 高中几何课曾介绍过勾股定理(即直角三角形三条边的长度之间关系):
也可以写成以下形式
这个表达式中的大部分运算符在第三章中已经介绍过,唯一没有出现的是开平方的操作,而
这一操作可以通过调用标准函数Math.sqrt来完成。
例如,下列语句
double y = Math.sqrt(x);
表示将x 的平方根赋给y。
请编写一个控制台程序,使之能通过用户给定的a,b的值,求出c的解,其中a,b为整型
变量,c 为双精度浮点型。程序完成图应当如下图所示:
code如下:
public class PythagoreanTheorem extends ConsoleProgram {
public void run() {
println("Enter values to computer Pythagorean theorem.");
int a = readInt("a:");
int b = readInt("b:");
double c = Math.sqrt(a*a+b*b);
println("c = " + c);
}
}
5、编写一个控制台程序,使之能够读取一列整数,每行一个,直至读到0 值时为止(此值
作为哨兵值,标识结束,在编程实践中应当能够随需要作出改变。)当完成对整列的读取后,
该程序应当能够指出此列中的最大值和最小值。如下图所示:
该程序应该能够对以下特殊情况进行处理:
该程序应该能够对以下特殊情况进行处理:
如果哨兵值前仅有一个数值,则在程序的返回值中,此数值应当既是最大值又是最小值
如果哨兵值是第一个输入值,且不再有其他的输入值。此时,程序应当能够输出相应的
错误信息。
code:
import acm.program.*;
public class FindRange extends ConsoleProgram {
public static final int SENTINEL = 0;
int min,max,x,times = 1;
public void run() {
//println("min=" + min + " max=" + max + " x=" + x + " times=" + times); //检查各个数赋值情况
println("This program find the largest and smallest numbers.");
read();
}
//比较并赋值
public void compare(){
if(times == 1){
min = x;
max = x;
}
if(x >= max) max = x;
if(x <= min) min = x;
times++;
}
//输出
public void print(){
if(times==1){
println("第一次不能输0你个混蛋!");
read();
}else{
println("smallest: " + min);
println("largest:" + max);
}
}
//读取
public void read(){
x = readInt("? ");
while(x != SENTINEL){
compare();
x = readInt("? ");
}
print();
}
}
6、道格拉斯•侯世达的巨作《哥德尔、艾舍尔、巴赫——集异璧之大成》曾获得普利策奖,
这本书中包含了许多数学谜团。这些谜团中的有不少可以借助计算机程序的形式表达。在此
书的第十二章中,侯世达提出了一个重要的问题,而这个问题刚好在第四章控制语句的研究
范围中。
对于这个问题的描述,如下所示:
设存在正整数n。
若n 为偶数,令n=n/2。
若n 为奇数,令n=3n+1。
重复如上步骤,直到n=1 为止。
在本书旧版的第401 页,侯世达用下述实例说明了这个过程,初值为15:
15 是奇数,因此执行3n+1: 46
46 是偶数,因此执行减半: 23
23 是奇数,因此执行3n+1: 70
70 是偶数,因此执行减半: 35
35 是奇数,因此执行3n+1: 106
106 是偶数,因此执行减半: 535
53 是奇数,因此执行3n+1: 160
160 是偶数,因此执行减半: 80
80 是偶数,因此执行减半: 40
40 是偶数,因此执行减半: 20
20 是偶数,因此执行减半: 10
10 是偶数,因此执行减半: 5
5 是奇数,因此执行3n+1: 16
16 是偶数,因此执行减半: 8
8 是偶数,因此执行减半: 4
4 是偶数,因此执行减半: 2
2 是偶数,因此执行减半: 1
从这个例子容易看出,数字在上下波动中,实际上,到目前为止所试验过的所有整数,最终
都会变小直至变为1 为止。从某种角度而言,这个运算过程与冰雹(hailstones)有相似
之处,后者在落地之前会反复被风吹向空中。也正因此,虽然有其它的名字,这个数列大
多数情况下被称为冰雹数列(Hailstone sequence)。
写一个控制台程序,用户每输入一个数字,就用侯世达的书中相同的格式,显示出该数字相
应的冰雹数列,并在最后一行输出到达1 所用的总步骤数。最终程序应当能显示如下示例:
这个问题的迷人之处在于至今没有人能够证明整个过程最后一定会停下来。随着数值的变
化,到达1 所需要的步骤将能够变得非常大。不妨求解一下。当n 等于27 的时候,需要多
少步能转化为1?
code:
import acm.program.*;
public class Hailstone extends ConsoleProgram {
private int a,b,times = 0;
public void run() {
a = readInt("Eneter a number:");
calculate();
println("The process took " +times +" to reach 1.");
}
public void calculate(){
while(true){
if(a <= 0){
println("Please enter a positive integer!");
a=readInt("Eneter a number:");
continue;
}
if(a == 1)break;
if(a%2 == 0){
b = a/2;
println(a+" is even so I take half: "+b);
times++;
a = b;
}else{
b = 3*a+1;
println(a+" is odd so I make 3n+1: "+b);
times++;
a = b;
}
}
}
}