for循环的经典程序分析
来源:互联网 发布:公司加密软件 破解 编辑:程序博客网 时间:2024/06/10 00:21
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中的基础知识,互相结合得到更多的东西。
- for循环的经典程序分析
- 一道经典的for循环笔试题
- 经典错误:插入for循环后程序无法运行
- C语言程序的汇编分析3——for循环
- OpenMP程序 for 循环并行的效率
- for循环程序块的处理顺序
- 利用for循环实现程序的延时
- [IDA] 分析for循环的汇编代码
- 经典for循环面试题
- java经典for循环例子
- for循环程序练习
- java程序----for循环
- 关于for循环的几种经典案例
- 循环例子-for经典循环例子
- for in、经典for循环和EnumerateObjectsUsingBlock
- 小程序for循环对象
- 微信小程序wx:for循环
- 微信小程序循环:Wx:for
- 详述大端小端存储
- 计算机网络——传输层(TCP、UDP)
- iOS开发debug跟release版本log屏蔽方法
- 使用Android Studio运行Android程序,出现错误:Error:java.lang.UnsupportedClassVersionError: com/android/dx/comman
- 【杭电】HDU 1052 Tian Ji -- The Horse Racing
- for循环的经典程序分析
- 【NOIP2013提高组T5】花匠-O(n)横扫做法
- 详解Less运算符和函数
- 图像视频数据集网站
- 实现简单工厂(一)
- VB程序学习代码记录20160722(2)
- Mybatis的面向接口开发中的注意事项
- python DNS处理模块dnspython
- 关于JavaWeb如何实现用户类似站内信功能