重构此 C 代码的最佳方法? CS50 - mario.c(更多)
Best way to refactor this C code? CS50 - mario.c (more)
所以我参加了 cs50 课程并解决了 pset 1mario.c 中的更多问题
我实际上用 3 个 for 循环解决了它,但我只想用 2 个循环重构它,我想出了这段代码,它为 "height: 5"
提供了以下解决方案
Result:
# #
## ##
### ###
#### ####
##### #####
#include <stdio.h>
int main(void)
{
int side = 5;
int max = side + 2;
for (int i = 1 ; i <= side ; i++)
{
int j = 1;
while(j != max+1)
{
if(j <= side-i)
{
printf(" ");
j++;
}
else if(j > side-i && j < side+1)
{
printf("#");
j++;
}
else if(j == side+1)
{
printf(" ");
j++;
}
else
{
printf("#");
j++;
}
}
max++;
printf("\n");
}
}
我想知道你们是否可以向我展示一个更优雅的解决方案,因为我认为这太……重复了。
此外,是否可以使用 switch case 而不是那么多 else if?尝试这样做,但代码没有为 j 取布尔值 :(
提前致谢! :)
如果你知道高度的上限,你可以在一个循环中完成。
喜欢:
int main(void) {
char s[] = "#############################################";
char f[32];
int n = 5; // height
sprintf(f, "%%%ds %%s", n); // Create a format string like "%5s %s"
char* p = s + strlen(s) - 1; // Let p point to the last char in s
for(int i=0; i<n; i++) // Loop n times
{
printf(f, p, p);
printf("\n");
p--; // Increase the number of # that p points to
}
return 0;
}
注意:如果您不知道高度的上限,您仍然可以使用这种方法,但是 s
必须动态分配。
所以我参加了 cs50 课程并解决了 pset 1mario.c 中的更多问题
我实际上用 3 个 for 循环解决了它,但我只想用 2 个循环重构它,我想出了这段代码,它为 "height: 5"
提供了以下解决方案Result:
# #
## ##
### ###
#### ####
##### #####
#include <stdio.h>
int main(void)
{
int side = 5;
int max = side + 2;
for (int i = 1 ; i <= side ; i++)
{
int j = 1;
while(j != max+1)
{
if(j <= side-i)
{
printf(" ");
j++;
}
else if(j > side-i && j < side+1)
{
printf("#");
j++;
}
else if(j == side+1)
{
printf(" ");
j++;
}
else
{
printf("#");
j++;
}
}
max++;
printf("\n");
}
}
我想知道你们是否可以向我展示一个更优雅的解决方案,因为我认为这太……重复了。
此外,是否可以使用 switch case 而不是那么多 else if?尝试这样做,但代码没有为 j 取布尔值 :(
提前致谢! :)
如果你知道高度的上限,你可以在一个循环中完成。
喜欢:
int main(void) {
char s[] = "#############################################";
char f[32];
int n = 5; // height
sprintf(f, "%%%ds %%s", n); // Create a format string like "%5s %s"
char* p = s + strlen(s) - 1; // Let p point to the last char in s
for(int i=0; i<n; i++) // Loop n times
{
printf(f, p, p);
printf("\n");
p--; // Increase the number of # that p points to
}
return 0;
}
注意:如果您不知道高度的上限,您仍然可以使用这种方法,但是 s
必须动态分配。