目录
一.复习回顾
- Java中的三大循环:for while do - while
-
for:对已知循环次数。
-
while:在循环次数不确定的情况下优先选择。
-
do - while:循环至少要执行一次的场景。
复习题
- 在一个班级里有若干名学生,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。
import java.util.Scanner;
public class lian {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
//求总的年龄
int sum = 0;
for (int i = 1;i <= num;i++){
int age = input.nextInt();
sum+= age;
}
//平均年龄 = 总年龄 / 总人数
double avg = sum * 1.0 / num;
String result = String.format("%.2f", avg);
System.out.println(result);
}
}
二.二重循环
- 概念:一个循环体内又包含另一个完整的循环结构.
- 语法:
for(循环条件1){
//循环操作1
for(循环条件2){
//循环操作2
}
}
- 案例:
- 使用二重循环输出如下图形:
*****
*****
*****
分析:外层循环控制打印图形的行数,内层循环控制打印图形的列数。
public class lian {
public static void main(String[] args) {
//写一个外层循环控制行数
for (int i = 1;i <= 3;i++) {
//写一个内层循环控制*的个数
for (int j = 1; j <= 5; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
练习题
- (一)编程序输出如下图形
11111
22222
33333
44444
public class lian {
public static void main(String[] args) {
for (int i = 1;i <= 4;i++){
//用内存来控制数字的个数
for (int j = 1;j <= 5;j++){
System.out.println(i);
}
System.out.println();
}
}
}
- (二) 输出一个三角形的图形
*
**
***
****
*****
public class lian {
public static void main(String[] args) {
for (int i = 1;i <= 5;i++){
//控制*的个数
for (int j = 1;j <= i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
-
(三)打印等腰三角形
*
***
*****
*******
*********
行数 | 1 | 2 | 3 | ··· | i | ··· |
个数 | 1 | 3 | 5 | ··· | 2*i-1 | ··· |
行数 | 1 | 2 | 3 | ··· | i | ··· |
个数 | 4 | 3 | 2 | ··· | n-i | ··· |
public class lian {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
//控制空格的循环
for (int j = 1; j <= 5 - i; j++) {
System.out.print(" ");
}
//控制*号的循环
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println();
}
}
}
- (四)打印数字直角三角形
0
12
345
6789
public class lian {
public static void main(String[] args) {
int num = 0;
for (int i = 1;i <= 4; i++){
for (int j = 1;j <= i;j++){
System.out.print(num);
num++;
}
System.out.println();
}
}
}
- (五)编写九九乘法表。
lic class lian {
public static void main(String[] args) {
for (int i = 1;i <= 9; i++){
for (int j = 1;j <= i;j++){
System.out.print(i + "*" + j + "=" +(i * j) + "\t");
}
System.out.println();
}
}
ps:二重循环打印图形的万能解法
-
先观察图形的行数,行数就是外层循环结束的条件。
-
内层循环结束条件如何去构建,也就是找到内存循环变量和 外层循环变量的关系。
-
内层循环结束后,不要忘记换行。
-
如果一行中符号类型有多个,则需要在外层循环中包含多个循环,分别控制不同类型的符号打印,难点就是如何找出每一个内层循环变量和外层循环变量之间的关系。
三.多重循环
-
概念:多重循环就是外层循环内部有一个中层循环,中层循环内有一个内层循环。它的执行机制和二重循环相似,只不过循环的次数更多。
ps:循环次数越少,电脑运算速度越快,写代码算法越优良。
案例
- 3文钱可以买1只公鸡,2文钱可以买1只母鸡,1文钱可以买3只小鸡,要用100文钱买100只鸡(每种鸡必须买1只),公鸡、母鸡、小鸡各有多少只?
- 需要同时满足两个条件:
- 公鸡+母鸡+小鸡=100只
- 买公鸡的钱+买母鸡的钱+买小鸡的钱=100文
public class lian {
public static void main(String[] args) {
//写一个外层循环控制公鸡的数量
for (int i = 1; i <= 33; i++) {
//第二层循环控制母鸡的数量
for (int j = 1; j <= 50; j++) {
//第三层循环控制小鸡的数量
for (int k = 1; k <= 98; k++) {
if (i + j + k == 100 && 3 * i + 2 * j + k / 3.0 == 100) {
System.out.println(i + "\t" + j + "\t" + k);
}
}
}
}
}
}
练习
- (一)有一个三位数,个位数字比百位数字大,而百位数字又比十位数字大,并且个位数字之和等于各位数字相乘之积,求此三位数。
public class lian {
public static void main(String[] args) {
for (int ge = 3; ge <= 9;ge++) {
for (int bai = 2; bai <= 8; bai++) {
for (int shi = 1; shi <= 7; shi++) {
if (ge + shi + bai == ge * shi * bai) {
System.out.println(bai * 100 + shi * 10 + ge);
break;
}
}
}
}
}
}
-
(二)超市购物系统
-
超市为了能自动算出每位顾客应付的货款,自动算出超市一天的营业额,自动统计一天购物的人数,需要一个简易的超市收费系统。
-
ps:超市一天来多少位顾客是不确定的,可以用一个结束标志来检查是否一天结束了。每位顾客换购的商品种类也不一样,用另一个结束标志来表示。
import java.util.Scanner;
public class lian {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//超市购物系统
boolean flag = true;//证明超市是否开门
int money,sumone = 0, sum = 0,num = 0;//sumone:单人购物的总金额,sum:超市的营业额, num:今日顾客人数
while (flag){
//超市开门并且来客人
sumone = 0;
do {
money = input.nextInt();
if (money == -1){//超市歇业中
flag = false;
break;
}
sumone+= money;
}while (money != 0);//购物金额非0,证明顾客买东西了
if (sumone != 0){
num++;
System.out.println("您的购物金额为:" + sumone + "元");
}
sumone+=sumone;
}
System.out.println("今天一共有" + num +"位顾客");
System.out.println("今日总销售额为:" + sum + "元");
}
}
ps:设置标记位:如果为0,证明单人购物结束,如果为-1,证明今日超市营业完成后已经歇业。