Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中打印给定的菱形图案?_Java_Loops_Ascii Art - Fatal编程技术网

如何在Java中打印给定的菱形图案?

如何在Java中打印给定的菱形图案?,java,loops,ascii-art,Java,Loops,Ascii Art,基本上,我只需要正确放置空格的想法。 我的代码到目前为止 *********** ***** ***** **** **** *** *** ** ** * * ** ** *** *** **** **** ***** ***** *********** 公共类金字塔3{ 公共静态void main(字符串[]args){ int i,j; int noOfCol=11; 对于(i=1;i=6){ noOfCol=noOfCol

基本上,我只需要正确放置空格的想法。 我的代码到目前为止

***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********
公共类金字塔3{
公共静态void main(字符串[]args){
int i,j;
int noOfCol=11;
对于(i=1;i=6){
noOfCol=noOfCol+2;
}
}
}
}

这是代码,很抱歉文档不好,希望对您有所帮助

PS:要解决任何类似的问题,只需使用一张白纸和一支铅笔,然后将列和索引“i”做成网格,然后绘制一个关系,然后就可以将其用作循环条件

公共类测试{
公共静态void main(字符串[]args){
int n=10;
//顶
对于(int i=n;i>0;i--){
//明星
对于(int j=0;j

希望能有所帮助:)

这是我的解决方案,您想要的正是钻石图案

我有一个方法,它使我更容易打印

private静态void put(字符c、int n、布尔NL){
对于(inta=0;a
基本上,您可以告诉它:打印哪个字符,打印多少次,以及打印完成后是否应该添加新行

然后是实际的解决方案:

put('*',11,true);
整数计数=0;
对于(int a=5;a>=1;a--){
put('*',(int)Math.ceil(a),false);
put(“”,count++*2+1,false);
put('*',(int)Math.ceil(a),true);
}
计数=4;
对于(int a=2;a<6;a++){
put('*',(int)Math.ceil(a),false);
put(“”,计数--*2-1,假);
put('*',(int)Math.ceil(a),true);
}
put('*',11,true);
老实说,有一点蛮力逻辑,但总体思路很简单。我通过计数器变量跟踪间距,并分别打印菱形的顶部和底部

很抱歉缺少文档,因为我没有太多时间来解决这个问题。希望有帮助

由于缺乏测试,这里是输出

public class Pyramid3 {

    public static void main(String[] args) {

        int i, j;
        int noOfCol = 11;

        for (i = 1; i <= 11; i++) {

            for (j = 1; j <= noOfCol; j++) {
                System.out.print("*");
            }

            System.out.println();

            if (i == 1) {
                noOfCol--;
            } else if (i > 1 && i < 6) {
                noOfCol = noOfCol - 2;
            } else if (i > 6) {
                noOfCol = noOfCol + 2;
            }
        }
    }
}

要解决有关ASCII艺术的问题,可以尝试在不同的行中查找模式。可以看到,每一行都包含一些星号(
*
),一些空格(可能为零)和一些星号

因此,我们首先编写一个助手函数:

***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********

第二行在中间包含一个空格,当n为奇数时,在n为偶数的情况下为2,这样看来:

System.out.println(generateRow(n,0,0));
因为na是大小减去空间数除以2

现在在每一行,空格的数量增加了两个,所以星号的数量减少了一个。如果只剩下一个星号,循环将停止。因此,您可以将其改写为:

int ns = 2-(n%2);
int na = (n-ns)/2;
System.out.println(generateRow(na,ns,na));
现在,下半部分只是通过相反的过程生产出来的。首先,我们需要撤消最后一个
na
ns
增量递减:

int ns = 2-(n%2);
int na = (n-ns)/2;
for(; na >= 1; na--, ns += 2) {
    System.out.println(generateRow(na,ns,na));
}
然后我们循环直到空间数小于1:

na += 2;
ns -= 4;
将所有这些放在一起,结果是:

for(; ns > 1; na++, ns -= 2) {
    System.out.println(generateRow(na,ns,na));
}
演示

对于尺寸
2
3
5
8
11
33
,这将生成:

public static void generateDiamond (int n) {
    System.out.println(generateRow(n,0,0));
    int ns = 2-(n%2);
    int na = (n-ns)/2;
    for(; na >= 1; na--, ns += 2) {
        System.out.println(generateRow(na,ns,na));
    }
    na += 2;
    ns -= 4;
    for(; ns >= 1; na++, ns -= 2) {
        System.out.println(generateRow(na,ns,na));
    }
    System.out.println(generateRow(n,0,0));
}

我喜欢简洁明了的答案。矿山利用钻石的水平和垂直对称轴: 其思想是计算钻石的1/4,然后首先围绕垂直轴镜像,然后围绕水平轴镜像(
\uu
是一个空格)

首先,一个简短的实用功能用于:

下面是代码(使用Java8Lambdas打印结果和)


您可以在
-n
n
的行和列上使用两个嵌套流打印内接在正方形中的空菱形。当
n>iAbs+jAbs
时获得菱形:

int n=5;
字符串[]arr=IntStream
.range关闭(-n,n)
.map(数学::abs)
.mapToObj(i->IntStream
.range关闭(-n,n)
.map(数学::abs)
//刻在正方形上的空菱形
.mapToObj(j->i+j
Arrays.stream(arr.forEach)(System.out::println);
输出:

***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********

另见:


我认为您需要将noOfCol分为两个变量。总列数不变,而块中的星号数不变。两者都会影响您在给定行上打印的内容。谢谢:)。。如果有人能为我提供一个链接或一些东西,让我理解这段代码的逻辑,那对我会很有帮助。提前感谢:你可能想考虑我的答案,它可能是非常有洞察力的。使用<代码>(int)数学有什么意义?CEIL(A)< /代码>?写
a
(或
a+1
)不是一种很奇怪的方式吗?我想我是在调试ceil(a/2+1),然后删除了它,但保留了ceil部分:/Thank you@CommuSoft:)。
**
**

***
* *
***

*****
** **
*   *
** **
*****

********
***  ***
**    **
*      *
**    **
***  ***
********

***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********

*********************************
**************** ****************
***************   ***************
**************     **************
*************       *************
************         ************
***********           ***********
**********             **********
*********               *********
********                 ********
*******                   *******
******                     ******
*****                       *****
****                         ****
***                           ***
**                             **
*                               *
**                             **
***                           ***
****                         ****
*****                       *****
******                     ******
*******                   *******
********                 ********
*********               *********
**********             **********
***********           ***********
************         ************
*************       *************
**************     **************
***************   ***************
**************** ****************
*********************************
******
*****_
****__  
***___
**____
*_____
String repeat(String s, int times) {
  return times == 0 ? "" : new String(new char[times]).replace("\0", s);
}
 // height and width of the diamond
int size = 11;
// Mhh diamonds
List<String> l = new ArrayList<>();
// len includes the axis, too
for (int i=0, len = size/2 + 1;i<len;i++) {
  String s = repeat("*", len - i) + repeat(" ", i);
  //Mirror, omitting the axis itself and append
  s += (new StringBuilder(s)).reverse().substring(1);
  l.add(s);
}
// Print the upper part
l.forEach(System.out::println);
// mirror around the horizontal axis
Collections.reverse(l);
// Omit the horizontan axis and print the rest
l.subList(1,l.size()).forEach(System.out::println);
***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********
* * * * * * * * * * *
* * * * *   * * * * *
* * * *       * * * *
* * *           * * *
* *               * *
*                   *
* *               * *
* * *           * * *
* * * *       * * * *
* * * * *   * * * * *
* * * * * * * * * * *