Java基础编程之分支结构和循环结构
程序员文章站
2022-06-26 07:59:43
...
Java基础编程之分支结构和循环结构
知识点1:分支结构1:if-else
- 基本使用
/*
一、流程控制分为三类结构:顺序结构、分支结构、循环结构
二、分支结构1:if-else
1.格式1:
if(条件表达式){
执行语句1;
}
2.格式2:“二选一”
if(条件表达式){
执行语句1;
}else{
执行语句2;
}
3.格式3:“多选一”
if(条件表达式1){
执行语句1;
}else if(条件表达式2){
执行语句2;
}else if(条件表达式3){
执行语句3;
}
....
else{
执行语句2;
}
*/
class IfTest {
public static void main(String[] args) {
int heartBeats = 80;
if(heartBeats < 60 || heartBeats > 100){
System.out.println("你需要做进一步的检查");
}
System.out.println("体检结束");
//############二选一################
int age = 23;
if(age >= 22){
System.out.println("你已经到了合法的结婚年龄");
}else{
System.out.println("你只能先谈谈恋爱~~");
}
//############多选一################
int myAge = 12;
if(myAge < 0 || myAge > 150){
System.out.println("你输入的数据不合法~~");
}else if(myAge < 6){
System.out.println("婴幼儿时期");
}else if(myAge < 25){
System.out.println("青少年时期");
}else if(myAge < 60){
System.out.println("壮年时期");
}else{
System.out.println("老年时期");
}
System.out.println("执行结束");
}
}
- 例题
说明1:
如果多个条件表达式彼此之间是“互斥”关系(即:没有交集),则哪个条件表达式声明在上面,哪个条件表达式声明在下面都可以。
如果多个条件表达式彼此之间是“包含”关系,则需要将条件表达式范围小的声明在条件表达式范围大的上面。
说明2:如果if-else结构中的某一个if或else if 或 else只有一行执行语句,则可以省略其一对{}。但是,不建议省略
*/
/*
岳小鹏参加Java考试,他和父亲岳不群达成承诺:
如果:
成绩为100分时,奖励一辆BMW;
成绩为(80,99]时,奖励一台iphone xs max;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
import java.util.Scanner;
class IfTest1{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入岳小鹏的期末成绩:");
int score = scan.nextInt();
if(score == 100){
System.out.println("奖励一台BMW");
}else if(score > 80){//
System.out.println("奖励一台iphone xs max");
}else if(score >= 60 ){//
System.out.println("奖励一个 iPad");
}else{
System.out.println("奖励一本参考书");
}
}
}
知识点2:if-else的使用
- 代码举例
/*
大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,
当然要提出一定的条件:高:180cm以上;富:财富1千万以上;帅:是。
如果这三个条件同时满足,则:“我一定要嫁给他!!!”
如果三个条件有为真的情况,则:“嫁吧,比上不足,比下有余。”
如果三个条件都不满足,则:“不嫁!”
*/
import java.util.Scanner;
class IfTest {
public static void main(String[] args) {
/*
Scanner scann = new Scanner(System.in);
System.out.println("请输入你的身高(cm):");
int height = scann.nextInt();
System.out.println("请输入你的财富(单位:千万):");
double wealth = scann.nextDouble();
System.out.println("请告诉我,你帅否?(true/false):");
boolean isHandsome = scann.nextBoolean();
if(height >= 180 && wealth >= 1 && isHandsome){
System.out.println("我一定要嫁给他!!!");
}else if(height >= 180 || wealth >= 1 || isHandsome){
System.out.println("嫁吧,比上不足,比下有余。");
}else{
System.out.println("不嫁!");
}
*/
//方式二:使用了String的equals(),判断两个字符串是否相等
Scanner scann = new Scanner(System.in);
System.out.println("请输入你的身高(cm):");
int height = scann.nextInt();
System.out.println("请输入你的财富(单位:千万):");
double wealth = scann.nextDouble();
System.out.println("请告诉我,你帅否?(是/否):");
String isHandsome = scann.next();
if(height >= 180 && wealth >= 1 && "是".equals(isHandsome)){
System.out.println("我一定要嫁给他!!!");
}else if(height >= 180 || wealth >= 1 || "是".equals(isHandsome)){
System.out.println("嫁吧,比上不足,比下有余。");
}else{
System.out.println("不嫁!");
}
}
}
知识点3:switch-case的使用
/*
分支结构2:switch-case
switch(表达式){
case 常量1:
执行语句1;
break;
case 常量2:
执行语句2;
break;
case 常量3:
执行语句3;
break;
...
default :
执行语句n;
break;
}
说明:
1. 执行过程:根据switch中表达式的值,依次匹配各个case中的常量。当与某个常量匹配上时,就进入case中,调用其执行语句。
执行完之后,仍然会考虑继续执行其后的case中的结构,直到遇到break关键字或执行完后续的所有的case结构。
2. switch中的表达式可以是如下的类型:byte \ short \ char \ int ; 枚举类(jdk5.0新增) \ String(jdk7.0新增)
3. switch-case结构的局限性:① switch中的表达式有类型的限制 ② 匹配的多个case,通常都不会太多。
4. default相当于if-else结构中的else。
default是可选的,位置也是灵活的。
5. switch-case与if-else的转换:
switch-case结构一定可以改写为if-else;
if-else不一定能改写成switch-case.
建议:在switch-case和if-else都可以使用的场景下,建议大家使用switch-case。因为执行效率稍高
*/
- 代码举例
class SwitchCaseTest {
public static void main(String[] args) {
int num = 5;
switch(num){
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;//跳出当前switch-case结构
case 3:
System.out.println("three");
break;
case 4:
System.out.println("four");
break;
default:
System.out.println("other");
//break;
}
//表达式是String类型
String season = "summer";
switch (season) {
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎");
break;
case "autumn":
System.out.println("秋高气爽");
break;
case "winter":
System.out.println("冬雪皑皑");
break;
default:
System.out.println("季节输入有误");
break;
}
}
}
- 如下:多个case结构可以合并
/*
对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
结论:如果多个case的执行语句相同,可以考虑合并。
*/
class SwitchCaseTest1{
public static void main(String[] args) {
int score = 78;
if(score < 60){
System.out.println("不及格");
}else{
System.out.println("及格");
}
//switch-case
/*
switch(score){
case 0:
//...
case 1:
//...
case 2:
//...
//...
case 100:
//...
}
*/
switch(score / 10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("不及格");
break;
case 6:
case 7:
case 8:
case 9:
case 10:
System.out.println("及格");
break;
}
//更优的做法:
switch(score / 60){
case 0:
System.out.println("不及格");
break;
case 1:
System.out.println("及格");
break;
}
}
}
- 如下:switch-case结构中没有break的举例
/*
编写程序:从键盘上输入2020年的“month”和“day”,要求通过程序输出输入的日期为2020年的第几天。
*/
import java.util.Scanner;
class SwitchCaseTest2{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入当年的month:");
int month = scan.nextInt();
System.out.println("请输入当月的day:");
int day = scan.nextInt();
int sumDays = 0;//记录总天数
/*
不建议如下的操作:
switch(month){//1 - 12
case 1:
sumDays = day;
break;
case 2:
sumDays = 31 + day;
break;
case 3:
sumDays = 31 + 29 + day;
break;
case 4:
sumDays = 31 + 29 + 31 + day;
break;
//...
}
*/
//更优的操作
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 += 29;
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(month + "月" + day + "日是2020年的第" + sumDays + "天");
}
}
/*
从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
或
2)可以被400整除
*/
import java.util.Scanner;
class SwitchCaseTest3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份year:");
int year = scan.nextInt();
System.out.println("请输入当年的month:");
int month = scan.nextInt();
System.out.println("请输入当月的day:");
int day = 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 += day;
}
System.out.println(month + "月" + day + "日是2020年的第" + sumDays + "天");
}
}
知识点4:循环结构1:for
/*
一、凡是循环结构,都有如下的4个要素:
① 初始化条件部分
② 循环条件部分 ---> boolean类型
③ 循环体部分
④ 迭代部分
二、for循环结构
for(①;②;④){
③
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ② - ... - ②
*/
- 代码举例
class ForTest {
public static void main(String[] args) {
for(int i = 1;i <= 5;i++){
System.out.println("Hello World!");
}
//例子:遍历100以内的偶数,并计算所有偶数的和,及记录偶数的个数
int sum = 0;//记录总和
int count = 0;//记录偶数的个数
for(int i = 0;i <= 100;i++){
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
}
System.out.println("总和为:" + sum);
System.out.println("偶数的个数为:" + count);
}
}
- 如下:在循环中使用break
/*
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
说明:break关键字的使用
1. 总结:结束循环的方式都有哪些呢?
方式1:循环条件不满足,返回false
方式2:在循环结构中,使用break关键字跳出循环结构
2. 如果一个循环结构不断的被执行,没有终止。则称为死循环!
3. 开发中大家要避免出现死循环。
*/
class ForTest1 {
public static void main(String[] args) {
int m = 12;
int n = 20;
//##########求最大公约数###############
//获取两个数的较小值
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;//结束当前循环结构
}
}
//###########求最小公倍数##############
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;
}
}
}
}
知识点5:循环结构2:while
/*
一、凡是循环结构,都有如下的4个要素:
① 初始化条件部分
② 循环条件部分 ---> boolean类型
③ 循环体部分
④ 迭代部分
二、while循环的结构
①
while(②){
③
④
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ② - ... - ②
三、说明
1. for循环和while循环是可以相互转换的。
2. 关于初始化条件部分,while循环在执行结束以后,初始化条件中涉及到的变量仍然可用。 而for循环的初始化条件中定义的变量,在出了循环结构以后失效。
*/
class WhileTest {
public static void main(String[] args) {
//遍历100以内的偶数,并计算所有偶数的和,及记录偶数的个数
int i = 0;
int sum = 0;//记录总和
int count = 0;//记录偶数的个数
while(i <= 100){
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
//迭代条件
i++;
}
System.out.println(i);//101
System.out.println("偶数总和为:" + sum);
System.out.println("偶数个数为:" + count);
}
}
知识点5:循环结构3:do-while
/*
一、凡是循环结构,都有如下的4个要素:
① 初始化条件部分
② 循环条件部分 ---> boolean类型
③ 循环体部分
④ 迭代部分
二、do-while循环的结构
①
do{
③
④
}while(②);
执行过程:① - ③ - ④ - ② - ③ - ④ - ② - ③ - .... - ②
三、说明:
1. do-while循环至少会执行一次循环体。
2. 从开发的使用频率讲,do-while用的较少。
*/
class DoWhileTest {
public static void main(String[] args) {
//遍历100以内的偶数,并计算所有偶数的和,及记录偶数的个数
int i = 0;
int sum = 0;//记录总和
int count = 0;//记录个数
do{
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
i++;//迭代条件
}while(i <= 100);
System.out.println("偶数总和为:" + sum);
System.out.println("偶数个数为:" + count);
}
}
知识点6:while(true)、for( ; ; )
/*
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
最简单“无限” 循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,
需要根据循环体内部某些条件,来控制循环的结束。
*/
import java.util.Scanner;
class ForWhileTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int positiveNumber = 0;//记录正数的个数
int negativeNumber = 0;//记录负数的个数
while(true){//for(;;){
System.out.println("请输入一个整数:(输入0时,结束)");
int num = scan.nextInt();
if(num == 0){
break;
}else if(num > 0){
positiveNumber++;
}else{
negativeNumber++;
}
}
System.out.println("正数的个数为:" + positiveNumber);
System.out.println("负数的个数为:" + negativeNumber);
}
}
- 退出循环结构的两种方式:
- 循环条件返回为false
- 在循环体中执行break
知识点7:嵌套循环
- 理解
/*
测试嵌套循环
1. 将一个循环结构A声明在另一个循环结构B的循环体中,则构成了嵌套循环。
A:内层循环
B:外层循环
2. 技巧:外层循环控制行数,内层循环控制列数
3. 如果外层循环循环次数为m次,内层循环循环次数为n次。则可以理解为内层循环的循环体要执行m * n次
*/
- 基本使用
class ForForTest {
public static void main(String[] args) {
//******
for(int i = 1;i <= 6;i++){
System.out.print("*");
}
System.out.println();
System.out.println();
/*
******
******
******
******
******
*/
for(int j = 1;j <= 5;j++){
for(int i = 1;i <= 6;i++){
System.out.print("*");
}
System.out.println();
}
/*
i j
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
*/
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= i;j++){
System.out.print("*");
}
System.out.println();
}
/*
i j(*的个数) j = 5 - i;
**** 1 4
*** 2 3
** 3 2
* 4 1
*/
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 5 - i;j++){
System.out.print("*");
}
System.out.println();
}
/*
*
**
***
****
*****
****
***
**
*
*/
//如上的做法
/*
上半部分 i j(-) k(*)
----* 1 4 1
---* * 2 3 2
--* * * 3 2 3
-* * * * 4 1 4
* * * * * 5 0 5
下半部分
* * * *
* * *
* *
*
*/ //上半部分
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 5 - i;j++){
System.out.print(" ");
}
for(int k = 1;k <= i;k++){
System.out.print("* ");
}
System.out.println();
}
}
}
- 九九乘法表
/*
九九乘法表的实现:
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
...
1 * 9 = 9 ... 9 * 9 = 81
*/
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(j + " * " + i + " = " + (j * i) +" ");
}
System.out.println();
}
}
}
- 质数输出
/*
遍历100000以内所有的质数。
体会一下不同的算法,执行效率的差别。
*/
class PrimeNumberTest1 {
public static void main(String[] args) {
//获取系统当前的毫秒数
long start = System.currentTimeMillis();
boolean isFlag = true;
int count = 0;//记录质数的个数
for(int i = 2;i <= 100000;i++){
//优化2:修改判断的临界值
for(int j = 2;j <= Math.sqrt(i);j++){//for(int j = 2;j < i;j++){//让j被i除
if(i % j == 0){
isFlag = false;
break;//优化1:主要针对的是非质数
}
}
//判断isFlag是否曾经被赋值为false
if(isFlag){//if(isFlag == true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
System.out.println("质数的个数为:" + count);
//获取系统当前的毫秒数
long end = System.currentTimeMillis();
System.out.println("花费的总时间为(毫秒):" + (end - start));//17683 - 1930 - 736
//13017 - 12
}
}
知识点8:break、continue
break的使用范围:
1. 应用在switch-case结构中,一旦执行,就跳出当前switch-case结构
2. 应用在循环结构中,一旦执行,就跳出前的循环结构
/*
break和continue的使用
使用场景 在循环结构中使用的作用: 相同点
break ① switch-case
② 循环结构 结束当前循环结构 在其后,不能声明执行语句。否则,编译错误
continue ① 循环结构 结束当次循环结构 在其后,不能声明执行语句。否则,编译错误
*/
class BreakContinueTest {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
//break;//结束当前循环
continue;//结束当次循环
//是否可以声明执行语句:No!
//System.out.println("今晚迪丽热巴要约我。。。。");
}
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();
}
}
}
补充:如何获取指定范围的随机数
/*
如何获取一个随机数?
1. 通过调用Math.random(),可以获取一个[0,1)范围的内的double型的随机数
2. 获取[10,99]范围内的随机数?
int number = (int)(Math.random() * 90 + 10);
3. 获取[100,999]范围内的随机数?
int number = (int)(Math.random() * (999-100+1) + 100);
总结:获取[a,b]范围的随机数?
(int)(Math.random() * (b - a + 1) + a);
*/
class RandomNumberTest{
public static void main(String[] args) {
//double value = Math.random();
//System.out.println("随机数为:" + value);
//int number = (int)(Math.random() * 90 + 10);//[0,1) --> [0,90) ---> [10,100) --> [10,99]
//System.out.println("随机数为:" + number);
int number = (int)(Math.random() * (999-100+1) + 100); //[0,1) -->[0,900) --> [100,1000) -->[100,999]
}
}
上一篇: Edraw Max亿图图示怎么画冰淇淋?