语法
选择结构
if语句
一、单分支if语句(指当且仅当条件为一个ture时执行的一个动作)
语法:
当布尔表达式判断结果为真时,执行语句(组)。其流程图如下:
注意:有时候布尔表达式后面的大括号可以省略。但最好不要省略。
二、双分支if-else语句
语法:
他表示如果布尔表达式的判断结果为ture,则执行布尔表达式为真时所要执行的语句。否则执行else后面所跟的语句。
流程图如下:
三、多分支if-else语句
语法:
if(布尔表达式1){
语句1
}else if(布尔表达式2){
语句2
} ...
else{
语句n
}
解释一下:如果布尔表达式1结果为真则执行语句1,否则向下继续判断如果布尔表达式2结果为真则执行语句2,否则在向下。。。一直到最后都没有符合布尔表达式的条件则执行else之后的语句n.
流程图:
如下就是一个典型的多分支if-else语句流程图。
四、if语句中的常见错误和陷阱!!!
1.忘记必要的括号(所以在编写代码的时候一定要仔细)
2.在if行出现错误的分号(对于这种错误,有时候编译也会通过但是执行出来的结果却不会正确。逻辑错误一般是头脑不清楚或者是因为编译者自己的习惯引起的)
3.对布尔值的冗余测试
为了检测测试条件中的布尔值时true还是false,比较好的方法就是直接测试布尔类型变量,避免不必要的多余与错误。
4.悬空else出现歧义
(原因)else总是匹配离他最近的 if 子匹配句,例如
对于程序a)和b),else语句匹配的是if(i>k)。如果要强制else匹配第一个if的子语句,则需要在第一个if语句后面加上一个大括号。
5.两个浮点数的相等测试
对于两个浮点数之间最好不要比较,因为浮点数具有有限的计算精度,在计算时可能存在取整错误。因此两个浮点数之间比较并不可靠。
6.简化布尔变量赋值
7.尽量避免重复性的代码比如:
这样有利于日后对代码的维护工作,是一个好习惯。
例题1:(多分支if-else)
/*
1.输入体重a 输入身高b 输入年龄age
2.换算之后体重weight=a/0.45359237; 身高height=b/0.0254;
3.计算BMI index=weight/(height*height)
4.先判断年龄 age>=20 再判断BMI
age<20 无法判断
5.判断BMI
6.输出
*/
import java.util.Scanner;
class Demo313
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入年龄、身高和体重:");
int age=scanner.nextInt();
double a=scanner.nextDouble();
double b=scanner.nextDouble();
double weight=a/0.45359237;
double height=b/0.0254;
double index=weight/(height*height);
if(age<20){
System.out.println("无法计算BIM");
return;
}else{
if(index<18.5){
System.out.println("偏瘦");
}else if(index<25.0){
System.out.println("正常");
}else if(index<30.0){
System.out.println("偏胖");
}else{
System.out.println("过胖");
}
}
}
}
例题2:
/*
1.随机产生一个两位数num1 定义a,b为两位数字 sum1=a+b用来记录两位数字之和
2.用户输入一个两位数num2 定义c,d为两位数字 sum2=c+d用来记录两位数字之和
3.判断
3.1 如果num1==num2 输出 奖金为10000
3.2 如果sum1==sum2 输出 奖金为3000
3.3 如果a==b||a==c||b==c||b==d 输出 奖金为1000
*/
import java.util.*;
class Demo32
{
public static void main(String[] args){
Random random=new Random();
int num1=random.nextInt(101);
//System.out.println("随机生成的号码为"+num1);
Scanner scanner=new Scanner(System.in);
System.out.print("请输入你所要买的号码");
int num2=scanner.nextInt();
int a=num1%10;int b=(num1/10)%10;int sum1=a+b;//对随机生成的号码的处理
int c=num2%10;int d=(num2/10)%10;int sum2=c+d;//对输入的号码进行处理
if(num1==num2){
System.out.println("一等奖,奖金为10000");
}else if(sum1==sum2){
System.out.println("二等奖,奖金为3000");
}else if(a==c||a==d||b==c||b==d){
System.out.println("三等奖,奖金为1000");
}else {
System.out.println("未中奖");
}
}
}
例题3:
import java.util.Scanner;
/*
1.输入一个三位数num
2.拆分该数字 对num取余 a个位 b十位 c百位
3.重新组成一个新数字newNum=100*a+10*b+c;
4.判断num是否等于newNum
相等 是回文数
不相等 不是回文数
5.输出
*/
class Demo35
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个三位数:");
int num=scanner.nextInt();
int num1=num;
int a=num%10;
num/=10;
int b=num%10;
num/=10;
int c=num%10;
int newNum=100*a+10*b+c;
if(num1==newNum){
System.out.println("数字"+num1+"是回文数");
}else{
System.out.println("数字"+num1+"不是回文数");
}
}
}
例题4:
import java.util.Scanner;
/*
1.输入圆的圆心点ox oy和半径radius
2.输入所要查找的点 x y
3.计算该点到圆心的距离 distance
4.判断
如果distance<radius 在圆内
如果distance=radius 在圆上
如果distance>radius 在圆外
5.输出
*/
class Demo38
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.println("请输出该圆的圆心和半径:");
double ox=scanner.nextDouble();
double oy=scanner.nextDouble();
double radius=scanner.nextDouble();
System.out.println("请输出要查找的点的坐标");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
double distance=Math.pow(((ox-x)*(ox-x)+(oy-y)*(oy-y)),0.5);
if(distance<radius){
System.out.println("该点在圆内");
}else if(distance>radius){
System.out.println("该点在圆外");
}else{
System.out.println("该点在圆内上");
}
}
}
switch语句
Java提供switch语句用来处理多重条件的问题
语法:
switch(表达式){
case 1:
语句块1;
break;
case 2:
语句块2;
break;
...
case n:
语句块n;
break;
default:
语句块n+1;
break;
}
注意:
1.表达式内取值byte、short、int、char、String、枚举类型,并且必须用括号括住
2.case后面跟的是与switch表达式的值具有相同的数据类型
3.当switch表达式的值与case值相同时,执行从case开始的语句,直到遇见break或者到switch结束
4.默认情况(default)是可选的
5.关键字break是可选的,用来跳出循环
循环结构
Java提供三种类型的循环语句:for循环、while循环、do-while循环
1)for循环
语法:
for(初始条件;循环继续条件;步长){
循环体;
}
执行流程:先执型初始条件,在判断循环继续条件,在执行循环体,最后执行步长(步长一般是自增或自减运算)
流程图:
注意:如果省略for循环中的循环条件,则隐含认为他执行循环继续条件true,变成无限循环
例题:求两个数的最大公约数
/*
1.输入两个整数num1 num2
2.定义变量gcd
3.反向比较 遇见的第一个可以被两者整除的数字就是最大公约数
if(num1>num2) i%num2==0&&j%num2==0 gcd=i
else gcd j
4.输出
*/
import java.util.Scanner;
class Demo4C
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请分别输入两个整数:");
int num1=scanner.nextInt();
int num2=scanner.nextInt();
if(num1>num2){
for(int i=num1;i>1;i--){
for(int j=num2;j>1;j--){
if(num1%i==0&&num2%i==0){
System.out.println("gcd=" +i);
return;
}
}
}
}
}
}
while循环
while循环 在循环条件为真的情况下重复执行语句
语法结构:
while(循环继续条件){
//循环体
语句组;
}
流程图:
注意:要保证循环条件最终可以变成false,或者出现关键字break或return,才能使程序停止运行。否则程序将陷入死循环
例题:循环猜数字游戏
/*
1.输入两个整数num1 num2
2.定义变量gcd
3.反向比较 遇见的第一个可以被两者整除的数字就是最大公约数
if(num1>num2) i%num2==0&&j%num2==0 gcd=i
else gcd j
4.输出
*/
import java.util.Scanner;
class Demo4C
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请分别输入两个整数:");
int num1=scanner.nextInt();
int num2=scanner.nextInt();
if(num1>num2){
for(int i=num1;i>1;i--){
for(int j=num2;j>1;j--){
if(num1%i==0&&num2%i==0){
System.out.println("gcd=" +i);
return;
}
}
}
}
}
}
4) do-while循环
do-while循环和while循环基本一致,不同的是do-while循环先执行一次循环体,然后继续判断循环继续条件
语法结构:
do{
循环体;
}while(循环继续条件);
流程图:
如果循环中的语句至少执行一次,则推荐使用do-while循环语句。
例题见下一篇文章!