【Java学习笔记】14 - 多重循环控制(重点,难点)、(ptrintf函数)、跳转控制语句(break,continue,return),以及作业练习

目录

一、多重循环控制

1.基本介绍       

练习

练习

二、跳转控制语句-break

示例

注意事项和细节说明

示例 标签

练习 

三、跳转控制语句-continue

1.基本介绍

示例

四、控制语句return

五、本章作业

1.个人作业

1.代码改进

        输出结果同上

2.个人作业

3.个人作业

4.个人作业

4.代码改进

5.个人作业

6.个人作业

6.代码改进

7.个人作业

7.代码改进

8.个人作业

8.代码改进

9.个人作业

9.代码改进


一、多重循环控制

1.基本介绍       

        1)将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do...while均可以作为外层循环和内层循环。(建议一般使用两层,最多不要超过三层,否则代码的可读性会很差)

        2)实质上,嵌套循环就是把内层循环当成外层循环的循环体(语句块)。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。

        3)设外层的循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次

        示例      

public class MultpleFor{
	public static void main(String[] args){
		for(int i = 0;i < 2;i++){
			for(int j = 0;j < 3;j++){
				System.out.println("i= " + i + "j= " + j);
			}
		}
    }
}

                

        通过示例可以明显的看出,只有在内层循环结束后,外层的一次循环才会结束跳出开始第二次循环。即一共运行6次,外层两次,内层三次。为什么是0 1 2 呢,因为在该语句中,j++的执行顺序很低,内部语句块跑完之后才会执行自增。

练习

                

1)

//分析,1.学生成绩的输入需要for循环依次重复五次,然后存入变量中,
//不用记录每个学生的成绩,
//2.然后计算和数和平均分,还有班级平均分
import java.util.Scanner;
public class MultpleForExercise{
	public static void main(String[] args){
		// int a1,a2,a3,a4,a5 = 0;
		// int b1,b2,b3,b4,b5 = 0;
		// int c1,c2,c3,c4,c5 = 0; 
		//目前只是想到用数组存进去,单个变量不会存
		double count = 0;				
		double classSum = 0;
		Scanner myScanner = new Scanner(System.in);
		for(int j = 1;j <= 3;j++){
			double sum = 0;
			for(int i = 1;i <= 5;i++){
				System.out.println("请输入第"+ j +"个班级,第" + i 
					+ "个学生的成绩" );
				count = myScanner.nextDouble();
				sum += count;

				
			}
			classSum += sum;
			System.out.println("学生总分=" + sum);
			System.out.println("学生平均分=" + (sum / 5.0));	
    	}
    	System.out.println("所有班级总分=" + classSum);	
    	System.out.println("所有班级平均分=" + (classSum / 5.0));	
	}
}

                

2)

//
import java.util.Scanner;
public class MultpleForExercise01{
	public static void main(String[] args){
		double count = 0;	
		int passNumber = 0;
		Scanner myScanner = new Scanner(System.in);
		for(int j = 1;j <= 3;j++){
			for(int i = 1;i <= 5;i++){
				System.out.println("请输入第"+ j +"个班级,第" + i 
					+ "个学生的成绩" );
				count = myScanner.nextDouble();
				if(count >= 60.0){//最内层循环加一个if判断即可
					passNumber++;
				}
			}
    	}
    	System.out.println("及格人数=" + passNumber);		
	}
}

                

3)

//九九乘法表,使用两个多重循环,i = 1 ,内层j = 1 都依次到9
public class MultpleForExercise02{
	public static void main(String[] args){
		int mult = 0;
		for(int i = 1;i <= 9;i++){
			System.out.println();
			for(int j = 1;j <= i;j++){
				// System.out.println(j + " * " + i + " = " + (mult = i * j));
                System.out.printf("%d*%d=%-6d", j, i, i * j);//printf和println的区别
			}
		}
	}
}

      

          该题使用了printf函数,对于printf和println的区别,在JAVA中,printf和println都是输出语句的方法,区别在于printf可以按照指定格式输出数据,而println则会在输出数据后自动换行,可以通过printf(“%d”,i);来指定输出格式,而使用println(x)则会在后面自动加上换行符,对于%d的几个区别,%2d会在输出数前补两个空格,例如i=   5,而%-2d会在输出后补两个空格 例如i-5   ,而%03d则是在输出前在数前补0如i=0005。

