JAVA 流程控制语句(含循环、课后练习题)

一、顺序结构

代码从主函数开始逐行向下运行,也是一种宏观的代码运行结构

class Demo {
    public static void main(String[] args) {
        int a = 3 ;
        int b = 5 ;
        int sum ;
        sum = a + b;
        System.out.println("sum="+sum);
    }
}

当代码在dos命令行中写入java Demo 回车之后,首先会启动JVM,JVM就会去加载当前Demo这个class文件,并执行其中的main方法。当程序执行main方法的时候会从第一行开始往下执行,直到整个代码全部执行完成。在此过程中程序按照书写的顺序,不会
跳过任何一行代码。像这样的执行流程就是常见的顺序执行结构。

二、选择结构(if/switch)

f是Java种的关键字,当程序在执行过程遇到if关键字,JVM就知道此处需要进行判断,根据判断结果需要处理相应的代码

1.if语句

基本格式:格式说明:if关键字后面是一对小括号,小括号后面是没有分号的,小括号中的表达式
运算完的结果必须是boolean类型的值

if(条件表达式){

      当条件为true时执行的代码;

}else{

      当条件为false时执行的代码;

}

单if形式

if(条件表达式){

     当条件为true时执行的代码;

}

嵌套if-else形式

对于嵌套if而言尽量不要层次太深,太深的话逻辑容易乱,一般会考虑下面这个if-else-if形式

if(条件1){

      条件1为true时执行的代码;

      if(条件2){

          条件2为true时执行的代码;

      }else{

          条件2为false时执行的代码;

      }

}else{

      条件1为false时执行的代码;

}

if-else-if形式:

if(条件1){

 

}else if(条件2){

 

}else if(条件3){

 

}else{

}

2.switch语句(一般在多选情况下用)

程序执行时,遇到switch关键字,首先会计算表达式的值,然后根据计算的值和case后面的值做比较,当case后面的值和switch表达式的值相同时,就执行case身后的所有语句,若case身后没有和switch表达式匹配的值,程序就会执行default后面的语句

switch(变量){              //switch所要求的变量的数据类型:byte short int char String 枚举

    case 值1:

          执行语句1;

          break;

    case 值2:

          执行语句2;

          break;

    case 值3:

          执行语句3;

          break;

    ........

    deafult:

          执行语句n;

          break;

}

if语句与switchyu语句的区别:if它既可以对一个单一的值进行判断,也可以对一个区间的值进行判断;switch只能判断单一的值

三、循环结构 (主要解决重复性执行的代码)

for循环:已知重复次数的循环

for循环格式
for(初始化表达式(1);循环条件表达式(2);循环后的操作表达式(3)){
   执行语句;(4)
}

for执行顺序:1-2-3-4-2-3-4-2-3-4-2-3-4-2不满足为止跳出循环,继续往下执行。

while循环:不知重复次数但是已知结束条件的循环

while循环格式:

1.循环的初始化

while(2.循环的继续条件){

    3.循环体

    4.循环的步长

}


while(true){

     1.循环初始化

     2.循环的继续条件

     3.循环体

     4.循环的步长

}

注意:这么写while循环的话,逻辑上比较顺畅的,但是有危险,在于本身是死循环,需要在合适的时候用break关键字跳出循环

 

      /*
        死循环:循环一直不出来 CPU在一直执行循环体
        for(;;){
            System.out.println("for死循环");
        }
        while(true){    //此处必须写条件表达式
            System.out.println("while死循环");
        }
     */

while执行顺序:当程序遇到while关键字时,JVM首先会运算while后面的条件表达式,当条件表达式为true时,就会执行while后面大括号中的语句,当把大括号中的所有语句执行完之后,会又回到while的条件表达式处再次判断,若还为true,就继续执行大括号中的语句,若为false就跳过大括号中的所有语句,继续往下执行。

以上不是一个严格意思上的分类,无论是for还是while,在Java当中都是可以互换的!

循环的四要素:

1.循环初始化(指的就是循环从什么时候开始执行)

