Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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
如何使用C绘制只包含for/while循环和if/else语句(不含数组)的#螺旋_C_Spiral - Fatal编程技术网

如何使用C绘制只包含for/while循环和if/else语句(不含数组)的#螺旋

如何使用C绘制只包含for/while循环和if/else语句(不含数组)的#螺旋,c,spiral,C,Spiral,因此,我对C非常陌生,我想知道如何创建以下螺旋形状: 这是我滑稽的尝试 #include <stdio.h> int main(void) { int size; int i,j; printf("Enter size: "); scanf("%d", &size); for (i = 0, j = 0; i < size - 4; i++, j+=2) { int row = 1; whi

因此,我对C非常陌生,我想知道如何创建以下螺旋形状:

这是我滑稽的尝试

#include <stdio.h>
int main(void) {
    int size;
    int i,j;

    printf("Enter size: ");
    scanf("%d", &size);

    for (i = 0, j = 0; i < size - 4; i++, j+=2) {

        int row = 1;
        while (row <= size) {
            int column = 1; 
            while (column <= size) {

                if ((row == 1 + j && column > j && column < size - j)|| 
                    (row == size - (j) && column > j && column < size - j) || 
                    (column == size - (j) && row > j && row <= size - j) ||
                    (column == 1 + j && row > (2+j) && row < size - j)) {
                    printf("*");
                }

                else {
                    printf("-");
                }

                column++;
            }   
            row++;
            printf("\n");

        }
    }
    return 0;
}
#包括
内部主(空){
整数大小;
int i,j;
printf(“输入大小:”);
scanf(“%d”,大小(&S);
对于(i=0,j=0;ij和行(2+j)和行<大小-j)){
printf(“*”);
}
否则{
printf(“-”);
}
列++;
}   
行++;
printf(“\n”);
}
}
返回0;
}

任何帮助都将不胜感激

我很喜欢这个问题,在想出解决方法时遇到了一些麻烦。然而,足够的混乱使模式变得明显;结果如下:

#include <stdio.h>

#define BLANK  "  "
#define FILLED "# "

void spiral(int size) {
    int i, j;

    if (!(size & 1)) { size++; }
    
    int half = size / 2 + 1;

    /* top */
    
    for (i = 0; i < half; i++) {
        if (i & 1) {
            for (j = 0; j < size; j++) {
                if (!(j & 1) && (j < i - 1 || j >= size - i)) {
                    printf(FILLED);
                }
                else {
                    printf(BLANK);
                }
            }
        }
        else {
            for (j = 0; j < size; j++) {
                if ((j & 1) && (j < i - 1 || j >= size - i)) {
                    printf(BLANK);
                }
                else {
                    printf(FILLED);
                }
            }
        }

        puts("");
    }
    
    /* bottom half */

    for (; i < size; i++) {
        if (i & 1) {
            for (j = 0; j < size; j++) {
                if (!(j & 1) && (j < size - i || j > i)) {
                    printf(FILLED);
                }
                else {
                    printf(BLANK);
                }
            }
        }
        else {
            for (j = 0; j < size; j++) {
                if ((j & 1) && (j < size - i || j > i)) {
                    printf(BLANK);
                }
                else {
                    printf(FILLED);
                }
            }
        }

        puts("");
    }
}

int main() {
    int i;

    for (i = 1; i < 35; i += 2 ) {
        spiral(i);
        puts("\n");
    }

    return 0;
}
说明: 让
i
表示当前行索引,
j
表示当前列索引

把问题分成两半。下半部分比较容易,因为左半部分和右半部分是对称的,所以偶数行和奇数行都在交替列索引
上打印各自的图案,如果ji

上半部分有点棘手:模式是一样的,只是左侧落后于右侧1,这意味着我们需要从左侧减去1:
如果j=size-i


注意,这段代码可以使用一些清理来减少重复;我把它写得很详细,以便弄清楚它是如何工作的。我还自由地调整了要打印的字符,因为原稿更难看——这很容易通过使用
#define
s或向函数添加参数进行调整。

您的方法很勇敢,但看起来您在外循环中打印了一堆单独的螺旋框。您可能希望尝试将其简化为两个循环(行、列),然后再尝试使用条件语句。我会考虑偶数行/奇数行,也许会用一两个变量来编码条件句所需的逻辑。你的问题是什么?你需要什么帮助?您对程序的输出不满意吗?输出是什么?怎么了?