今天就是学习的第二天,开始了我们每天的敲代码之旅,不多废话了,下面开始吧。
一个普通的Java程序,例如我们昨天写的hello world,他就是一个顺序结构的流程,从上到下来进行执行的一个程序,这也是没有加别的控制流程语句的默认的执行流程
条件控制语句有if then、if then else、if then else if then else。
下面通过代码来进行讲解
class demo1 { public static void main(String[] args){ int a = 3; if(a == 3){ System.out.println("a的值和3相等"); } } }
这个代码中if的小括号中的值是Boolean值,如果是true,则进入下面的代码块
下面的代码则是if then else
class demo1 { public static void main(String[] args){ int a = 4; if(a == 3){ System.out.println("a的值和3相等"); }else{ System.out.println("a的值和3不相等"); } } }
下面的代码将讲述if then else if then else结构,输出中文的时候
class demo2 { public static void main(String[] args){ int a = 60; if(a<=100){ if(a>=80){ System.out.println("优秀"); }else if(a>=60){ System.out.println("良好"); }else{ System.out.println("不及格"); } } } }
大家可以自己写练习题练习一下if的这种结构,多多练习还是很简单的。
循环结构有三种:while(){ }、do{ }while();、for( ; ; ){ } 下面分开介绍这三种循环结构。
下面是一段while的代码
class demo3 { public static void main(String[] args){ int i = 0; while(i<5){ System.out.println("hello world"); i++; } } }
在while的小括号中的值是Boolean类型的值,不仅仅可以写比较的语句
和while比较相似,使用的过程也比较相似,但是有一点的区别,下面就写一下正常的一个do while循环(和上面的需求相同)
class demo4 { public static void main(String[] args){ int i = 0; do{ System.out.println("hello world"); i++; }while(i<5); } }
下面的代码显示了while和do while的区别
class demo5 { public static void main(String[] args){ int i = 0; do{ System.out.println("hello world"); i++; }while(i<0); } }
可以明显看出来,i并不满足while的条件,但是他还是执行了一次,说明do while是先执行一次之后在进行条件的判断,而while则是直接进行条件的判断,如果符合条件再进行执行。不过我觉得do while用起来不是很舒服。
下面直接放代码来看for的用处
class demo6 { public static void main(String[] args){ for(int i = 0;i < 5;i++){ System.out.println("hello world"); } } }
在for循环中有三部分,第一部分是变量的定义,第二部分是控制循环的循环次数,值是Boolean类型的,第三部分是自增或者自减,表示变量的变化。在for循环括号中,每一个部分都可以进行省略,但是要有相对应的内容,例如我的代码中int i = 0,这句话可以写在for循环前面。但是如果循环控制没有内容,或者一直是true的话,那就是变成了死循环了。
在循环中可以进行嵌套循环,下面通过一个例题的讲解来解释什么是嵌套循环,需求是打印下面的图形:
****
****
****
****
class demo7 { public static void main(String[] args){ for(int i = 0;i<4;i++){ for(int j = 0;j<4;j++){ //print方法输出的时候不进行换行 System.out.print("*"); } //这一行的意思是每次输出完一整行,然后要进行换行 System.out.println(); } } }
嵌套循环按照字面意思理解就是在循环中嵌套循环,也叫做多重循环,这些逻辑可以用画图来解释,或者用整体的思想来进行解释
1.创建一个空白项目并进行测试(不在演示)
2.先用四个语句进行输出一行数据
System.out.print("*"); System.out.print("*"); System.out.print("*"); System.out.print("*"); System.out.println();
3.发现上面的代码有重复代码,然后可以用循环来改进一下
for(int j = 0;j<4;j++){ System.out.print("*"); } System.out.println();
4.这样就写完了一行的代码,然后输出四行,代码如下
for(int j = 0;j<4;j++){ System.out.print("*"); } System.out.println(); for(int j = 0;j<4;j++){ System.out.print("*"); } System.out.println(); for(int j = 0;j<4;j++){ System.out.print("*"); } System.out.println(); for(int j = 0;j<4;j++){ System.out.print("*"); } System.out.println();
5.发现相同的代码又重复了,把3的代码当成一个整体放进另外一个循环中,让它循环执行里面的循环就行了,这样就出来了最后的代码
class demo7 { public static void main(String[] args){ for(int i = 0;i<4;i++){ for(int j = 0;j<4;j++){ //print方法输出的时候不进行换行 System.out.print("*"); } //这一行的意思是每次输出完一整行,然后要进行换行 System.out.println(); } } }
分支语句有三个,break,continue,return。他们都有相同的功能,终止功能,但是使用后的结果并不相同,下面分别来介绍三种语句;
他的作用是结束循环,代码如下:
class demo8 { public static void main(String[] args){ for(int i = 0;i<10;i++){ if(i==5){ break; } System.out.println(i); } System.out.println("郑州在下雨"); } }
这里可以看出来break只是终止了他的循环,不影响别的部分,这就是break
不多说了,直接放代码
class demo9 { public static void main(String[] args){ for(int i = 0;i<10;i++){ if(i==5){ continue; } System.out.println(i); } System.out.println("郑州在下雨"); } }
这就很明显了,continue是跳过这一次的循环
直接放代码
class demo10 { public static void main(String[] args){ for(int i = 0;i<10;i++){ if(i==5){ return; } System.out.println(i); } System.out.println("郑州在下雨"); } }
很明显,使用了return之后直接结束了当前的方法,当前的方法就是main方法,导致了后面的输出郑州在下雨的语句输出不来了。
需求:找到三位数的所有偶数,要求输出偶数的个数还有他们的总和
分析:
1.先创建空白项目并进行测试
2.分析需求
3.先想办法把三位数全部都找到
4.把每个数字都进行对2求余,如果余数为0则为偶数,如果不为0则是奇数
5.定义两个变量,一个存储数字和,一个存储数字的个数
代码如下
class demo011 { public static void main(String[] args){ //先定义数字的总和sum并且初始化 int sum = 0; //定义数字的个数 int n = 0; //循环找出所有的三位数 for(int i = 100;i<1000;i++){ //对于i进行求余,如果余数为0则为偶数 if(i%2 == 0){ //如果是偶数,则会进入此代码块,sum+=i是sum = sum + i的另一种写法 sum+=i; //数字的个数也自增 n++; } } //输出数字的总和 System.out.println(sum); //输出数字的个数 System.out.println(n); } }
需求:求出三位数的水仙花数字并且把他们一一输出。(水仙花数是这个数字的各个位数上的数字的立方和等于该数字本身,例如:153=1^3+ 5^3+ 3^3)
分析:
1.先创建空白项目并进行测试
2.需求分析
3.先找出所有的三位数
4.把数字的三个位数上的数字拆开
5.把这三个数字的立方和与原来的数字进行比较
6.如果相同则进行输出
代码如下:
class demo021 { public static void main(String[] args){ //这个用来存放个位数的数值 int g = 0; //这个用来存放十位数的数值 int s = 0; //这个用来存放百位数的数值 int b = 0; //这个用来存放上面三个数字的立方和 int sum = 0; //循环遍历所有的三位数字 for(int i = 100;i<1000;i++){ //提出来百位的数值 b = i / 100; //提出来十位的数值 s = (i - b * 100)/10; //提出来个位的数值 g = i - b * 100 - s * 10; //算出来三个数字的立方和 sum = b*b*b + s*s*s + g*g*g; //把sum和该数字进行比较 if(i==sum){ //相同则进行输出 System.out.println(i); } } } }
需求分析:打印出来九九乘法表
分析:
1.先创建一个空白项目并测试
2.分析这个需要嵌套循环来实现
3.外层的是右边的数字,内层循环是左边的数字
4.左边的数字需要小于等于右边的数字
代码如下:
class demo041 { public static void main(String[] args){ //这个是外层循环,控制右边的数字 for(int i = 1;i<10;i++){ //这个是内层循环,控制的左边的数字 for(int j = 1;j<=i;j++){ //输出一个式子,不换行的 System.out.print(j+"*"+i+"="+j*i+" "); } //一行输出完了之后在进行换行 System.out.println(); } } }
需求:找到100以内的所有质数
分析:
1.创建一个空白项目并进行测试
2.先遍历出2-100的所有数字
3.分析一下
4.质数的定义是要除了1和它本身都不能除尽,意思就是求余的结果不为0
5.可以定义一个开关来表示输出这个数字
6.在循环中写一个条件语句,如果求余结果为0,则开关变为false
代码如下:
class demo031 { public static void main(String[] args){ //遍历2-100的数字 for(int i = 2;i<100;i++){ //定义一个锁,开始为true int jishu = true; //遍历2-i的数字来让i求余 for(int j = 2;j<i;j++){ //如果i%j为0,则表示i不是质数 if(i%j==0){ //锁变为false jishu = false; } } //如果jishu为true,则表示除了1和它本身没有能除尽的,为质数 if(jishu){ //输出这个质数 System.out.println(i); } } } }
这里写我的另外一种写这个题目的思路,用集合来写的,初学者可能看不懂,不过我感觉我的这种想法可以节省一点空间
代码如下:
import java.util.ArrayList; class demo08 { public static void main(String[] args){ ArrayList<Integer> arr = new ArrayList(); arr.add(2); for(int i = 2;i<101;i++){ boolean suo = true; for(int j = 0;j<arr.size();j++){ if(i % arr.get(j)==0){ suo = false; break; } } if(suo){ arr.add(i); } } for(int i = 0;i<arr.size();i++){ System.out.println(arr.get(i)); } } }
这个用了ArrayList集合,只存储质数,先存储一个2,然后把2-100的数字以此执行下面的程序,对于ArrayList内的所有元素进行求余,如果有能除尽的,则锁为false,如果没有能除尽的则为质数,锁为true。并且把这个新质数加到ArrayList中。这样的话只用求余一下比这个数小的质数了,会稍微节省一点内存把,如果数字大了可能会加快一点速度。