嗨,我需要一些帮助来弄清楚如何编写这个模式程序。控制台要求输出许多行,并打印出由星形构成的上升三角形,其中每条前进线比前一条线多两颗星,然后是一个下降三角形,其中每条前进线比前一条线少两颗星。这可能不是最好的解释,但这是我基本上需要得到的一个例子:
输入行数:6
*
***
*****
*****
***
*
另一个奇数的例子:
输入行数:7
*
***
*****
*******
*****
***
*
我一直在论坛上寻找这个具体的例子,但我还没找到它
答案 0 :(得分:2)
这是我的代码:
#include <stdio.h>
int main(int argc, char** argv){
int rows;
int limit;
int twiceFlag = 0;
char c = '*';
int i,j;
printf("enter the number of rows:");
scanf("%d", &rows);
if (rows % 2 == 0){
twiceFlag = 1;
limit = rows / 2;
}
else{
limit = rows / 2 + 1;
}
/*Logic to print the Stars*/
for (i = 1; i <= limit; i++){
printf("%c", c);
for (j = 1; j < i; j++){
printf("%c%c", c, c);
}
printf("\n");
}
if (twiceFlag == 1){
printf("%c", c);
for (j = 1; j < limit; j++){
printf("%c%c", c, c);
}
printf("\n");
}
limit -=2;
for (i = limit; i >= 0; i--){
printf("%c", c);
for (j = i; j > 0; j--){
printf("%c%c", c, c);
}
printf("\n");
}
return 0;
}
答案 1 :(得分:2)
试试此代码
int main(){
int row=6,n; //enter number of rows
n=row/2;
for(int i=n; i>=-n;i--) //if row is 6, `i` will work for 3 to -3
{
if(row%2==0 && i==0) //if number is even, shouldn't work for i=0
i--;
for(int j=1; j<=(2*(n-(i<0?-i:i)))+1; j++){
printf("*");
}
printf("\n");
}
return 0;
}
答案 2 :(得分:2)
对于N行数据,您将有一个从0到N-1的循环索引。通过评估M = min(i, N-1-i)
,您可以获得所需的“上下”形状。对于N = 6,这将生成序列0,1,2,2,1,0;对于N = 7,它生成0,1,2,3,2,1,0。在给定的恒星行中,您打印m = 2 * M + 1
个星。因此:
#include <stdio.h>
static inline int min(int x, int y) { return (x < y) ? x : y; }
int main(void)
{
int N;
if (scanf("%d", &N) == 1)
{
for (int i = 0; i < N; i++)
{
int m = 2 * min(i, N - 1 - i) + 1;
for (int j = 0; j < m; j++)
putchar('*');
putchar('\n');
}
}
return 0;
}
关键技巧是M
的表达式。
请注意,代码直接通过测试来自scanf()
的返回值来检查有效输入,并通过不为N
的零值或负值打印任何内容来间接检查。它没有对N
进行合理性检查,但可能应该这样做。
如果编译器不支持C99或C11,则可以使用宏代替内联函数,并在循环外声明循环索引。