首页 理论教育 Arduino单片机实战开发技术:函数设计注意事项

Arduino单片机实战开发技术:函数设计注意事项

时间:2023-10-23 理论教育 版权反馈
【摘要】:图6-1提供了开始设计的有用路线图。IsLeapYear()表示函数将处理找出给定某一年是否是闰年。特别是背包在调用函数之前,需要有一个int数据类型,指定填充到其中的年份。下一行定义了求闰年的函数名称及相关参数列表,并明确了函数返回值类型和参数数据类型。因此,将一个参数视为程序员的选择对发送到函数的值进行设置。显然,函数返回的值是由函数类型说明符指定的。此顺序用于描述函数文档注释的结尾。

Arduino单片机实战开发技术:函数设计注意事项

显然,你需要自定义函数来完成所需完成的单个任务。图6-1提供了开始设计的有用路线图。让我们从设计的角度来检查图6-1的各个部分。

(1)函数类型说明符。

首先,我们希望函数返回什么数据类型?虽然大多数语言都有闰年函数库(C#,java,C++,Visual Basic,C语言)返回一个布尔值,我们希望返回值是int类型,而不是布尔值。原因是闰年最常用年份计算是确定给定年份的2月份有多少天。也许哪天对账单周期、利息支付或其他计算产生影响。不管是什么原因,如果使用“标准”闰年计算,则需要如下代码:

对于上述代码,我们可以通过初始化daysInFeb重构,并删除else子句:

问题是我们仍然需要if声明来设置2月份的适当天数。但是,如果将函数编写为返回1(使用int类型值),如果是闰年,则返回1,否则返回0,则可以编写:

考虑到我们希望函数实现的功能,这是一个很好的解决方法。一般来说,只要代码的意图保持清晰,少代码就是好代码。

看看下面的语句:

i=(i<<3)+(i<<1)+(*string-'0');

实质上,这是一个ASCII数字代码并将其乘以10。虽然这是聪明的代码,如果有程序员这样干,这是故意“炫耀代码”。编写这样的代码对其他程序员来说是很难理解的,不值得这么麻烦。

(2)函数名。

你已经确定了一个函数的名字。IsLeapYear()表示函数将处理找出给定某一年是否是闰年。这是否会导致函数名冲突(即两个函数使用相同的名称),这个名称在其他一些库中使用,函数签名是一样的。即使你碰巧包含了一个具有相同函数名的库,那么编译器优先于其源代码正在编译的函数。

(3)参数列表。

我们的函数确实需要来自“外部世界”的数据来完成其任务。特别是背包在调用函数之前,需要有一个int数据类型,指定填充到其中的年份。再一次将函数可视化为具有单个入口和出口点的黑盒是一个很好的函数应该起作用的方法。也就是说,在编写此函数之后,将该函数交给另一个程序员使用,只应提示他们三个问题:

①这个函数执行什么任务?

②我需要向函数发送哪些数据?

③我能从中得到什么数据?

如果你的设计工作做得很好,函数名会回答第一个问题,参数列表会回答第二个问题,函数类型说明符会回答第三个问题。当一天结束时,程序员可能不太关心如何在函数中编写代码,只要它以合理的效率完成手头的任务。

(4)函数体。(www.xing528.com)

函数体以大括号开始,后面是完成手头任务所必需的语句,后面是结束大括号。因为我们的类型说明符返回int,所以你马上就知道其中一条语句必须使用return语句传回数据。

仔细想想,函数参数列表对应于你在第2章中学习的五个程序步骤中的输入步骤。函数体反映流程步骤,因为它包含解决任务所需的语句。现在你需要一个算法过程来执行如何判断给定年份是否是闰年。

你可以在网上搜索闰年并找到闰年计算的算法。算法只是解决问题的一组循序渐进的指令。闰年的算法计算过程:

如果给定年份可以被4整除,但不能被100整除,那就是闰年。如果给定年份可以被400整除,那就是闰年。

虽然可以使用两个嵌套的if语句编写代码,但Aeduino C提供了一种简单的代码编写方法。为了实现这个算法,让我们绕一小段路,了解Aeduino C提供的逻辑运算符以及如何使用它们。

逻辑运算符允许你组合逻辑表达式。逻辑运算符如表6-1所示。

表6-1 逻辑运算符

说明:逻辑运算符使用的最佳方法是首先考虑它们如何与称为真值表的概念相关。真值表使用两个表达式显示逻辑运算的所有可能结果。

有关逻辑运算的真值表标识过程这里省略。

学习过数字电路知识的你应该已经了解了逻辑运算符,让我们来编写函数体。重复我们的闰年算法:

代码清单6-1.The IsLeapYear()Function

此样式使用多行开头注释引入函数的文档字符序列(/*)后跟四个星号。下一行定义了求闰年的函数名称及相关参数列表,并明确了函数返回值类型和参数数据类型。

请注意,虽然我在这里专门使用参数术语,但在其他地方使用参数。调用IsLeapYear()函数时,你可以确定哪个变量的值已发送到该函数。例如,你可能有一组整数的数据,每个整数值表示一年。你可以决定将那个整数值传递到IsLeapYear()函数中。也就是说,你可以决定通过引用这组整数中的哪个[例如,IsLeapYear(第[3]年)]。

现在从IsLeapYear()的角度来看问题。它对数据没有选择:要使用的值是“指定” 给它的……该值被交给函数(放在推过前门的背包里!),在这件事上它没有选择。因此,将一个参数视为程序员的选择对发送到函数的值进行设置。将一个参数视为一个强制到函数代码上的值,别无选择。

参数列表之后是函数文档的返回值元素。显然,函数返回的值是由函数类型说明符指定的。但是,文件应说明该值的解释。在我们的例子中,值1表示传递给函数的年份是闰年,0表示该年份不是闰年。

返回值后面是一系列四个星号和一个结束多行注释字符配对:******/。此顺序用于描述函数文档注释的结尾。下一行是函数定义的开头,以函数类型说明符(int)开头,接着跟函数签名[IsLeapYear(int year)]。下一行是函数体,后跟组成函数体的语句,再后面是函数的结束符右大括号。

为什么要使用特定的函数样式?

再说一次,C不太关心你使用的编码风格,那么为什么要使用这种风格呢?遵循这些编码风格规则的原因是,它有助于创建一本自成文档的程序员手册。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