程序逻辑控制

程序逻辑控制

文章目录

  • 一、顺序结构
  • 二、分支结构
    • 2.1 if 语句
    • 2.2 switch 语句
      • 1. 基本语法
      • 2. 执行流程
  • 三、循环结构
    • 3.1 while循环
    • 3.2 break
    • 3.3 continue
    • 3.4 for循环
    • 3.5 do while 循环
  • 四、小试牛刀

一、顺序结构

按照代码的顺序一行一行执行

publicclassTest{publicstaticvoidmain(String[]args){System.out.println("aaa");System.out.println("bbb");System.out.println("ccc");}}

二、分支结构

2.1 if 语句

1.单if判断

if(布尔表达式){语句;}

2.if…else二选一

if(布尔表达式){语句;}else{语句;}

3.if…else if…else多分支

if(布尔表达式){语句;}elseif{语句;}else{语句;}

4.题目:判断成绩类型

publicclassTest{publicstaticvoidmain(String[]args){intscores=98;if(scores>=90&&scores<=100){System.out.println("优秀");}elseif(scores>=80&&scores<90){System.out.println("良好");}elseif(scores>=70&&scores<80){System.out.println("中等");}elseif(scores>=60&&scores<70){System.out.println("及格");}elseif(scores>=0&&scores<60){System.out.println("不及格");}else{System.out.println("错误数据");}}}

5.题目:判断一个数是奇数还是偶数

publicclassTest{publicstaticvoidmain(String[]args){inta=14;if(a%2==0){System.out.println("是偶数");}else{System.out.println("是奇数");}}}

6.题目:判断一个年份是否为闰年

普通年份能被4整除且不能被100整除的是闰年(如2020、2024);世纪年份(如1900、2000)则必须能被400整除才是闰年。

publicclassTest{publicstaticvoidmain(String[]args){intyear=2005;if((year%4==0&&year%100!=0)||(year%400==0)){System.out.println("是闰年");}else{System.out.println("是平年");}}}

7.悬垂else问题

publicclassTest{publicstaticvoidmain(String[]args){intx=10;inty=20;if(x==20)if(y==10)System.out.println("hehe");elseSystem.out.println("haha");}}//什么都不打印,if / else语句中可以不加括号,也可以写语句(只能写一条语句),此时else是和最接近的if匹配;

2.2 switch 语句

1. 基本语法

