我正在努力解决哈佛大学在线CS50课程的一些问题。我得到了正常工作的问题,但我想知道是否可能有更清洁或更好的方法来使程序工作。
该计划的目标是打印由哈希标签和空格字符组成的右对齐金字塔。任何关于风格或技巧的指导都是非常受欢迎的。
/* Creating the mario program, whose goal is to create a
* pyramid by accepting input from the user to get the
* height then aligning the pyrimid to the right.
*
*/
#include <stdio.h>
#include <cs50.h>
int main(void)
{
// get user input and set to variable
printf("Height: ");
int height = GetInt();
int i, j, k;
for(i = 1 ; i < height; i++)
{
// create n-1 spaces
for(k = (height - 2); k > (i-1); k--)
{
printf("%c", ' ');
}
// create n+1 hash tags
for(j = 0; j < (i+1); j++)
{
printf("#");
}
printf("\n");
}
return 0;
}
答案 0 :(得分:2)
我假设更清洁,你的意思是“漂亮和更好的”。
这看起来很漂亮:
#include <stdio.h>
#include <cs50.h>
int main(void) {
// get user input and set to variable
printf("Height: ");
int height = GetInt();
int hm2 = height - 2;
int j, k;
for(int i = 1 ; i < height; i++) {
// create n-1 spaces
for(k = hm2; k > (i-1); k--)
printf("%c", ' ');
// create n+1 hash tags
for(j = 0; j < (i+1); j++)
printf("#");
printf("\n");
}
return 0;
}
但是,不要太过追赶你的代码。虽然如果你和别人合作,或者你自己真的很好,这很好。你的例子很好看。
现在,优化 -wise,这是值得担心的事情。请记住,过多的优化可能会破坏您的计划。
答案 1 :(得分:2)
供大家考虑:这就是“所有风格和无可读性”的样子:)
i = 0;
while (i++ < height*height)
printf ("%c%s", (i-1)/height < height-(i-1)%height-1 ? ' ' : '#',
i % height ? "" : "\n");
如果不运行它,几乎不可能看到代码的作用。如果要进行后续练习,很难重新编写形式,比如说,一个平等的金字塔。我可能会抛弃它,然后重新开始基础知识,然后再将它连接成一个像这样的小怪物。
(稍后)将i++
放在最后稍微整齐一点,所以两次(i-1)
被交易进行稍微复杂的行尾测试:
i = 0;
do
printf ("%c%s", i/height < height-i%height-1 ? ' ' : '#',
i % height==height-1 ? "\n" : "");
while (++i < height*height);
答案 2 :(得分:1)
我认为通过更清洁,更好的方式,你的意思是成为一个完美形状的直角三角金字塔 为此,你应该做为 改变
printf("Height: ");
到
printf("Height: \n\n");
和
for(i = 1 ; i < height; i++)
到
for(i = 0 ; i < height; i++)
并查看sample output。
答案 3 :(得分:0)
这是一个建议:
#include <stdio.h>
#include <cs50.h>
int main(void) {
//initialize variables
int height, hm2, j, k, i;
printf("Height: \n");
// Get user input
height = GetInt();
hm2 = height - 1;
for(i = 0; i < height; i++) {
// create n spaces
for(k = hm2; k > i; k--)
printf("%c", ' ');
// create n+1 hash tags
for(j = 0; j < i+1; j++)
printf("#");
printf("\n");
}
return 0;
}
如果用户输入高度为5的结果:
Height:
#
##
###
####
#####
我在这个版本的代码中考虑了几件事:
- 在C中,将所有变量分别声明给它们赋值并稍后赋值,这是一种很好的做法。如果要在for循环中声明和赋值,某些编译器可能会出现此错误:&#34;错误:'for'循环初始声明仅允许在C99模式下使用#34;。这些变化与我提供的内容一起考虑。
//initialize variables
int height, hm2, j, k, i;
- 我在这里添加了一个换行符
printf("Height: \n");
- 而不是hm2 = height - 2我改为:
hm2 = height - 1;
-First循环,现在我们给一个值并将其设置为0以满足所做的其他更改:
for(i = 0; i < height; i++) {
- 对于创建n个空格的循环,我将其更改为:
for(k = hm2; k > i; k--)
- 在最后一个for循环中删除了括号(在这种情况下不需要):
for(j = 0; j < i+1; j++)
干杯