微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打印3、5和2的倍数的C程序,专业风格建议

如何解决打印3、5和2的倍数的C程序,专业风格建议

我写了我的第一个简单的C程序,它打印3,5以及3和5的倍数,而不是从1到100的数字。

我知道该程序可以用数百万种不同的方式编写。专业的C程序员将如何实施最佳实践?作为一个完美主义者,我正在尝试实现最高的标准,主要是指针,专业功能实现和预处理器。

#include <stdio.h>

void findMultiples(int n);


int main() {
    
    findMultiples(100);
    
    return 0;
}

void findMultiples(int n){
    for (int i = 1; i <= n; i++)
        if (i % 15 == 0){
            printf("Multiple of 3 and 5\n");
        }
        else if (i % 5 == 0){
            printf("Multiple of 5\n");
        }
        else if (i % 3 == 0){
            printf("Multiple of 3\n");
        }
        else{
            printf("%d\n",i);
        }
}

解决方法

这基本上是Fizzbuzz,如果FizzBu​​zz可被5和3分开,则应打印FizzBu​​zz;如果Five可被5除而不能被3除,则应打印Fizz;如果Buzz可被3除而不能被5除的,则应打印Buzz。 >

TL; DR

没有“正确”的方法来执行此操作。无论您怎么做,都会破坏一些最佳做法。

详细说明

注意!

我是那种喜欢在最佳实践和代码标准方面采用灵活方法的程序员。这不是对还是错,但是下面的全部内容都是根据我的个性而涂上颜色的。我几乎将此测试视为“您可以理解何时跳过最佳做法”,而其他人则将其视为“即使在棘手的情况下,您也可以找出如何遵循最佳做法”的方法。没有一个比另一个更正确。

这个问题的目的是很容易理解,但是要做到“很好”就很棘手。在此示例中,您经常会遇到的一件事是重复的代码。您可以很轻松地将其构建,但是通常以可读性为代价。

如果我要设计一个满足您要求的代码,那么我对您提供的解决方案将非常满意,然后继续研究下一个问题。花大量的时间真的不值得。这也是雇主在给您这项测试时要看的一件事。您是否花了数小时和数天的时间来确保您的代码遵循所有“最佳实践”,即使收益微不足道,还是您创建了可以正常工作且可读性强的代码,并在代码足够好时就继续使用?

我看到一些示例避免首先检查两个数字是否可除,然后分别检查它们是否是连接字符串。像这样的伪东西:

string str = ""
if n % 5 = 0: str += "Fizz"
if n % 3 = 0: str += "Buzz"
print str

看起来不错,对吗?可以将其转换为真正的C,其中字符串处理非常混乱。

char str[9] = "";
if(n%5 == 0) strcat(str,"Fizz");
if(n%3 == 0) strcat(str,"Buzz");
puts(str);

看起来还不错。但这真的值得吗?而且,如果您想将“ Fizz”和“ Buzz”更改为更长的时间该怎么办?然后,您需要确保str有更多的空间,这很容易忘记并且会导致难以跟踪的错误。我并不是说这段代码非常危险,但是这里的底线是您的推理方式。这样的风险真的值得避免一些代码重复吗?

有些人将条件重构为函数,例如bool dividable_by_15(int n),因为“最好在单独的函数中分解功能”。有些人甚至可以做到这一点:

bool dividable_by(int n,int d) { return (n%d) == 0; }
bool dividable_by_3(int n) { return dividable_by(n,3); }
bool dividable_by_5(int n) { return dividable_by(n,5); }
bool dividable_by_15(int n) { return dividable_by_3(n) && dividable_by_5(n); }

但是在这种情况下真的需要吗?我不这么认为,但我不会说选择是100%显而易见的,而且还取决于您使用的语言。但是对于大多数情况,我会说这是过度设计的明显案例。

此测试与查看是否可以遵循所有最佳实践无关。这更多是一种性格测试。有些雇主希望您做各种各样的事情,而另一些雇主则希望您在执行应做的事情时只保留原样。

