我在Objective-C中练习使用for
,if-else
和printf
在控制台中打印这样的Zig-Zag:
请看图片:
我已经尝试过使用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");
}
答案 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'语句。希望这段代码非常自我解释,对你有用处。