3.01顺序结构
流程控制语句:流程控制语句即就是程序运行时,各条语句的执行顺序对程序的影响,流程控制语句不都是按照顺序结构执行的,还有选择结构与循环结构,并通过不同结构执行语句完成程序的不同功能。
顺序结构:顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行,中间没有任何的判断及跳转。举例说明;顺序结构如同一条笔直的马路,从路的这端走到那端,没有任何的岔路和弯路。
3.02选择结构
选择结构:给定判断条件,根据判断结果和某些条件,来选择控制程序的流程。常见的选择结构语句有 if语句和switch语句。
if语句是一个结构,允许程序确定执行的路径,根据判断条件来选择合适的路径执行语句,实现程序的功能 。
单if语句
如图所示的流程图是java中执行if语句的语法,转换位代码如下所示
if(布尔表达式){
(执行语句组)
}
当布尔表达式为真时,执行大括号中的语句体,如果布尔表达式为假,则跳过语句体,执行其他的语句。
常见的if语句中的错误有以下几点;
1.布尔表达式需要加括号,不加括号可以让代码更加简短,但是容易产生错误。
2.在if行出现错误的 分号“;”。
3.忘记必要的大括号,如果块语句中只有一条语句,就可以忽略大括号,但是如果称呼嫌多条语句出现在括号内时,则需要把if语句块中的语句组用大括号括在一起与其他语句组分开,避免程序设计错误。
4.对布尔值的冗余测试,例如
if(even==true){
System.out.println("It is even");
}
这条语句没有编译错误,但是这样做even如果是false,则不会执行下面的语句组,其正确的做法是
if(even){
System.out.println("It is even");
}
4.悬空else出现歧义,一个if与一个else匹配,当else缩进出错时,else匹配其他的if。错误的范例如下:
> int i=1,j=2,k=3;
> if(i>j)
> if(i>k)
> System.out.println("A");
> else
> System.out.println("B");
> 正确的缩进格式
正确的缩进else需要与第二个if对其,否则会造成悬空歧义
5.两个浮点数值的相等测试,浮点数具有有限的计算精度;涉及浮点数的计算可能引入取整错误,例如
> int i=1.0;
if((i-0.1-0.1-0.1-0.1-0.1==0.5){
System.out.println("true");
}
if 中的布尔表达式结果,i-0.1-0.1-0.1-0.1-0.1并不是精确等于0.5,而是0.5000000000000001,所以该布尔表达式一直判断为false,不便于给定小数与计算后的小数做比较。
Math.abs(A)返回A的绝对值
6.简化布尔变量赋值,范例如下
int i=1.0;
if((i-0.1-0.1-0.1-0.1-0.1==0.5){
System.out.println("true");
}
等价于②中所示的情况,如下
boolean even=number%2==0;
②中的代码形式更加的简洁,方便。
**3.02嵌套的if语句和多分支if-else语句**
if的语句可以在另外一个if语句中,形成嵌套的if语句;例如下面就是一个嵌套的if语句
> int i=1.0;
if((i-0.1-0.1-0.1-0.1-0.1==0.5){
System.out.println("true");
}
嵌套的if语句可用于实现多重选择。
例题如下
让电脑随机产生一个三位数 作为彩票的中奖号码,提示用输入一个三位数,中奖规则如下:
①如果所输入的数字匹配彩票的实际顺序,奖金为10000美元
②如果用户输入的所有匹配数字匹配彩票的所有数字,奖金为3000美元
③如果用户输入的一个数字匹配彩票的一个数字,奖金为1000美元
注释:
1.数据:电脑随机产生一个三位数, 用户输入一个三位数
2.指令: num=(int)(Math.random()*1000), Scanner scanner=new Scanner(System.in) int n=scanner.nextInt();接受输入的数字
判断数字是否匹配
先判断n==num;如果匹配 中奖10000美元
如果不匹配,进行第二次判断 n中的数字是否与num中的数字匹配,
把n拆分成 a b c 三个,
> a=n%10;
n/=10;
b=n%10;
n/=10;
c=n%10;
分别代表n的个位,十位,百位,重新排列组合是否能等于num,如果等于num中奖3000美元,
如果不匹配,进行第三次判断n中的数字与num中的数字逐个进行判断,假设num中的数字取出来 分别是a1 b1 c1,判断条件如下
> a==a1||a==b1||a==c1||b==a1||b==b1||b==c1||c==a1||c==b1||c==c1,
其中只要有一个数字符合,则不用再继续判断,如果没有,打印谢谢参与 ,程序结束
> import java.util.Scanner;
class day06{
public static void main(String[] args){
int num=(int)(Math.random()*1000);
int i=num;
System.out.println(i);
int a1=num%10;
num/=10;
int b1=num%10;
num/=10;
int c1=num%10;
Scanner scanner=new Scanner(System.in);
System.out.print("please input three number between 0 to 999:");
int n=scanner.nextInt();
int h=n;
int a2=n%10;
n/=10;
int b2=n%10;
n/=10;
int c2=n%10;
if(num==i){
System.out.println("一等奖10000美元!");
}else if((a2*100+b2*100+c2==i)||(a2*100+c2*10+b2==i)||(b2*100+c2*10+a2==i)||(b2*100+a2*10+c2==i)||(c2*100+a2*10+b2==i)){
System.out.println("二等奖3000美元!");
}else if(a2==a1||a2==b1||a2==c1||b2==a1||b2==b1||b2==c1||c2==c1||c2==b1||c2==a1){
System.out.println("三等奖1000美元!");
}else{
System.out.println("谢谢参与!");
}
}
}
3.04switch语句
1)switch语句是基于变量或变量表达式的值来执行语句,switch语句适用于一次判断多种选择的选择结构,下面是switch语句的完整语法及流程框图:
> switch(switch表达式){
case 值1:语句组1;
break;
case 值2: 语句组2;
break;
......
case 值N:语句组N;
break;
default:默认情况下执行的语句组
}
switch语句遵从规则;
①switch表达式必须能计算出一个char.byte.short.int 或者String型的值,并且必须总是用括号括住。
②值1到值N必须与switch表达式的值具有相同的数据类型,其中值1到值N必须是常量表达式,表达式中不能包含变量
③当switch表达式的值与case语句的只想匹配是,执行该case开始的语句,直到遇到break语句或是switch语句的结束
④ 默认情况(default)是可选的,当没有一个给出case与switch表达式相匹配时,用来执行该操作
⑤关键字break是可选的,break语句会立即终止switch语句
2)switch语句种常见的错误
① 忘记使用break,当一个case匹配switch表达式时,就会执行其中的语句组,直到遇到break结束或switch语句结束,这样会造成执行其他的case语句并影响程运行后的结果
②switch语句使用针对的是常量值得判断
例题1.
import java.util.Scanner;
class day02{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Please input three number:");
//输入一元二次方程的三个系数 a b c
double a=scanner.nextDouble();
double b=scanner.nextDouble();
double c=scanner.nextDouble();
if(a==0){
double r5=-c/b;
if(b!=0&c!=0){
System.out.println("The equation has one root is : "+r5);
}else if(b==0&c==0){
System.out.println("The equation has any roots!");
}else if(b==0&c!=0){
System.out.println("The equation has error! ");
}
}
//判断是否有解
if(a!=0){
double delt=b*b-4*a*c;
if(delt>0){
double r1=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
double r2=(-b-Math.sqrt(b*b-4*a*c))/(2*a);
System.out.println("The equation has two roots "+r1+" and "+r2);
>
>
> }else if(delt==0){
double r3=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
System.out.println("The equation has one root: "+r3);
}else{
System.out.println("The equation has no real root!");
}
}
}
}
例题二
import java.util.Scanner;
class day03{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Enter a nuber between 100 to 999:");
int num=scanner.nextInt();
String s="";
s=s+num%10;
num/=10;
s=s+num%10;
num/=10;
s=s+num%10;
int n=Integer.parseInt(String s);
if(n==num){
System.out.println(n+" is a palinder!");
}
Systtem.out.println(n+" is not a palinder!");
}
}
例题三
用户输入一个点的坐标,判断该店是否在中心为(0,0),长为10 宽为5的矩形里面
数据 ;用户输入点的坐标(x,y)
指令: 输入点的坐标大小
判断是否在矩形内
1.x绝对值小于5,并且y的绝对值小于2.5
import java.util.Scanner;
class day07{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Please input a point:");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
if((Math.abs(x)<=5)&&(Math.abs(y)<=2.5)){
System.out.println("("+x+","+y+" )在矩形内");
}else{
System.out.println("("+x+","+y+" )不在矩形内");
}
}
例题四
用户输入一个点的坐标,判断该店是否在中心为(0,0),长为10 宽为5的矩形里面
数据 ;用户输入点的坐标(x,y)
指令: 输入点的坐标大小
判断是否在矩形内
1.x绝对值小于5,并且y的绝对值小于2.5
> import java.util.Scanner;
class day07{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Please input a point:");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
if((Math.abs(x)<=5)&&(Math.abs(y)<=2.5)){
System.out.println("("+x+","+y+" )在矩形内");
}else{
System.out.println("("+x+","+y+" )不在矩形内");
}
}
}