for循环的经典程序分析

1.单层for循环,利用for循环打印输出1~100之间的所有整数(最基础的)然后通过与if-else语句结合实现更多的功能。
可以看出利用for循环可以遍历整数

/*
    1. 输出从1到100之间所有的整数;(简单的单层for循环)**for循环遍历整数**
    2. 输出从1到100之间所有的奇数;(通过与if-else结合,有条件的输出语句)
    3. 输出从1到100之间所有不能被3整除的数;并输出这些整数的和;(通过增加条件,更合理的练习for循环与if语句结合)
*/
public class NumberFor {

    public static void main (String[] args) {
        //这里利用输出语句打印一个提示语句
        System.out.println("输出从1到100之间所有的整数;");
        //输出从1到100之间所有的整数;
        for (int i = 1; i < 100; i++) {
        /*
            i 为循环因子,根据题意i要初始化为1,i < 100,每个整数都要打印,因此迭代语句自增为1.
            程序执行1~100(没有100)共99次 次数:计算方法(100-1)
        */
            //循环体
            System.out.print(i + " ");
        }

        System.out.println("\n" + "输出从1到100之间所有的奇数;");
        //输出从1到100之间所有的奇数
        for (int i = 1; i < 100; i++) {
            //设置条件判断,有条件的输出循环
            if (i % 2 != 0) {
                System.out.print(i + " ");
            }
        }

        System.out.println("\n" + "输出从1到100之间所有不能被3整除的数;并输出这些整数的和");
        //输出从1到100之间所有不能被3整除的数;并输出这些整数的和
        //最后要输出整数的和,要提前声明一个保存和的变量
        int sum = 0;
        for (int i = 1; i < 100; i++) {
            if (i % 3 != 0) {
                //每次循环都进行判断,若真执行{}中语句
                System.out.print(i + " ");
                //将符合条件的i进行累加
                sum += i;
            }
        }
        System.out.println("\n" + "这些数的和为:" + sum);
    }
}

2.嵌套for循环
先利用for循环打印一个简单的矩形
矩形形式:

*****
*****
*****  每一行5个星星,共有3行

思路:若我们每次输出一行5个星星,我们循环3次就可以完成矩形

class LoopTest1 {
    public static void main(String[] args) {
        //可以称i为循环因子 需要打印3行,循环次数为3(0 1 2)在i = 3时不满足条件,结束循环。
        for (int i = 0; i < 3; i++) {
            //循环体,每次输出5个星星并换行
            System.out.println("*****");
        }
    }
}

深入思考,我们是不是也可以把每次输出5个星星这个语句转化成每次输出一个星星,循环输出5次然后构成循环。
思路:依旧用一个循环控制行数,因为每行都要输出5个星星,因此在i = 0时,它要执行一个循环输出*的循环。i = 1 i =2 都要这样,就得到下面这个嵌套循环程序

class LoopTest2{ 
    public static void main(String[] args) {
        //外循环控制行数(外循环的循环体是一个内循环)
        for (int i = 0; i < 3; j++) {
            //i :0~3 共3次
            //内循环控制列数,这个循环用来循环输出5个星星
            for (int j = 0; j < 5; i++) {
                //内循环循环体 j:0~5 共5次 每次打印一个星星
                //这里不要换行,因为在同一行上打印
                System.out.print("*");
            }
            //内循环执行完成后进行换行
            System.out.println();
        }
    }
}

综上:若是把LoopTest1中的i < 3 ,3改为n的话就可以打印输出n行
若是把LoopTest2中的j < 5,5改为m的话每行就可以打印输出5个星星,总结一下,可以把外层循环看做控制行数,内层循环控制列数。自己多做几个程序,多思考几次就可以体会到这句话真正的含义了。
那么打印一个n*m的矩形易如反掌,下面是打印n*m矩形的程序。

class LoopTest3{

    public static void main(String[] args) {
        //从命令行获取n,m
        int n = Integer.parseInt(args[0]);
        int m = Integer.parseInt(args[1]);
        //外循环控制行数
        for (int i = 0; i < n; i++) {
            //外循环控制列数
            for (int j = 0; j < m; j++) {
                System.out.print("*");
            }
            //内层循环执行完后,进行换行
            System.out.println();
        }
    }
}

熟练掌握for嵌套循环可以打印一个空心矩形,下面代码供参考。

/**
    打印n*m的空心矩形
*/
public class TestFor {

    public static void main(String[] args) {
        //从命令行获取n,m
        int n = Integer.parseInt(args[0]);
        int m = Integer.parseInt(args[1]);

        for (int i = 0; i < n; i++) {
            //将首尾行与其他行分开打印
            if (i == 0 || i == n-1) {
                //打印首尾行
                for (int j = 0; j < m; j++){
                    System.out.print("*");
                }
            }else {
                //打印其他行
                for (int j = 0; j < m; j++) {
                    //其他行,控制首列和尾列的打印
                    if(j == 0 || j == m-1) {
                        System.out.print("*");
                    }else {
                        System.out.print(" ");
                    }
                }
            }
            System.out.println();
        }
    }
}

3.嵌套循环深入