两个示例代码,

public class PrintfAndPrintln{
	public static void main(String[] args){
		String name = "Jack";
		int age = 18;
		Double score = 89.50;
		System.out.printf("姓名:%s,年龄:%d,成绩:%.2f\n",name,age,score);
		System.out.println("姓名:"+ name + ",年龄:" + age + ",成绩:" + score);
	}
}

练习

//和乘法表一样,先试试打印靠一边的金字塔
import java.util.Scanner;
public class Starts{
	public static void main(String[] args){
		int totalLevel = 0;	
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入金字塔层数");
		totalLevel = myScanner.nextInt();
		for(int i = 1;i <= totalLevel;i++){
			System.out.println("");
			for(int j = 1;j <= i;j++){
				System.out.printf("*");
			}
    	}	
	}
}

                

//接下来思考如何打印出13579...形式考虑为(i - 1) * 2 + 1
for(int j = 1;j <= ((i - 1) * 2 + 1) ;j++){
    System.out.printf("*");

                

//砂玻了,其实就是层数totalLevel - i,就是空的。右边的空都不用考虑
            for(int k = 1;k <= totalLevel - i;k++){
				System.out.printf(" ");
			}

                 

import java.util.Scanner;
public class Starts{
	public static void main(String[] args){
		int totalLevel = 0;	
		int empty = 0;
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入金字塔层数");
		totalLevel = myScanner.nextInt();
		for(int i = 1;i <= totalLevel;i++){ //外层的i负责层数
			System.out.println();//每一次内层结束后换行
			for(int k = 1;k <= totalLevel - i;k++){
//这个k代表占位空的,每一层都会有 层数-以运行层数的空位
				System.out.printf(" ");
			}
			if (i < totalLevel) {//为了实现最后一层全为符号,判断i层数是否到预设层数
//若没到,执行镂空的算法
				for(int j = 1;j <= ((i - 1) * 2 + 1) ;j++){//循环个数到1 3 5 7 9
					if(j == 1 || j == ((i - 1) * 2 + 1)){//如果是一层的最开始和最后一个
						System.out.printf("*");//执行符号
					}
					else {
						System.out.printf(" ");//否则占空
					}
				}
			}
			else {//到达设定的最后一层,循环输出符号
				for(int j = 1;j <= (i - 1) * 2 + 1;j++){
					System.out.printf("*");
				}
			}
    	}	
	}
}

                

二、跳转控制语句-break

                

Math.random();//随机生成0-1 (不包含)内的随机数
System.out.println((int)(Math.random() * 100) + 1); //此时返回的就是1-100的随机数
public class BreakControl{
	public static void main(String[] args){
		int num = 99;
		for(int i = 0;i <= 100;i++){
			int k = (int)(Math.random() * 100) + 1;
			System.out.println(k);
			if(k == num){
				System.out.println("Find=" + k);
				break;
			}
		}
	}
}

                

示例

        

public class Break01{
	public static void main(String[] args){
		for(int i = 0;i < 10;i++){
			if(i == 3){
				break;//退出for循环,提前结束for循环 即为3时退出不打印
			}
			System.out.println("ok" + i);
		}
	}
}

注意事项和细节说明

        

示例 标签

public class BreakDetail{
	public static void main(String[] args){
		label1:
		for(int j = 0;j < 4;j++){
			label2:
			for(int i = 0;i < 10;i++){
				if(i == 2){
					// break;
					//默认跳出最近的循环体,就是label2,但这是外层循环
					//仍然在执行,所以j= 0 i= 0 1 会重复回到j = 1 i = 0 1
					//直到j = 3
					break label1;//会跳出label1循环体,即只输出0 1
				}
				System.out.println("i=" + i);
			}	
		}
	}
}

练习 

                

1)

