课程回顾:
程序的结构:
分支结构:
1、if-else
格式:if(boolean类型表达式){代码块}[else if(boolean型表达式){代码块}……][else{代码块}]
//注意:if(boolean类型表达式){代码块}-else if(boolean型表达式){代码块}-else{代码块}:else语句可有可不有。
2、switch
格式:switch(表达式)
{
case 常量值1:代码块;break;
……
[default :代码块;break;]
}
表达式:byteshortcharintenumString
循环结构:
for语句:
格式:for(循环变量初始化;循环变量验证;循环变量值改变)
{
循环体
}
今日内容:
循环语句的分类:
1、当型
for语句
while语句
2、直到型
do/while语句
for语句:
格式:for(循环变量初始化;循环变量验证;循环变量值改变)
{
循环体
}
执行过程:先执行循环变量初始化,在验证循环变量,为true,则执行循环体,再执行循环变量值改变
接着验证循环变量,为true则继续
直到为false结束循环
For语句的三个表达式的省略情况:
class Test15
{
public static void main(String[] args)
{
//表达式1可以省略,但是循环变量需要提前声明并赋值
//int i=1;
/*for(;i<10;i++)
{
System.out.println(i);
}*/
//表达式3可以省略,但是循环变量的值的改变需要在循环体中进行
/*int i;
for(i=1;i<10;)
{
System.out.println(i);
i++;
}
System.out.println("循环结束之后:"+i);*/
//表达式2可以省略,但是相当于死循环,可以在循环内部使用break
/*for(int i=1;;i++)
{
System.out.println(i);
if(i==10)
{
break;
}
}*/
//for语句的三个表达式都可以省略,这时相当于死循环
//以下实现重要说10遍
int count=0;
for(int n1=1,n2=3;;n1++,n2+=n1)
{
System.out.println("我相信,我可以做到:"+n1+","+n2);
count++;
if(count==10)
{
break;
}
}
//Math.pow(a,b):计算指定数字的次幂的值,计算a的b次幂的结果
System.out.println(Math.pow(10,4));
/*
//等价于for(;;)
while(true)
{
System.out.println("我相信,我可以做到");
}*/
//System.out.println("我可以");
}
}
class Test06
{
public static void main(String[] args)
{
//控制行数的变化
for(int i=1;i<4;i++)
{
//控制每行的*的输出,*数量最多为行数
for(int j=1;j<=i;j++)
{
System.out.print("*");//输出*
}
//该行的*输出完成之后,进行换行
System.out.println();//换行
}
System.out.println("传说中的乘法口诀:");//换行
//控制行数的变化
for(int i=1;i<10;i++)
{
//控制每行的*的输出,*数量最多为行数
for(int j=1;j<=i;j++)
{
System.out.print(j+"*"+i+"="+i*j+" ");//输出*
}
//该行的*输出完成之后,进行换行
System.out.println();//换行
}
}
}
//输出以下图形
*****
****
***
**
*
class Test07
{
public static void main(String[] args)
{
for(int i=5;i>0;i--)
{
for(int j=i;j>0;j--)
{
System.out.print("*");
}
System.out.println();
}
}
}
//输出以下图形
*
***
*****
*******
*********
***********
*************
***************
*****************
class Test08
{
public static void main(String[] args)
{
int maxrows=10;
//控制行数的变化
for(int i=1;i<maxrows;i++)
{
//控制空格的打印
//随着行数的增加,空格数减少
for(int j=1;j<maxrows-i;j++)
{
System.out.print(" ");//输出空格
}
//控制*的打印
//随着行数的增加,*数每次增加2个
for(int n=1;n<=2*i-1;n++)
{
System.out.print("*");//输出*
}
//换行
System.out.println();
}
}
}
//1到10的阶乘累加和为:
class Test04
{
public static void main(String[] args)
{
long sum2=0;
String res="";
for(int i=1;i<=10;i++)//控制数字递增
{
int num=1;
//获取对应数字的阶乘值
for(int j=1;j<=i;j++)
{
num*=j;
}
sum2 +=num;
res +=num;
res+="!";
System.out.println(i+"的阶乘是:"+num);
if(i!=10)
{
res +="+";
}
}
System.out.println("1到10的阶乘累加和为:"+sum2);
System.out.println(res+"="+sum2);
}
}
while语句:
格式:while(boolean型表达式)
{
循环体;
}
执行过程:
先验证表达式,如果为true就执行循环体,接着验证表达式,为true则继续
如果表达式为false那么就终止循环
class Test01
{
public static void main(String[] args)
{
int num=1;
//使用while语句输出1-10的数字
while(num<11)
{
System.out.println(num);
num++;
}
//等同于上述代码,都是输出1-10的数字
int n=0;
while((++n)<11)
{
System.out.println(n);
}
//练习,请输出10-20的数字,要求倒序输出
//练习:使用while循环输出100以内的:1,4,7,10,13……,要求每行5个
}
}
class Test02
{
public static void main(String[] args)
{
//倒序输出
int num=20;
while(num>9)
{
System.out.println(num);
num--;
}
int n=1;//符合要求的数字
int count=0;//记录当前是第几个数字
while(n<101)//100以内的数字
{
System.out.print(n+" ");
n+=3;//每次增加3
count++;//累加计算第几个数字
if(count%5==0)//如果当前的个数为5的倍数就换行
{
System.out.println();//换行
}
}
}
}
class Test03
{
/*
有一根绳子总长1000米,每天剪断一半,问多少天绳子小于5米(不考虑小数)
*/
public static void main(String[] args)
{
int length=1000,day=0;
while(length>=5)//只要绳子大于等于5米,那么就可以剪断
{
length/=2;//剪断一半
day++;//累加计算天
}
System.out.println(day);
}
}
do/while语句:
格式:do{
循环体
}while(boolean型表达式);
执行过程:程序先执行循环体再进行表达式验证,如果为true则继续执行循环体,再验证表达式
直到表达式为false就结束循环
class Test05 //使用do/while实现20以内的偶数的和
{
public static void main(String[] args)
{
int num=0,sum=0;
double sum2=1;
do{
if(num%2==0)
{
sum+=num;
}
num++;
sum2*=num;
}while(num<21);
System.out.println("20以内的偶数的值:"+sum+",20的阶乘:"+sum2);
}
}
for:确定循环次数
while:不确定循环次数
do/while:要求循环体先执行
循环的嵌套:循环语句中可以再使用循环
在使用循环嵌套的时候,一定要理清思路,最好能够搞明白执行过程
特殊的循环控制:
break:结束循环(最近的)
continue:跳过/结束 某一次的循环
return:结束循环(所有循环)
标签:java允许对某行代码加上标记
格式:标识符 : 代码
可以和break一起使用,用来结束指定的循环
自己动手结合标签和continue使用,观察效果
class Test11
{
public static void main(String[] args)
{
for(int i=1;i<10;i++)
{
if(i==6)//如果为6
{
//continue;//跳过/结束 本次循环
break;//结束循环
}
//continue;
//break;
System.out.println(i);
}
//System.out.println("Hello World!");
}
}
/////
class Test13
{
public static void main(String[] args)
{
//对指定的循环加上标签/标记
outer:for(int i=1;i<5;i++)
{
for(int j=10;j<15;j++)
{
System.out.println(i+","+j);
if(j==12)
{
//break outer;//结束循环,结束指定标签的循环
//return;//等价于上述代码
//break;//结束当前的内循环
continue outer;//结束外层的本次循环
}
}
System.out.println(i);
}
}
}
public class Test14
{
/*计算素数*/
public static void main(String[] args)
{
//输出10以内的素数
/*
for(int i=2;i<101;i++)
{
boolean res=true;//记录当前数字是否为素数
for(int j=2;j<=i/2;j++)//循环验证是否还有其他约数
{
if(i%j==0)//是否可以被整除
{
res=false;//修改标识,
break;
}
}
if(res)
{
System.out.println(i);
}
}*/
outer:for(int i=2;i<11;i++)
{
for(int j=2;j<=i/2;j++)
{
if(i%j==0)
{
continue outer;
}
}
System.out.println(i);
}
}
}
//欢迎玩我们的数字求和小游戏
import java.util.Scanner;
public class Geam01
{
public static void main(String[] args)
{
System.out.println("欢迎玩我们的数字求和小游戏");
int base,count;//声明变量,分别用于记录输入的基数和个数
char isQuit;//记录是否退出,Y代表退出
Scanner sc=new Scanner(System.in);//创建键盘输入对象,
用于读取用于输入的数据
while(true)
{
System.out.println("请输入基数:");
base=sc.nextInt();//获取用户输入的基数
System.out.println("请输入个数:");
count=sc.nextInt();//获取用户输入的个数
String res="";//创建字符串变量,用于记录表达式
long sum=0;//记录总和
//循环个数
for(int i=1;i<=count;i++)
{
long num=0,pow=1;//创建变量,记录每个数
字,和倍数
//循环计算数字
for(int j=1;j<=i;j++)
{
num+=base*pow;//累加计算数字
pow*=10;//倍数是以10倍进行递增
}
sum+=num;//计算和
res+=num;//记录表达式
//如果不是最后一位数字,我们就加上+
if(i!=count)
{
res+="+";
}
}
System.out.println("您本次输入的基数:"+
base+"个数:"+count+
",结果为:"+res+"="+sum);
System.out.println("请选择:退出(Y),,继续请输
入其他");
isQuit=sc.next().charAt(0);//获取用户输入的字符
if(isQuit=='Y')//如果输入的是结束指令,那么就结
束循环
{
System.out.println("期待下次与你重逢");
break;//结束循环
}
}
}
}
面试:
跳过/跳出 本次/某次 循环---continue
结束/跳出 整个/全部 循环---break
素数(质数):只能被1和本身整除的数
练习:计算10以内的素数
步骤:
1、获取1-10的数字
2、验证每个数字是否为素数
素数的验证:当前的数字只能被1和本身整除
可以通过验证数字能否被其他数字整除
特殊的for循环:
1、表达式1可以省略,但是循环变量需要提前声明并赋值
2、表达式3可以省略,但是循环变量的值的改变需要在循环体中进行
3、表达式2可以省略,但是相当于死循环,可以在循环内部使用break
4、for语句的三个表达式都可以省略,这时相当于死循环
5、表达式1和表达式3可以使用,表达式,可以达到声明多个变量,或操作多个变量的值
例如:
for(int n1=0,n2=1;;n1+=2,n2+=n1)
{
}
循环的总结:
对同一问题,可以使用3种循环
一般来说,确定循环次数或者明确给出循环条件的,我们使用for语句
如果没有明确的循环次数一般选择while
如果要求必须先执行循环体那么我们选择do/while
切记:要避免死循环
小游戏:
2+22+222+2222
基数:2
个数:4
用户输入基数和个数,程序输出对应的结果:
2+22+222+2222=值
询问用户是否结束,如果继续,那么就继续
例如:基数输入:3,个数输入2
3+33
//Math.pow(a,b):计算指定数字的次幂的值,计算a的b次幂的结果
System.out.println(Math.pow(10,4));
步骤:
1、循环获取指定个数的数字
2、计算出每个数字
2=2
22=2+20
222=2+20+200
2222=2+20+200+2000
3、求和
行数 *数
* 1 1 1-1
** 2 2 1-2
*** 3 3 1-3
**** 4 4 1-4
***** 5 5 1-5
*****
****
***
**
*
行数 *数 空格数
* 1 1 3
*** 2 3 2
***** 3 5 1
******* 4 7 0
**********
*******
*****
***
*
有一根绳子总长1000米,每天剪断一半,问多少天绳子小于5米(不考虑小数)
练习:求1+2!+3!+...+10!的和(注意用long计算)
注:3!=1*2*3
步骤:
1、循环获取1-10的数字
2、分别计算每个数字的阶乘(循环计算)
图、画图1、for的执行过程
2、for嵌套的执行过程
3、do/while的执行过程
2:打印
* 行数1 星数1 空格4
** 2 2 3
*** 3 3 2
**** 4 4 1
***** 5 5 0
//
class zuoye02
{
public static void main(String[] args)
{
//用于控制行数
for(int i=1;i<=5;i++)
{
for(int j = 1;j<=5-i;j++)
{
System.out.print(" ");
}
for(int k =1;k<=i;k++)
{
System.out.print("*");
}
System.out.println();
}
}
}
3:
$$$$$$$$$$$
$$$$$$$$$
$$$$$$$
$$$$$
$$$
$
$$$
$$$$$
$$$$$$$
$$$$$$$$$
$$$$$$$$$$$$
class zuoye03
{
public static void main(String[] args)
{
for(int i=1;i<=6;i++)//控制行数
{
for(int k=1;k<i;k++)
{
System.out.print(" ");
}
for(int j=11;j>2*i-2;j--)
{
System.out.print("$");
}
System.out.println();
}
for(int t=1;t<=5;t++)//控制行数
{
for(int k=4;k>t-1;k--)
{
System.out.print(" ");
}
for(int j=1;j<=2*t+1;j++)
{
System.out.print("$");
}
System.out.println();
}
}
}
class zuoye033
{
public static void main(String[] args)
{
for(int i =1;i<=11;i++)
{
for(int j=1;j<6-Math.abs(6-i);j++)
{
System.out.print(" ");
}
for(int j=1;j<=2*Math.abs(6-i)+1;j++)
{
System.out.print("$");
}
System.out.println();
}
}
}
4:
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * *
* * * * *
* * * *
* * *
* *
*
*
自己发现,规律去实现
class zuoye04
{
public static void main(String[] args)
{
for(int i=1;i<=17;i++)
{
for(int j=1;j<=9-Math.abs(9-i);j++ )
{
System.out.print("*");
System.out.print(" ");
}
System.out.println();
}
}
}
5、计算:求1-3+5-7+ …… -99+101的值。
class zuoye05
{
public static void main(String[] args)
{
int sum=0;
int flag=1;
for(int i=1;i<=101;i+=2)
{
sum +=i*flag;
flag*=-1;
}
System.out.println(sum);
}
}
6、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。(不考虑小数)
a:2
b:1
1:2/1
2:3/2
3:5/3
4:8/5
a/b
(a+b)/a
2/1,3/2,5/3,8/5,
/**
int a=2,b=1;
int sum=0;
for(int i=1;i<=20;i++)
{
sum +=a/b;
a = a+b;
b = a-b;
}
System.out.println("有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和:"+sum);
*/
double sum=0;
int cnt=20;
int a=2,b=1,c=0;
while((cnt--)>0){
sum+=(double)a/b;
a=a+b;
b=a-b; //b存储原来的a
}
System.out.println(sum);
7、水仙花数:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,
其各个数字立方和等于该数本身。
例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。 //java.lang.Math.pow()
int c=0,d=0,e=0;
for(int j=100;j<1000;j++)
{
c = j/100;
d = j/10%10;
e = j%10;
if(j== c*c*c+d*d*d+e*e*e)
{
System.out.println("水仙花数为:"+j);
}
}