C编程Zig-Zag实践

时间:2015-08-14 06:31:25

标签: c

我在Objective-C中练习使用forif-elseprintf在控制台中打印这样的Zig-Zag:

请看图片:

enter image description here

我已经尝试过使用C编程的代码并打印一个三角形,然后尝试编辑这个,但是无法做更多的事情来获得我的Zig-Zag。

我已经解决了我的问题。非常感谢你们。

 for (int i = 0; i < 5; i++) {
    for(int j = 1; j<= 21; j++ ){
        if(j<=9){
            if(j - i == 5 || j+ i == 5){
                printf("*") ;
            }else{
                printf(" ");
            }
        }else{
            if(j+i == 13 || j - i == 13 || j + i == 21){
                printf("*") ;
            }
            else{
                printf(" ");
            }
        }
    }
    printf("\n");
}

2 个答案:

答案 0 :(得分:0)

好的,根据您更新的问题尝试2。让我们从基本结构开始。设置一些宽度和高度的坐标 - 我们将在多个地方引用它们,因此consts可以很容易地进行更改 - 并创建一个带有基本逻辑的循环来开始获得所需的显示。

const int numRows = 5;
const int numCols = 21;
for (int row = 0; row < numRows; ++row)
{
    for (int col = 0; col < numCols; ++col)
    {
        if (col == row)
        {
            printf("X");
        }
        else
        {
            printf(" ");
        }
    }
    printf("\n");
}

这给了我们:

X                    
 X                   
  X                  
   X                 
    X                

这是错误的方式,只给我们一个&#34; downtroke&#34;,但这是一个好的开始。让我们使用模数函数来重复模式。重复发生在第9个字符上,这表明我们需要使用((numRows - 1)* 2)作为我们的模数。

const int modulusVal = ((numRows - 1) * 2);
for (int row = 0; row < numRows; ++row)
{
    for (int col = 0; col < numCols; ++col)
    {
        int modCol = (col % modulusVal);
        if (modCol == row)
        {
            printf("X");
        }
        else
        {
            printf(" ");
        }
    }
    printf("\n");
}

现在我们得到:

X       X       X    
 X       X       X   
  X       X       X  
   X       X       X 
    X       X       X

开始变得更接近我们想要的东西。所以,对于上行。当modCol在行的范围内时,显示下行程序,即0-4。当modCol超过此范围时,我们通过从中减去行数将其恢复到范围内。

然后我们&#34;反转&#34;它可以从行的最高值中减去它,即numRows - 1.这意味着当modCol为0时它将变为4,当它为1时它将变为3,当它为2时它将保持不变。 / p>

for (int row = 0; row < numRows; ++row)
{
    for (int col = 0; col < numCols; ++col)
    {
        int modCol = (col % modulusVal);
        if (modCol >= numRows)
        {
            modCol -= numRows;
            modCol = ((numRows - 1) - modCol);
        }

        if (modCol == row)
        {
            printf("X");
        }
        else
        {
            printf(" ");
        }
    }
    printf("\n");
}

现在我们得到:

X       X       X    
 X       X       X   
  X    X  X    X  X  
   X  X    X  X    X 
    XX      XX      X

关闭,但没有雪茄。第5列被视为第0列,但我们需要将其视为第1列。进行此更改以修复它:

modCol = ((numRows - 1) - (modCol + 1));

Output:
X       X       X    
 X     X X     X X   
  X   X   X   X   X  
   X X     X X     X 
    X       X       X

这有我们想要的模式,但是当我们想要左下角时从左上角开始。轻松修复。在计算了相同的modCol之后我们在它大于/等于/到numRows时将它反转。

for (int row = 0; row < numRows; ++row)
{
    for (int col = 0; col < numCols; ++col)
    {
        int modCol = (col % modulusVal);
        if (modCol >= numRows)
        {
            modCol -= numRows;
            modCol = ((numRows - 1) - (modCol + 1));
        }
        modCol = ((numRows - 1) - modCol);

        if (modCol == row)
        {
            printf("X");
        }
        else
        {
            printf(" ");
        }
    }
    printf("\n");
}

最后我们得到了我们想要的输出:

    X       X       X
   X X     X X     X 
  X   X   X   X   X  
 X     X X     X X   
X       X       X    

我希望这会有所帮助并且相当容易理解。

答案 1 :(得分:-1)

我不熟悉使用Objectionable C的控制台编程,你还没有准确解释你曾经尝试过的,有效的和没有的。

假设您的问题是选择适当位置以显示“+”字符并且不在控制台上的特定位置显示文本的代码,这就是我要做的事情:

int currentY = MIN_Y;
int incrementY = 1;
for (int currentX = MIN_X; currentX <= MAX_X; ++currentX)
{
    SetCursorPosition(currentX, currentY);
    printf("+");

    currentY += incrementY;
    if (currentY == MAX_Y)
    {
        incrementY = -1;
    }
    else if (currentY == MIN_Y)
    {
        incrementY = 1;
    }
}

这假设你有一个SetCursor()的函数和MIN / MAX X / Y的consts /。

'if'语句可以优化为:

if (currentY == MAX_Y || currentY == MIN_Y)
{
    incrementY -= incrementY;
}

但您需要使用'else'语句。希望这段代码非常自我解释,对你有用处。