//1)1-100以内的数求和,求出当和第一次大于20的当前数(for + break)
public class BreakExercise{
	public static void main(String[] args){
		int k = 1;
		int sum = 0;
		for (;k <= 100;k++){
			sum += k;
			System.out.printf("%-2d",k);
			if(sum >= 20){
				System.out.printf("他们的和为sum=%d\n",sum);
				break;
			}
		}
	}
}

2)

import java.util.Scanner;
public class BreakExercise01{
	public static void main(String[] args){
		int k = 1;
		String name = "";
		String passWord = "";
		int time = 3;
		Scanner myScanner = new Scanner(System.in);
		for (;k <= time;k++){
			System.out.println("请输入用户名");
			name = myScanner.next();
			System.out.println("请输入密码");
			passWord = myScanner.next();
			// System.out.println(name + passWord);
			//if(name == "顶针" && passWord == "666"){//需要使用equals,这样单纯==无法比较
			//if(name.equals("顶针") && passWord.equals("666"))//也可以用第二种写法
			if("顶针".equals(name) && "666".equals(passWord)){//推荐用这种写法,可以避免空指针
				System.out.println("允许访问");
				break;
			}
			else if (k < time) {
				System.out.println("密码错误,请重新输入,你还有" + (time - k)+ "次机会");
			}
			else{
				System.out.println("验证错误,已锁定");
			}
		}

	}
}

三、跳转控制语句-continue

1.基本介绍

        

1)continue语句用于结束本次循环,继续下一次循环(指的是不执行语句块,但仍要执行循环迭代)

2)continue语句出现在多层嵌套的循环语句体重,可以通过标签指明要调过的是哪一层循环,这个和前面的标签的使用规则一样

基本语法

{
    ...
    continue;
    ...

}

示例

        

public class Continue01{
	public static void main(String[] args){
		int i = 1;//此时内存里 i = 1
		while(i <= 4){//此时小于4成立
			i++;// i += 1
			if(i == 2){//此时i = 2,执行if判断
				continue;//执行,直接跳回到while i <= 4
			}
			System.out.println("i=" + i);//i = 2时的无法执行到此,但是i = 3 、 = 4 、 = 5 
//可以被执行
		}
	}
}

public class ContinueDetail{
	public static void main(String[] args){
		label1:
		for(int j = 0;j < 4;j++){
			label2:
			for(int i = 0; i < 10;i++){
				if(i == 2){//当i == 2 时,跳到最近的循环体,执行完本次循环体后的i++后接着循环
					continue;
					// continue label1;//如果是跳到label1,此时 i == 2 不执行下一语句,i++后
//回到for j 此时j == 1 ,for i = 0再重复两次,因此应该输出4次i= 0 、 = 1
				}
				System.out.println("i=" + i);//即i == 2时,不执行该句话,跳到循环迭代执行下一次
			}//所以应该输出为 i = 0 i = 1 i= 3 ...
		}
	}
}

如果是跳到label1 

四、控制语句return

1.基本介绍

        return 的使用方法,表示跳出所在的方法(在方法时会详细介绍),注意,return写在main方法里时会退出程序

public class Return01{
	public static void main(String[] args){
		for(int i = 1;i <= 5;i++){
			if(i == 3){
				System.out.println("ni hao shi jie"+i);
				// return;
				// break;
				//continue;
			}System.out.println("hello world");
		}System.out.println(" go on");
	}
}

结果 return直接结束程序

break退出循环体但仍然执行下几句

continue会回到for循环,因此输出四句hello world 一句nihaoshijie

