流程控制语句结构:
1、顺序结构:从上往下,没什么好说的
2、分支结构 if else switch...case
3、循环结构:重复执行某些代码时
循环结构
1、for循环
2、while循环
3、do...while循环
4、foreach增强循环(后面再讲)*/
语法
1、语法结构
形式一:
for(;;){
需要重复执行的语句(换句话说,不需要重复执行的语句,就不要放到{}中
}
形式二:
for(循环变量初始化表达式①; 循环条件表达式②; 循环变量迭代表达式③){
循环体语句④:需要重复执行的语句
}
实例,如果我们写一个死循环怎么写?
//【注意】这是错误的写法,不符合语法
/*
for(1>0){
System.out.println("你真厉害");
}
//正确写法如下
for(;;){
System.out.println("你真厉害");
}
猜一猜
练习:用for循环求1-100的和
练习:用for循环求1-100的和
错误写法:
因为0不是偶数,没必要从0开始
正确写法
//---------------------------------------------------------------------
/*
(二)while循环
语法格式:
while(循环条件){
循环体语句块
}
执行过程:
(1)先判断循环条件
(2)如果循环条件成立,那么就执行循环体语句,再回到(1)
如果循环条件不成立,那么就结束while循环
仔细分析,仍然有四个要素:
(1)循环变量的初始化,例如:int i = 1;
(2)循环条件,例如:i<=100
(3)循环体语句,例如: sum+=i;
(4)迭代语句,例如:i++
结论:
各种循环之间是可以互相替换的,只不过,在某些场景,那么某一中循环更合适(可读性方面)
for循环一般用于:次数比较明显,以及后面数组等遍历
while循环一般用于:条件比较明显,次数不太明显*/
//实例1、求1-100的和
int i=1;
int sum=0;
while(i<=100){
sum+=i;
i++;
}
System.out.println(sum);
//----------------------------------------------------------------
//do...while 循环
/*
语法结构:
do{
循环体语句块:需要重复的代码
}while(循环条件);
*/
/*
执行过程:
(1)先执行一次循环体语句块
(2)然后再判断条件,看是否继续下一次
(3)如果条件成立,再次执行循环体语句块;然后回到(2)
如果条件不成立,直接结束do...while
do...while循环与for和while的最大区别:它的循环体语句块是至少执行一次。
*/
//练习
/*
随机生成一个100以内的整数,猜数字游戏
从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,
并统计一共猜了多少次*/
int randNum=(int)(Math.random()*100);//0-100之间 默认是0-1 所以乘以100,转成int是为了去掉小数
//做法,普通生成随机数的方式
java.util.Scanner input=new java.util.Scanner(System.in);
int num;//挪到do() 上面 ,提升作用域
int count=0; //统计次数
do{
System.out.println("猜数(范围[0,100])");
num=input.nextInt();
count++;//输入一次,就代表猜了一次
if(num>randNum){
System.out.println("大了");
}else if(num<randNum){
System.out.println("小了");
}else{
System.out.println("猜对了");
}
}while(num!=randNum);//没有猜对,就一直猜
System.out.println("一共猜了:"+count+"次, "+"随机数是"+randNum);
---------------------------------------------------------------------
另外一种生成随机数的方式 这一种更容易理解
在Java的核心类库中,除了在Math类中提供了random()来产生随机数,
还在java.util.Random类中也提供产生随机数的方法。
//实例
//准备工具
java.util.Random tools=new java.util.Random();
//用工具获取随机数
int num=tools.nextInt();
System.out.println("随机整数:"+num);
double d=tools.nextDouble();
System.out.println("随机小数:"+d);
//用工具获取一定范围内的随机数值
int rangeNum=tools.nextInt(10); //表示[0,10]
System.out.println("随[0,10]的整数:"+rangeNum);
//---break-----------------------------------------------
/*
break:
(1)用于switch..case
作用:结束switch
(2)用于循环结构
作用:结束当前循环
结论:结束一个循环有两种情况(1)循环条件不满足(2)遇到了break等中断
*/
//实例:从键盘输入整数,输入0结束,统计输入的正数、负数的个数。
//做法
//获取键盘输入
java.util.Scanner input=new java.util.Scanner(System.in);
int zhengshu=0;
int fushu=0;
while(true){
System.out.println("请输入整数,输入0结束,我们将统计输入的正数、负数的个数");
int userInput=input.nextInt();
if(userInput>0){
zhengshu++;
}else if(userInput<0){
fushu++;
}else{
break;//退出while循环
}
}
System.out.println("您输入的正数一共有"+zhengshu+"个
"+"您输入的正数一共有"+fushu+"个 ");
//---------------------------------------------------------------------------------------------
continue:继续
只能用于循环结构
作用:提前结束本次循环,继续下一次循环
*/
//实例 打印 1-100的偶数
for(int i=1;i<=100;i++){
if(i%2!=0){
continue;
}
System.out.println(i);
}
/*
7、输入两个正整数m和n,求其最大公约数和最小公倍数
*/
class Test14_Exer7{
public static void main(String[] args){
//输入两个正整数m和n
java.util.Scanner input = new java.util.Scanner(System.in);
int m;
while(true){
System.out.print("请输入第一个正整数m的值:");
m = input.nextInt();
if(m<=0){
System.out.println(m + "不是正整数,请重写输入!");
}else{
break;
}
}
int n;
while(true){
System.out.print("请输入第一个正整数n的值:");
n = input.nextInt();
if(n<=0){
System.out.println(n + "不是正整数,请重写输入!");
}else{
break;
}
}
System.out.println("两个正整数:" + m + "," + n);
-值得细品的练习--------------------------------------------------------------------------------------------
//求m和n的最大公约数和最小公倍数
/*
1、概念
公约数:能够把m和n都整除,就是它俩的公约数
例如:6和9,公约数:1,3
9和18,公约数:1,3,9
5和13,公约数:1
公倍数:能够被m和n都整除的,就是它俩的公倍数
例如:6和9,公倍数:18,36....
9和18,公倍数:18,36...
5和13,公倍数:65,....
2、如何找最大公约数
例如:6和9
从6开始,9%6==0? 6%6==0?
9%5==0? 6%5==0?
9%4==0? 6%4==0?
9%3==0? 6%3==0? binggou找到了 结束查找
例如:9和18
从9开始 9%9==0? 18%9==0? binggou找到了 结束查找
例如:5和13
从5开始 5%5==? 13%5==0?
5%4==? 13%4==0?
5%3==? 13%3==0?
5%2==? 13%2==0?
5%1==? 13%1==0? binggou找到了 结束查找
其实只要找到5的平方根就可以了
*/
//第一步:找出m和n中最大值和最小值
int max = m>=n ? m : n;
int min = m<n ? m : n;
//第二步:从小的开始查找
//这里的1也可以修改为min的平方根
int maxYue = 1;
for(int i=min; i>=1; i--){.........................
//看i是否能够同时把m和n都整除
if(m%i==0 && n%i==0){
maxYue = i;
break;
}
}
System.out.println(maxYue +"是" + m + "和" + n + "的最大公约数");
//最小公倍数 = m*n / 最大公约数
//System.out.println(m*n/maxYue +"是" + m + "和" + n + "的最小公倍数");
//如果不知道这个公式
//从max开始找,一直找到m*n
for(int i=max; i<=m*n; i++){
if(i%m==0 && i%n==0){
System.out.println(i +"是" + m + "和" + n + "的最小公倍数");
break;
//Test15_NestLoop循环嵌套------------------------------------------------------------------
/*
循环的嵌套:
执行过程:外循环循环一次,内循环整个循环一轮
例如:
*****
*****
*****
*****
*/
//分析(1)连续打印5颗*(2)换行
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
System.out.print("*");
}
System.out.println();
}
System.out.print("*");
--------------------------------------------------------------------
循环嵌套:
5、输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
例如: 153 = 1*1*1 + 5*5*5 + 3*3*3
*/
//分析
//所谓水仙花数是指一个3位数==>[100,999]
//百位:1-9
//十位:0-9
//个位:0-9
/*
当bai=1, shi会从0变到9整个来一轮
当shi=0,ge会从0变到9整个来一轮
*/
for(int bai=1;bai<=9;bai++){
for(int shi=0;shi<=9;shi++){
for(int ge=0;ge<=9;ge++){
if(ge*ge*ge+shi*shi*shi+bai*bai*bai==bai*100+shi*10+ge){
System.out.println(bai*100+shi*10+ge);
//--------------------------------------------------------------------------
//out就是标签名称,和变量名一样命名规则,规范
//标签名后面加:
//out是个标号。是指break时候跳出当前循环并跳出标号所指的循环
for(int i=1;i<=5;i++){
out:for(int j=1;j<=5;j++){
System.out.print("* ");
if(i==j){
break out;
}
}
System.out.println();
}
}
}