2.循环继续条件(什么情况循环继续执行/反过来说,循环何时结束)

3.循环体(就是我们需要被多次循环执行的代码块)

4.循环的周期,步长,间距(当前循环和下一次循环之间的变更)

举个栗子:

public class Test{
    public static void main(String[] args){
        for(int = 1;i <= 5;i++){
            System.out.println("*");
        }
    }
}
public class Test{
    public static void main(String[] args){
        int i = 1;
        while(i<6){
            i=i+1;
            System.out.println("*");
        }
    }
}

结果都是:

*

*

*

*

*

四、代码练习题

import java.util.Scanner;
public class Demo03_01{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入三个数:");
        double a = scanner.nextDouble();
        double b = scanner.nextDouble();
        double c = scanner.nextDouble();
        double delt = b * b - 4 * a * c;
        if(delt>0){
            double r1 = (-b + Math.sqrt(delt)) / (2 * a);
            double r2 = (-b - Math.sqrt(delt)) / (2 * a);
            System.out.printf("r1 = %.2f,r2 = %.2f",r1,r2);
        }else if(delt==0){
            double r = -b / (2 * a);
            System.out.printf("r = %.2f",r);
        }else{
            System.out.println("无实数解!");
        }
    }
}

import java.util.Scanner;
public class Demo03_03{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入今天是周几:");
        int today = scanner.nextInt();
        System.out.print("输入未来的几天:");
        int future = scanner.nextInt();
        int futureday = (today+future)%7;
        String todaystr ="";
        String futuredaystr ="";
        if(today== 0){
            todaystr="周日";
        }else if(today== 1){
            todaystr="周一";
        }else if(today== 2){
            todaystr="周二";
        }else if(today== 3){
            todaystr="周三";
        }else if(today== 4){
            todaystr="周四";
        }else if(today== 5){
            todaystr="周五";
        }else if(today== 6){
            todaystr="周六";
        }
        
        if(futureday== 0){
            futuredaystr="周日";
        }else if(futureday== 1){
            futuredaystr="周一";
        }else if(futureday== 2){
            futuredaystr="周二";
        }else if(futureday== 3){
            futuredaystr="周三";
        }else if(futureday== 4){
            futuredaystr="周四";
        }else if(futureday== 5){
            futuredaystr="周五";
        }else if(futureday== 6){
            futuredaystr="周六";
        }
        System.out.println("今天是"+todaystr+",未来的"+future+"天后是"+futuredaystr);
    }
}

/*
123
3 123%10
2 123/10%10
1 123/10/10
321==123?
3*100+2*10+1
(3*10+2)*10+1
(((0*10)+3)*10+2)*10+1
*/
import java.util.Scanner;
public class Demo03_04{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("请用户输入一个三位数:");
        int num = scanner.nextInt();
        int temp = num;
        int sum = 0;
        sum = (sum * 10) + num % 10 ;
        num/=10;
        sum = (sum * 10) + num % 10 ;
        num/=10;
        sum = (sum * 10) + num % 10 ;
        num/=10;
        if(sum == temp){
            System.out.println("是回文");   
        }else{
            System.out.println("不是回文");
        }
    }
}

import java.util.*;
class Demo03_06{
    public static void main(String[] args){
        //1.
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入 剪刀0 石头1 布2:");
        int usr=scanner.nextInt();
        //2.
        Random random=new Random();
        int com=random.nextInt(3);
        //3.
        String usrStr="";
        String comStr="";
        switch(usr){
            case 0: //if usr==0
                usrStr="剪刀"; 
                break;
            case 1:// if usr==1
                usrStr="石头";
                break;
            case 2:// if usr==2
                usrStr="布";
                break;
        }
        switch(com){
            case 0: 
                comStr="剪刀"; 
                break;
            case 1:
                comStr="石头";
                break;
            case 2:
                comStr="布";
                break;
        }
        //3.
        if(usr==com){
            System.out.printf("用户是%s,电脑是%s,平局",usrStr,comStr);
        }else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
            System.out.printf("用户是%s,电脑是%s,用户赢",usrStr,comStr);
        }else{
            System.out.printf("用户是%s,电脑是%s,用户输",usrStr,comStr);
        }
    }
}

 

