第三章 条件语句、循环与方法

版权声明:转载麻烦告知。 https://blog.csdn.net/qq_40064948/article/details/81740304

一、概述

流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:顺序结构、分支结构和循环结构

二、选择结构

2.1条件语句if

if分支结构分为三种:if、if else、if-if else。结构不同,优缺点不同。

2.1.1 if和else

Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
if( num % 2 == 0 ){
    System.out.println("您输入的"+num+",是一个偶数");
}else{
    System.out.println("您输入的"+num+",是一个奇数");
}

单/双分支语句:if(){};结构:()放入一个结果是true或false的值,在{}中写满足条件需要执行的代码。else{}的{]中写不满足条件需要执行的代码。

2.1.2 if -else if

if( num >=90 ){
    System.out.println("您得到的等级是:A级");
}else if( num >=80 ){
    System.out.println("您得到的等级是:B级");
}else if( num >=70 ){
    System.out.println("您得到的等级是:C级");
}else if( num >=60 ){
    System.out.println("您得到的等级是:D级");
}else{
    System.out.println("您得到的等级是:E级");
}

多分支语句:if(){}else if(){};else if可以翻译为否则如果,如果num>=90,否则如果num>=80,依次判断下去。当执行到满足条件的语句时,将不再执行后续条件语句。

2.2条件语句switch

int num2 = num / 10;
switch(num2){
    case 9: System.out.println("您得到的等级是:A级"); break;
    case 8: System.out.println("您得到的等级是:B级"); break;
    case 7: System.out.println("您得到的等级是:C级"); break;
    case 6: System.out.println("您得到的等级是:D级"); break;
    default: System.out.println("您得到的等级是:E级");
}

执行过程:首先拿表达式中值与case中的值逐个比较,如果case值相等,则执行对应语句,执行后会执行break结束比较,防穿透。如果没有break,会无条件的执行下面的表达式,如果没有case对应的值,会运行default下的语句。default语句可以写在任意位置,但是一般情况放在最后。default就是如果没有符合的case就执行它,default并不是必须的。

switch语句只能做整数、字符型、枚举、1.7版本之后可以做String类型的数据比较。

三、循环结构

循环三要素:循环变量赋初值,循环条件合理(boolean型的结果),循环变量要改变,不一定是加减,只要改变就行。循环结构都由如下四个结构组成:初始化、条件判断、循环体、迭代。

3.1while

Scanner sc = new Scanner(System.in);
System.out.println ("请输入一个正整数");
int num = sc.nextInt();
//先判断是否为正数
if(num >= 0){
    //判断是否为偶数
    if(num <= 2){
        System.out.println (num+"不是素数");
        return;
    }
    int i = 2;
    //定义i为2 输入的数字每次向i++求余,当余数为0时跳出whule循环
    while( num % i != 0 ){	
        i++;
    }
    //余数为0分为两种情况,一种是模到自己本身,即num==i此时便是素数
    //第二种情况是模到自己的因数,即能被除自身和1以外的数整除,不是素数。
    if(num == i ){
        System.out.println (num+"是素数");
    }else{
        System.out.println (num+"不是素数");
    }
}else{
    System.out.println ("不能为负数");
}

while是入口循环,先判定后执行,执行0-n次。在循环刚开始时,会计算一次表达式的值,弱条件为真,执行循环体。而对于后来每一次额外的循环,都会在开始前重新计算一次。语句中应有使循环趋向于结束的语句,否则会出现无限循环——“死”循环。

3.2do-while

    Scanner sc = new Scanner(System.in);
    //先声明一个char型变量,假定num2的值为y
    char num2 = 'y';
    //先执行,再判断
    //在这里num2即是初始值,也做了改变。
    do{
        System.out.println ("请输入一个整数");
        int num1 = sc.nextInt();
        System.out.println ("您输入的整数是:"+num1);
        System.out.println ("是否继续打印");
        num2 = sc.next().charAt(0);
    //进行判断
    }while( num2 == 'y' || num2 == 'Y');	

while:先判断,后执行。do-while先执行,后判断。

3.3for

public static void main(String[] args){
    //这里素数不可能是偶数,所以直接赋初始值为101,每次加2,保证i一直为奇数,这样可以减少循环次数
    for ( int i = 1 ; i <= 99 ; i+=2 ){
        //这里可以执行一个空循环,只要变量j逐一增加就可以了,在这里j需要定义在for循环之外,因为下面的if中还要用到j变量
        int j ;
        for( j = 2 ; (i % j != 0) && ( j <= 99) ; j++ ){
        }
        //无论是素数还是不是素数i%j都会得到一个0的答案,所以接下来要做的就是判断i%j等于0,属于哪一种情况,如果i==j说明i%的这个j是他本身,所以当i==j时,i为素数,打印出素数
        if( i == j ){
            System.out.println (i);
        }
    }
}

for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。

注意事项:for循环再执行条件测试后,先执行程序部分,再执行步进。在for语句的初始化部分声明的变量,其作用域为整个for循环体。“初始化”和“循环条件表达式”部分可以使用逗号来执行多个操作。如果三个部分都为空语句(分号不能省),相当于一个无限循环。

3.4跳转

