模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。 在设计较复杂的程序时,一般采用自顶向下的方法,将问题划分为几个部分,各个部分再进行细化,直到分解为较好解决问题为止。 采用模块化设计编写程序时,不是一开始就逐条编写程序代码,而是首先用主程序、子程序等框架把软件
函数是具有某种特定功能的代码块,可以重复使用。在前面的学习中你已经认识到了很多 Python 的内置函数。这节课我们就来创建我们自己的函数: 1. 重复性的代码 1.1 什么是重复性的代码 在处理功能相似的逻辑时,会出现结构雷同的代码,例如:有两个列表,编写程序分别打印这两个列表,代码如下: 案例演示 预览 复制 复制成功! a = [1, 2, 3] b = [10, 20, 30] # 打印
Python 解释器内置了很多函数,不用 import 即可使用这些内置函数。本小节讲解了 Python 中常见的内置函数,我们将这些函数分为 7 大类: 类别 功能 系统帮助 获取函数的使用帮助 文件 IO 读取标准输入、写标准输出、打开文件 类型转换 将整数转换为字符串、将字符串转换为整数 数学运算 常见的数学运算函数,例如:max 和 min 复合数据类型 列表、元组、字典等数据类型的构造
删除函数的函数可以不进行实现,默认函数就则不同:编译器会创建函数实现,通常都是“默认”实现。当然,这些函数可以直接使用(它们都会自动生成):默认构造函数,析构函数,拷贝构造函数,移动构造函数,拷贝赋值操作符和移动赋值操作符。 为什么要这样做呢?这里列出一些原因: 改变函数的可访问性——编译器生成的默认函数通常都是声明为public(如果想让其为protected或private成员,必须自己实现)
有时让类去做拷贝是没有意义的。std::mutex就是一个例子——拷贝一个互斥量,意义何在?std::unique_lock<>是另一个例子——一个实例只能拥有一个锁;如果要复制,拷贝的那个实例也能获取相同的锁,这样std::unique_lock<>就没有存在的意义了。实例中转移所有权(A.1.2节)是有意义的,其并不是使用的拷贝。当然其他例子就不一一列举了。 通常为了避免进行拷贝操作,会将拷贝
12.3.1. 字符串比较函数 假如结果的长度大于 max_allowed_packet 系统变量的最大值时,字符串值函数的返回值为NULL。请参见7.5.2节,“调节服务器参数”。 对于在字符串位置操作的函数,第一个位置的编号为 1。 ASCII(str) 返回值为字符串str的最左字符的数值。假如str为空字符串,则返回值为 0 。假如str 为NULL,则返回值为 NULL。 ASCII()
2. 自定义函数 我们不仅可以调用C标准库提供的函数,也可以定义自己的函数,事实上我们已经这么做了:我们定义了main函数。例如: int main(void) { int hour = 11; int minute = 59; printf("%d and %d hours\n", hour, minute / 60); return 0; } main函数的特殊之处在于执行程序时它自动
#include <stdio.h> int global = 1; int func(void) { return (++global); } int main(void) { printf("%d\n", global); return 0; } 技巧 使用gdb调试程序时,可以使用“call”或“print”命令直接调用函数执行。以上面程序为例: (gdb)
有了Deck对象之后,把所有从属于Deck的函数放入其结构定义中也是情理之中的事了。看一下到目前为止我们定义的函数,很明显12.7节的printDeck函数可以作为候选加进来。下面将printDeck重写为成员函数: void Deck::print () const { for (int i = 0; i < cards.length(); i++) { cards[i].print
通常认为C++是一种面向对象编程语言,这意味着它提供了支持面向对象编程的特性。 定义面向对象语言并非易事,但是我们已经看到了它具备的一些特性: 1.程序由一些结构定义和函数定义组成,大多数函数操作特定类型的结构(或者对象)。 2.每个结构定义对应着一些现实世界中的物体或概念,对结构进行操作的函数对应着现实世界中物体交互的方式。 例如,我们在第九章中定义的Time结构体明显对应着人们记录每天时间的方
本章并未介绍所有的apstring函数,在15.2节和15.4节我们会再介绍c_str和substr两个函数。
当你看一个包含若干函数的类定义时,习惯从头看到尾,但这有可能带来混淆,因为这并不是程序的执行顺序。 程序往往从main函数的第一条语句开始执行,不管它出现在程序的什么位置(通常在最底部)。语句被逐条执行,直到遇到函数调用处。函数调用就像程序执行流程中的回转道,使你来到被调函数的第一行代码——而非顺序上的下一条语句,然后执行所有的函数语句,再回到刚才中断的地方,继续下去。 听起来简单的可以,但你得记
到目前为止我们只使用了C++内置的函数,然而也可以添加新函数。实际上我们已经见过一个函数定义了:main。main这个函数名很特殊,因为它表示程序开始执行的地方,但main函数的语法形式和其它函数定义一样: void 函数名(参数列表) { 语句 } 你可以为自己的函数任意定义名称,但不能命名为main或者其它C++关键字。参数列表指定了使用(或称为调用)新函数所需要提供的信息(如果有的话)
2.5介绍的EM_ASM系列宏只能接受硬编码常量字符串,而本节将要介绍的emscripten_run_script系列函数可以接受动态输入的字符串,该系列辅助函数可以类比于JavaScript中的eval()方法。 2.6.1 emscripten_run_script() 函数声明: void emscripten_run_script(const char *script) 参数: scrip
泛型函数定义 泛型函数可以用于任何类型. 这里是上面提到的swapTwoInts(_:, _:)函数的泛型版本, 叫做swapTwoValues(_:_:) func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } 上面的s