开始C程序

时间:2013-11-24 22:41:09

标签: c cs50

我正在努力解决哈佛大学在线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;
}

4 个答案:

答案 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++)

干杯