public class Bbreak{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //break是结束包含它的循环,并且该循环的后续代码不再执行
        //一般配合条件语句使用,break语句可以改程序的控制流
        for( int i = 1 ; i <= 100 ; i++  ){
            System.out.println ("请输入一个数");
            int num = sc.nextInt();   
            if( num == -1 ){
                break;
            }
        }
        System.out.println ("输出1-10之间的不是3的倍数的数");
        //continue是结束包含它的当次循环,继续下一次。如果用break,就会只打印出1.2。
        for(int i = 1 ; i <= 10 ; i++){
            if( i % 3 == 0){
            continue;
        }
        System.out.print ( i +" " );
    }
}

3.4.1break

在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句还可用于多只语句switch中)

3.4.2continue

continue语句用在循环语句体重,用于种植某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

3.4.3return

return语句从当前方法退出,返回到调用该方法的语句处,并从该语句的下调语句处继续执行程序。返回语句的两种格式:return expression返回一个值给调用该方法的语句,返回值的数据类型必须和方法声明中的返回值类型一致或是精度低于声明的数据类型。return当方法声明中用void声明返回类型为空时,应使用这种返回类型,它不返回任何值。

四、方法

6.1什么是方法

封装在一起来执行操作语句的集合,用来完成某个功能操作,在某些语言中称为函数或者过程,特殊的方法main,程序执行的入口。不可能所有的功能都放到main中,需要定义其他方法完成指定功能,需要时调用方法即可。

6.2定义方法

[访问权限] [其他修饰符] 返回值类型 <方法名> ([形参列表]){

方法体

return 返回值;

}

[]是可有可无的 <>是必须要有的。方法内不能在写方法,方法是同级别的。形参-就是形式参数-类似于数学中的未知数。

上面案列是有返回值类型的。(求2数和的方法),z的返回值类型必须能与方法的类型匹配,如果z是int型,getSum是float型也是可以的,因为能自动转换。

6.3方法调用

int a = 10 ;
int b = 3 ;
//有返回值类型调用
int c = Bbreak.getSum(a,b);
System.out.print(c);
//无返回值类型调用
Welcome(name);

方法名其实就是方法在内存中的地址。方法调用的本质就是,通过名字找到方法地址,然后将实参赋给形参。形参的名可以和实参相同,因为作用域不同。

总结步骤:先写出方法,再在main方法中调用方法,将实参赋值给形参,实参在方法中运算出结果,方法返回值就是结果,再将返回值赋值给main方法中的变量,并打印。

方法里面可以调用方法,这是方法的嵌套使用。方法内不能定义方法。

实现两个整数的交换其实就是值传递,传副本,引用传递,传本身。

堆内存中,只有没有指针指向时,分配的内存空间就会死亡,在方法中一样,方法一用完,即里面的内存空间死亡。

写方法时一定要功能单一,一个方法只做一件事情。

6.3.1案列:用户随意输入一个数,判断是否是水仙花数。

public class NarNum {
    public static void main(String[] args) {
        System.out.println("请输入一个数:");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        if(NarNum.isFlawer(num)){
            System.out.println("Yes");
        }else{
            System.out.println("No");
        }
    }
    //判断是否是水仙花数
    private static boolean isFlawer(int num) {
        if( num == getSum(num) ){
            return true;
        }else{
            return false;
        }
    }
    //得到输入的num的和
    private static int getSum(int num) {
        int sum = 0;
        int byt = 0;
        int count = getCount(num);
        for(int i = 0 ; i < count ; i++ ){
            //每次循环temp都能取到num的最后一个数 再放入pow()里面求次幂。
            byt = num % 10;
            //sum=每次新的余数次幂加上一次的余数次幂 153 0+1^3=1 1+5^3=126 126+3^3=153
            sum = sum + pow(byt,count);
            //每次num/10  如果num=153 那么num会依次得到15 3 0 ;
            num = num / 10;
        }
        return sum;
    }
    //计算输入的num是几位数
    private static int getCount(int num) {
        int count = 1;
        while( num >= 10 ){
            num = num / 10;
            count++ ;
        }
        return count;
    }
    //计算num的数字次幂
    private static int pow(int byt, int count) {
        int temp = byt;
        for(int i = 1 ; i < count ; i++){
            byt = byt * temp ;
        }
        return byt;
    }
}

6.4方法重载

一个类中可以定义有相同的名字,单参数不同的多个方法,调用时,会根据不同的参数表选择对应的方法。

方法重载三大原则方法名相同,同一作用域,参数不同(数据不同,参数数量不同,参数顺序不同,都是参数不同)。方法重载跟方法的返回值类型没有任何关系。参数的顺序不同看数据类型而不是变量名。请勿将功能完全不一样的方法重载。重载也可能不是万能的。Println就是每天都在用的重载。

两个不同的对象,属性不同,但方法相同,属性属于对象的,方法是属于类的。下面是大概的内存图。


6.5递归算法

程序调用自身的编程技巧称为递归。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。

递归问题的特点:一个问题可被分解为若干层简单的子问题,子问题和其上层问题的解决方案一致,外层问题的解决依赖于子问题的解决。递归的有点:简单的程序,缺点:但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多。

递归的使用场合:任何可用递归解决的问题也能使用迭代解决。当递归方法可以更加自然地反映问题,并且易于理解和调试,并且不强调效率问题时,可以采用递归。在要求高性能的情况下尽量避免使用递归,递归即花时间又耗内存。

//阶乘
public class Work07{
    public static void main(String [] args){
        System.out.println("请输入0-10的一个整数");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int res = getNum(num);
        System.out.println(res);
    }
    public static int getNum(int num){
        if(num==1){
            return 1;
        }else{
            return num*getNum(num-1);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40064948/article/details/81740304
今日推荐