一、程序流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组 合成能完成一定功能的小逻辑模块。
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
1.顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
2.分支结构
根据条件,选择性地执行某段代码。
有if…else和switch-case两种分支语句。
3.循环结构
根据循环条件,重复性的执行某段代码。
有while、do…while、for三种循环语句。
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
1.1 顺序结构
Java中定义成员变量时采用合法的前向引用
1.2 分支语句
1.2.1 分支语句 if-else结构
分支结构:if-else使用说明
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
语句块只有一条执行语句时,一对{}可以省略,但建议保留
if-else语句结构,根据需要可以嵌套使用
当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略
当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓 当多个条件是“包含”关系时,“小上大下 / 子上父下”
表达式:将数据 变量 使用运算符 按照一定的规则拼接起来 形成的就是表达式
表达式类型 :指的就是表达式计算之后的结果的类型
int age = 23;
//假定人的年龄的合法值位0—100
if(age > 0 && age < 100)
System.out.println(“年龄合法”);
else
System.out.println(“年龄不合法”);
如果if else其后只有一条需要执行的语句 则if else后的大括号可以省略 但是仅限于其后有且仅有一条语句
约定:自己写代码 不允许省略大括号 即使只有一条语句 也不允许省略
例1
public static void main(String[] args){
int age = 23;
//假定人的年龄的合法值位0—100
if(age > 0 && age < 100){
System.out.println(“年龄合法”);
}else{
System.out.println(“年龄不合法”);
}
}
例2
import java.util.Scanner;
public class Demo1{
/*
岳大鹏参加Java考试,他和父亲岳不群达成承诺:
如果: 成绩为100分时,奖励一辆BMW;
成绩为(80,99]时,奖励一台iphoe xs max;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请输入您的Java考试成绩:”);
int score = sc.nextInt();
if(score < 0 || score > 100 100){
System.out.println(“输入的成绩不合法,请查证后重新输入。。。。”);
}else{
if(score == 100 ){
System.out.println(“奖励一辆BMW”);
}else if(score > 80 && score <= 99){
System.out.println(“奖励一台iphoe xs max”);
}else if(score >= 60 && score <= 80){
System.out.println(“奖励一台iPad”);
}else{
System.out.println(“无奖励”);
}
}
}
}
例3
import java.util.Scanner;
public class Demo1{
/*
编写程序:由键盘输入三个整数分别存入变量num1、num2、num3,
对它们进行排序(使用 if-else if-else),并且从小到大输出。
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请输入第一个整数:”);
int num1 = sc.nextInt();
System.out.println("请输入第二个整数:");
int num2 = sc.nextInt();
System.out.println("请输入第三个整数:");
int num3 = sc.nextInt();
// 将第一个数和第二数进行比较 对他们进行交换位置 将较小者放在第一位 较大者放在第二位
// 在用第三个数和第二个数进行比较 交换位置
// 此时比较第一个和第二个数
if(num1 > num2){
int temp = 0 ;
temp = num1;
num1 = num2;
num2 = temp;
}
if(num2 > num3){
int temp = 0 ;
temp = num2;
num2 = num3;
num3 = temp;
}
if(num1 > num2){
int temp = 0 ;
temp = num1;
num1 = num2;
num2 = temp;
}
System.out.println(num1 +"---"+ num2+"---"+num3);
}
}
例4
import java.util.Scanner;
public class Demo1{
/*
我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每 一年相当于人类的10.5岁,
之后每增加一年就增加四岁。那么5岁的狗 相当于人类多少年龄呢?
应该是:10.5 + 10.5 + 4 + 4 + 4 = 33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人 类的年龄。
如果用户输入负数,请显示一个提示信息。
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请输入狗的年龄整数:”);
double dogAge = sc.nextDouble();
if(dogAge > 0){
if(dogAge <= 2 ){
dogAge *= 10.5;
}else{
dogAge = (dogAge-2) * 4 + 2 * 10.5;
}
System.out.println(dogAge);
}else{
System.out.println(“狗的年龄不能为负数:”);
}
}
}
1.2.2 分支语句 switch-case结构
switch(表达式){
case 常量1:
语句1;
// break;
case 常量2:
语句2;
// break;
… …
case 常量N:
语句N;
// break;
default: 语句;
// break;
}
常量:不可改变的变量就成为常量
常量:字面常量、自定义常量
字面常量:所使用的所有的数字 字母 汉字 符号
int i = 2; char c = ‘a’;
final int I = 2;
使用注意事项:
1 在每一个case之后都需要break,如果没有break 会出现case穿透
2 default不是必须的 如果有default 也必须加上break;default可以出现在任意位置
3 switch的表达式的类型:int byte short char String(jdk7.0) 枚举 (jdk 5.0)
4 case后必须是常量
5 case后的常量不允许重复
switch和if语句的对比
if和switch语句很像,具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几 种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。也就是说,使用switch-case的,都可以改写为if-else。反之不成立
例1
public class SwitchDemo{
/*
3.根据用于指定月份,打印该月份所属的季节。
3,4,5 春季
6,7,8 夏季
9,10,11 秋季
12, 1, 2 冬季
*/
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println(“请输入你需要判断的月份(1–12):”);
int month = sc.nextInt();
switch(month){
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;
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
default:
System.out.println("输入的月份有误");
break;
}
}
}
例2
public class SwitchDemo{
/*
编写程序:从键盘上输入2019年的“month”和“day”,
要求通过程序 输出输入的日期为2019年的第几天。
*/
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println(“请输入你的月份(1–12):”);
int month = sc.nextInt();
System.out.println(“请输入你的日期(1–31):”);
int day = sc.nextInt();
int days= 0;
switch(month){
case 1:
days = day;
break;
case 2:
days = 31 + day;
break;
case 3:
days = 31 + 28 + day;
break;
case 4:
days = 31 + 28 + 31 + day;
break;
}
System.out.println(“您输入的日期为2019年的第”+days+“天”);
}
}
例3
public class SwitchDemo{
/*
编写一个程序,为一个给定的年份找出其对应的中国生肖。
中国的生肖基于12年一个周期, 每年用一个动物代表:
rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、 rooster、dog、pig。
算法是程序的灵魂:
2008 鼠 (2019 - 1900 )% 12 1900鼠
*/
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println(“请输入4位数的年 :”);
int year = sc.nextInt();
int num = (year - 1900 )% 12;
switch(num){
case 0:
System.out.println(“鼠”);
break;
case 1:
System.out.println(“牛”);
break;
case 2:
System.out.println(“虎”);
break;
}
}
}
1.3 循环结构
循环结构
在某些条件满足的情况下,反复执行特定代码的功能
循环语句分类
for 循环
while 循环
do-while 循环
循环语句的四个组成部分
初始化部分(init_statement)
循环条件部分(test_exp)
循环体部分(body_statement)
迭代部分(alter_statement)
1.3.1 循环结构之for循环
语法格式
for (①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
}
执行过程: ①-②-③-④-②-③-④-②-③-④-…-②
说明:
②循环条件部分为boolean类型表达式,当值为false时,退出循环
①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
④可以有多个变量更新,用逗号分隔
Demo1
public class ForLoop {
public static void main(String args[]) {
int result = 0;
for (int i = 1; i <= 100; i++) {
result += i;
}
System.out.println(“result=” + result);
}
}
Demo 2
public class ForDemo
{
/*
计算0—100之间的所有整数的和
/
public static void main(String[] args)
{
int sum = 0;
for(int i = 0;i <= 100 ;i++){
sum += i;
}
System.out.println(sum);
}
}
Demo 3
public class ForDemo
{
/
编写程序从1循环到150,并在每行打印一个值,
另外在每个3的倍数行 上打印出“foo”,
在每个5的倍数行上打印“biz”,
在每个7的倍数行上打印 输出“baz”
System.out.print(i) 不换行输出 System.out.println(i) 输出并换行
print()必须有输出参数 println()可以没有参数 直接输出换行
/
public static void main(String[] args)
{
for(int i = 1; i <= 150; i++){
System.out.print(i);
if(i % 3 == 0){
System.out.print(" foo");
}
if(i % 5 == 0){
System.out.print(" biz");
}
if(i % 7 == 0){
System.out.print(" baz");
}
System.out.println();
}
}
}
Demo 4
public class ForDemo
{
/
打印1~100之间所有奇数的和
/
public static void main(String[] args)
{
int sum = 0 ;
for(int i = 1 ; i < 100 ;i++){
if(i % 2 !=0){
sum += i;
}
}
System.out.println(sum);
}
}
Demo 5
public class ForDemo
{
/
打印1~100之间所有是7的倍数的整数的个数及总和
/
public static void main(String[] args)
{
int sum = 0 ;
int count = 0;
for(int i = 1 ; i < 100 ;i++){
if(i % 7 ==0){
sum += i;
count++;
}
}
System.out.println(sum);
System.out.println(count);
}
}
Demo 6
public class ForDemo
{
/
输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数 字立方和等于其本身。
例如: 153 = 111 + 333 + 555
/
public static void main(String[] args)
{
for(int i = 100 ; i < 1000 ;i++){
int ge = i % 10;
int shi = i /10 % 10;
int bai = i /100 ;
if((gegege + shishishi + baibaibai) == i){
System.out.println(i);
}
}
}
}
Demo 7
public class ForDemo
{
/
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 比如:12和20的最大公约数是4,最小公倍数是60。 说明:break关键字的使用
最大公约数 最大公约数不大于其中任何一个数
最小公倍数 两个数的乘积除以最大公约数
/
public static void main(String[] args)
{
int opt1 = 12;
int opt2 = 20;
int min = 0 ;
int max = 0 ;
if(opt1 <= opt2){
min = opt1;
max = opt2;
}else{
min = opt2;
max = opt1;
}
// 计算最大公约数
for(int i = min; i > 0; i–){
if(opt1 % i == 0 && opt2 % i == 0){
System.out.println(i);
break;//结束循环 整个循环执行到此结束 不在循环 继续执行循环之后的代码
}
}
//计算最小公倍数
for(int j = max; j > 0; j++){
if(j % opt1 == 0 && j % opt2 == 0){
System.out.println(j);
break;
}
}
System.out.println(“计算结束”);
}
}
Demo 8
public class ForDemo
{
/
题目:输出1–100 之间 非5的倍数
/
public static void main(String[] args)
{
for(int i = 1; i < 100; i++){
if(i % 5 == 0){
continue; // 结束本次循环 继续下次循环
}else{
System.out.println(i);
}
}
}
}
1.3.2 循环结构之while循环
语法格式
①初始化部分
while(②循环条件部分){
③循环体部分;2
④迭代部分;
}
执行过程: ①-②-③-④-②-③-④-②-③-④-…-②
说明:
注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。
for循环和while循环可以相互转换
Demo 1
public class ForDemo
{
/
题目:输出1–100 之间 非5的倍数
/
public static void main(String[] args)
{
int i= 1;
while(i < 100){
if(i % 5 == 0){
i++;
continue;
}else{
System.out.println(i++);
}
}
}
}
Demo 2
public class ForDemo
{
/
题目:输出1–100 之间 非5的倍数
/
public static void main(String[] args)
{
int i= 1;
/
while(i < 100){
if(i % 5 == 0){
i++;
continue;
}else{
System.out.println(i++);
}
}*/
for(;i < 100;){
if(i % 5 == 0){
i++;
continue;
}else{
System.out.println(i++);
}
}
}
}
Demo 3
public class ForDemo
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
//while(true){
for(;true;){
System.out.println("请输入第一个操作数:");
int opt1 = sc.nextInt();
System.out.println("请输入第二个操作数:");
int opt2 = sc.nextInt();
// 如果输入数中包含0 就结束程序
if(opt1 == 0 || opt2 == 0){
break;
}
int min = 0 ;
int max = 0 ;
if(opt1 <= opt2){
min = opt1;
max = opt2;
}else{
min = opt2;
max = opt1;
}
// 计算最大公约数
for(int i = min; i > 0; i--){
if(opt1 % i == 0 && opt2 % i == 0){
System.out.println(i);
break;//结束循环 整个循环执行到此结束 不在循环 继续执行循环之后的代码
}
}
//计算最小公倍数
for(int j = max; j > 0; j++){
if(j % opt1 == 0 && j % opt2 == 0){
System.out.println(j);
break;
}
}
}
System.out.println("计算结束");
}
}
for 循环和while 区别
1 从循环变量的生命周期 for仅限于其整个循环 while范围更大
2 for用于能够明确知道循环界限的循环 while用于循环界限奴明确的
通常情况两者可以进行转换
1.3.3 循环结构: do-while循环
语法格式
①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分);
执行过程: ①-③-④-②-③-④-②-③-④-…②
说明: do-while循环至少执行一次循环体。
Demo 1
public class ForDemo
{
/*
计算1–100之间的整数的和
/
public static void main(String[] args)
{
int i= 1;
int sum = 0 ;
do{
sum += i;
i++;
}while(i <= 100);
System.out.println(sum);
}
}
Demo 2
public class ForDemo
{
/
从键盘读入个数不确定的整数,
并判断读入的正数和负数的个数,
输入 为0时结束程序。
最简单“无限” 循环格式:while(true) , for(;😉,
无限循环存在的原因是并不 知道循环多少次,
需要根据循环体内部某些条件,来控制循环的结束。
/
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int zhengCount = 0 ;
int fuCount = 0;
while(true){
int i = sc.nextInt();
if(i > 0 ){
zhengCount++;
}else if(i < 0){
fuCount++;
}else{
break;
}
}
System.out.println(“正数的个数:” + zhengCount);
System.out.println(“负数的个数:” + fuCount);
}
}
Demo 3
public class ForDemo
{
/
模拟系统登录 让用户输入用户名
如果用户输入的用户名为admin 则输出 登录成功
如果输入的不是admin 则提示用户输入不正确 请重新输入
最多允许尝试3次
/
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int inputCount = 0 ;
do{
String username = sc.next();
if(“admin”.equals(username)){
System.out.println(“登录成功”);
break;
}else{
inputCount++;
System.out.println(“用户名输入不正确,请重新输入:”);
}
}while(inputCount < 3 );
if(inputCount == 3){
System.out.println(“输入以达到最大次数,请明天再来尝试:”);
}
}
}
do。。。。while 至少执行一次
1.3.4 循环结构:嵌套循环结构
将一个循环放在另一个循环体内,就形成了嵌套循环。其中, for ,while ,do…while均可以作为外层循环或内层循环。
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的 循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开 始下一次的循环。
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行mn次。
Demo 1
public class ForDemo
{
/*
输出九九乘法表
*/
public static void main(String[] args)
{
for(int i = 1 ; i < 10 ;i++){//外层循环 控制的行
for(int j = 1 ; j <= i; j++){// 内层循环 控制每一行列
System.out.print(i +" * " + j +" = " + i * j +" ");
}
System.out.println();
}
}
}
如果break出现在嵌套循环中 则结束的是他所在的循环 并不能结束外层循环
如果想结束外层循环 可以通过加标记的方式(了解) 开发中尽量不用
Demo 1改
public class ForDemo
{
/*
输出九九乘法表
*/
public static void main(String[] args)
{
l1:for(int i = 1 ; i < 10 ;i++){//外层循环 控制的行
for(int j = 1 ; j <= i; j++){// 内层循环 控制每一行列
System.out.print(i +" * " + j +" = " + i * j +" ");
if( j == 5){
break l1;//结束指定标记的循环
}
}
System.out.println();
}
}
}