c - 打印出目标表模式中的字符

标签 c

我必须用c编写代码,打印出目标表模式。

So input for example:

3
1
2
3


and the output:

*

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

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

我已经做了几次尝试,但它不起作用,无法做到中间区域。
我已经完成了这段代码,对于 1-2 来说它可以工作,但是对于 2+ 来说我不能这样做。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>

int main()
{
    int n,i,k;
    int p=0;
    int j=0,l=0;
    int d=0;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&k);
        d=((4*k)-3)*((4*k)-3);
            p=((4*k)-3);
        for(j=0; j<p; j++)
        {
            if(j==0 || j==p-1)
            {
                for(l=0; l<p; l++)
                    printf("*");
                        printf("\n");
            }

            if(j==p/2+1)
            {
                    for(l=0; l<p; l++)
                        {
                        if(l%2==0) 
                            printf("*");
                        else printf(" ");
                        }
                    printf("\n");
            }
            if(j>0 && j<p/2)
            {
                    for(l=0; l<p; l++)
                    {   
                        if(l==0 || l==p-1)
                            printf("*");
                        else printf(" ");
                    }
                    printf("\n");
                        }
                        if(j>p/2 && j<p-1)
            {
                    for(l=0; l<p; l++)
                    {   
                        if(l==0 || l==p-1)
                            printf("*");
                        else printf(" ");
                    }
                    printf("\n");
                        }

        }
    }
    return 0;
}

最佳答案

#include <stdio.h>
#include <stdbool.h>

bool online(int size, int r, int c){
    if(size < 1)
        return false;
    int last = size-1;
    if((r == 0 || r == last) && (0 <= c && c <= last))
        return true;
    if((c == 0 || c == last) && (0 <= r && r <= last))
        return true;
    return online(size-4, r-2, c-2);
}

int main(void){
    int t, n, size;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        size = 4*n-3;//1 + 4*(size-1);
        for(int r = 0; r < size; ++r){
            for(int c = 0; c < size; ++c){
                if(online(size, r, c))
                    putchar('*');
                else
                    putchar(' ');
            }
            putchar('\n');
        }
        putchar('\n');
    }
}

关于c - 打印出目标表模式中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253211/

相关文章:

c - 决定是使用 DOM、SAX 还是 XPath 的因素

c - 在没有安装readline的计算机上使用readline?

c - 数字时钟 C 代码不会显示正确的时间

C 按升序或降序打印二维数组元素

c - 为什么命令行参数声明会导致段错误

c - 将数据传输到工作线程的回调或从工作线程的回调传输数据

c - 如何静态且高效地实现两个节点数组?

c - 提取超过固定阈值的较低数字?

c - 编译时出错

c - Int 到 char 数组作为函数返回 char 数组的简单方法