Thinking in java 第4章 控制执行流程
4.4 Foreach语法
1. 于net.mindview.util.Range包中有一个名为range()的方法,用于与Foreach语句一起使用,同Python。
for(int i:range(10)) {...} //0,1,..,9
for(int i:range(5,10)) {...} //5,6,...,9
for(int i:range(5,20,3)) {...} //5,8,...,20
4.7 goto
1. 尽管goto是Java中的一个保留字,但Java没有goto。
2. 在Java中,标签起作用的唯一的地方刚好是在迭代语句之前。唯一的使用理由:有循环嵌套存在,而且想从多层嵌套中break或continue。
label1:
outer_iteration {
inner-iteration {
//...
break; //中端内部迭代,回到外部迭代。
//...
continue; //移回内部迭代的起始处。
//...
continue label1; //中断内部迭代以及外部迭代,随后继续迭代过程,从外部开始。
//...
break label1 //中断所有迭代,但不会重新进入迭代。
}
}
4.8 switch
1. case的选择因子必须是int或char那样的整数值,若为浮点数则不会工作。
习题
练习1:写一个程序,打印从1到100的值。
public class E4_1 {
public static void main(String[] args) {
for(int i = 1; i <= 100; i++) {
System.out.print("" + i + " ");
}
}
}
/*
1 2 3 ... 100
*/
练习2:写一个程序,产生25个int类型的随机数。对于每一个随机值,使用if-else语句来将其分类为大于、小于或等于紧随它而随机生成的值。
import java.util.Random;
public class E4_2 {
public static void main(String[] args) {
Random r = new Random();
int pre = 0;
for(int i = 0; i < 25; i++) {
int now = r.nextInt();
if(i == 0) pre = now;
else {
System.out.print("pre = " + pre + ", now = " + now + ", ");
if(pre == now) System.out.println("equals");
else if (pre < now) System.out.println("greater");
else System.out.println("less");
}
}
}
}
/*
pre = -1827692903, now = 1986822367, greater
pre = -1827692903, now = 70842251, greater
pre = -1827692903, now = -1305025312, greater
pre = -1827692903, now = 1374814801, greater
pre = -1827692903, now = 1478385569, greater
pre = -1827692903, now = 1861359084, greater
pre = -1827692903, now = -371757104, greater
pre = -1827692903, now = 1657903782, greater
pre = -1827692903, now = 475706624, greater
pre = -1827692903, now = 1961194076, greater
pre = -1827692903, now = -949692857, greater
pre = -1827692903, now = -1155827079, greater
pre = -1827692903, now = 113912915, greater
pre = -1827692903, now = 1126956680, greater
pre = -1827692903, now = 1923633696, greater
pre = -1827692903, now = -1880685758, less
pre = -1827692903, now = 335386548, greater
pre = -1827692903, now = 88270202, greater
pre = -1827692903, now = -1321302895, greater
pre = -1827692903, now = 48016741, greater
pre = -1827692903, now = 1964815295, greater
pre = -1827692903, now = 50789895, greater
pre = -1827692903, now = -1368692337, greater
pre = -1827692903, now = -1135574582, greater
*/
练习3:把代码用一个while无限循环包括起来。然后运行它直至用键盘中断其运行(通常是通过按Ctrl-C)。
import java.util.Scanner;
public class E4_3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int i = sc.nextInt();
System.out.println(i);
}
}
}
练习4:写一个程序,使用两个嵌套的for循环和取余操作符(%)来探测和打印素数。
public class E4_4 {
public static void main(String[] args) {
for(int i = 2; i <= 100; i++) {
int ok = 1;
for(int j = 2; j <= Math.sqrt(i); j++) {
if(i%j == 0) {
ok = 0;
break;
}
}
if(ok == 1) System.out.print(i+" ");
}
}
}
/*
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
*/
练习5:重复第3章中的练习10,不要用Integer.toBinaryString()方法,而是用三元操作符 * 和按位操作符来显示二进制的1和0。
即按10进制转2进制的方法重写toBinaryString()方法。略。
练习6:修改前两个程序中的两个test()方法,让它们接收两个额外的参数begin和end, 这样在测试testval时将判断它是否在begin和end之间(包括begin和end)的范围内。
public class E4_6 {
public static void main(String[] args) {
System.out.println(judge(5,5,10));
System.out.println(judge(1,5,10));
}
public static boolean judge(int val, int begin, int end) {
if(val <= end && val >= begin) return true;
else return false;
}
}
/*
true
false
*/
练习7:修改本章练习1,通过使用break关键词,使得程序在打印到99时退出。然后尝试使用return来达到相同的目的。
加个判断break和return即可。略。
练习8:写一个switch开关语句,为每个case打印一个消息。然后把这个switch放进for循环来测试每个case。先让每个case后面都有break,测试一下会怎样;然后把break删了,看看会怎样。
没有break时会发生穿透。略。
练习9:一个斐波那契数列是由数字1、1、2、3、5、8、13、21、34等等组成的,其中每一个数字(从第三个数字起)都是前两个数字的和。创建一个方法,接收一个整数参数,并显示从第一个元素开始总共由该参数指定的个数所构成的所有斐波那契数字。例如,如果运行java Fibonacci 5(其中Fibonacci是类名),那么输出就应该是1、1、2、3、5。
import java.util.Scanner;
public class E4_9 {
public static void main(String[] args) {
System.out.print("please enter the n(n > 0 && n < 105): ");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[105];
a[0] = a[1] = 1;
for(int i = 2; i < n; ++i) a[i] = a[i-1]+a[i-2];
for(int i = 0; i < n; ++i) {
System.out.print(a[i] + " ");
}
}
}
练习10:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81
写一个程序,找出4位数的所有吸血鬼数字。
public class E4_10 {
public static void main(String[] args) {
int[] digit = new int[5];
for(int i = 1000; i < 10000; i++) {
int temp = i;
for(int j = 0; j < 4; j++) {
digit[j] = temp%10;
temp/=10;
}
for(int j = 1; j < 4; j++) {
int a1 = digit[0]*10+digit[j];
int a2 = digit[j]*10+digit[0];
int a3, a4;
if(j == 1) {
a3 = digit[2]*10+digit[3];
a4 = digit[3]*10+digit[2];
}
else if(j == 2) {
a3 = digit[1]*10+digit[3];
a4 = digit[3]*10+digit[1];
}
else {
a3 = digit[2]*10+digit[1];
a4 = digit[1]*10+digit[2];
}
if(a1*a3 == i) {
System.out.println(i + " = " + a1 + " * " + a3);
break;
}
else if(a1*a4 == i) {
System.out.println(i + " = " + a1 + " * " + a4);
break;
}
else if(a2*a3 == i) {
System.out.println(i + " = " + a2 + " * " + a3);
break;
}
else if(a2*a4 == i) {
System.out.println(i + " = " + a2 + " * " + a4);
break;
}
}
}
}
}
/*
1260 = 60 * 21
1395 = 15 * 93
1435 = 35 * 41
1530 = 30 * 51
1827 = 87 * 21
2187 = 27 * 81
6880 = 80 * 86
*/