day03
循环结构
分类:
- for循环
- while循环
- do while循环
组成:
- 初始化部分
- 循环条件部分
- 循环体部分
- 迭代部分
for循环
流程:初始化部分–>循环条件部分–>循环体部分–>迭代部分
语法格式:
for(初始化部分;循环条件部分;迭代部分){
循环体部分;
}
//初始化部分-->循环条件部分-->循环体部分-->迭代部分-->循环条部分-->循环体部分-->......
//循环条件部分为boolean类型表达式,当值为false时,退出循环
//初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
//可以有多个变量更新,用逗号分隔(迭代部分)
打印1~100之间所有奇数的和
/*
* int i = 1为初始化部分,整个循环只会执行一次,i<=100为循环条件,当不满足条件时,就无法进入循环体,i++为迭代部分
* if(i % 2 == 1) {
* sum += i;
* }为循环体,for循环之后的一对大括号里面的内容就是循环体的内容
* 整个执行流程:先进行int i = 1的初始化,然后判断条件,满足,进入循环体,当循环体里面的执行语句执行完成时,进入迭代部分,然后进入循环条件,如此往复
*/
int sum = 0;//记录总和
for(int i = 1 ; i <= 100; i++) {
if(i % 2 == 1) {
sum += i;
}
}
System.out.println(sum);//2500
打印1~100之间所有是7的倍数的整数的个数和总和
int sum = 0;
int count = 0;
for(int i = 1;i <= 100;i++){
if(i%7 == 0) {
sum += i;
count++;
}
}
System.out.println("1~100内所有7的倍数的个数为:"+count+",和为:"+sum);
//1~100内所有7的倍数的个数为:14,和为:735
输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
for(int i = 100;i <= 999;i++) {
int a = i % 10;//获得个位数字
int b = i / 10 %10;//获得十位数字
int c = i / 100;//获得百位的数字
int sum = a * a * a + b * b * b + c * c * c;
if(sum == i) {
System.out.print(i+" ");
}
}
//153 370 371 407
初始化部分和迭代部分不一定都是对变量进行操作:
int i = 0;
for(System.out.print("A");i <= 10;System.out.print("C"),i++) {
}
//ACCCCCCCCCCC
//初始化部分不一定在for里面,也可以在外面,作用域的问题。
while循环
语法格式:
初始化部分
while(循环条件部分){
循环体部分;
迭代部分;
}
执行过程:
初始化部分–>循环条件部分–>循环体部分–>迭代部分–>循环条件部分–>循环体部分–>…
注意:
- 不要忘记声明迭代部分。否则,循环将不能结束,变成死循环。
- for循环和while循环可以相互转换
将水仙花数用while循环实现
int i = 100;
while(i<=999) {
int a = i % 10;//获得个位数字
int b = i / 10 %10;//获得十位数字
int c = i / 100;//获得百位的数字
int sum = a * a * a + b * b * b+ c * c * c;
if(sum == i) {
System.out.print(i+" ");
}
i++;
}
dowhile循环
格式:
初始化部分;
do{
循环体;
迭代部分;
}while(循环条件);
//初始化部分-->循环体-->迭代部分-->循环条件--》循环体-->......
do-while循环至少执行一次循环体。
int i = 8;
do {
System.out.println(i);
i++;
}while(i < 8);
//8
最简单“无限” 循环格式:while(true) , for ( ; ; ),无限循环存在的原因是并不知道循环多少次,需要根据循环体内部某些条件,来控制循环的结束.
嵌套循环
将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环或内层循环。
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
九九乘法表
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9
4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16
5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25
6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36
7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49
8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64
9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
打印这个表更多的是找规律:
i行号,j列数
第一行:i:1,j:1
第二行:i:2,j:2
第三行:i:3,j:3
第四行:i:4,j:4
第五行:i:5,j:5
第六行:i:6,j:6
第七行:i:7,j:7
第八行:i:8,j:8
第九行:i:9,j:9
for(int i = 1;i<=9;i++) {
for(int j = 1;j <= i;j++) {
System.out.print(i+" * "+j+" = "+(i*j)+" ");
}
System.out.println();
}
比较难一点的例题:
100以内的所有质数
outer://自定义跳出位置,如果没有定义,则就近原则
for(int i = 2; i <= 100;i++) {
for(int j = 2;j <= Math.sqrt(i);j++) {
if(i % j == 0) {
continue outer;
}
}
System.out.print(i+" ");
}
//2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
break和continue的使用:
break只能用于switch语句和循环语句中。
continue 只能用于循环语句中。
二者功能类似,但continue是终止本次循环,break是终止本层循环。
break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。很多语言都有goto语句,goto语句可以随意将制转移到程序中的任意一条
语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的。
综合练习
模拟实现基于文本界面的《家庭记账软件》。该软件能够记录家庭的收入、支出,并能够打印收支明细表。
项目采用分级菜单方式。主菜单如下:
-----------------家庭收支记账软件-----------------
1 收支明细
2 登记收入
3 登记支出
4 退 出
import java.util.Scanner;
public class FamilyAccount {
/**
* 测试小案例
* -----------------家庭收支记账软件-----------------
1 收支明细
2 登记收入
3 登记支出
4 退 出
*/
public static void main(String[] args) {
boolean flag = true;
Scanner sc = new Scanner(System.in);
String details = "收支\t账户金额\t\t收支金额\t说 明\n";
int balance = 10000;
while(flag) {
System.out.println("-----------------家庭收支记账软件-----------------");
System.out.println(" 1 收支明细");
System.out.println(" 2 登记收入");
System.out.println(" 3 登记支出");
System.out.println(" 4 退 出");
System.out.print("请输入选择:");
int theChoose = sc.nextInt();
for(;;) {
if((theChoose != 1) && (theChoose != 2) && (theChoose != 3) && (theChoose != 4)) {
System.out.print("输入有误,请重新输入:");
theChoose = sc.nextInt();
}else break;
}
switch(theChoose) {
case 1:
System.out.println("-----------------当前收支明细记录-----------------");
System.out.println(details);
System.out.println();
System.out.println("---------------------------------------------");
break;
case 2:
System.out.print("本次收入金额:");
int money = sc.nextInt();//从键盘获取收入的金额
System.out.print("本次收入说明:");
String desc = sc.next();//从键盘获取收入的说明
//修改总金额
balance += money;
details += ("收入\t" + balance + "\t\t" + money + "\t" +desc + "\n");
System.out.println("---------------------登记完成-------------------");
break;
case 3:
System.out.print("本次支出金额:");
int money1 = sc.nextInt();//从键盘获取收入的金额
for(;;) {
if(money1>balance) {
System.out.print("输入有误,请重新输入:");
money1 = sc.nextInt();
}else break;
}
System.out.print("本次支出说明:");
String desc1 = sc.next();//从键盘获取收入的说明
//修改总金额
balance -= money1;
details += ("支出\t" + balance + "\t\t" + money1 + "\t" +desc1 + "\n");
System.out.println("---------------------登记完成-------------------");
break;
case 4://退出
System.out.print("确定退出吗?(Y/N):");
String s = sc.next().toUpperCase();
for(;;) {
if("Y".equals(s) || "N".equals(s)) {
if("Y".equals(s)) {
System.out.println("拜拜~~");
flag = false;
break;
}else break;
}else {
System.out.print("输入有误,请重新输入:");
s = sc.next().toUpperCase();
}
}
break;
}
}
sc.close();
}
}