今天就是学习的第二天,开始了我们每天的敲代码之旅,不多废话了,下面开始吧。
流程控制语句
顺序流程
一个普通的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
下面是一段while的代码
class demo3
{
public static void main(String[] args){
int i = 0;
while(i<5){
System.out.println("hello world");
i++;
}
}
}
在while的小括号中的值是Boolean类型的值,不仅仅可以写比较的语句
do … while
和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
下面直接放代码来看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。他们都有相同的功能,终止功能,但是使用后的结果并不相同,下面分别来介绍三种语句;
break
他的作用是结束循环,代码如下:
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
continue
不多说了,直接放代码
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是跳过这一次的循环
return
直接放代码
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
boolean 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中。这样的话只用求余一下比这个数小的质数了,会稍微节省一点内存把,如果数字大了可能会加快一点速度。