2.1 作比较
2.1.1 比较
自动售票机
- 售票机,选择了终点或线路之后,投入足够的纸币或硬币,就可以自动打印或制作出车票,还会自动找回零钱。
- 自动售票机需要用户做两个操作:选择终点或路线、投入纸币或硬币,而自动售货机则根据用户的输入做出相应的动作:打印出车票并返回找零,或告知用户余额不足以出票
- 从计算机程序的角度看,这就是意味着程序需要读用户的两个输入,然后进行一些计算和判断,最后输出结果。
简易自动售票机
package com.meteor;
import java.util.Scanner;
public class SimpleTicketDispenser {
public static void main(String[] args) {
// 初始化
Scanner in = new Scanner(System.in);
// 读入投币金额
System.out.print("请投币:");
int amount = in.nextInt();
// 打印车票
System.out.println("**********");
System.out.println("Java城际铁路专线");
System.out.println(" 无指定座位票 ");
System.out.println(" 票价:10元 ");
System.out.println("**********");
// 计算并打印找零
System.out.println("找零:" + (amount - 10));
}
}
注释
- 以两个斜杠“//”开头的语句把程序分成了四个部分:
- 初始化
- 读入投币金额
- 打印车票
- 计算并打印找零
- 注释(comment) 插入在程序代码中,用来向读者提供解释信息。它们对于程序的功能没有任何影响,但是往往能使得程序更容易被人类读者理解。
- 延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列“/“开始,而以“/”结束
- 这种注释也可用于行内注释
上面的程序当投币金额小于10元时:
请投币:5
**********
Java城际铁路专线
无指定座位票
票价:10元
**********
找零:-5
找零-5元是不合理的。在投币后加入amount的比较
package com.meteor;
import java.util.Scanner;
public class SimpleTicketDispenser {
public static void main(String[] args) {
// 初始化
Scanner in = new Scanner(System.in);
// 读入投币金额
System.out.print("请投币:");
int amount = in.nextInt();
System.out.println(amount);
System.out.println(amount>=10);//true或false
// 打印车票
System.out.println("**********");
System.out.println("Java城际铁路专线");5
System.out.println(" 无指定座位票 ");
System.out.println(" 票价:10元 ");
System.out.println("**********");
// 计算并打印找零
System.out.println("找零:" + (amount - 10));
}
}
关系运算
- 计算算两个值之间的关系,所以叫做关系运算
运算符 | 意义 |
== | 相等 |
!= | 不相等 |
> | 大于 |
>= | 大于或等于 |
优先级
- 所有的关系算符的优先级比算术运算的低,但是比赋值运算的高
- 7 >= 3 + 4
- 判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右进行
- 5 > 3 == 6 > 4
2.2 判断语句
2.2.1 做判断
package com.meteor;
import java.util.Scanner;
public class SimpleTicketDispenser {
public static void main(String[] args) {
// 初始化
Scanner in = new Scanner(System.in);
// 读入投币金额
System.out.print("请投币:");
int amount = in.nextInt();
if (amount >= 10) {
// 打印车票
System.out.println("**********");
System.out.println("Java城际铁路专线");
System.out.println(" 无指定座位票 ");
System.out.println(" 票价:10元 ");
System.out.println("**********");
// 计算并打印找零
System.out.println("找零:" + (amount - 10));
}
}
}
if语句
- 一个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果为true,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。
- if语句这一行结束的时候并没有表示语句结束的“;”,而后面的赋值语句写在if的下一行,并且缩进了,在这一行结束的时候有一个表示语句结束的“;”。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条賦值语句,决定它是否要被执行。
package com.meteor;
import java.util.Scanner;
public class Age {
public static void main(String[] args) {
final int MINOR = 35;
System.out.print("请输入你的年龄: ");
Scanner in = new Scanner(System.in);
int age = in.nextInt();
System.out.print("你的年龄是"+age);
if ( age < MINOR )
{
System.out.println("年轻是美好的,");
}
System.out.println("年龄决定了你的精神世界,好好珍惜吧。");
}
}
- 上面这段程序,在第12行,if ( age < MINOR )这一行设置断点(Intellij IDEA如何设置断点),观察程序的执行过程,发现当输入的年龄年龄小于35时,输出了“年轻是美好的”,而输入的年龄大于等于35时跳过了这句话。
2.2.2 判断语句
if-else
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();
int max;
if ( x > y )
max = x;
else
max = y;
System.out.println(max);
2.2.3 嵌套和级联的判断语句
- 输入三个整数,找出最大的数
package com.meteor;
import java.util.Scanner;
public class Max {
public static void main(String[] args) {
int x;
int y;
int z;
int max;
Scanner in = new Scanner(System.in);
x = in.nextInt();
y = in.nextInt();
z = in.nextInt();
if (x > y) {
if (x > z) {
max = x;
} else {
max = z;
}
} else {
if (y > z) {
max = y;
} else {
max = z;
}
}
System.out.println("max值为:" + max);
}
}
- else总是和最近的那个if匹配
级联的if-else if
int x;
int f;
Scanner in = new Scanner(System.in);
x = in.nextInt();
if (x < 0) {
f = -1;
} else if (x == 0) {
f = 0;
} else {
f = 2 * x;
}
System.out.println(f);
单一出口
上面的程序还有一种不好的实现方法,每次判断都输出f的值。
int x;
Scanner in = new Scanner(System.in);
x = in.nextInt();
if (x < 0) {
System.out.println(-1);
} else if (x == 0) {
System.out.println(0);
} else {
System.out.println(2 * x);
}
这种写法不符合单一出口原则。如果想把各种情况下的结果都加1,符合单一出口的第一段程序只需在最后输出的时候修改,而第二段程序需要修改每一次的输出。
2.3 多路分支
- switch-case
- 控制表达式只能是整数型的结果
- 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止
- 如果所有的case都不匹配那么就执行defau忙后面的语句;如果没有default,那么就什么都不做
- switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。
package com.meteor.judge;
import java.util.Scanner;
public class SwitchCase {
public static void main(String[] args) {
int type;
Scanner in = new Scanner(System.in);
type = in.nextInt();
switch (type) {
case 1:
case 2:
System.out.println("你好");
break;
case 3:
System.out.println("晚上好");
case 4:
System.out.println("再见");
break;
default:
System.out.println("什么?");
break;
}
}
}