JavaSE基本语法下
程序流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
三种基本流程结构:
-
顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。 -
选择结构
根据条件,选择性地执行某段代码。
有if…else和switch-case两种分支语句。 -
循环结构
根据循环条件,重复性的执行某段代码。
有while、do…while、for三种循环语句。
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
选择结构
if-else结构
分支结构中的if-else结构
存在三种结构
第一种
if(条件表达式){
执行表达式
}
第二种:二选一
if(条件表达式){
执行表达式1
}
else{
执行表达式2
}
第三种:多选一
if(条件表达式1){
执行表达式1
}
else if(条件表达式2){
执行表达式2
}else if(条件表达式3){
执行表达式3
}
...
else{
执行表达式n
}
package com.atguigu.java;
public class IFTest {
public static void main(String[] args) {
//举例1
int heartBeats = 79;
if(heartBeats < 60 || heartBeats > 100) {
System.out.println("需要做进一步检查");
}
System.out.println("检查结束");
//举例2
int age = 23;
if(age < 18) {
System.out.println("多看看动画片");
}else {
System.out.println("多工作");
}
}
}
Scanner类的使用
使用Scanner类从键盘获取不同属性的变量
如何从键盘获取不同属性的变量:需要使用Scanner类
具体实现步骤:
1.导包 import java.util.Scanner;
2.Scannner的实例化
3.调用Scanner类的相关方法(next()/nextXXX()),来获取指定类型的变量
注意:
需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,
可能会导致异常,使得程序终止。
package com.atguigu.java;
/*
如何从键盘获取不同属性的变量:需要使用Scanner类
具体实现步骤:
1.导包 import java.util.Scanner;
2.Scannner的实例化
3.调用Scanner类的相关方法(next()/nextXXX()),来获取指定类型的变量
注意:
需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,、
可能会导致异常,使得程序终止。
*/
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的姓名");
String name = scan.next();//scan实例获取字符型变量
System.out.println(name);
System.out.println("请输入你的芳龄");
int age = scan.nextInt();//scan实例获取整型变量
System.out.println(age);
System.out.println("请输入你的体重");
double weight = scan.nextDouble();//scan实例获取浮点型变量
System.out.println(weight);
System.out.println("你是否相中我了呢?(true/false)");
boolean result = scan.nextBoolean();//scan实例获取布尔型变量
System.out.println(result);
//对于char型的获取,Scanner没有提供相关的方法,只能获取字符串
System.out.println("请输入你的性别:(男/女)");
String gender = scan.next();
char genderChar = gender.charAt(0);
System.out.println(genderChar);//获取索引位置为0位置上的字符
}
}
/*
//结果
请输入你的芳龄
20
20
请输入你的体重
80
80.0
你是否相中我了呢?(true/false)
false
false
请输入你的性别:(男/女)
男
男
*/
If-else例题
例题1
岳小鹏参加Java考试,他和父亲岳不群达成承诺:
如果:
成绩为100分时,奖励一辆BMW;
成绩为(80,99]时,奖励一台iphone xs max;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
package com.atguigu.java;
import java.util.Scanner;//导包
public class IfExer1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入岳小鹏的成绩(0-100)");
int score = scan.nextInt();//调用
if(score == 100) {
System.out.println("奖励一辆BMW");
}else if(score > 80 && score <= 99) {
System.out.println("奖励一台iphone xs max");
}else if(score >= 60 && score <= 80) {
System.out.println("奖励一个 iPad");
}else {
System.out.println("什么奖励也没有");
}
}
}
/*
//结果
请输入岳小鹏的成绩(0-100)
79
奖励一个 iPad
*/
说明:
1.else结构是可选的。
2.针对于条件表达式
如果多个条件表达式之间是"互斥"关系,那个判断和执行语句声明在上面还是下面,无所谓
如果多个条件表达式之间有交集关系,需要根据实际情况,考虑清楚应该将那个结构声明在上面
如果多个条件表达式之间有包含关系,通常需要将范围小的声明在范围大的上面
例题2
编写程序:由键盘输入三个整数分别存入变量num1、num2、num3,
对它们进行排序(使用 if-else if-else),并且从小到大输出。
先比较num1 和 num2,得到num1 和 num2的大小关系,再把num3 插入到他们之间
说明:
1.if-else结构是可以嵌套的
2.如果if-else结构中的执行语句只有一行时,可以省略大括号,不建议采用
package com.atguigu.java;
import java.util.Scanner;//导包
public class IfExer2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个整数");
int num1 = scan.nextInt();
System.out.println("请输入第二个整数");
int num2 = scan.nextInt();
System.out.println("请输入第三个整数");
int num3 = scan.nextInt();
if(num1 >= num2) {
if(num3 >= num1) {
System.out.println(num2 + "," + num1 + "," + num3);
}else if (num3 >= num2) {
System.out.println(num2 + "," + num3 + "," + num1);
}else {
System.out.println(num3 + "," + num2 + "," + num1);
}
}else {
if(num3 >= num2) {
System.out.println(num1 + "," + num2 + "," + num3);
}else if (num3 >= num1) {
System.out.println(num1 + "," + num3 + "," + num2);
}else{
System.out.println(num3 + "," + num1 + "," + num2);
}
}
}
}
/*
//结果
请输入第一个整数
30
请输入第二个整数
-50
请输入第三个整数
98
-50,30,98
*/
例题3
我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每
一年相当于人类的10.5岁,之后每增加一年就增加四岁。那么5岁的狗
相当于人类多少年龄呢?应该是:10.5 + 10.5 + 4 + 4 + 4 = 33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人
类的年龄。如果用户输入负数,请显示一个提示信息。
package com.atguigu.java;
import java.util.Scanner;//导包
public class IfExer3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入狗的年龄");
int dogAge = scan.nextInt();//调用
double dogtopersonAge;
if(dogAge <= 0) {
System.out.println("输入不合法");
}else {
if(dogAge <= 2) {
dogtopersonAge = dogAge*10.5;
}else{
dogtopersonAge = 2*10.5 + (dogAge-2)*4;
}
System.out.println("相当于人的年龄:" + dogtopersonAge);
}
}
}
/*
//结果
请输入狗的年龄
5
相当于人的年龄:33.0
*/
随机数的产生:一个小点
package com.atguigu.java;
/*
随机数的产生:10-99
*/
public class IfExer4 {
public static void main(String[] args) {
double value1 = Math.random()*100;// [0.0 1.0)-->[0.0 100.0)
double value2 = (int)(Math.random()*90 + 10);// 10-99
System.out.println(value2);
// 公式 [a,b] : (int)(Math.random()*(b-a+1) + a)
}
}
例题4
大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,当然要提出
一定的条件:高:180cm以上;富:财富1千万以上;帅:是。
如果这三个条件同时满足,则:“我一定要嫁给他!!!”
如果三个条件有为真的情况,则:“嫁吧,比上不足,比下有余。”
如果三个条件都不满足,则:“不嫁!”
package com.atguigu.java;
import java.util.Scanner;//导包
public class IfExer5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入你的身高(cm):");
int height = scan.nextInt();//
System.out.println("请输入你的财富(千万):");
double wealth = scan.nextDouble();
System.out.println("请输入你是否帅(true/false):");
boolean isHandsome = scan.nextBoolean();
if(height >= 180 && wealth >= 1 && isHandsome) {
System.out.println("我一定要嫁给他!!!");
}else if(height >= 180 || wealth >= 1 || isHandsome) {
System.out.println("嫁吧,比上不足,比下有余。");
}else {
System.out.println("不嫁!");
}
}
}
/*
//结果
请输入你的身高(cm):
172
请输入你的财富(千万):
0.3
请输入你是否帅(true/false):
true
嫁吧,比上不足,比下有余。
*/
Switch-case结构
分支结构之二:switch-case
1.格式
switch(表达式){
case 常量1:
执行语句1;
//break;
case 常量2:
执行语句2;
//break;
...
default:
执行语句n;
//break;
}
说明:
1.根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,则进入相应case中的语句去执行
当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break或switch-case结构结束
2.break关键字,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
3.switch结构中的表达式,只能是如下的6种数据类型:
byte,short,char,int,枚举类型,String类型
4.case之后声明常量,不能声明范围
5.break关键字是可选的
6.default 相当于if-else结构中的else
default结构是可选的
package com.atguigu.java;
public class SwitchCaseTest {
public static void main(String[] args) {
int number = 2;
switch(number) {
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default:
System.out.println("other");
}
}
}
Switch-case例题
例题1
package com.atguigu.java;
/*
对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
*/
import java.util.Scanner;//导包
public class SwitchCaseExer1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入学生的成绩(0-100):");
int score = scan.nextInt();
switch(score/60) {
case 0:
System.out.println("不合格");
break;
case 1:
System.out.println("合格");
break;
default:
System.out.println("输入有误");
}
}
}
/*
//结果
请输入学生的成绩(0-100):
80
合格
*/
例题2
根据用于指定月份,打印该月份所属的季节。
3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
package com.atguigu.java;
import java.util.Scanner;//导包
public class SwitchCaseExer2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入月份(1-12):");
int month = scan.nextInt();//调用
switch(month) {
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("输入有误");
}
}
}
/*
//结果
请输入月份(1-12):
10
秋季
*/
例题3
编写程序:从键盘上输入2019年的“month”和“day”,要求通过程序
输出输入的日期为2019年的第几天。
算法分析:
利用 switch-case中break结构是可选的,并且在无break结构中,程序会从某个case接口进入,然后执行后续所有的case
举例 :计算5月20 需要1-4月的天数 + 20
计算 7月18 需要 1-6月的天数 + 18
....
可以看出来 1.2.3月需要执行的频率比较高 所以往下边放
package com.atguigu.java;
import java.util.Scanner;//导包
public class SwitchCaseExer3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入2019年的月份(1-12):");
int month = scan.nextInt();//调用
System.out.println("请输入2019年的天数(1-31):");
int days = scan.nextInt();//调用
//定义变量来保存总天数
int sumDays = 0;
switch(month) {
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
sumDays += 28;
case 2:
sumDays += 31;
case 1:
sumDays += days;
}
System.out.println("2019年的" + month + "月" + days + "日" + "2019年的第"+ sumDays+"天");
}
}
/*
//结果
请输入2019年的月份(1-12):
4
请输入2019年的天数(1-31):
3
2019年的4月3日2019年的第93天
*/
例题4
package com.atguigu.java;
/*
从键盘分别输入年、月、日,判断这一天是当年的第几天
*/
import java.util.Scanner;
public class SwitchCaseExer4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入年份:");
int year = scan.nextInt();//调用
System.out.println("请输入月份(1-12):");
int month = scan.nextInt();//调用
System.out.println("请输入天数(1-31):");
int days = scan.nextInt();//调用
//定义变量来保存总天数
int sumDays = 0;
switch(month) {
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
if((year % 4 == 0 && year % 100 != 0)|| year % 400 == 0) {
sumDays += 29;
}else {
sumDays += 28;
}
case 2:
sumDays += 31;
case 1:
sumDays += days;
}
System.out.println(year + "年的" + month + "月" + days + "日是" + year + "年的第"+ sumDays+"天");
}
}
/*
//结果
请输入年份:
2018
请输入月份(1-12):
3
请输入天数(1-31):
20
2018年的3月20日是2018年的第79天
*/
例题5
编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的
值输出其对应的成绩等级:
score>=90 等级: A
70<=score<90 等级: B
60<=score<70 等级: C
score<60 等级: D
package com.atguigu.java;
import java.util.Scanner;//导包
public class SwitchCaseExer5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入你的成绩(0-100):");//不能超过100 或者 小于0 没有进行异常数据检测
int score = scan.nextInt();//调包
switch(score/10) {
case 10:
case 9:
System.out.println("等级: A");
break;
case 8:
case 7:
System.out.println("等级: B");
break;
case 6:
System.out.println("等级: C");
break;
default:
System.out.println("等级: D");
}
}
}
/*
//结果
请输入你的成绩(0-100):
99
等级: A
*/
循环结构
循环语句的四个组成部分
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
for循环
for循环结构的使用
一 循环结构的4个要素
1初始化条件
2循环条件 ---Boolean类型
3循环体
4迭代条件
二 for循环结构
for(1初始化条件;2循环条件;4迭代条件){
3循环体
}
执行过程:1-->2-->3-->4-->2--->4--->2.....-->2
package com.atguigu.java;
public class ForTest1 {
public static void main(String[] args) {
for(int i = 1;i <= 5;i++) {
System.out.println("Hello World!");
// i:在for循环内有效,出了for循环就失效了
}
//练习 熟悉循环结构的执行过程
int num = 1;
for(System.out.print('a');num <= 3;System.out.print('c'),num++) {
System.out.print('b');
}
// a --> b -->c -->b--->c--->b----c
//遍历100以内的偶数,并输出所有偶数的和
int sum = 0;
for(int j = 1;j <= 100;j++) {
if(j % 2 == 0) {
sum += j;
System.out.println(j);
}
System.out.println(sum);
}
}
}
例题1
编写程序从1循环到150,并在每行打印一个值,
另外在每个3的倍数行上打印出“foo”,
在每个5的倍数行上打印“biz”,
在每个7的倍数行上打印输出“baz”
package com.atguigu.java;
public class ForExer1 {
public static void main(String[] args) {
String printValue;
for(int i = 1;i <= 150;i++) {
printValue = "";
printValue += i;
if(i % 3 == 0) {
printValue += " foo";
}
if(i % 5 == 0) {
printValue += " biz";
}
if(i % 7 == 0) {
printValue += " baz";
}
System.out.println(printValue);
}
}
}
例题2
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
说明:break关键字的使用
package com.atguigu.java;
import java.util.Scanner;//导包
public class ForExer2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
System.out.println("请输入第一个正整数:");
int m = scan.nextInt();//调用
System.out.println("请输入第二个正整数:");
int n = scan.nextInt();//调用
//获得两个数中的较小值
int min = (m > n)?n:m;
for (int i = min;i >= 1;i--) {
if(m % i == 0 && n % i == 0) {
System.out.println("最大公约数是"+ i);
break;//一旦在循环中执行到break,就跳出
}
}
//获得两个数中的较大值
int max = (m > n)?m:n;
for (int i = max;i <= m*n;i++) {
if(i % m == 0 && i % n == 0) {
System.out.println("最小公倍数是"+ i);
break;//一旦在循环中执行到break,就跳出
}
}
}
}
/*
//结果
请输入第一个正整数:
20
请输入第二个正整数:
12
最大公约数是4
最小公倍数是60
*/
例题3
public class ForExer3 {
public static void main(String[] args) {
//打印1~100之间所有奇数的和
int sum = 0;
for(int i = 1;i <= 100;i++) {
if(i % 2 == 1) {
sum += i;
}
}
System.out.println("1~100之间所有奇数的和为" + sum);
//1~100之间所有奇数的和为2500
//打印1~100之间所有是7的倍数的整数的个数及总和(体会设置计数器的思想)
int sumSeven = 0;
int countSeven = 0;
for(int i = 1;i <= 100;i++) {
if(i % 7 == 0) {
sumSeven += i;
countSeven++;
}
}
System.out.println("1~100之间7的倍数的整数的总和为" + sumSeven);
System.out.println("1~100之间7的倍数的个数为" + countSeven);
//1~100之间7的倍数的整数的总和为735
//1~100之间7的倍数的个数为14
}
}
While循环
While循环结构的使用
一 循环结构的4个要素
1初始化条件
2循环条件 ---Boolean类型
3循环体
4迭代条件
二 while循环结构
1循环初始条件;
while(2循环条件){
3循环体;
4迭代条件;
}
执行过程:1-->2-->3-->4-->2--->4--->2.....-->2
说明:
1.写while循环千万小心不要丢了迭代条件。一旦丢了 可能导致死循环。
2.写程序要注意避免出现死循环
3.for循环和while循环是可以相互转换的!
区别:for循环和while循环的初始化条件作用域不一样
package com.atguigu.java;
public class WhileTest {
public static void main(String[] args) {
//遍历 100 以内的所有偶数
int i = 1;
while(i <= 100) {
if(i % 2 == 0) {
System.out.println(i);
}
i++;
}
}
}
do-while循环
do-while循环结构的使用
一 循环结构的4个要素
1初始化条件
2循环条件 ---Boolean类型
3循环体
4迭代条件
二 do-while循环结构
1初始化条件;
do{
3循环体;
4迭代条件;
}while(2循环条件);
执行过程:1-->3-->4-->2-->3--->4--->2.....-->2
package com.atguigu.java;
public class DoWhileTest {
public static void main(String[] args) {
//遍历100以内的偶数
int i = 1;
do {
if(i % 2 == 0) {
System.out.println(i);
}
i++;
}while(i <= 100);
}
}
循环语句综合例题
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入
为0时结束程序。
说明:
1.不在循环条件部分限制次数的结构:for(;;),while(true)
2.结束循环有几种方式?
方式一:在循环条件部分返回false
方式二:在循环体中,执行break
package com.atguigu.java;
import java.util.Scanner;//导包
public class AllExer1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//实例化
int sumPositive = 0,sumNegative = 0;
//sumPositive 记录正数的个数
//sumNegative 记录负数的个数
while(true) {
int number = scan.nextInt();//调包
//判断正负情况
if(number == 0) {
break;
}else if(number > 0) {
sumPositive++;
}else {
sumNegative++;
}
}
System.out.println("读入正数的个数为" + sumPositive);
System.out.println("读入负数的个数为" + sumNegative);
}
}
/*
//结果
5
-2
92
12
-2138
0
读入正数的个数为3
读入负数的个数为2
*/
嵌套循环
嵌套循环的使用
1.嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
2.外层循环:B
内层循环:A
3.说明
3.1内层循环结构遍历一遍,只相当于外层循环体执行了一次
3.2假设外层循环需要执行m次,内层循环需要执行n次,此时内层循环的循环体一共执行了m*n次
4.技巧
外层循环控制行数
内层循环控制列数
package com.atguigu.java;
public class ForForExer1 {
public static void main(String[] args) {
//输出 ******
for(int i = 1;i <= 6;i++) {
System.out.print("*");
}
System.out.println("\n");
//输出
/*
******
******
******
******
*/
for(int j = 1;j <= 4;j++) {
for(int i = 1;i <= 6;i++) {
System.out.print("*");
}
System.out.println();
}
}
}
例题1
输出
i(行数) j(列数)
* 1 1
** 2 2
*** 3 3
**** 4 4
package com.atguigu.java;
public class ForForExer2 {
public static void main(String[] args) {
for(int i = 1;i <= 4;i++) {
for(int j = 1;j <= i;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
例题2
九九乘法表
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
....
9 * 1 = 9 9 * 2 = 18 9 * 3 = 27
package com.atguigu.java;
public class NineNineTable {
public static void main(String[] args) {
for(int i = 1;i <= 9;i++) {
for(int j = 1;j <= i;j++) {
System.out.print(i + " * " + j + " = " + (i*j) + " ");
}
System.out.println();
}
}
}
例题3
输出100以内的质数
package com.atguigu.java;
public class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag;//标识符
for(int i = 2;i <= 100;i++) {//遍历100以内的自然数
isFlag = true;
for(int j = 2;j <= Math.sqrt(i);j++) {//j:被i去除
//Math.sqrt(i) 优化二:针对本身是质数自然数有效
if(i % j == 0) {//i被j除尽
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的
}
}
if(isFlag) {
System.out.println(i);
}
}
}
}
特殊关键字break,continue的使用
break和continue关键字的使用
适用范围 循环中的作用
break: switch-case,循环 结束当前循环
continue: 循环 结束当次循环
package com.atguigu.java;
public class BreakTest {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++) {
if(i % 4 == 0) {
//break;123
continue;//123567910
}
System.out.print(i);
}
System.out.println();
//*************
label:for(int i = 1;i <= 4;i++) {
for(int j = 1;j <= 10;j++) {
if(j % 4 == 0) {
//break;//默认跳出包裹此关键字的最近一次循环
//continue;//默认结束包裹此关键字的最近一次循环
break label;//结束指定标签的一层循环
//continue label;
}
System.out.print(j);
}
System.out.println();
}
}
}
/*
//结果
123567910
123
*/
参考文献
链接: B站尚硅谷宋红康Java.