《Java从入门到精通》“循环结构 “拓展习题

简介: 《Java从入门到精通》“循环结构 “拓展习题

目录

一、for循环嵌套:以打印九九乘法表

二、 用for循环打印一个菱形

三、 Java 嵌套循环之跳出多层循环



一、for循环嵌套:以打印九九乘法表


public class Test {

   public static void main(String args[]) {

       for(int i=1;i<=9;i++){

           for(int j=1;j<=i;j++){

               System.out.print(j+"*"+i+"="+i*j+" ");

           }

           System.out.println();

       }

   }

}


第一个 for 循环:代表行数。定一个整型变量 i, 它的初始值是 1;判断 i 是否小于等于 9;如果成立, i 就自增 1。

第二个 for 循环:代表列数。定一个整型变量 j, 它的初始值是 1;判断 j 是否小于等于 i;如果成立, j 就自增 1。

二、 用for循环打印一个菱形


public class Test {

   public static void main(String[] args) {

       //定义变量

       int i,j,q;

       //打印菱形的上半部分,左边打印倒直角三角形的空格,右边打印等腰三角形

       for( i = 1;i < 6; i ++) //外循环控制行数,共打印五行

       {

           //左边打印倒直角三角形空格

           for( j = 5; j > i; j--) //与外循环关联,初始值不变,表达式变化,控制打印的列数

           {

               System.out.print(" ");

           }

           //右边等腰三角形

           for( q = 1;q < i*2; q++) //与外循环关联,初始值不变,表达式变化,打印奇数列1,3,5,7,9

           {

               System.out.print("*");

           }

           System.out.println();    //换行

       }

       //打印菱形的下半部分,左边为直角三角形的空格,右边为倒的等腰三角形

       for(i = 1; i < 5; i++) //外循环控制行数,共打印四行

       {

           //左边直角三角形空格

           for(j = 1;j <= i; j++) {    //与外循环关联,初始值不变,表达式变化,共打印五行

               System.out.print(" ");

           }

           //右边倒直角三角形

           for( q = i*2; q < 9 ; q++) {    //与外循环关联,初始值变化,表达式不变,打印奇数列7,5,3,1

               System.out.print("*");

           }

           System.out.println();    //换行

       }

   }

}

思路:

  • 菱形为上下两个等腰三角形(用两个外层for循环分别代表上下两部分)
  • 上部分为倒直角三角形 + 等腰三角形。外层for以要嵌套两个for循环分别打印出倒直角三角形(直角三角形打印空格)和等腰三角形
  • 下部分为直角三角形和倒等腰三角形。外层for同样要嵌套两个for循环打印直角三角形(直角三角形打印空格)和倒的等腰三角形

三、 Java 嵌套循环之跳出多层循环

例:有以下程序,输出 0-99,两个数值间使用空格分隔,每 10 个数一行,每行用 ---- 分隔,代码:


public class Test {

   public static void main(String []args) {

       for(int i = 0; i < 10; i++){

           for(int j = 0; j < 10; j++){

               System.out.print("" + i + j +"  ");

           }

           System.out.println("\n -------------------------------------- \n");

       }

       System.out.println("输出完毕!");

   }

}

输出结果


00  01  02  03  04  05  06  07  08  09  

--------------------------------------


10  11  12  13  14  15  16  17  18  19  

--------------------------------------


20  21  22  23  24  25  26  27  28  29  

--------------------------------------


30  31  32  33  34  35  36  37  38  39  

--------------------------------------


40  41  42  43  44  45  46  47  48  49  

--------------------------------------


50  51  52  53  54  55  56  57  58  59  

--------------------------------------


60  61  62  63  64  65  66  67  68  69  

--------------------------------------


70  71  72  73  74  75  76  77  78  79  

--------------------------------------


80  81  82  83  84  85  86  87  88  89  

--------------------------------------


90  91  92  93  94  95  96  97  98  99  

--------------------------------------

题目要求在不修改循环结构的情况下使输出结果变成输出 0-29:

根据题意我们一般情况下首先会想到直接判断当大于 29 的时候就跳出循环就是了。