五、本章作业

1.个人作业

        某人有100,000元,每次经过一次路口,需要交费,规则如下

1)当现金>50000时,每次交5%

2)当现金<=50000时,每次交1000

编程计算该人可以通过几次这个路口,要求使用while break完成

public class chapter2Exercise{
	public static void main(String[] args){
		int savingsAccount = 100000;//持有金钱
		int taxRate = 50000; //税率门槛,50000为分割线
		int i = 0;//计数次数
		while (true){
			if(savingsAccount > taxRate){//如果大于分割线 执行该语句块
				savingsAccount = savingsAccount - (int)(savingsAccount * 0.05);//计算余额
//正常来说不应该强转为int,但考虑小数太多,就强转了,如果想显示余额可以用printf的%0.2f来显示
//示例     double savingsAccount = 100000.0
//         savingsAccount = savingsAccount - savingsAccount * 0.05;
//         System.out.println("由于您余额>50000,收取5%,您已交费%0.2f,剩余
//额%0.2f",savingsAccount * 0.05,savingsAccount)
				System.out.println("由于您余额>50000,收取5%,您已交费"
					+ (int)(savingsAccount * 0.05) + " 剩余余额" + savingsAccount);
			}
			else if (savingsAccount <= taxRate){ //如果余额不足分割线 执行该语句块
				if(savingsAccount < 1000){//先判断够不够1000 随后再计算,不够直接break
					System.out.println("余额不足,请充值");
					break;
				}
				savingsAccount = savingsAccount - 1000;//计算余额
				System.out.println("由于您余额<50000,收取1000整,您已交费1000元" 
					+ " 剩余余额" + savingsAccount);
			}
            i++;//i++应该放在上面计算之后,如果放在开头,钱不够break了,也会计算一次,放在后面
//就不会
		}
		System.out.println("您通过该路口" + i + "次"
					+ " 剩余余额" + savingsAccount);
	}
}

                       

        使用双浮点显示的情况

                

public class chapter2Exercise{
	public static void main(String[] args){
		double savingsAccount = 100000.0;
		int taxRate = 50000;
		int i = 0;
		while (true){
			if(savingsAccount > taxRate){
				savingsAccount = savingsAccount - savingsAccount * 0.05;
				System.out.printf("由于您余额>50000,收取5%%,您已交费%.2f,剩余余额%.2f\n",savingsAccount * 0.05,savingsAccount);
			}
			else if (savingsAccount <= taxRate){
				if(savingsAccount < 1000.0){
					System.out.printf("余额不足,请充值\n");
					break;
				}
				savingsAccount = savingsAccount - 1000.0;
				System.out.printf("由于您余额<50000,收取1000整,您已交费1000元剩余余额%.2f\n",savingsAccount);
			}
			i++;
		}
		System.out.printf("您已通过%d次,剩余余额%.2f\n",i,savingsAccount);
	}
}

注意,使用printf打印%可以用%%来表示打印一个%

1.代码改进

public class chapter2Exercise{
	public static void main(String[] args){
		double savingsAccount = 100000.0;
		int taxRate = 50000;
		int i = 0;
		while (true){
			if(savingsAccount > taxRate){
				// savingsAccount = savingsAccount - savingsAccount * 0.05;
				savingsAccount *= 0.95;
				System.out.printf("由于您余额>50000,收取5%%,您已交费%.2f,剩余余额%.2f\n",savingsAccount * 0.05,savingsAccount);
				i++;
			}
			else if (1000.0 <= savingsAccount){//可以省略&& savingsAccount <= 50000
				// if(savingsAccount < 1000.0){
				// 	System.out.printf("余额不足,请充值\n");
				// 	break;
				// }
				savingsAccount = savingsAccount - 1000.0;
				System.out.printf("由于您余额<50000,收取1000整,您已交费1000元剩余余额%.2f\n",savingsAccount);
				i++;
			}
			else {
				System.out.printf("余额不足,剩余%.2f\n",savingsAccount);
				break;
			}
		}
		System.out.printf("您已通过%d次,剩余余额%.2f\n",i,savingsAccount);
	}
}

        输出结果同上

