目标:
实施一个程序,打印出一个指定高度的双半金字塔,按照下面的内容。
$ ./mario
Height: 4
# #
## ##
### ###
#### ####
问题:
过去3个小时左右一直在弄乱代码。我得到了第一条工作线,但除此之外的所有东西都只是2个平行支柱,由一个单一的散列标记组成。目前,该程序无限期地打印一个哈希标记。
代码:
int main (void) {
// user gives height value for pyramid
// h = height
int h;
do {
printf (
"How tall do you want your pyramid to be? Please type a number "
"between 0 and 23.\n");
h = get_int ();
} while (h < 0 || h > 23);
// Left side of pyramid says spaces first, followed by hashes. Two spaces
// inbetween sides of the pyramid. Right side renders hashes first, then
// inputs newline character.
// r = row
// s = space
// p = hash
// q = hash right
int q;
int p;
int s;
int r;
for (r = 0; r < h; r++) {
do {
do {
printf (" ");
s++;
} while (s < h - r);
// says spaces
do {
printf ("#");
p++;
} while (p < r++);
// says left hashes
// always print 2 spaces inbetween
printf (" "); // two spaces
do {
printf ("#");
q++;
} while (q < r++);
// says right hashes
printf ("\n");
q = 0;
p = 0;
s = 0;
// reset q,p,s values
} // end bracket of encompassing 'do' function
while (r < h);
//'for' function should execute once, increment 'r' by 1, and repeat
//until row height becomes height provided by user.
} // end bracket of for loop
} // end bracket of int main
预期结果:
程序创建由哈希符号和空格组成的金字塔。
实际结果:
无限循环打印功能。
答案 0 :(得分:1)
你的循环结束就像:
p++;
}
while (p < r++);
所以r
始终领先于p
,因为您正在增加两者。这是你的无限循环。
我在第二个r++
内循环之后移动while
得到一个非常好的结果,如下所示:
# #
# #
## ##
### ###
所以仍然有点调整,你就在这里。另一个问题是do/while
即使条件为假也会执行一次。替换为while
循环,或者像上面一样关闭:
do
{
while (s < h - r)
{
printf(" ");
s++;
}
//says spaces
while (p < r)
{
printf("#");
p++;
}
//says left hashes
//always print 2 spaces inbetween
printf(" ");
//two spaces
while(q < r)
{
printf("#");
q++;
}
//says right hashes
r++;
printf("\n");
q = 0;
p = 0;
s = 0;
// reset q,p,s values
}//end bracket of encompassing 'do' function
while(r < h);
请注意,使用“Notepad ++ / TextFX / TextFX edit / Reindent C ++代码”自动添加代码也很便宜
# #
## ##
### ###
#### ####
##### #####
###### ######
####### #######
######## ########
######### #########
答案 1 :(得分:1)
您的研究的较短实施
int i,j;
for (i=0 ; i<h ; i++) { // h lines
for(j=0 ; j < h+2+i+1 ; j++) { // cover all characters on 1 line
printf("%s", j<h-i-1 || j<h+2 && j>=h ? " " : "#");
}
printf("\n"); // end of line
}
关于j<h-i-1 || j<h+2 && j>=h ? " " : "#"
j<h-i-1
之前的#
个空格
{li> j<h+2 && j>=h
#
?:
运算符:C ? A : B
转换为如果C为真,则为A,否则为B