循环结构
概念:通过某个条件,使一段代码周而复始的执行。
循环的组成部分:
初始部分:循环用以判断的变量
循环条件:决定是否继续循环的依据
循环操作:单次执行的逻辑代码或任务(一次循环要做的事情)
迭代部分:控制循环条件的增量
while循环
语法:
whlie(布尔表达式){
//逻辑代码(循环操作)
}
执行流程:
先对布尔表达式进行判断,结果为true,则执行逻辑代码。
本次执行完毕后,再次进行判断,结果仍旧为true,则再次执行逻辑代码。
直至布尔表达式的结果为false时,才会退出循环结构,执行后续代码。
基本结构:
public class TestWhile{
public static void main(String[]args){
//要求:循环打印10次HelloWorld
int i = 1;
//首次判断时,条件满足且条件没有发生改变,永远满足,造成死循环
while (i <= 10){
System.out.println("HelloWorld");
i++;//条件改变
}
System.out.println("程序结束");
}
}
while的特点
特点:首次即有入口条件,先判断、再执行,适用于循环次数明确的情况。
题:计算1+2+3+4...+99+100的总和
public class testWhile2{
public static void main(String[]args){
//1-100之间所有数字(100个数字)的和
/*
思路:
1.先拿到1~100之间的每个数字
2.将这100个数字进行相加求和
int i = 1;
int sun = 0;
//循环 改变i的值
while(i <=100){ //循环次数明确
sum = sum + i;//循环操作
i++;//迭代部分;循环操作的中间变量
}
*/
int i = 1;
int sum = 0;
while(i <= 100){
sum = sum + i;
i++;
}
System.out.println("总和为:"+ sum);//5050
}
}
题:计算1~100之间的所有偶数的和。
public class TestWhile3{
public static void main(String[]args){
//1~100之间所有偶数和
int i = 1;
int sum = 0;
while(i <=100){
if(i % 2 == 0){
sum = sum + i ;
}
i++;
}
System.out.println("偶数和是:" + sum);
}
}
do while
语法:
do{
代码逻辑(循环操作)
}whlie(布尔表达式);
执行流程:
先执行一次循环操作,再进行布尔表达式的判断。
如果结果为ture,则再执行循环操作。
如果结果为false,才会退出循环结构,执行后续代码。
应用场景:适用于循环次数不明确的情况。
do while的特点:
题:检查学生作业完成情况,输入教师评语,决定学生是否需要抄写代码。
import java.util.Scanner;
public class TestDoWhile2{
public static void main(String[]args){
//1.同学们先写一遍作业
//2.由老师检查(评语:y/n)
//3.根据检查的结果,决定是否需要重新抄写
Scanner input = new Scanner(System.in);
char answer;
do{
System.out.println("抄写一遍作业...");
System.out.println("请老师根据当此的完成情况输入评语:");
//评语
answer = input.next().charAt(0);
}while(answer != 'y');
System.out.println("作业已完成...");
}
}
for循环
for循环语法:
for(1.初始部分;2.循环条件;4.迭代部分){
3.循环操作
}
执行流程:
首次执行初始部分(仅一次)。
对布尔表达式进行判断,结果为true,则执行逻辑代码。
特点:
public class TestFor{
public static void main(String[]args){
//打印100遍HelloWorld
//while改为for,1.更换关键字 2.在布尔表达式前后各加一个";"
for(int i = 1;i<=100;i++){
System.out.println("HelloWorld"+i);
}
System.out.println("程序结束");
}
}
题:控制台输入整数n,计算n的阶乘(!n)。例:1*2*3...*n
import java.util.Scanner;
public class TestFor2{
public static void main(String[]args){
//阶乘 例如:5的阶乘等于1*2*3*4*5
Scanner input = new Scanner(System.in);
System.out.println("请输入一个需要计算阶乘的值:");
int target = input.nextInt();//接收一个目标值,计算该值的阶乘
int sum =1;//注意:int类型的sum,最多计算到12的阶乘,如果计算13的阶乘,会超过int的取值范围,不精确,可以改为long类型
for(int i = 1;i<=target; i++){
//相乘求积
sum = sum * i;
}
System.out.println("阶乘的积为:" + sum);
}
}
题:计算一个班级的五位同学的平均分
import java.util.Scanner;
public class TestFor3{
public static void main(String[]args){
//计算一个班的5位同学的平均分
Scanner input = new Scanner(System.in);
double sum = 0.0;
for(int i = 1; i<=5;i++){
System.out.println("请输入第"+ i + "位同学的成绩:");
double score = input.nextDouble();
sum = sum + score;//把每一位同学的成绩加入到sum中
}
//计算总分与平均分
double avg = sum / 5;
System.out.println("五位同学的平均分为:"+ avg);
}
}
流程控制语句:
break: 终止、跳出switch、以及所有的循环结构。
continue:用于跳出当前循环的当次执行,进入下一个循环。
注意:
break:只能用于结束所在循环,或者结束所在switch分支的执行。
continue:只能在循环中进行使用。
public class TestBreak{
public static void main(String[]args){
//break的基本应用
for(int i =1; i<=10;i++){
if(i == 5){
break;//跳出整个循环
}
System.out.println("当前次数:"+1);
}
System.out.print("程序结束");
}
}
import java.util.Scanner;
public class TestBreak2{
public static void main(String[]args){
Scanner input = new Scanner(System.in);
double sum =0.0;
int i =1;
for(;i<=5;i++){
System.out.println("请输入第" + i + "位同学的成绩:");
double score = input.nextDouble();//如果录入学生的成绩是非法数据,则所有成绩作废
if(score < 0 || score > 100){
//非法数据
break;
}
sum = sum + score;
}
if(i==6){
double avg = sum / 5;
System.out.println("5位同学的平均分位:" + avg);
}else{
System.out.println("输入有误,请重新运行程序,并输入成绩!");
}
}
}
continue:结束本次,进入下一次循环。
题:
import java.util.Scanner;
public class TestGuess{
public static void main(String[]args){
Scanner input = new Scanner(System.in);
//人机猜拳(1.剪刀、2.石头、3.布)
/*
1.先完成可以比较一次的版本(没有循环,只有电脑获得一个随机数、玩家输入一个,多重if)
2.固定循环3次
3.双方谁率先达到连胜2局,则退出整个循环,break(添加2个计数器)
4.平局,不计算总局数(平局,continue,跳过写在最后的i++)
*/
int computerCount =0;//电脑的获胜次数
int playerCount = 0; //玩家的获胜次数
for(int i =1; i<=3;){
//随机产生1、2、3的整数
java.util.Random random = new java.util.Random();
int computer = random.nextInt(3) + 1;//random.nextInt(3)表示随机获得0、1、2;追加之后就变为了1、2、3
System.out.println("请玩家输入数字(1.剪刀、2.石头、3.布)");
int player = input.nextInt();
//比较猜拳
if(computer == player){ //平局
System.out.println("平局,再接再厉!");
continue//不加;
}else if((player==1 && computer == 3) || (player == 2 && computer == 1) ||(player == 3 && computer ==2)){ //玩家胜
System.out.println("恭喜玩家胜利");
playerCount++;//玩家胜率+1
}else{
System.out.println("跟我斗,再练100年吧");
computerCount++;//电脑胜率+1
}
//判断双方是否已经存在连胜2局的情况
if(playerCount == 2 ||computerCount == 2){
break;
}
i++;
}
System.out.println("程序结束");
}
}
典型的死循环:
for( ; true ; ){
}
嵌套循环
概念:在一个完整的循环结构中,嵌套另一个完整的循环结构。
案例:需求:打印3行5颗星。
public class TestNested1{
public static void main(String[]args){
//打印3行5颗星
/*
//1.在一行中打印5颗星
for(int j = 1; j <=5;j++){
System.out.print("*");
}
//2.打印3行(执行3次)
for(int i = 1;i <=3;i++){
}
*/
//将2步进行整合
for(int i = 1;i <=3;i++){ //外层控制行数
for(int j = 1; j <=5;j++){ // 内层控制列数
System.out.print("*");
}
System.out.println();
}
}
}
案例:需求: 计算三个班的5位同学的平均成绩
import java.util.Scanner;
public class TestNested2{
public static void main(String[]args){
Scanner input = new Scanner(System.in);
//1.计算一个班5位同学的平均成绩
/*
double sum = 0.0;
for(int j=1;j <=5;j++){
System.out.println("请输入第"+ j + "位同学的成绩:");
double score = input.nextDouble();
sum = sum + score; // sum += score;
}
double avg = sum / 5;
System.out.println("平均分是:" + avg);
//2.计算三个班5位同学的平均成绩
for(int i = 1; i <=3;i++){ // 外层控制的循环次数
}
*/
//整合:
for(int i = 1; i <=3;i++){ //循环次数
//单次的循环操作
double sum = 0.0;
for(int j=1;j <=5;j++){
System.out.println("请输入第"+ j + "位同学的成绩:");
double score = input.nextDouble();
sum = sum + score; // sum += score;
}
double avg = sum / 5;
System.out.println("平均分是:" + avg);
}
}
}
嵌套循环案例:
public class TestNested3{
public static void main(String[]args){
//*
//**
//***
for(int i = 1;i <=3;i++){
for(int j = 1; j <=i;j++){ //内层的条件,通过外层i的递增,不断地发生变化
System.out.print("*");
}
System.out.println();
}
}
}
随机数Random类
1.Random随机数类生成需要几步,具体是什么样的?
导包:import Java.util.Random;
Random r = new Random();
int number = r.nextInt(10);
2.Random随机数如何生成65-91之间的随机数字?
65 - 91 => (0-26) + 65
int number = r.nextInt(27)+65;
import java.util.Random;
public class RannerDemo1{
public static void main(String[]args){
//目标:学会使用Java提供的随机数类Random
//1.导包
//2、创建随机数对象
Random r = new Random();
//3.调用nextInt功能(方法)可以返回一个整型的随机数
for(int i =0;i<10;i++){
int data = r.nextInt( 10 );//0-9 不包含10(包前不包后)
System.out.println(data);
}
System.out.println("-------------------------------");
//1-10 ==> -1 ==> (0-9)+1
int data = r.nextInt(10) +1;
System.out.println(data);
System.out.println("-------------------------------");
//3-17 ==> -3 ==> (0-14) + 3
for(int j =1;j<=20;j++){
int data1 = r.nextInt(15) +3;
System.out.println(data1);
}
}
}
import java.util.Random;
import java.util.Scanner;
public class TestRandom2{
public static void main(String[]args){
/*
需求:随机生成一个1-100之间的数据,提示用户猜测,
猜大提示过大,猜小提示过小,直到猜中结束游戏;
*/
//1.随机生成一个1-100之间的数据
Random r = new Random();
int luckNumber = r.nextInt(100) + 1;
//2.使用一个死循环让用户不断地猜测,并给出提示
Scanner sc = new Scanner(System.in);
while(true){
//让用户输入数据猜测
System.out.println("请您输入猜测的数据(1-100):");
int guessNumber = sc.nextInt();
//3.判断这个猜测的号码与幸运号码的大小情况
if(guessNumber > luckNumber){
System.out.println("您猜测的数据过大~");
}else if(guessNumber < luckNumber){
System.out.println("您猜测的数据过小~");
}else{
System.out.println("恭喜您猜中了");
break;
}
}
}
}