2.个人作业

        实现判断一个整数,属于哪个范围:大于0;小于0;等于0

import java.util.Scanner;
public class chapter2Exercise02{
	public static void main(String[] args){
		int num = 0;
		while(true){
			Scanner myScanner = new Scanner(System.in);
			System.out.println("输入一个数字");
			num = myScanner.nextInt();
			if(num > 0){
				System.out.println("大于0\n");
			}
			else if(num < 0){
				System.out.println("小于0\n");
			}
			else if (num == 0) {
				System.out.println("等于0\n");
			}
		}
	}
}

                

3.个人作业

        判断一个年份是否为闰年

import java.util.Scanner;
public class chapter2Exercise03{
	public static void main(String[] args){
		int years = 0;
		while(true){
			Scanner myScanner = new Scanner(System.in);
			System.out.println("输入一个数字");
			years = myScanner.nextInt();
			if(years % 4 == 0 && years % 100 != 0){
				System.out.println(years + "为闰年");
			}
			else if(years % 400 == 0){
				System.out.println(years + "为闰年");
			}
			else {
				System.out.println(years + "不是闰年");
			}
		}
	}
}

                

4.个人作业

        判断一个整数是否是水仙花数,水仙花数指的是一个3位数,其各个位上数字立方和等于其本身,例如 153 = 1*1*1 + 3*3*3 + 5*5*5

import java.util.Scanner;
public class chapter2Exercise04{
	public static void main(String[] args){
		int num = 0;
		int a,b,c = 0;//定义个位十位百位
		while(true){
			Scanner myScanner = new Scanner(System.in);
			System.out.println("输入一个3位数数字");
			num = myScanner.nextInt();//获得用户输入的数字
			// System.out.println(num / 100 <= 9 && num / 100 >= 1);
			if (num / 100 <= 9 && num / 100 >= 1){//判断是否是三位数 int型会自动舍去小数点 
// /100后如果小于9大于1就是三位数
				a = num /100;//获得百位数的数,int运算会自动舍去小数点后的数
				b = (num - a * 100) / 10;//获得十位数的数
				c = (num - a * 100 - b * 10) / 1;//获得个位数的数 
//原理是进制算法,256 = 2 * 100 + 5 * 10 + 6 * 1 ,
//想获得个位就用num - 百位数x100 - 十位数x100
				if (a * a * a + b * b * b + c * c *c == num){//判断是否为水仙花数
					System.out.println(num + "是水仙花数\n");
				}
				else {
					System.out.println(num + "不是水仙花数\n");
					}
			}
			else{
				System.out.println("输入的不是3位数数字,请重试\n");
				continue;
			}		
				
			
		}
	}
}

                

4.代码改进

        可以精简算法,n的百位 = n /100;

        n的十位 = n % 100 / 10;

        n的个位 = n % 10;

5.个人作业

        

什么都不输出 如果m=1,输出ok2

6.个人作业

        输出1-100之间不能被5整除的数,每5个一行

public class chapter2Exercise05{
	public static void main(String[] args){
		int num = 1;//1-100的范围
		int count = 0;//计数,每五个一组
		while (num <= 100){
			if(!(num % 5 == 0)){//如果不能被5整除执行
				count++;
				if (count % 5 == 0){//判断是否换行,当计数为5的倍数时,输出一个然后换行
					System.out.printf("%-6d\n",num);
				}
				else{
					System.out.printf("%-6d",num);//不为5的倍数时就不用,正常叠加就好
				}
			}
			num++;//自增
		}
	}
}

        ​​​​​​​​​​​​​​        