import java.util.Scanner;
class Demo03_07{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.先输入年份
        System.out.print("请输入年份:");
        int year=scanner.nextInt();
        //2.输入月份 1月 2月分别用13 14代替 同时year-1
        System.out.print("请输入月份:");
        int month=scanner.nextInt();
        //3.输入日期
        System.out.print("请输入日期:");
        int day=scanner.nextInt();

        //4.对特殊的1月和2月做处理
        if(month==1||month==2){
            month+=12;
            year-=1;
        }
        //5.套公式
        int h=(day+26*(month+1)/10+year%100+year%100/4+year/100/4+5*year/100)%7;
        
        switch(h){
            case 0:
                System.out.println("是周六");
                break;
            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;
        }
    }
}

 

import java.util.Scanner;
class Demo03_09{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.提示用户输入一个点的坐标
        System.out.print("请输入一个坐标:");
        double x=scanner.nextDouble();
        double y=scanner.nextDouble();
        //2.先大致判断一下坐标的范围
        //3.再精确的判断坐标的范围
        if(x>=0&&x<=200&&y<=-0.5*x+100){
            System.out.println("点再三角形内");
        }else{
            System.out.println("点再三角形外");
        }
    }
}

 

import java.util.Scanner;
class Demo03_10{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.先输入大矩形的中心,宽和高
        System.out.print("请输入第1个矩形的信息:");
        double x1=scanner.nextDouble();
        double y1=scanner.nextDouble();
        double w1=scanner.nextDouble();
        double h1=scanner.nextDouble();
        //2.再输入小矩形的中心,宽和高
        System.out.print("请输入第2个矩形的信息:");
        double x2=scanner.nextDouble();
        double y2=scanner.nextDouble();
        double w2=scanner.nextDouble();
        double h2=scanner.nextDouble();

        double inXMin=x1-(w1-w2)/2;
        double inXMax=x1+(w1-w2)/2;
        double inYMin=y1-(h1-h2)/2;
        double inYMax=y1+(h1-h2)/2;

        double outXMin=x1-(w1+w2)/2;
        double outXMax=x1+(w1+w2)/2;
        double outYMin=y1-(h1+h2)/2;
        double outYMax=y1+(h1+h2)/2;
        if(x2>=inXMin&&x2<=inXMax&&y2>=inYMin&&y2<=inYMax){
            System.out.println("小矩形在大矩形里面!");
        }else if(x2<=outXMin||x2>=outXMax||y2<=outYMin||y2>=outYMax){
            System.out.println("小矩形在大矩形外面!");
        }else{
            System.out.println("小矩形和大矩形相交!");
        }
    }
}

 遇到与以上两个题类似的问题时,一般先找极限条件。

像三角形那道题,首先看到坐标系会想到用线性规划来做,先把三角形的斜边当做直线写出一个方程(y=-0.5x+100),极限横坐标就是(x1=0,x2=200)所以可以确定x的定义域(0<= x <=200),从而得出若(y<=-0.5x+100)则在三角形内。

对于矩形这道题比较复杂,放在平面上看不太好考虑,所以选择放在数轴上,极限条件就是某一个直角边刚好重合。从而根据四个小矩形确定出来一个大矩形(此矩形是在极限条件下确定出来的,它一旦变化就会改变小矩形与大矩形的位置关系,所以根据边中点的坐标来做条件表达式)如下图所示:

 


 这里开始接触到循环(注意break要放到合适的位置,如果出现死循环可以按Ctrl+c结束循环)

 