当涉及到您的代码时,我实际上只有一个反对意见,那就是您省略了for循环的花括号。我永远不会这样做,除非身体是一条简单的线。但是,我将省略if语句的花括号。有些人会同意最后一个,有些人不会。那些赞成即使对于单个语句也总是使用大括号的人经常使用这样的说法,即如果您需要在主体中添加额外的语句,则可以减少错误的风险。另一个论点是一致性,即您始终应该努力在所有地方都做相同的事情。在我看来,这些因素不值得多花钱,但嘿,就是我。你做你。

for (int i = 1; i <= n; i++) {
    if (i % 15 == 0)
         printf("Multiple of 3 and 5\n");
    else if (i % 5 == 0)
        printf("Multiple of 5\n");
    else if (i % 3 == 0)
        printf("Multiple of 3\n");
    else
        printf("%d\n",i);
}

这对我来说好多了。我什至会考虑将if's作为一个衬板:

    if      (i % 15 == 0) printf("Multiple of 3 and 5\n");
    else if (i % 5 == 0)  printf("Multiple of 5\n");
    else if (i % 3 == 0)  printf("Multiple of 3\n");
    else                  printf("%d\n",i);

我还将考虑提取换行符,如下所示:

    if      (i % 15 == 0) printf("Multiple of 3 and 5");
    else if (i % 5 == 0)  printf("Multiple of 5");
    else if (i % 3 == 0)  printf("Multiple of 3");
    else                  printf("%d",i);
    printf("\n");

由于这只是换行,因此您可以将printf("\n")更改为puts("")

但是-这就是问题-在我看来,我已经在这个问题上花费了很多精力。 :)

作为一名完美主义者,我正在尝试实施最高的最佳标准

我读到的引言完美地回答了这个问题:“盲目遵循最佳实践不是最佳实践”

“最佳做法”的目的是提供一种非常简单的方法来实现某些目标。如果您的代码在没有遵循最佳实践的情况下实现了该目的,那么为什么要对其进行更改?尤其是如果它可以更好地实现该目的。

,

您的实施是最好的实施。

对于许多程序员而言,两次检查模数条件并不令人满意,并且案例的实现感觉它们是如此相似,以至于可以折叠在一起。因此,我们中的许多人都会尝试以某种方式来消除明显的冗余。

但是,这些技巧总是会增加代码的复杂性。事实是,正如您所写的那样,这四个案例很容易理解。而且,没有任何技巧可以尝试消除明显的冗余使其变得更简单。

最后,简单胜过聪明。我们知道这就是KISS原则:保持简单,愚蠢。高质量的软件不是在努力变得聪明,而是在努力变得简单。这使维护,扩展和使用更加容易。 最重要的优化变量是代码的简洁性。最聪明的程序员会精打细算,只在需要时才发布。


也就是说,作为纯样式评论,通常不建议在复杂循环或if的主体周围省略括号。我会将您的代码格式化为:

void findMultiples(int n) {
    for (int i = 1; i <= n; i++) {
        if (i % 15 == 0) {
            printf("Multiple of 3 and 5\n");
        }
        else if (i % 5 == 0) {
            printf("Multiple of 5\n");
        }
        else if (i % 3 == 0) {
            printf("Multiple of 3\n");
        }
        else {
            printf("%d\n",i);
        }
    }
}

否则,您总是冒着弄乱属于循环/ if和不属于循环的东西的风险。

此外,该函数的命名不是最佳的。我想,我将其命名为printDivisibilityList()。因为该函数不会“查找倍数”,所以它会打印所有数字并通过35用可除数注释它们。

,

您假设有人正在读取输出。此外,该程序不会执行您的操作。它不会打印3和5的倍数,而忽略

通常,我会阅读所要询问的内容,然后确定程序的使用方式,然后编写程序。 在您的情况下,将类似于:

#include <stdio.h>

void findMultiples(int n)
{
    for (int i = 1; i <= n; i++)
        if ((i % 3 == 0) || (i % 5 == 0)) {
            printf("%d\n",i);
        }
    }
}

int main()
{   
    findMultiples(100);

    return 0;
}

编码风格不是那么重要。

现在,我为什么要从关于人类的评论开始。好吧,小程序通常被设计为链接逻辑。为什么非人类会对您打印的文字感兴趣?

我认为这个答案并不是您最初想到的,但是我希望它能以稍微不同的方式帮助您考虑程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。