在 C 中打印三角形
Posted
技术标签:
【中文标题】在 C 中打印三角形【英文标题】:Printing triangle in C 【发布时间】:2017-03-25 05:55:35 【问题描述】:我是 C 新手,我有这个程序,我试图根据它的高度打印一个三角形:
/\
/__\
所以如果高度为2,那么'/'、'\'和'_'有2个。
所以我写了这些代码:
#include <stdio.h>
int main(void)
int noOfRows;
printf("Enter height: ");
scanf("%d", &noOfRows);
int counter, rowNumber;
for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
// For each row, insert numberOfRows - N spaces before printing
for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
printf(" ");
// For each row, print N times the character
printf("/");
for (counter = 0; counter < noOfRows; counter++)
printf("\\");
printf(" ");
printf("\n");
return 0;
但是当我输入 3 作为高度时,它会给我这样的输出。
/\\\
/\\\
/\\\
我想在每个新行出现时获得更多空间的“\”,但我不确定应该如何修改 for 循环以正确形成三角形。请让我知道我是否应该添加更多问题以使其更清楚。
我对代码进行了更改,目前有这个:
#include <stdio.h>
int main(void)
int noOfRows;
printf("Enter height: ");
scanf("%d", &noOfRows);
int counter, rowNumber;
for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
// For each row, insert numberOfRows - N spaces before printing
for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
printf(" ");
// For each row, print N times the character
printf("/");
for (counter = 0 ; counter < rowNumber ; counter++)
if(rowNumber >= 1)
for(int j=0; j<counter +1; j++)
printf(" ");
if(rowNumber != 0)
printf(" ");
printf("\\");
printf("\n");
return 0;
现在我当前的输出是这样的:
Height: 3
/\
/ \
/ \
Height: 5
/\
/ \
/ \
/ \
/ \
我在代码中做错了什么导致某些“\”走得更远?
【问题讨论】:
这是你的大学作业吗?我建议你多一些耐心,尝试自己解决这个问题,如果你在没有任何人帮助的情况下解决它会给你带来更多的乐趣。否则肯定有人会用循环和打印语句来回答这个问题。 为什么要循环打印\\
?每行只有一个。您需要一个循环来打印/
和\\
之间的空格,类似于您用来打印/
之前的空格的循环。
最后一行你需要打印_
而不是空格。
@Barmar 谢谢你,我采纳了你的建议并编辑了代码,请参阅上面我现在发布的代码编辑版本。
【参考方案1】:
使用 if else 只能使用两个循环来打印此模式。在 if else 中,您可以对空格、反斜杠、正斜杠和下划线使用多个条件。
1 #include<stdio.h>
2
3 int main()
4
5 int n;
6 int i,j,k;
7 printf("Enter hight of trangle\n");
8 scanf("%d",&n);
9 for(i=0;i<n;i++,printf("\n"))
10
11 for(j=-n;j<=n;j++)
12
13 if(j<0) k=-j;
14 else k=j;
15
16 if(j==0);
17 else if((j<0)&&(k==(i+1)))
18 printf("/");
19 else if((j>0)&&(k==(i+1)))
20 printf("\\");
21 else if((i+1)==n)
22 printf("_");
23 else
24 printf(" ");
25
26
27
【讨论】:
谢谢,这组代码在获得单个三角形时起作用:)【参考方案2】:@Barmar 的想法是正确的,你不再需要
if(rowNumber != 0)
printf(" ");
完整代码:
#include <stdio.h>
int main(void)
int noOfRows;
printf("Enter height: ");
scanf("%d", &noOfRows);
int counter, rowNumber;
for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
printf(" ");
printf("/");
for (counter = 0 ; counter < rowNumber ; counter++)
if(rowNumber >= 1)
for (counter = 0; counter < rowNumber*2; counter++)
if (rowNumber == noOfRows-1)
printf("_");
else
printf(" ");
printf("\\");
printf("\n");
【讨论】:
【参考方案3】:您不需要两个嵌套循环来打印/
和\\
之间的空格。它应该只打印rowNumber*2
空格。
for (counter = 0; counter < rowNumber*2; counter++)
printf(" ");
您不需要测试if (rowNumber >= 1)
,因为当它是0
时,循环会立即结束。
但是,您确实需要检查最后一行,因为您应该打印 _
而不是空格。所以应该是:
for (counter = 0; counter < rowNumber*2; counter++)
if (rowNumber == noOfRows-1)
printf("_");
else
printf(" ");
【讨论】:
谢谢,我对代码进行了更改,现在我可以打印单个三角形了!!! :)【参考方案4】:或者,您可以将重复打印的字符抽象为:
// print_char(n,c) prints c n-times.
void print_char(int n, char c)
for (int i = 0; i < n; ++i)
printf("%c", c);
这样您在构建三角形时只需跟踪一个 for 循环:
void print_triangle(int height)
for (int i = 1; i <= height; ++i)
print_char(height-i, ' '); // print leading empty spaces
printf("/"); // print forward slash
if (i == height) // print middle dashes/spaces
print_char((height-1)*2, '_'); // <--| |
else // |
print_char((i-1)*2, ' '); // <---------|
printf("\\\n"); // print backslash
例如,
int main(void)
int height;
printf("Enter height: ");
if (scanf("%d", &height) != 1)
// handle error if scanf fails
print_triangle(height);
return 0;
然后,
$ Enter height: 1
/\
$ Enter height: 5
/\
/ \
/ \
/ \
/________\
【讨论】:
以上是关于在 C 中打印三角形的主要内容,如果未能解决你的问题,请参考以下文章