黑马程序员技术交流社区

标题: 只用一个for循环打印菱形* [打印本页]

作者: Gonnaloveu    时间: 2015-1-6 22:55
标题: 只用一个for循环打印菱形*
本帖最后由 Gonnaloveu 于 2015-1-7 09:29 编辑

学java基础有一个月了,打算复习一下,无意间想到打印菱形了,以下是我自己写出来的两种方法,如果大家有什么其他方法欢迎分享.或者有什么其他有意思的拿出来大家一起做吧.
要求:只用一个for打印菱形"*"(当然其他的循环如while也不能用啦)
第一种方法:
  1. import java.util.Scanner;

  2. public class Test3 {
  3.         public static void main(String[] args) {
  4.                 Scanner sc =new Scanner(System.in);
  5.                 System.out.println("请输入菱形的行数(请输入单数,因为双数无法构成菱形):");
  6.                 int x=sc.nextInt();
  7.                 for (int i = 0, j = 0, k = 0; i < x;) {
  8.                         if (Math.abs(i - x/2) + j == x/2) { //判断输出是否是此行的最后一个"*"
  9.                                 if (Math.abs(i - x/2) > k) {        //用来制造第一行和最后一行的空格
  10.                                         System.out.print(" ");
  11.                                         k++;
  12.                                 } else {                                                //换行并初始化j和k
  13.                                         System.out.println("*");
  14.                                         j = 0;
  15.                                         k = 0;
  16.                                         i++;
  17.                                 }
  18.                         } else {
  19.                                 if (Math.abs(i - x/2) > k) {        //用来打印除第一行和最后一行的空格
  20.                                         System.out.print(" ");
  21.                                         k++;
  22.                                 } else {
  23.                                         System.out.print("**");                //后一个*可以改成空格
  24.                                         j++;
  25.                                 }
  26.                         }
  27.                 }
  28.         }
  29. }
复制代码

第二种方法:

  1. import java.util.Scanner;
  2. /**
  3. * 假设菱形x行
  4. * 因为是菱形x行x列一共需要循环x²次
  5. * i%x代表第几列 i/x代表第几行  然后判断应该打印什么就可以了
  6. * */
  7. public class Test4 {
  8.         public static void main(String[] args) {
  9.                 Scanner sc =new Scanner(System.in);
  10.                 System.out.println("请输入菱形的行数(请输入单数,因为双数无法构成菱形):");
  11.                 int x=sc.nextInt();
  12.                 for(int i =0;i<x*x;i++){               
  13.                         if(i%x<Math.abs(i/x-x/2)){               
  14.                                 System.out.print(" ");               
  15.                         }else if(i%x<x-1-Math.abs(i/x-x/2)){
  16.                                 System.out.print("*");
  17.                         }else if(i%x == x-1){
  18.                                 System.out.println("*");
  19.                         }
  20.                 }
  21.         }
  22. }
复制代码
补充:
以上两种执行效果例图:

看到有人想要空心菱形的实际添加一个判断语句即可:
  1. import java.util.Scanner;

  2. public class Test3 {
  3.         public static void main(String[] args) {
  4.                 Scanner sc =new Scanner(System.in);
  5.                 System.out.println("请输入菱形的行数(请输入单数,因为双数无法构成菱形):");
  6.                 int x=sc.nextInt();
  7.                 for (int i = 0, j = 0, k = 0; i < x;) {
  8.                         if (Math.abs(i - x/2) + j == x/2) { //判断输出是否是此行的最后一个"*"
  9.                                 if (Math.abs(i - x/2) > k) {        //用来制造第一行和最后一行的空格
  10.                                         System.out.print(" ");
  11.                                         k++;
  12.                                 } else {                                                //换行并初始化j和k
  13.                                         System.out.println("*");
  14.                                         j = 0;
  15.                                         k = 0;
  16.                                         i++;
  17.                                 }
  18.                         } else {
  19.                                 if (Math.abs(i - x/2) > k) {        //用来打印除第一行和最后一行的空格
  20.                                         System.out.print(" ");
  21.                                         k++;
  22.                                 }else if(j==0){
  23.                                         System.out.print("* ");
  24.                                         j++;
  25.                                 }
  26.                                 else {
  27.                                         System.out.print("  ");                //后一个*可以改成空格
  28.                                         j++;
  29.                                 }
  30.                         }
  31.                 }
复制代码
效果图:




作者: Gonnaloveu    时间: 2015-1-6 23:06
最近发现以前学的都忘差不多了,看来还是代码敲得少. =.=
作者: aa524500    时间: 2015-1-6 23:08
不错,感谢分享了啊
作者: Gonnaloveu    时间: 2015-1-6 23:22
完全自学没人可以问太困难..
作者: jun_03    时间: 2015-1-6 23:23
要不要这么吊!
作者: 李增宽    时间: 2015-1-6 23:24
厉害
作者: 银离子    时间: 2015-1-6 23:27
Gonnaloveu 发表于 2015-1-6 23:22
完全自学没人可以问太困难..

同感:hug:
作者: Gonnaloveu    时间: 2015-1-6 23:31
jun_03 发表于 2015-1-6 23:23
要不要这么吊!

最近打算报名,各种做基础题,无意间想到了这个,整体感觉我基础一点也不好...唉
作者: Gonnaloveu    时间: 2015-1-6 23:34
银离子 发表于 2015-1-6 23:27
同感

尤其许多问题度娘也不知道.一想想好长时间,太伤
作者: TW莞尔一笑    时间: 2015-1-7 00:15
是这个吗?
  1.    *
  2.        *     *
  3.     *           *
  4. *                 *
  5.     *           *
  6.        *     *
  7.           *
复制代码

作者: huduzhi    时间: 2015-1-7 00:46
大牛呀,学习了。。
作者: 励志Java_鸿政    时间: 2015-1-7 02:17
学习一下!琢磨琢磨
作者: hanjun    时间: 2015-1-7 04:20
厉害。。。
作者: 郭文飞    时间: 2015-1-7 07:54
强  还真没想过   
作者: 飘零宾    时间: 2015-1-7 08:46
感谢分享。
作者: 開忄    时间: 2015-1-7 08:51
很好,很强悍
作者: Gonnaloveu    时间: 2015-1-7 09:17
TW莞尔一笑 发表于 2015-1-7 00:15
是这个吗?

     *
    ***
   *****
  *******
*********
***********
*********
  *******
   *****
    ***
     *   两个都是这种的,如果想要空心的可以改
作者: ※无价※之宝    时间: 2015-1-7 09:49
看看大神们的学习
作者: 精英通    时间: 2015-1-7 10:11
好强大,学习了
作者: Gonnaloveu    时间: 2015-1-7 13:24
想报61期不知道现在走流程会不会太早
作者: TW莞尔一笑    时间: 2015-1-7 22:27
Gonnaloveu 发表于 2015-1-7 09:17
*
    ***
   *****

实心的我也会,空心的还不会改.
作者: #→_→    时间: 2015-1-7 22:34
why are you so diao?
学习了。。。。。。。
顺便问下基础测试题可以发一份么,谢谢楼主啦
作者: jinghoujiayin    时间: 2015-1-7 22:57
学习下,回头试试
作者: 西西小枫    时间: 2015-1-7 23:18
不错,感谢分享。
作者: quick3g    时间: 2015-1-8 01:21
高手呀!数学真奇妙,学习了。
作者: iblackhorse    时间: 2015-1-8 18:56
好棒,今天刚好学到这里,非常感谢楼主的分享哦。我看看代码,自己敲一下
作者: 探寻者    时间: 2015-1-8 19:20
今天试着敲空心菱形,只用for循环,改了好多次才出来,把楼主的方法再试试看能加深理解吗




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2