6.代码改进

               if(!(num % 5 == 0))可以改为 if(num % 5 != 0)

public class chapter2Exercise05{
	public static void main(String[] args){
		int num = 1;
		int count = 0;
		while (num <= 100){
			if(num % 5 != 0){
				count++;
				System.out.printf("%-6d",num);//打印所有不能被5整除的数
				if (count % 5 == 0){//计数为5的倍数就输出一个换行就好
					System.out.printf("\n");
				}
			}
			num++;
		}
	}
}

7.个人作业

        输出小写的a-z以及大写的z-a

public class chapter2Exercise07{
	public static void main(String[] args){
		char letter = 97;
		int count = 0;
		while(letter <= 122){
			count++;
			if (count % 5 == 0){
				System.out.printf("%-3c\n",letter);
			}
			else{
				System.out.printf("%-3c",letter);
			}
			letter++;
		}
		System.out.printf("\n");
		letter = 90;
		count = 0;
		while(letter >= 65){
			count++;
			if (count % 5 == 0){
				System.out.printf("%-3c\n",letter);
			}
			else{
				System.out.printf("%-3c",letter);
			}
			letter--;
		}
	}
}

        

7.代码改进

               JAVA中可以直接比较字符,在计算机会直接计算内部的ascii码

public class chapter2Exercise07{
	public static void main(String[] args){
		char letter = 'a';
		int count = 0;
		while(letter <= 'z'){
			count++;
			System.out.printf("%-3c",letter);
			if (count % 5 == 0){
				System.out.printf("\n");
			}
			letter++;
		}
		System.out.printf("\n");
		letter = 'Z';
		count = 0;
		while(letter >= 'A'){
			count++;
			System.out.printf("%-3c",letter);
			if (count % 5 == 0){
				System.out.printf("\n",letter);
			}
			letter--;
		}
	}
}

8.个人作业

        求出1-1/2+1/3...1/100的和

public class chapter2Exercise08{
	public static void main(String[] args){
		double sum = 0.0;
		int count = 0;
		while(count < 100){
			count++;
			if(count % 2 == 0){
				sum = sum + ( - 1.0 / count);//注意,这里由于count是int型,做除法要记得加小数
//自动转换为double型
				System.out.println(sum);
			}
			else{
				sum = sum + 1.0 / count;
				System.out.println(sum);
			}
		}
		System.out.println(sum);
	}
}

        ​​​​​​​        

8.代码改进

public class chapter2Exercise08{
	public static void main(String[] args){
		double sum = 0.0;
		int count = 0;
		while(count < 100){
			count++;
			if(count % 2 == 0){
				sum -= 1.0 / count;//可以直接写成-=,同等于sum = sum - 1.0 / count
			}
			else{
				sum += 1.0 / count;//同理
			}
		}
		System.out.println(sum);
	}
}

9.个人作业

public class chapter2Exercise08{
	public static void main(String[] args){
		int count = 0;
		int sum = 0;
		int i = 0;
		while(i < 100){
			i++;//1-100
			count = count + i;//count作用是记1+2+3+...+n
//当i=1时 count = 1, i= 2 时 count = 1 + 2,当i = 3时 count = 1 + 2 + 3...
			sum = sum + count;//sum的作用是累加count,当i=1时 sum = count = 1当i = 2时
//sum = 1 + 1 + 2,当i= 3时,sum = 1 + 1 + 2 + 1 + 2 + 3....
			System.out.println("count=" + count + " sum=" + sum);//打印中间值和最终值
		}
	}
}

        ​​​​​​​        ​​​​​​​

9.代码改进

                看成两个循环也可以,而且更加精简

public class chapter2Exercise09{
	public static void main(String[] args){
		int sum = 0;
		int i = 0;
		while(i < 100){
			i++;
			int j = 0;
			while(j < i){
				j++;
				sum += j;
			}
		}	
		System.out.println(" sum=" + sum);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinhai1114

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值