目录
一、多重循环控制
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);
}
}