import java.util.Scanner;
/* 
输入一个数字
再判断数字是否为0
如果为0则退出
不是则继续
*/
class Demo03_11{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        double sum=0;  //总和
        int positives=0;    //正数的个数
        int negatives=0;    //负数的个数
        System.out.print("请输入若干数字:");
        while(true){//不管三七二十一 先进来再说
            int num=scanner.nextInt();
            if(num!=0){
                sum+=num;
                if(num>0){
                    positives++;
                }else{
                    negatives++;
                }
            }else{
                break;  //跳出当前循环
            }
        }   
        if(positives+negatives==0){
            System.out.println("没有其他数字的输入,除了0");
        }else{
            System.out.println("正数的个数"+positives);
            System.out.println("负数的个数"+negatives);
            System.out.println("总和"+sum);
            System.out.println("平均值"+sum/(positives+negatives)); 
        }
    }
}

import java.util.Scanner;
class Demo03_12{
    /* 
    21  42
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16~21
    3 7
    */
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.输入两个数字
        System.out.print("请输入两个数字:");
        int n1=scanner.nextInt();
        int n2=scanner.nextInt();
        int gcd=1;
        for(int i=n1<n2?n1:n2;i>=1;i--){
            if(n1%i==0&&n2%i==0){
                gcd=i;
                break;
            }
        }
        System.out.println(gcd);

    }
}

/* 
120 2~120 ->2
60  2~60  ->2
30  2~30  ->2
15  2~15  ->3
5   2~5   ->5
1   
*/
import java.util.Scanner;
class Demo03_13{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num=scanner.nextInt();
        while(true){
            for(int i=2;i<=num;i++){
                if(num%i==0){
                    System.out.print(i+" ");
                    num=num/i;
                    break;
                }
            }
            if(num==1){
                break;
            }
        }
    }
}

 


 打印金字塔图案的题(3.14、3.16)(一般都利用绝对值来做)

 

 

/*
 4  3  2  1 2 3 4
-3 -2 -2  0 1 2 3
第4行 x∈[-3,3] y=|x|+1
第5行 x∈[-4,4] y=|x|+1
*/
import java.util.Scanner;
class Demo03_14{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入行数:");
        int line=scanner.nextInt();
        for(int i=1;i<=line;i++){
            for(int k=1;k<=(line-i);k++){
                if(line<10){
                    System.out.print("  ");
                }else{
                    System.out.print("   ");
                }
            }
            for(int x=-(i-1);x<=i-1;x++){
                if(line<10){
                    System.out.printf("%-2d",Math.abs(x)+1);
                }else{
                    System.out.printf("%-3d",Math.abs(x)+1);
                }
            }
            System.out.println();
        }
    }
}

 

class Demo03_15{
    public static void main(String[] args){
        for(int i=1;i<=6;i++){
            for(int j=1;j<=i;j++){
                System.out.print(j+" ");
            }
            System.out.println();
        }
        System.out.println("==========");
        for(int i=1;i<=6;i++){
            for(int j=1;j<=7-i;j++){
                System.out.print(j+" ");
            }
            System.out.println();
        }
        System.out.println("==========");
        for(int i=1;i<=6;i++){
            for(int k=1;k<=6-i;k++){
                System.out.print("  ");
            }
            for(int j=i;j>=1;j--){
                System.out.print(j+" ");
            }
            System.out.println();
        }
        System.out.println("==========");
        for(int i=1;i<=6;i++){
            for(int k=1;k<=i-1;k++){
                System.out.print("  ");
            }
            for(int j=1;j<=7-i;j++){
                System.out.print(j+" ");
            }
            System.out.println();
        }
    }
}

/*
第4行  
         1  2  4 8 4 2 1
         0  1  2 3 2 1 0
      x -3 -2 -1 0 1 2 3
第5行
        1 2 4 8 16 8 4 2 1
        0 1 2 3 4  3 2 1 0
    x  -4-3-2-1 0  1 2 3 4
*/
class Demo03_16{
    public static void main(String[] args){
        for(int i=1;i<=8;i++){
            for(int k=1;k<=8-i;k++){
                System.out.print("    ");
            }
            for(int x=-(i-1);x<=i-1;x++){
                System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
            }
            System.out.println();
        }
    }
}
/*
对于打印一些对称性的三角形图案或者是类似的问题
尽量向绝对值考虑
*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值