【问题标题】:Beginning C Program开始 C 程序
【发布时间】:2013-11-24 22:41:08
【问题描述】:

我正在学习哈佛在线 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;
}

【问题讨论】:

  • 问问自己,更清洁/更好是什么意思?在您看来,是什么让这个程序变得肮脏/糟糕。
  • 除了来自@PreetSangha 的评论之外,我的建议是在刚开始时不要过于沉迷于代码的清洁度/效率。当您编写更复杂的程序时,您对简洁代码的渴望会自动发展,但编程最终是关于编写有效的、有用的程序。随着我们的程序变得更加复杂和资源密集,我们需要优化和提高效率
  • @leemo 优化和效率是,但可读性和基本的良好实践不是。
  • 顺便说一下,这段代码在我看来还不错。除了多余的括号。 (而且我很少这么说。)
  • @H2CO3 - 同意,但我关于在完全理解这些概念之前不要沉迷于此的评论仍然有效。

标签: c cs50


【解决方案1】:

我假设清洁工的意思是“漂亮和花哨”。

这对我来说看起来很漂亮:

#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;
}

但是,不要太着迷于使您的代码花哨。虽然如果你和别人一起工作,或者你自己真的很好。你的例子看起来不错。

现在,优化-明智的,这是值得担心的事情。请记住,过多的优化可能会破坏您的程序。

【讨论】:

  • 但这不会打印出 更干净更好 pyramid :)
  • 没那么重要,但我认为删除两个内部循环中的大括号很容易出错。
  • 我想我更喜欢在 for 循环之外创建变量,也许可以稍微清理一下可读性。但我想我理解有很多方法可以给这只猫剥皮的论点。
【解决方案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);

【讨论】:

    【解决方案3】:

    我认为通过更清洁和更好的方式,您的意思是成为一个完美的直角三角形金字塔。
    为此,您应该这样做
    改变

    printf("Height: ");  
    

    printf("Height: \n\n");  
    

    for(i = 1 ; i < height; i++)  
    

    for(i = 0 ; i < height; i++)   
    

    并查看sample output

    【讨论】:

    • 啊,是的!我想你是对的。让我感到困扰的是,我必须同时拥有“(高度 -2)”和“(i-1)”来创建空间。似乎有点多余
    【解决方案4】:

    这里有一个建议:

    #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 循环中声明和赋值,一些编译器可能会出现这个错误:“错误:‘for’循环初始声明只允许在 C99 模式下”。这些更改是根据我提供的内容考虑的。

    //initialize variables                                                            
    int height, hm2, j, k, i;
    

    -我在这里添加了一个换行符

    printf("Height: \n");
    

    - 而不是 hm2 = height - 2 我改为:

    hm2 = height - 1;
    

    -第一个循环,现在我们给 i 一个值并将其设置为 0 以满足所做的其他更改:

    for(i = 0; i < height; i++) {
    

    -对于创建 n 个空格的循环,我将其更改为:

    for(k = hm2; k > i; k--)
    

    -最后在最后一个for循环中删除了括号(在这种情况下不需要):

    for(j = 0; j < i+1; j++)
    

    干杯

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2011-01-12
      相关资源
      最近更新 更多