1.for循环嵌套练习
例1:打印图案
*
***
*****
*******
--------------------------------------------
public class DoubleFor001 {
public static void main(String[] args) {
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 7; j++) {
if (j <= (8 - 2 * i)) {
System.out.print(" ");
} else {
System.out.print("*");
}
}
System.out.println("");
}
}
}
或:
public class DoubleFor001 {
public static void main(String[] args) {
// 外层控制行,总共四行
for (int i = 1; i < 5; i++) {
// 内层循环控制列 负责打印空格
for (int j = 2 * (4 - i); j > 0; j--) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}
2.while循环
语法:
while(具有布尔值的表达式){
//循环体
}
一般而言,需要在循环体里面去控制循环的次数
可以使用之前for中的i循环变量的写法或者break
3.for和while的区别
- for有3个条件,while有1个
for可以进行循环次数的精确控制,while适用于不明确需要循环多少次的情况 - 趋向于结束的方式
for使用循环变量i使得循环结束,while使用break使得循环结束
4.do…while
语法:
do{
//循环体
}while();
注意:while()后面的;绝对不能省略
结论:\
- 如果判断条件为真,do循环体可以执行;\
- 如果判断条件为假,do循环体可以执行;最多执行一次;
即使判断条件为假,dowhile循环也会执行一次
5.forLabel
语法:
label:for(a;b;c){
//循环体
break label;
}
label相当于给for循环起名字,必须符合标识符命名规范
break label:可以结束指定名称的循环
6.双层for中的break
break的执行和判断条件无关,只取决于break所在的循环.
如果break位于内层循环,提前结束内层循环
如果break位于外层循环,提前结束外层循环
练习
1.求1至1000之间满足”用3除余2;用5除余3;用7除余2”的数,且一行只打印5个数
public class Test01 {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 1000; i++) {
if (i % 3 == 2 && i % 5 == 3 & i % 7 == 2) {
count++;
if (count % 5 == 0) {
System.out.println(i);
} else {
System.out.print(i+" ");
}
}
}
}
}
2.求1-3+5-7+ …… -99+101的值
public class Test02 {
public static void main(String[] args) {
int sum = 0;
int count = 0;
for (int i = 1; i < 102; i += 2) {
count++;
if (count % 2 == 0) {
sum -= i;
} else {
sum += i;
}
}
System.out.println(sum);
}
}
3.打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身
public class Test03 {
public static void main(String[] args) {
for (int i = 100; i < 1000; i++) {
int il = i / 100;
int im = i / 10 % 10;
int ir = i % 10;
if (i == (il*il*il+im*im*im+ir*ir*ir)) {
System.out.println(i);
}
}
}
}
//!!我居然连立方和,立方差都不记得了
4.输入两个正整数m和n,求其最大公约数和最小公倍数
import java.util.Scanner;
public class Test04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入第一个正整数");
int m = sc.nextInt();
System.out.println("输入第二个正整数");
int n = sc.nextInt();
int pro = m * n;
// 公约数,用的是欧几里得算法(辗转相除法)
do {
if (n > m) {
m = m + n;
n = m - n;
m = m - n;
}//判断m,n大小,大的值给m,小的给n
m = m % n;//大的数对小的数取余,再用小的数和余数比较,再取余,直到整除为止
} while (m != 0);
System.out.printf("最大公约数是%d,", n);
// 公倍数
int result = pro / n;
System.out.printf("最小公倍数是%d", result);
sc.close();
}
}
5.百元百鸡问题:公鸡5元一只,母鸡3元一只,3只小鸡1元,如果用100元钱,买100只鸡,不佘不欠,可以买公鸡,母鸡,小鸡,各多少只。
public class Test05 {
public static void main(String[] args) {
for (int male = 0; male <= 20; male++) {//公鸡
for (int female = 0; female <= 34; female++) {//母鸡
for (int child = 0; child <= 300; child += 3) {//小鸡
int pay = 5 * male + 3 * female + child / 3;
if (pay == 100) {
System.out.printf("公鸡%d只,母鸡%d只,小鸡%d只", male, female, child);
System.out.println();
}
}
}
}
}
}
6.编写一个Java应用程序,用循环结构打印如下的数值列表:
N 10*N 100*N 1000*N
1 10 100 1000
2 20 200 2000
3 30 300 3000
4 40 400 4000
5 50 500 5000
public class Test06 {
public static void main(String[] args) {
System.out.println("N 10*N 100*N 1000*N");
for (int n = 1; n <= 5; n++) {
System.out.println(n + " " + 10 * n + " " + 100 * n + " " + 1000 * n);
}
}
}
7.打印2到10000的所有素数,每行显示8个素数
public class Test07 {
public static void main(String[] args) {
int count = 0;//计数
for (int i = 2; i <= 10000; i++) {
boolean status = true;//给定状态
for (int j = 2; j < i; j++) {
if (i % j == 0) {
status = false;//有能被整除的数,状态改为false,退出循环
break;
}
}
if (status) {//如果没有能被整除的数,及状态没被改变,为true时
count++;//计数
if (count % 8 == 0) {
System.out.println(i);
} else {
System.out.print(i+" ");
}
}
}
}
}
8.商品价格表
(1)用户从控制台输入需要查询的商品编号,根据编号现实对应商品价格。
(2)循环查询商品价格 (商品名称 单价)
(3)输入n退出循环
//这是什么奇怪的题
import java.util.Scanner;
public class Test08 {
public static void main(String[] args) {
System.out.println("input num");
Scanner sc = new Scanner(System.in);
while (true) {
String num = sc.next();
if (num.equals("n")) {
break;
}
switch (num) {
case "101": {
System.out.println(num + "苹果 1.5元");
break;
}
case "102": {
System.out.println(num + "Switch 4500元");
break;
}
case "103": {
System.out.println(num + "Xperia1 5999元");
break;
}
default: {
System.out.println("商品不存在");
break;
}
}
}
sc.close();
}
}
关于next()、nextLine()、nextInt(){target=”_blank”
rel=”noopener”}
1.nextLine()方法,不将空格看做是两个字符串的间隔,而是看作字符串的一部分,返回时,它作为String类型一并返回
输入23 24 25
输出”23 24 25”
2.使用next()方法时,将空格看作是两个字符串的间隔
输入23 24 25
输出”23”输出”24”输出”25”
3.nextInt()方法,与next()方法类似,只是它的返回值是int类型的,依旧将空格看作是两个输入的数据的间隔
输入23 24 25
输出23输出24输出25
只能输入int类型的
9.开发一个标题为”FilpFlop”的游戏程序。它从1计数到100,遇到3的倍数就替换为单词Filp,5的倍数就替换为单词Flop,既为3的倍数又为5的倍数则替换单词FilpFlop.
public class Test09 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) {
System.out.println("FilpFlop");
} else if (i % 3 == 0) {
System.out.println("Filp");
} else if (i % 5 == 0) {
System.out.println("Flop");
} else {
System.out.println(i);
}
}
}
}
面试题:
1.什么时候用for循环,什么时候用while循环
for可以进行循环次数的精确控制,while适用于不明确需要循环多少次的情况
2.while循环和do-while循环的区别
while先判断,符合条件后才执行;do-while先执行再判断,即便判断条件为假,do-while循环也会执行一次
3.break、continue、return的区别
break在for循环中退出当前层循环或指定循环,switch循环中退出循环执行下一条语句,
continue退出本次循环直接进入下一次循环,
return退出函数返回到调用位置