第1关:学习-Java循环之嵌套循环之淡水湖排名
任务描述
本关任务:我国有 4 大淡水湖,分别是洞庭湖,洪泽湖,鄱阳湖和太湖。 A 说:洞庭湖最大,洪泽湖最小,鄱阳湖第三; B 说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三; C 说:洪泽湖最小,洞庭湖第三; D 说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。 请根据每人说的话求出 4 大湖的正确排名。
注意:4个湖不存在相等的情况,且每人只说对一句话。
相关知识
嵌套循环
嵌套循环就是一个循环中包含一个或者 n 个其他的循环,while、do…while 和 for 循环之间可以相互嵌套,比如 for 循环里面可以有 for 循环,for 循环里可以有 do…while 循环等。
嵌套循环使用案例:打印如下所示图形。
*
**
***
代码如下:
public static void main(String[] args) {
int i, j;
for (i = 1; i <= 3; i++) { // 外层循环控制行数
for (j = 1; j <= i; j++) { // 内层循环打印 *
System.out.print("*"); // 注意不是 println
}
System.out.print("\n"); // 换行
}
}
从以上案例中可以得出,嵌套循环的外层循环迭代一次,即换行一次,内层循环执行一遍,即循环打印某行的所有*
。
使用 Java 解逻辑题
一个班中有 4 位同学外出,其中的一位做了好事不留名,表扬信来了之后,班主任问这四位是谁做的好事。 A 说:不是我; B 说:是 C; C 说:是 D; D 说:C 胡说。 已知有三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。
第一步:创建变量分别代表 A,B,C,D; 第二步:把每个人说的话转化为逻辑语句,比如 A 说的话可表示为!='A'
,B 说的话可表示为=='C'
,C 说的话可表示为=='D'
,D 说的话可表示为!='C'
; 第三步:使用三元运算符把说话的真假转化为具体数值,比如 1 代表说话为真, 0 代表说话为假; 第四步:把四个人说的话都转化成三元运算符(话为真赋值为 1,为假则赋值为 0),然后对所有三元运算符的值求和,如果等于 3,说明有三人说真话,一人说假话。
具体代码如下:
public static void main(String[] args) {
char t;
int sum;
// 从A开始循环,当sum等于3时,输出做了好事的人
for (t='A'; t<='D'; t++) {
sum = (t!='A'?1:0) + (t=='C'?1:0)+(t=='D'?1:0)+(t!='D'?1:0);
if (sum==3)
System.out.printf("做好事的人是"+t);
}
}
输出结果:
做好事的人是C
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧 “测试结果”区查看具体的测试集详情。
开始你的任务吧,祝你成功!
/*
任务:我国有 4 大淡水湖,分别是洞庭湖,洪泽湖,鄱阳湖和太湖。
A 说:洞庭湖最大,洪泽湖最小,鄱阳湖第三;
B 说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三;
C 说:洪泽湖最小,洞庭湖第三;
D 说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
请输出4大湖的正确排名,输出样式:洞庭湖排名:n
A说的话可用如下表达式体现:
int a1 = (dongting == 1) ? 1 : 0;//洞庭湖最大(1),是的话赋值为1,否则赋值为0
int a2 = (hongze == 4) ? 1 : 0;//洪泽湖最小(4),是的话赋值为1,否则赋值为0
int a3 = (poyang == 3) ? 1 : 0;
a=a1+a2+a3;//A说的话
*/
public class LakeTest {
public static void main(String[] args) {
int a, b, c, d; // 定义4个人说的话
int dongting, hongze, poyang, tai; // 定义4个湖
// 请在Begin-End间编写代码
/********** Begin **********/
// 使用嵌套循环依次遍历各个湖的4种排名情况,用逻辑表达式表达每人说的话,输出具体排名
for(dongting=1;dongting<=4;dongting++){
for(poyang=1;poyang<=4;poyang++){
if(poyang==dongting) continue;
for(hongze=1;hongze<=4;hongze++){
if(hongze==poyang||hongze==dongting) continue;
for(tai=1;tai<=4;tai++){
if(tai==hongze||tai==poyang||tai==dongting) continue;
a=(dongting==1?1:0)+(hongze==4?1:0)+(poyang==3?1:0);
b=(hongze==1?1:0)+(dongting==4?1:0)+(poyang==2?1:0)+(tai==3?1:0);
c=(hongze==4?1:0)+(dongting==3?1:0);
d=(poyang==1?1:0)+(tai==4?1:0)+(hongze==2?1:0)+(dongting==3?1:0);
if(a==1&&b==1&&c==1&&d==1){
System.out.println("洞庭湖排名:" + dongting);
System.out.println("洪泽湖排名:" + hongze);
System.out.println("鄱阳湖排名:" + poyang);
System.out.println("太湖排名:" + tai);
}
}
}
}
}
/********** End **********/
}
}