代码如下:


public class Test {

   public static void main(String []args) {

       for(int i = 0; i < 10; i++){

           for(int j = 0; j < 10; j++){

               if(i * 10 + j > 29){

                   break;

               }

               System.out.print("" + i + j +"  ");

           }

           System.out.println("\n -------------------------------------- \n");

       }

       System.out.println("输出完毕!");

   }

}

输出结果


00  01  02  03  04  05  06  07  08  09

--------------------------------------

10  11  12  13  14  15  16  17  18  19

--------------------------------------

20  21  22  23  24  25  26  27  28  29

--------------------------------------

--------------------------------------

--------------------------------------

--------------------------------------

--------------------------------------

--------------------------------------

--------------------------------------

--------------------------------------


看输出结果确实达到了只是输出 0-29,但是你会发现和题目要求的输出结果是不一样的,后面多出了很多分隔线条,那是因为跳出循环体的语句 break 只能跳出当前语句的上一层循环。

这时我们需要想办法让他跳出多层循环。

修改后代码如下:


public class Test {

   public static void main(String []args) {

       lable:

       for(int i = 0; i < 10; i++){

           for(int j = 0; j < 10; j++){

               if(i * 10 + j > 29){

                   break lable;

               }

               System.out.print("" + i + j +"  ");

           }

           System.out.println("\n -------------------------------------- \n");

       }

       System.out.println("输出完毕!");

   }

}

输出结果


00  01  02  03  04  05  06  07  08  09  

--------------------------------------


10  11  12  13  14  15  16  17  18  19  

--------------------------------------


20  21  22  23  24  25  26  27  28  29  

--------------------------------------


我们在第 3 行定义了一个标记 标记名是 lable。

然后在第 7 行的跳出循环语句中使用 break lable 跳出到 lable 标记的循环外面。

相关文章
|
13天前
|
Java 数据安全/隐私保护
JAVA经典习题详解
JAVA经典习题详解
15 4
|
13天前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
26 0
|
2月前
|
Java C语言
|
4月前
|
设计模式 安全 Oracle
Java学习笔记:从入门到精通
Java学习笔记:从入门到精通
|
4月前
|
Java 开发者 Spring
从入门到精通,Spring 框架带你玩转 Java 企业应用开发!
【6月更文挑战第25天】Spring框架简化了Java企业开发,通过依赖注入降低耦合,如使用构造函数注入`UserService`中的`UserDao`。它还提供声明式事务管理,如`@Transactional`注解自动处理事务,减少手动错误。此外,Spring的AOP支持允许在不侵入业务逻辑的情况下实现横切关注点,如`LoggingAspect`所示。无论是新手还是资深开发者,Spring以其全面的功能和灵活性成为企业应用开发的强大工具。
34 4
|
4月前
|
存储 监控 算法
掌握Java内存管理:从入门到精通
【6月更文挑战第29天】本篇文章将引导读者深入理解Java的内存管理机制。不同于传统的技术文章,我们将通过一个故事来展开讲解,让复杂的技术内容变得生动易懂。文章不仅会涵盖基础的内存分配和回收概念,还将探讨高级特性如JVM调优和内存泄漏检测工具的使用,帮助开发者有效提升应用程序的性能和稳定性。
41 0
|
4月前
|
设计模式 监控 Java
打造高效的Java应用架构:从入门到精通
打造高效的Java应用架构:从入门到精通
|
4月前
|
安全 Java API
Java文件操作:从入门到精通,读写、复制、删除一个都不能少!
【6月更文挑战第27天】在Java编程中,学习文件操作至关重要,涵盖读写、复制和删除。入门文件读写涉及读取`example.txt`内容并追加文字;进阶文件复制展示如何使用`FileInputStream`和`FileOutputStream`从`source.txt`复制到`destination.txt`;精通文件删除则利用`File`的`delete()`方法安全删除`destination.txt`,前提检查文件存在且有权限。这些实例带你全面掌握Java文件操作基础!
37 0
|
4月前
|
Java
Java中的Lambda表达式:从入门到精通
Java中的Lambda表达式:从入门到精通
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。