Java基础06--喝自己之前偷懒的洗脚水(六)
流程控制3
无限循环结构
不在循环条件部分限制次数的结构:for(;;) 或 while(true)
那么如何结束一个循环结构?
1.循环条件部分返回false;
2.在循环体中,执行break
示例代码:
import java.util.Scanner;
class ForWhileTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int positiveNum = 0;//记录正数的个数
int negativeNum = 0;//记录负数的个数
//while(true){
for(;;){//与上面的结构效果一致
int num = scan.nextInt();
if(num > 0){
positiveNum++;
}else if(num < 0){
negativeNum++;
}else{
//输入 0 的时候,跳出循环
break;
}
}
System.out.println("输入的正数个数为:" + positiveNum);
System.out.println("输入的负数个数为:" + negativeNum);
}
}
break 和 continue 关键字
break 和 continue 关键字的使用
使用范围 循环之中的作用(不同点) 相同点
break : switch-case
循环结构中 结束当前循环 关键字后面不能声明执行语句
continue: 循环结构中 结束当次循环
示例代码:
class BreakContinueTest {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i %4 == 0){
//break;//123
continue;//123567910
}
System.out.print(i);
}
System.out.println();
}
}
嵌套循环结构
嵌套循环的使用
1. 嵌套循环:将一个循环结构A生命在另一个循环结构B的循环体中,
就构成了嵌套循环。
2.
外层循环:循环结构B
内层循环:循环结构A
3.
1)内层循环结构遍历一遍,只相当于外层循环执行了一次。
2)假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了 m*n 次。
3)技巧:
外层控制行数
内层控制列数
练习1:
用“*”打印出要求的图形
class ForForTest {
public static void main(String[] args) {
//
/*
******
******
******
******
*/
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 6;j++){
System.out.print("*");
}
System.out.println();
}
System.out.println();
/*
i(行号) j(*的个数)
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
*/
for(int i = 1;i <= 5;i++){//控制行数
for(int j = 1;j <= i;j++){//控制列数
System.out.print("*");
}
System.out.println();
}
/*
i(行号) j(*的个数) 规律:i + j = 5 即 j = 5 - i
* 1 4
** 2 3
*** 3 2
**** 4 1
*/
for(int i = 1;i <= 4;i++){//控制行数
for(int j = 1;j <= 5 - i;j++){//控制列数
System.out.print("*");
}
System.out.println();
}
/*
----*-
---*-*-
--*-*-*-
-*-*-*-*-
*-*-*-*-*-
-*-*-*-*-
--*-*-*-
---*-*-
----*-
- 为空格,方便观察
*/
//上半部分
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 5 - i;j++){
System.out.print(" ");
}
for(int m = 1;m <= i;m++){
System.out.print("* ");
}
System.out.println();
}
//下半部分
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= i;j++){
System.out.print(" ");
}
for(int m = 1;m <= 5 - i;m++){
System.out.print("* ");
}
System.out.println();
}
}
}
练习2:
九九乘法表
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
… …
9 * 1 = 9 … … 9 * 9 = 81
class NineNineTable{
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) + " ");
}
System.out.println();
}
}
}
练习3:
100以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数
–>从2开始,到这个数-1为止,
都不能被这个数本身整除
最小的质数是:2
class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
for(int i = 2;i < 100;i++){//遍历100以内的自然数
for(int j = 2;j < i;j++){//j:被i除
if(i % j == 0){//i被j除尽
isFlag = false;
}
}
//如果isFlag没被修改,所以i就没被从2开始,到i-1除尽过
if(isFlag == true){
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
}
}
练习4:练习3Plus版
100000以内的所有质数的输出。
对PrimeNumberTest.java 文件(练习三中的代码)中的指数输出问题进行优化
实现方式1:
class PrimeNumberTest1 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
//获取当前时间距离1070-01-01 00:00:00 的毫秒数
Long start = System.currentTimeMillis();
int count = 0;//记录质数的个数
for(int i = 2;i < 100000;i++){//遍历100以内的自然数
//优化2(i-->Math.sqrt(i)):对本身是质数的自然数是有效的
for(int j = 2;j < Math.sqrt(i);j++){//j:被i除
//for(int j = 2;j < i;j++){//j:被i除
if(i % j == 0){//i被j除尽
isFlag = false;
break;//优化1:只对本身非质数的自然数是有效的
}
}
//如果isFlag没被修改,所以i就没被从2开始,到i-1除尽过
if(isFlag == true){
//System.out.println(i);//输出拖慢了程序的效率
count++;
}
//重置isFlag
isFlag = true;
}
//获取当前时间距离1070-01-01 00:00:00 的毫秒数
Long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("当前程序运行花费时间为:"+ (end - start));
//未优化的花费时间 19978ms --------------------> 14052ms(去掉输出语句后的时间,下同)
//优化1(加了break后):花费时间为 2596ms -----> 1083ms
//优化2:花费时间为 1022ms --------------------> 12ms
}
}
练习5:练习3Plus修改版
100000以内的所有质数的输出。
对PrimeNumberTest.java 文件(练习三中的代码)中的指数输出问题进行优化
实现方式2:
class PrimeNumberTest2 {
public static void main(String[] args) {
//获取当前时间距离1070-01-01 00:00:00 的毫秒数
Long start = System.currentTimeMillis();
int count = 0;//记录质数的个数
label:for(int i = 2;i < 100000;i++){//遍历100以内的自然数
for(int j = 2;j < Math.sqrt(i);j++){//j:被i除
if(i % j == 0){//i被j除尽
continue label;//结束label这个循环的本次循环
}
}
//执行到此步骤的都是质数
count++;
}
//获取当前时间距离1070-01-01 00:00:00 的毫秒数
Long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("当前程序运行花费时间为:"+ (end - start));
//12ms
}
}