switch(表达式){case常量1:语句块1;break;case常量2:语句块2;break;// 可以有任意多个case,但常量值不可以重复default:默认语句;break;}

2. 执行流程

  1. 先计算表达式的值
  2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束
  3. 当表达式的值没有所项匹配时,执行default

注意:

  1. 不能做switch的参数的数据类型是long float double boolean ;
  2. switch 不能表达复杂的条件:
//这样的代码使用if很容易表达,但是使用switch就无法表示。if(num>10&&num<20){system.out.println("hehe");}
  1. switch 虽然支持嵌套,但是很丑,一般不推荐

三、循环结构

3.1 while循环

循环条件为为布尔表达式,值为true,则执行循环语句;否则结束循环。

while(循环条件){循环语句;}

题目:判断1~100之间奇数的和

publicclassTest{publicstaticvoidmain(String[]args){inti=1;intsum=0;while(i<100){sum+=i;i+=2;}System.out.println(sum);}}

题目:计算5的阶乘

publicclassTest{publicstaticvoidmain(String[]args){inti=1;intret=1;while(i<=5){ret*=i;i++;}System.out.println(ret);}}

题目:计算1!+ 2!+ 3!+ 4!+ 5!

publicclassTest{publicstaticvoidmain(String[]args){inti=1;intsum=0;while(i<=5){intj=1;intret=1;while(j<=i){ret*=j;j++;}sum+=ret;i++;}System.out.println(sum);}}

3.2 break

break的功能是让循环提前结束。

publicclassTest{publicstaticvoidmain(String[]args){inta=1;while(a<=10){if(a==3){break;}System.out.print(a+" ");a++;}}}//输出1 2

3.3 continue

continue 的功能是跳过这次循环,立即进入下次循环。

publicclassTest{publicstaticvoidmain(String[]args){inta=1;while(a<=10){if(a==3){a++;continue;}System.out.print(a+" ");a++;}}}//输出1 2 4 5 6 7 8 9

3.4 for循环

基本语法

for(表达式1;布尔表达式2;表达式3){表达式4;}

3.5 do while 循环

基本语法

do{循环语句;}while(循环条件);

先执行循环语句,在判定循环条件,循环条件成立则继续进行,否则循环结束。

注意:

  1. do while 循环后的分号不要忘记
  2. 一般 do while很少用到,更推荐使用for 和while

例题:打印1~10

publicclassTest{publicstaticvoidmain(String[]args){intnum=1;do{System.out.println(num);num++;}while(num<=10);}}

四、小试牛刀

1.判定⼀个数字是否是素数

素数是指大于 1,并且只有 1 和自身两个正因数的自然数。因此,0、1 和负数都不是素数。

解法一:素数只能整除1和它本身

publicclassTest{publicstaticvoidmain(String[]args){intn=3;// 小于等于 1 的整数不是素数if(n<=1){System.out.println("不是素数");return;}inti=2;//除以2 到 n - 1之间的数字for(i=2;i<=n-1;i++){if(n%i==0){System.out.println("不是素数");break;}}if(i>n-1){System.out.println("是素数");}}}

解法二:如果 n 是合数,那么它在区间 [2, n / 2] 内必然存在至少一个因数。因此,可以通过枚举该区间判断 n 是否为素数。

publicclassTest{publicstaticvoidmain(String[]args){intn=3;// 小于等于 1 的整数不是素数if(n<=1){System.out.println("不是素数");return;}inti=2;for(i=2;i<=n/2;i++){if(n%i==0){System.out.println("不是素数");break;}}if(i>n/2){System.out.println("是素数");}}}

解法三:如果 n 是合数,那么它至少存在一个不大于根号n的因数,因此只需要枚举到根号n

publicclassTest{publicstaticvoidmain(String[]args){intn=3;// 小于等于 1 的整数不是素数if(n<=1){System.out.println("不是素数");return;}inti=2;for(i=2;i<=Math.sqrt(n);i++){if(n%i==0){System.out.println("不是素数");break;}}if(i>Math.sqrt(n)){System.out.println("是素数");}}}

注意:自幂数是指一个n位数,它的每个数位上的数字的n次幂之和等于他本身。

自幂数名字:

一位次幂数:独身数;1~9

三位自幂数:水花仙数;

四位自幂数:四叶玫瑰数;

五位自幂数:五角星数;

六位自幂数:六合数;

七位自幂数:北斗七星数;

八位自幂数:八仙数;

九位自幂数:九九重阳数;

十位自幂数:十全十美数;

2.求出100〜999之间的所有“水仙花数”并输出。(“水仙花数”是指⼀个三位数,其各位数字的立方和刚好等于该数本⾝,如: 153 = 1^3 + 5^3 + 3^3 ,则153是⼀个“水仙花数”。

publicclassTest{publicstaticvoidmain(String[]args){for(inti=100;i<999;i++){intsum=0;inttemp=i;while(temp!=0){sum+=Math.pow(temp%10,3);temp/=10;}if(sum==i){System.out.println("水仙花数有 "+i);}}}}//运行结果:该水仙花数为153该水仙花数为370该水仙花数为371该水仙花数为407

升级,输出一到六位自幂数

publicclassTest{publicstaticvoidmain(String[]args){for(inti=1;i<999999;i++){//1.求当前数字i是一个几位数intcount=0;//假设i = 123inttemp=i;while(temp!=0){count++;temp/=10;}//temp = 0 count = 3temp=i;//temp = 123intsum=0;while(temp!=0){sum+=Math.pow(temp%10,count);temp/=10;}if(sum==i){System.out.println(count+" 位自幂数为:"+i);}}}}//运行结果1位自幂数为11位自幂数为21位自幂数为31位自幂数为41位自幂数为51位自幂数为61位自幂数为71位自幂数为81位自幂数为93位自幂数为1533位自幂数为3703位自幂数为3713位自幂数为4074位自幂数为16344位自幂数为82084位自幂数为94745位自幂数为547485位自幂数为927275位自幂数为930846位自幂数为548834

3.给定两个数,求这两个数的最大公约数

例如:

输入:20 40

输出:20

解题思路:

最大公约数:即两个数据中公共约数的最大者。

求解的方式比较多,此处主要介绍:辗转相除法

publicstaticvoidmain(String[]args){inta=18;intb=24;// 第一步:转为正整数,处理负数边界a=Math.abs(a);b=Math.abs(b);intc=a%b;//a,b大小关系无所谓while(c!=0){a=b;b=c;c=a%b;}System.out.println(b);}

4.最小公倍数
公式法(适用于两个数)
若已知两个数 a 和 b,以及它们的最大公因数(Greatest Common Divisor,简称 GCD),可通过公式直接计算最小公倍数:

publicstaticvoidmain(String[]args){intnum1=18;// 保存原始值(后续计算需要用)intnum2=24;inta=num1;// 用于计算GCD的临时变量intb=num2;intc=a%b;// 先求最大公因数(GCD)while(c!=0){a=b;b=c;c=a%b;}intgcd=b;// 此时b为最大公因数// 再用公式计算最小公倍数(LCM)intlcm=(num1*num2)/gcd;System.out.println("最小公倍数是:"+lcm);// 输出结果为72}

5.计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值
思路:
从上述表达式可以分析出
该表达式主要由100项,奇数项为正,偶数项为负

publicstaticvoidmain(String[]args){doublesum=0;intflg=1;for(inti=1;i<=100;i++){sum+=1.0/i*flg;flg=-flg;}System.out.println(sum);}