所以我抬起头来,只找到了正常的三角形问题。 这个有点棘手。
给定一个N,你的程序应该创建一个带有N边大小的星号未填充三角形。
Example 1
Inform N: 1
*
Example 2:
Inform N: 2
**
*
Example 3:
Inform N: 3
***
**
*
Example 4:
Inform N: 4
****
* *
**
*
Example 5:
Inform N: 5
*****
* *
* *
**
*
这是我的尝试,我只能低效地填充三角形
void q39(){
int n,i,b;
printf("Inform N: ");
scanf ("%i",&n);
for ( i = 0; i < n; ++i)
{
printf("*");
for ( b = 1; b < n; ++b)
{
if (i==0)
{
printf("*");
}
else if (i==1 && b>1)
{
printf("*");
}
else if (i==2 && b>2)
{
printf("*");
}
else if(i==3 && b>3){
printf("*");
}
else if(i==4 && b>4){
printf("*");
}
else if(i==5 && b>5){
printf("*");
}
else if(i==6 && b>6){
printf("*");
}
else if(i==7 && b>7){
printf("*");
}
else if (i==8 && b>8){
printf("*");
}
}
printf("\n");
}
}
答案 0 :(得分:1)
我只是为你提供一个逻辑,你可以解决它。 你可以采取三个循环。一行表示i,第二表示*(星号)表示j,第三表示空白(空三角)表示k。现在,我希望你知道如何使用i,j制作一个三角形。 k的逻辑可能是它应该比行的循环(即第j个)少1并且应该打印一个空格(“”)。
您可以在这样的模块中划分问题
print_asterisk(n);
print_hollow_asterisk();
print_asterisk(1);
答案 1 :(得分:1)
您需要考虑用于打印三角形的算法。您可能需要绘制三种不同类型的线:
第1步 - 找出如何打印出上述行
第2步 - 在打印出上述行时计算
答案 2 :(得分:1)
这个问题的较长版本可以大大优化
void print_start_and_end_asterix( int n )
{
int i = 0;
for ( ; i < n ; i ++ )
{
if( i == 0 || i == n-1 )
printf("*");
else
printf(" ");
}
printf("\n");
}
void print_full_row( int n )
{
int i = 0;
for ( ; i < n ; i ++ )
printf("*");
printf("\n");
}
int main (){
int n;
scanf("%d", &n);
int row = 0 , col = n;
for ( row = 0 ; row < n ; row ++ , col--) {
if( row == 0 )
print_full_row(col);
else
print_start_and_end_asterix(col);
}
return 0;
}
答案 3 :(得分:1)
绘制的三角形是一个二维图形,因此可以使用两个嵌套的for
循环绘制。外循环跟踪正在绘制的行。内循环跟踪列。对于row
和col
的每个组合,必须做出一个非常简单的决定,我们应该输出一个星号,还是应该输出一个空格。
从外循环开始。外循环从N倒数到1是有意义的,因为一行上的字符数从N开始并减少直到达到1.所以外循环是
for ( row = N; row >= 1; row-- )
接下来是内循环。内循环需要计算每行上的字符数。我们安排了一些东西,以便外循环中的row
变量等于字符数。因此,内循环只是
for ( col = 0; col < row; col++ )
现在我们来做决定。鉴于row
和col
,我们应该打印星号还是空格?好吧,我们应该始终在第一行打印一个星号,即row == N
。我们还应该在左边缘打印一个星号,col == 0
。最后,我们在右边缘需要一个星号,col == row-1
。因此,决策代码是
if ( row == N || col == 0 || col == row-1 ) // top or left or right
putchar( '*' );
else
putchar( ' ' );
最后,在内循环完成后,我们需要输出一个换行符来开始下一行
putchar( '\n' );
这就是它的全部内容。
答案 4 :(得分:1)
你只需要认为第一行应填充*
第二件事是每行的第一个字符应该是*
最后一个字符也应该是*
。在你之间你需要填补空间。
int main()
{
int n=6;
for(int i=n-1;i>=0;i--) // using n-1, bcz loop is running upto 0
{
for(int j=0;j<=i;j++)
{
if(i==n-1 || j==0 ||i==j)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
条件if(i==n-1 || j==0 ||i==j)
这里使用了i==n-1
,因此第一行应填充*
j==0
用于生成每一行*
的第一个字符。每当新行开始,即j = 0时,它将打印一个*
字符
i==j
这用于在i == j时生成最后一个字符*
,这是我们运行循环的最后一个索引。所以在最后一个索引它将打印*
对于所有其他值,它将打印空间,因为它将运行else
条件。
输出
******
* *
* *
* *
**
*