Java选择结构:
Java和其它的高级序设计语言一样也有选择语句,这样就可以在两个或更多的选择中做出相应的选择。比如:
if(radius<0)
System.out.println(“输入不正确!”);
else {
area = radius * radius * 3.14;
System.out.println(“面积是:” + area);
}
有选择肯定就是条件判断,条件就是一个布尔表达式,这个表达式可以得到一个布尔值,一个布尔值就是boolean类型的值
Java提供了六种比较比较运算符,这些运算符也叫关系运算符,用来对两个值的比较,也可以对字符进行比较,如果对字符比较就是对字符的统一码进行比较
6种比较运算符:
< 小于
<= 小于等于
> 大于
>= 大于等于
== 等于
!= 不等于
注意对于相等的比较是使用的==而不是=,对于后者它表示的是赋值
具有布尔值的变量称之为布尔变量,使用类型boolean进行声明,它的取值只可能是true和false之一
true和false都是直接量,它们是保留字不可以作为程序中的标识符
import java.util.Scanner;
/*对两个十以内的数要求输入答案并给出输入的答案是否正确*/
publicclass AddtionQuiz {
publicstaticvoid main(String[] args) {
//获得两个十以内的数
int number1 = (int)(System.currentTimeMillis()%10);
int number2 = (int)(System.currentTimeMillis()*7%10);
//创建一个控制台的输入对象
Scanner input = new Scanner(System.in);
System.out.print(number1+"+"+number2+"? ");
int answer = input.nextInt();
System.out.println(number1+"+"+number2+" = "+answer +" is "+(number1+number2==answer));
}
}
上面的程序就是使用了关系运算符==这样表达式会直接得到true或是false
if语句:
单一if语句:当条件满足的时候就执行相应的语句
if(布尔表达式){
statements;
}
这里如果语句体中只有一条语句则可以省略掉花括号不写
import java.util.Scanner;
publicclass SimpleIfDemo {
publicstaticvoid main(String[] args) {
//创建一个读取控制台输入的扫描器
Scanner input = new Scanner(System.in);
//读取输入
System.out.print("请输入一个整数:");
int number = input.nextInt();
//对读取到的整数进行判断
if(number%5 == 0)
System.out.println("Hi5");
if(number%2 == 0)
System.out.println("HI2");
}
}
如上面的程序就是一个简单的单一if语句的例子当满足条件就会执行后面的语句体如果不满足则跳过这个语句体
双向if语句:
当指定条件是true的时候单向if语句执行一个操作,而当条件为false的时候则会什么也不干,如果在条件false的时候也能做一些操作则要使用双向的if语句
if(布尔表达式){
当表达式为true时执行语句组;
}else{
布尔表达式为假的时候执行语句组;
}
对于双向if语句一样如果执行语句组只有一条语句时可以省略花括号,一般来说我们可以有如下的一种结构是常用的如果判断一种条件成立时为一个变量赋一个什么值,不满足条件时赋另一个值
int var = 不成时要赋的值作为初始值;
if(条件)
var = 条件成立时则赋这个指定的值;
这样的话可以把逻辑上需双向的条件语句写成一个单一if语句
嵌套if语句:
在if或是if…else当中可以是任何合法的Java语句,而且可以在里面再出现if…else这样就形成的一种if嵌套而且对这种嵌套的深度是没有限制的
if(i>k){
if(j>k)
System.out.prinltn(“XXXXXXXXX”);
} else
System.out.println(“XXXXXXXXX”);
嵌套if可以形成一种多重选择的结构:比如下面的这种结构
if(score>=90)
grade = ‘A’;
else if (score>=80)
grade = ‘B’;
else if (score>=70)
grade = ‘C’;
else if (score>=60)
grade = ‘D’;
else
grade=’F’;
注意对于测试条件的值赋给一个boolean变量的时候一般我们不要写if…else了直接把布尔值赋给boolean变量变就可以了
关于选择语句中常见的错误:
1, 当语句执体中如果不只有一条语句时一定要使用花括号把多条语句括起来
2, 在if后加上一错误的分号
比如:if(i>10);
{
System.out.println(“XX”);
i--;
}
这里多了一个;号就会出现逻辑上的错误
3, 对于布尔值的冗余的测试:比如
if(even == true){
XXXXXXX;
YYYYYYY;
}
直接写为如下更好
if(even){
XXXXXX;
YYYYYY;
}
而且这种测试很容易写为even=true这样就会出现一个很难发现的错误,因为这个时候是把true赋给even这个时候even永远是true
4,写if…else的时候如果嵌套一定不要悬空else,这样不容易阅读,else总是与上一个最近的if配对的要按正确的缩进来书写代码,可者使用花括号把它们分开
如下程序写一个一年级小学生的学习工具做减法
算法过程:
1, 产生两个随机数,使用Math类的random()方法来产生
2, 如果number1<number2把这两个数进行交换保证number1>number2
3, 提示学生输入减法的结果
4, 检查学生的答案如果错误的话给出正确结果
import java.util.Random;
import java.util.Scanner;
publicclass SubtractionQuiz {
publicstaticvoid main(String[] args) {
Random random = new Random();
//产生两个十发内的随机整数
int number1 = random.nextInt(10);
int number2 = random.nextInt(10);
//判断两个整数的大小如果number1<number2则进行数值的交换
if(number1<number2){
int temp = number1;
number1 = number2;
number2 = temp;
}
//提示学生输出这两个数相减的结果,并读取学生的输入
System.out.print(number1+" - "+number2+" = ? ");
Scanner input = new Scanner(System.in);
int answer = input.nextInt();
//判断学生的输入如果不正确还要给出下确的值
if(number1-number2==answer)
System.out.println("输入正确!Y(^_^)Y");
else
System.out.println("输入错误,正确的答案应是 "+(number1-number2)+" ^_^o~ 努力!");
}
}
这里用到了Random类,这个类在java.util包中所以要事先导入这个包,这里取随机的10以内的整数也可以使用Math类来完成
int number1 = (int)(Math.random()*10);
这里要把后面的整个表达式括起来是因为Math.random()返回的结果是0.0~0.9之间的一个double类型的浮点数,如果不括起来先会把这个取的值转为int型则这个表达式永远会返回0
下面程序是用来计算身体的质量(BMI):
测试的方法是以千克为单位的体重除以以米为单位的身高的平方这样就会得到一个BMI值
import java.util.Scanner;
publicclass ComputeBMI {
publicstaticvoid main(String[] args) {
//创建一个读取控制输入的扫描器类对象
Scanner input = new Scanner(System.in);
//提示用户输入体重、身高
System.out.print("请输入你的体重(单位:千克):");
double weight = input.nextDouble();
System.out.print("请输入你的身高(单位:米):");
double height = input.nextDouble();
//计算出BMI值
double bmi = weight/(height*height);
//显示测试结果
System.out.println("你的测试结果为:");
if(bmi<16)
System.out.println("严重偏轻!");
elseif(bmi<18)
System.out.println("偏轻!");
elseif(bmi<24)
System.out.println("正常体重!");
elseif(bmi<29)
System.out.println("超重!");
elseif(bmi<35)
System.out.println("严重超重!");
else
System.out.println("非常严重超重!");
}
}
if…else if…else if…else这种嵌套会从上住下去找到直到找到一个满足的就执行相应的语句如果都不匹配的话则会执行else分支中语句体
在程序中我们可以调用System.exit(0);这句表示中止程序运行退出程序,这里的参数0表中正常退出程序
逻辑运算符:
有时候一个条件并不是一个简单的布尔运算可以完成的通常由多个条件的组合来进行判断,这个时候可通过使用逻辑运算符来组合各个条件,通过它可以把多个条件组到一起行成一个新的布尔值,其中逻辑运算符有如下一些:
! 表示逻辑非(对某个条件来说取它的对立面,为true时结果为false,为false时结果为true)
&& 表示逻辑与(对于多个条件来说只要有一个是false则为false)
|| 表示逻辑或(对于多个条件来说只要有一个true则为true)
^ 表示逻辑异或(对于两个条件来说一true,一false变为true)
publicclass TestBooleanOperators {
publicstaticvoid main(String[] args) {
//获得一个读取控制台输入的扫描类对象
Scanner input = new Scanner(System.in);
//提示用户输入一个用于测试的值
System.out.print("请输入一个整数来验证是否被2和3整除的情况:");
int number = input.nextInt();
//输出结果
System.out.println(number+"能被2和3整除吗? "+(number%2==0&&number%3==0));
System.out.println(number+"能被2或是3中任何一个整除或是同时能2和3整除? "+(number%2==0||number%3==0));
System.out.println(number+"只能被2或是3中的一个整除? "+(number%2==0^number%3==0));
}
}
这个程序就是利用了逻辑运算符的特性来作相应的判断输出不同的结果
注意:
1<i<10这个表达式在数学上是完全正确的,但是在Java当中是不正确的因为我们运算的过程从左到右先是1<i得到一个布尔值,接下这个布尔值与10进行比较这是无法比较的所以报错,这个时个则和须要使用逻辑运算符&& (1<i)&&(i<10)
对于布尔类型来说它是不可以转为其它类型的,其它类型也不可以转为布尔类型
关于逻辑运算符&&,||它们都是短路的:
比如有如下的操作p1&&p2
Java中的判断是,先计算p1好果p1为true则再去计算p2如果为true则为整个结果为true否则为false,如果首先计算p1就是false则后面的p2不会再去计算直接整个表达式为false,因而对于&&判断的时候我们一般是把容易出现false的写在前面,这样可以提高效率
p1||p2
Jav中的判断是,先计算p1如果p1为false则再去计算p2如果为true则整个结果为true否则为false,如果首先计算p1的结果为true,则后面的之不会再去判断整个结果就是true,因而对于||运算常常是把为true的写在前面这样可以提高效率
判定闰年的问题:
关于闰年的判断如下:如果这一年的年数可以被4整除而不能被100整除或者是可以被400整除那么这一年就是闰年
isLeapYear = (year % 4 ==0 && year%100!=100) ||(year %400==0)
下面的程序是一个游戏小程序
过程如下,随机得到一个两位的数字,提示用户输入一个两位数,然后通过下面的过程判断是否有奖金
1, 如果用户输入数匹配这个随机数则得到10000元
2, 如果用户输入的所有数字匹配输入的数字则奖金为3000元
3, 如果用户输入的一个数字匹配这个数字则奖金为1000元
import java.util.Scanner;
publicclass Lottery {
publicstaticvoid main(String[] args) {
//得到一个两位数字的随机数
Random random = new Random();
int lottery = random.nextInt(100);
//提示用户输入一个两位数
Scanner input = new Scanner(System.in);
System.out.print("请输入一个两位数:");
int gess = input.nextInt();
//分别得到随机数两位数的个位与十位
int ssw = lottery/10;
int sgw = lottery%10;
//分别得到用户输入的两位数的个位与十位
int ysw = gess/10;
int ygw = gess%10;
//判断可以得到的奖金
if(gess == lottery)
System.out.println("你获得的奖金:10000元");
elseif(ssw == ygw && sgw == ysw)
System.out.println("你获得的奖金:3000元");
elseif(ssw == ysw||ssw == ygw||sgw==ysw||sgw==ygw)
System.out.println("你获得的奖金:1000元");
else
System.out.println("对不起,你没有获得奖金");
}
}
switch语句:
在程序中如果我们过多的嵌套if语句会使用程序难以阅读,如是Java提供了switch语句来有效地处理多重条件的问题
switch(switch表达式){
case 值1: 语句组1; break;
case 值2: 语句组2; break;
…
case 值N: 语句组N; break;
default: 默认情况下执行的语句组;
}
其中有如下的规则:
1, switch表达式必须能计算出一个char、byte或int型值,并且要用括号括住
2, 值1…值N必须要与switch表达式的值有相同的数据类型,而且它们都是常量表达式,这些表达式当中不能存在变量
3, 当switch表达式的值与某个case语句后的值相匹配的话则会执行相应后面的语句直到遇到break;或是到switch语句的未尾
4, 关键字break;是可选的表示跳出当前的switch结构
5, 默认情况default也是可选的,它用来表示与所有的case都不匹配的时候会执行的动作
6, case语句是顺序来检测的
对于这个结构来说这里的break;作用很关键如果多个值执行相应的动作的时候在最后一个要执行这个动作的case后写上一个break;以防止再住下执行
条件表达式:
布尔表达式?表达式1:表达式2
当布尔表达式的值为true的时候则会执行表达式1否则会执行表达式2
这也是Java中唯一的三目运算符
格式化控制台输出
要完成格式化控制台输出可以使用方法printf方法输出
System.out.printf(format,item1,item2,…,itemk);
在这里format指的是一个子串和格式标识符构成的字符串
格式字符串有如下:
%b 布尔值
%c 字符
%d 十进制整数
%f 浮点数
%e 标准科学记数法形式的数
%s 字符串
比如:
int count = 5;
double amount = 1.0;
System.out.printf(“count is %d and amount is %f”,count,amount);
除了指定类型的条目还可以指定宽度的精度
%5c:表示输入一个字符并在它的前面加上四个空格
%6d:输出一个布尔值,在false前加一个空格,在true前加上两个空格
%10.2f:指定输出的浮点数宽度是10位,小数点后两位,那么小数点前就是7位数字如果小于7位则在前面补空格
%10.2e:这个宽度是10位包括小数点、小数点后的数字及指数,如果按科学计数法显示数字小于10位则在前面补空格
%12s:表示字符串宽度为12位,小于12位则在前面补空格,大于12位则自动增加宽度
运算符的优先级及它的结合方向
优先级规定了运算符的先后次序,如果相邻运算符的优先级相同则结合方向决定了它们的执行顺序对于二元运算都是左结合的
关于GUI的确认对话框例子:showConfirmDialog
这个方法会产生一个确认对话框,当点击Yes或No时会产生不同的返回值
Yes按钮返回JOptionPane.YES_OPTION(0)
No按钮返回JOptionPane.NO_OPTION(1)
Cancel按钮返回JOptionPane.CANCLE_OPTION(2)
如下是一个猜生日的程序
import javax.swing.JOptionPane;
publicclass GuessBirthdayUsingConfirmDialog {
publicstaticvoid main(String[] args) {
String set1 =
" 1 3 5 7\n"+
" 9 11 13 15\n"+
"17 19 21 23\n"+
"25 27 29 31";
String set2 =
" 2 3 6 7\n"+
"10 11 14 15\n"+
"18 19 22 23\n"+
"26 27 29 31";
String set3 =
" 4 5 6 7\n"+
"12 13 14 15\n"+
"20 21 22 23\n"+
"28 29 30 31";
String set4 =
" 8 9 10 11\n"+
"12 13 14 15\n"+
"24 25 26 27\n"+
"28 29 30 31";
String set5 =
"16 17 18 19\n"+
"20 21 22 23\n"+
"24 25 26 27\n"+
"28 29 30 31";
int day = 0;
//使用确认框提示用户进行确认
int answer = JOptionPane.showConfirmDialog(null, "你的生日在下面的数字中吗?\n"+set1);
if(answer == JOptionPane.YES_OPTION)
day += 1;
answer = JOptionPane.showConfirmDialog(null, "你的生日在下面的数字中吗?\n"+set2);
if(answer == JOptionPane.YES_OPTION)
day += 2;
answer = JOptionPane.showConfirmDialog(null, "你的生日在下面的数字中吗?\n"+set3);
if(answer == JOptionPane.YES_OPTION)
day += 4;
answer = JOptionPane.showConfirmDialog(null, "你的生日在下面的数字中吗?\n"+set4);
if(answer == JOptionPane.YES_OPTION)
day += 8;
answer = JOptionPane.showConfirmDialog(null, "你的生日在下面的数字中吗?\n"+set5);
if(answer == JOptionPane.YES_OPTION)
day += 16;
//显示你的生日结果
JOptionPane.showMessageDialog(null, "你的生日是:"+day+" 号");
}
}