/*
分析过程:
    打印等腰三角形(高度为5)
    底边长度为9     1 3 5 7 9 
    空格数 i            *
        4  0    *       1    
        3  1   ***      3
        2  2  *****     5
        1  3 *******    7
        0  4*********   9

        * = 2i + 1      *与行数成正比     y=kx+b
     空格 = 4-i = 5-1-i 空格与行数成反比

*/
public class TestFor {

    public static void main(String[] args) {

        for(int i = 0; i < 5; i++) {
            //从0行开始
        //程序顺序执行,先打空格,空格与行数的关系 5-1-i//5-(i+1)
            //这里j因为不在同一个{}中,所以都可以用j
            for(int j = 0; j < (5 - 1) - i; j++) {
                System.out.print(" ");
            }
            //星星打印数1 3 5 7 9 与行数关系(2*行数)+1
            for (int j = 0; j < (2 * i) + 1; j++) {
                    System.out.print("*");
            }
            //换行
            System.out.println();
        }
    }
}
/*
    拓展一下,打印高度为n的等腰三角形
    实际只需要将外层循环5换成n就好
*/
class TestFor1 {
    public static void main(String[] args) {
        //从命令行获取参数
        int n = Integer.parseInt(args[0]);
        //设置外循环控制行数
        for (int i = 0; i < n; i++) {
            //设置内循环控制列中空格的打印
            for (int j = 0; j < n - 1 - i; j++) {
                System.out.print(" ");
            }
            //设置并列内循环控制列中*的打印
            for (int j = 0; j < (2 * i) + 1; j++) {
                System.out.print("*");
            }
            //换行
            System.out.println();
        }
    }
}

总结:要想使用好循环,首先要观察问题的规律,找出要循环的步骤,直接套用即可。多做循环的题体会循环。

4.嵌套循环中最高难度的for循环问题(打印质数的问题)

首先要了解质数的定义,质数:只能被1和其本身整除的数就是质数。1不是质数

从定义可以知道,若是我们正向考虑,问题极为的复杂,要先找出其所有能被整除的数,然后判断除了1和它本身以外还有其他的吗?若有不是质数,若没有,就是质数。
这样,我们反向考虑,问题就变得异常简单。

思路:首先我们要会遍历一个范围内的整数,这个利用简单的单层循环实现,其次对于每一个整数,我们先假设它是质数,然后利用反证法只要找出一个能被它整除的数就可以将它推翻。若找不出能被它整除的数,则它是质数。

/*
    打印100-200之间的所有质数,并统计个数
    这个题,共有两个问题。
    1.打印100~200所有质数
    2.统计质数的个数

    思路:利用反证法
        质数的个数统计应该和质数输出在同一个{}中
*/
class TestFor1 {
    public static void main(String[] args) {
        //设置计数器,用于统计质数的个数
        int count = 0;
        //利用for循环遍历100~200所有整数,不包括200.
        for (int i = 100; i < 200; i++) {
            //先假设i为质数,利用反证法 设置一个布尔变量,值为true时为质数,值为false时,不是质数
            boolean flag = true;
            //设置内循环对每个数进行判断
            //质数:只能被1和自身整除的数
            for (int j = 2; j < i; j++) {
                //设置条件判断,若存在可以被整除的数(除1和自身),修改flag为flase,只要存在一个就可以推翻。
                if(i % j == 0) {
                    flag = false;
                    break;  //此处加个break优化代码,只要找到一个,利用break结束当前循环的特性,直接结束内层循环。
                }
            }
            //内循环判断质数执行完毕,通过判断flag,打印输出质数,并统计个数
            if(flag) {
                //打印输出质数
                System.out.println(i + "是质数");
                //个数自增
                count++;
            }
        }
        //打印统计的个数
        System.out.println("质数的个数为:" + count);
    }
}

会打了上边的这个求质数的代码,来分析一个更深层次的问题。
打印1~100内的质数(只打印参数个质数就行,尽可能的优化代码)

/**
    利用continue,break简化质数的打印
    打印1~100之间的质数(要求打印参数个质数)
*/
class TestFor2 {

    public static void main(String[] args) {
        //从命令行获取参数
        int n = Integer.parseInt(args[0]);
        //设置计数器
        int count = 0;
        //循环遍历2~100(因为1不是质数),并设置标签l1
        l1:for (int i = 2; i < 100; i++) {
            //设置循环判断i能否被除1和其本身之外的数整除,默认认为i是质数
            //因为利用continue加标签所以不用使用再进行最后的真假判断
            l2:for (int j = 2; j < i; j++) {
                //设置条件判断,若i不是质数,利用continue l1 结束当次循环,(这里的当次循环指的是标签处外循环)
                // 进入下一次循环(外层循环的迭代语句)
                if (i % j == 0) {
                    continue l1; 
                }
            }
            //内循环结束打印输出质数
            System.out.println(i + "是质数");
            //计数器自增1
            count++;
            //判断输出的质数是否符合题意,若符合利用break结束循环(结束的是break所属的循环即外层循环)
            if(count == n){
                break;
            }
        }
    }
}

如果能解决掉上述问题,对for循环的理解和使用非常熟练。
利用for循环还可以打印直角三角形,倒直角,99乘法表等等。如果会了上边的for循环,这些问题手到擒来。重点是灵活运用java中的基础知识,互相结合得到更多的东西。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值