程序逻辑控制语句
提示:以下是本篇文章正文内容,下面案例可供参考
一、分支结构
1. if语句
1.1 语法格式1
if (布尔表达式){
//如果布尔表达式的结果为true,执行if中的语句,否则不执行
//语句
}
举例:分数超过90分,获得学习之星称号。
int score=92;
if (score>90){
System.out.println("学习之星");//输出学习之星
int score=89;
if (score>90){
System.out.println("学习之星");//布尔表达式结果为false,不执行if中的语句
}
1.2 语法格式2
if (布尔表达式){
//语句1
}else{
//语句2
}//如果布尔表达式结果为true,则执行语句1,否则执行语句2.
举例:分数超过60分,则考试通过;否则未通过。
int score=80;
if (score>60){
System.out.println("考试通过");
}else{
System.out.println("考试未通过");
}
1.3 语法格式3
if (布尔表达式1){
//语句1
}else if(布尔表达式2){
//语句2
}else{
//语句3
}
//如果布尔表达式1结果为true,则执行语句1,否则
//表达式2结果为true,则执行语句2,否则执行语句3.
例如给学生成绩分段:
- 分数在[0, 60 ), 不及格
- 分数在[60, 70), 及格
- 分数在[70, 80), 中等
- 分数在[80, 90), 良好
- 分数在[90,100], 优秀
按照上述办法,公布学生成绩
int score=61;//输出及格
if(score>=90&&score<=100){
System.out.println("优秀");
}else if(score>=80&&score<90){
System.out.println("良好");
}else if(score>=70&&score<80){
System.out.println("中等");
}else if(score>=60&&score<70){
System.out.println("及格");
}else if(score>=0&&score<60){
System.out.println("不及格");
}else{
System.out.println("数据错误");
}
需注意的问题:
- 分号问题
int x=20;
if(x==10);//此处多了一个分号
{
System.out.println("错误");
}
if语句后面多了一个分号,导致{}中的代码成为和if无关的代码块。
- 悬垂else问题
int x=10;
int y=1;
if(x==10)
if(y==10)
System.out.println("a");
else
System.out.println("b");
if、else语句中可以不加花括号,也可以写语句,但是只能写一条语句;此时else是和最近的if匹配;一般不建议这样写。
2. switch语句
基本语法:
switch(表达式){
case 常量值1:{
//语句1;
[break;]
}
case 常量值2:{
//语句2;
[break;]
}
...
default:{
//都不满足时,执行的语句
[break;]
}
}
执行流程:
- 先计算表达式的值.
- 和case依次比较,一旦匹配就执行该项下的语句,直到遇到break时结束.
注意:
- default是可选项,可以有也可以没有,一般都会加上;当表达式的值没有与所列项匹配时,执行default.
- 从语法上来讲,case之间没有先后次序之分,包括default,尽量将case按照常量值从小到大排列.
- 字符串是可以排序的,比如:按照字典排序.
代码示例(根据day的值输出星期几):
int day=3;
switch(day){
case 1:{
System.out.println("星期一");
break;
}
case 2:{
System.out.println("星期二");
break;
}
case 3:{
System.out.println("星期三");
break;
}
case 4:{
System.out.println("星期四");
break;
}
case 5:{
System.out.println("星期五");
break;
}
case 6:{
System.out.println("星期六");
break;
}
case 7:{
System.out.println("星期日");
break;
}
default:{
System.out.println("输入有误");
break;
}
}
注意事项:
- 多个case后的常量值不可以重复
- switch的括号内只能是以下类型的表达式:
基本类型:byte、char、short、int
引用类型:String常量串、枚举类型
否则会报错
double num=1.0;
switch(num){
case 1.0:{
System.out.println("he");
break;
}
case 2.0:{
System.out.println("ha");
break;
}
default:{
System.out.println("输入有误");
break;
}
}
//报错 java: 不兼容的类型: 从double转换到int可能会有损失
- break不能丢,否则会失去"多分支选择"的效果
int day=1;
switch(day){
case 1:{
System.out.println("星期一");
//break;
}
case 2:{
System.out.println("星期二");
break;
}
default:{
System.out.println("输入有误");
break;
}
}
//运行结果:
星期一
星期二
- switch不能表达复杂的条件
//例如:如果num的值在10到20之间,就打印he
//使用if就很容易表达,但是使用switch就无法表示
if (num>10&&num<20){
System.out.println("he");
}
- switch支持嵌套,一般不推荐
- 综上:switch的使用局限性比较大.
二、循环结构
1. while 循环
基本语法格式:
while(循环条件){
//循环语句;
}
循环条件(表达式结果为boolean类型)为true,则执行循环语句;否则结束循环.
实现循环的关键点:
- 循环因子起始值
- 循环的条件
- 循环当中执行的语句–即每次循环时需要做的事
- 循环因子的修改(递增/递减)
代码示例1:打印1-10的数字
int num=1;
while (num<=10){//循环条件---boolean结果的表达式
System.out.println(num);
num++;//循环因子的递增或递减
System.out.println("=================");
num =10;
while(num>0){
System.out.println(num);
num--;
}
代码示例2:计算1-100的和
//方法1
int sum=0;
int j=1;
while(j<=100){
sum+=j;
j++;
}
System.out.println(sum);
//方法2
//求和公式
System.out.println((1+100)*100/2);
代码示例3:计算5的阶乘
//1*2*3*4*5
//给一个变量,从1递增到5
int i=1;
int rst=1;
while(i<=5){
rst*=i;
i++;
}
System.out.println(rst);
代码示例4:计算1!+2!+3!+4!+5!
int num=1;
int sum=0;
//外层循环求和
while(num<=5){
//算num的阶乘
int i=1;
int rst=1;
while(i<=num){
rst*=i;
i++;
}
sum+=rst;
num++;
}
System.out.println("sum="+sum);
这里可以发现当一个代码中有多重循环时,代码的复杂程度就大大提高了.
注意事项:
- 和if类似,while下面的语句可以不写{},但是不写的时候只能支持一条语句,建议写上{}.
- 和if类似,while后面的{建议和while写在同一行.
- 和if类似,while后面不要多写分号,否则导致出错.
int num=1;
while(num<=10);{
System.out.println(num);
num++;
}
//死循环,无内容输出
2. break
break的功能是让循环提前结束,break所在的循环结束.
代码示例:找到100-200中第一个3的倍数
int i=100;
while(i<=200){
if(0==i%3){
System.out.println(i);
break;//作用:如果执行到break的位置,结束当前while循环
}
i++;
}
//输出102
3. continue
continue的功能是跳过这次循环,结束单趟循环,立即进入下次循环.
代码示例:找到100-200中所有3的倍数
int num1=100;
while(num1<=200){
if(num1%3!=0){
num1++;
continue;
}
System.out.println("找到了3的倍数,为:"+num1);
num1++;
}
4. for 循环
基本语法:
for (表达式1;布尔表达式2;表达式3){
表达式4;
}
- 表达式1:用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次.
- 表达式2:循环条件,满足则循环继续,否则循环结束.
- 表达式3:循环变量更新方式.
执行过程:1234–>234–>234–>…–>2为false,循环结束.
代码示例:
- 打印1-10的数字
for (int i=1;i<=10;i++){
System.out.println(i);
}
- 计算1+2+3+…+100的和
//1~100的和
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
System.out.println("sum="+sum);
//输出结果:sum=5050
- 计算5的阶乘
//计算5的阶乘
//计算1*2*3*4*5
int rst=1;
for(int i=1;i<=5;i++){
rst*=i;
}
System.out.println("5的阶乘为"+rst);
//输出结果:5的阶乘为120
- 计算1!+2!+3!+4!+5!
int sum1=0;
for(int j=1;j<=5;j++){
int rst=1;
for(int i=1;i<=j;i++){
rst*=i;
}
sum1+=rst;
}
System.out.println("1!+2!+3!+4!+5!="+sum1);
//输出结果:1!+2!+3!+4!+5!=153
注意事项:
- 和if类似,for后面的语句可以不写{},但是不写的时候只能支持一条语句,建议写上{}.
- 和if类似,for后面的{建议和for写在同一行.
- 和if类似,for后面不要多写分号,否则可能导致循环不能正确执行.
- 和while循环一样,结束单趟循环用continue,结束整个循环用break.
5. do while 循环
基本语法:
do{
循环语句;
}while(循环条件);
先执行循环语句,再判断循环条件,循环条件成立则继续执行,否则循环结束.
代码示例:打印1-10
for (int i=1;i<=10;i++){
System.out.println(i);
}
注意事项:
- do while循环最后的分号不要忘记.
- 一般do while很少用到,更推荐使用for或者while.
三、输入输出
1. 输出到控制台
基本语法:
System.out.println(msg);//输出一个字符串,带换行
System.out.print(msg);//输出一个字符串,不带换行
System.out.printf(format,msg);//格式化输出
- println输出的内容自带\n,print不带\n.
- printf的格式化输出方式和C语言的printf基本是一致的.
代码示例:
System.out.println("hello world");
int x=10;
System.out.printf("x=%d\n",x);//格式化输出
格式化字符串
转换符 | 类型 | 举例 | 输出 |
---|---|---|---|
d | 十进制整数 | ("%d",100) | 100 |
x | 十六进制整数 | ("%x",100) | 64 |
o | 八进制整数 | ("%o",100) | 144 |
f | 定点浮点数 | ("%f",100f) | 100.000000 |
e | 指数浮点数 | ("%e",100f) | 1.000000e+02 |
g | 通用浮点数 | ("%g",100f) | 100.000 |
a | 十六进制浮点数 | ("%a",100f) | 0x1.9p6 |
s | 字符串 | ("%s",100) | 100 |
c | 字符 | ("%c",‘1’) | 1 |
b | 布尔值 | ("%b",100) | true |
h | 散列码 | ("%h",100) | 64 |
% | 百分号 | ("%.2f%%",2/7f) | 0.29% |
2. 从键盘输入
使用Scanner读取字符串/整数/浮点数
import java.util.Scanner;
public class control {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name =sc.nextLine();
System.out.println("请输入你的年龄:");
int age =sc.nextInt();
System.out.println("请输入你的工资:");
float salary =sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名:"+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close();
}
}
//输出结果
请输入你的姓名:
张三
请输入你的年龄:
18
请输入你的工资:
2000
你的信息如下:
姓名:张三
年龄:18
工资:2000.0
输入不同类型的数据:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);//标准输入固定写法
int data =sc.nextInt();//要求用户通过键盘输入一个int类型的数据
double d =sc.nextDouble();//要求用户通过键盘输入一个double类型的数据
String s =sc.next();//要求用户通过键盘输入一个String类型的字符串
System.out.println(data);
System.out.println(d);
System.out.println(s);
字符串的输入:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s1=sc.next();
System.out.println(s1);
//输入hello world
//输出hello
System.out.println("============");
String s2 =sc.nextLine();
System.out.println(s2);
//输入hello world
//输出hello world
sc.close();
}
sc.next()和sc.nextLine()的区别:
- sc.next():接收字符串,但是在接收时,遇到空格就终止接收了,空格之后的内容不再接收.
- sc.nextLine():接收整行的字符串.