深入理解并创建 void 函数
在编程中,函数是非常重要的概念,它可以让代码更易读、可复用。本文将详细介绍 void 函数的创建和使用。
1. void 函数的概念
在日常生活中,我们有各种例行事务。比如,家长让孩子“准备上学”,这一指令实际上包含了一系列具体步骤:
1. 起床
2. 洗澡
3. 梳头
4. 穿衣服
5. 吃早餐
6. 刷牙
7. 拿书包
8. 上车
因为这些步骤是预先定义好的,家长只需给出“准备上学”这个总体指令,孩子就知道要执行相应的一系列活动。
在编程里,void 函数与之类似。它是一组被命名的语句序列,当通过名称调用该函数时,就会执行这些语句,这些语句共同构成了函数名称所描述的整体动作。
Processing 有许多内置的 void 函数,例如
println()
。它是一个预定义的 void 函数,用于在控制台显示一行文本。调用 Processing 的 void 函数时,只需写出函数名,后面跟上该函数所需的参数。例如:
println("Hello");
当运行程序并调用
println()
函数时,它会使用我们提供的参数,执行预定义的动作,在控制台显示“Hello”。我们自己创建的 void 函数调用方式相同,但调用时会执行我们自己定义的特定动作序列。
2. 进入 Active 模式与 setup() 函数
要创建和使用自己的函数,需要在 Processing 的 Active 模式下工作。在 Active 模式中,总是会涉及定义特殊的
setup()
函数。
定义
setup()
函数的步骤如下:
1. 先写出函数框架:
void setup()
{
}
-
在花括号内放置希望在调用
setup()函数时执行的语句序列。例如,要让setup()函数在控制台显示问候语,可以这样写:
void setup()
{
println("Hello!");
println("How are you?");
}
setup()
函数的调用方式很特殊。在 Active 模式下,运行程序时,Processing 会自动调用一次
setup()
函数。也就是说,程序总是从
setup()
函数开始执行。因此,在 Active 模式下,
setup()
函数是放置主程序语句的地方。
我们还可以将之前在静态模式下编写的程序转换为 Active 模式程序,只需将其语句放在
setup()
函数的花括号内。例如,一个简单的掷骰子游戏程序:
int roll;
roll = int( random(1, 7) );
println("Roll: " + roll);
将其转换为 Active 模式:
void setup()
{
int roll;
roll = int( random(1, 7) );
println("Roll: " + roll);
}
运行这个新的 Active 模式程序时,Processing 会自动调用一次
setup()
函数,按顺序执行其中的语句,输出结果与静态模式程序相同。
3. 深入了解 setup() 函数
setup()
函数的定义由函数头和函数体两部分组成。
-
函数头
:包含三个信息项:
1.
返回值类型
:
setup()
函数执行完后不会返回结果值,在 Processing 术语中,它是一个 void 函数,所以在函数头中返回类型指定为
void
。
2.
函数名
:函数名是
setup
,函数名的首字母通常为小写。
3.
所需参数
:
setup()
函数不需要参数变量,所以在函数头中添加一对空括号。
函数头的三个信息项总结如下表:
|信息项|详情|
| ---- | ---- |
|返回值类型|void|
|函数名|setup|
|所需参数|无|
-
函数体
:函数体部分用一对花括号括起来,在花括号内放置希望在调用
setup()函数时执行的语句。例如:
void setup()
{
println("Beginning the setup() function...");
println("The setup() function has finished.");
}
运行包含
setup()
函数的 Active 模式程序时,Processing 会自动调用该函数一次,控制台会输出:
Beginning the setup() function...
The setup() function has finished.
4. 创建自己的 void 函数
我们可以尝试在 Active 模式程序中添加一个新的、非内置的 void 函数。定义这样的函数与定义
setup()
函数类似,需要定义函数头和函数体。
以创建一个名为
greet()
的函数为例:
-
函数头
:
1.
返回值类型
:因为是 void 函数,不返回值,所以返回类型为
void
。
2.
函数名
:使用
greet
作为函数名。
3.
所需参数
:为了简单起见,该函数不需要参数,添加一对空括号。
-
函数体
:让
greet()
函数发出问候语“Hello!”,并在控制台显示函数执行开始和结束的通知。函数体如下:
void greet()
{
println(" Beginning the greet() function...");
println(" Hello!");
println(" The greet() function has finished.");
}
完整的程序如下:
void setup()
{
println("Beginning the setup() function...");
println("The setup() function has finished.");
}
void greet()
{
println(" Beginning the greet() function...");
println(" Hello!");
println(" The greet() function has finished.");
}
但运行这个程序时,控制台没有显示
greet()
函数的通知和问候语。这是因为在 Active 模式下,
setup()
函数会自动调用一次,而我们自己创建的函数必须显式调用才能执行。所以,需要在
setup()
函数内添加对
greet()
函数的显式调用:
void setup()
{
println("Beginning the setup() function...");
greet();
println("The setup() function has finished.");
}
void greet()
{
println(" Beginning the greet() function...");
println(" Hello!");
println(" The greet() function has finished.");
}
现在运行程序,
greet()
函数会作为
setup()
函数自动执行的一部分被调用,控制台输出如下:
Beginning the setup() function...
Beginning the greet() function...
Hello!
The greet() function has finished.
The setup() function has finished.
程序的执行流程如下:
graph TD;
A[开始运行程序] --> B[Processing自动调用setup()函数];
B --> C[执行setup()函数的第一条语句,输出Beginning the setup() function...];
C --> D[调用greet()函数];
D --> E[跳转到greet()函数,执行第一条语句,输出Beginning the greet() function...];
E --> F[执行greet()函数的第二条语句,输出Hello!];
F --> G[执行greet()函数的第三条语句,输出The greet() function has finished.];
G --> H[返回setup()函数中调用greet()函数的位置];
H --> I[执行setup()函数的下一条语句,输出The setup() function has finished.];
I --> J[程序执行结束];
通过以上步骤,我们成功定义了自己的 void 函数
greet()
,并从
setup()
函数中调用它,同时了解了函数调用的执行流程。
5. 图形示例:绘制气球的 void 函数
接下来,我们通过一个图形示例进一步理解 void 函数的应用。我们将创建一个程序,在画布上随机位置绘制一个红色气球。
首先,创建一个新程序并保存为
BalloonDraw
。定义一个
setup()
函数来生成一个 200x200 像素的画布:
void setup()
{
size(200, 200);
}
然后,定义一个名为
balloon()
的函数来绘制气球。该函数的定义步骤如下:
-
函数头
:
1.
返回值类型
:不需要该函数返回值,所以返回类型为
void
。
2.
函数名
:函数名为
balloon
。
3.
所需参数
:此版本的函数不需要我们提供额外信息来绘制气球,所以不需要参数,添加一对空括号。
函数头定义完成后如下:
void balloon()
-
函数体
:
- 定义并初始化两个变量,分别存储线段(气球的绳子)的长度和气球的直径:
void balloon()
{
int lineLength = 50;
int diameter = 20;
}
2. 随机选择气球中心的像素列位置和像素行位置,并将这些值存储在变量中:
void balloon()
{
int lineLength = 50;
int diameter = 20;
int column = int( random(width) );
int row = int( random(height) );
}
这里的
lineLength
、
diameter
、
column
和
row
都是局部变量,其作用域仅限于
balloon()
函数内部。
3. 绘制气球的绳子和气球的主体:
void balloon()
{
int lineLength = 50;
int diameter = 20;
int column = int( random(width) );
int row = int( random(height) );
line(column, row, column, row + lineLength);
fill(255, 0, 0);
ellipse(column, row, diameter, diameter);
}
完整的程序如下:
void setup()
{
size(200, 200);
}
void balloon()
{
int lineLength = 50;
int diameter = 20;
int column = int( random(width) );
int row = int( random(height) );
line(column, row, column, row + lineLength);
fill(255, 0, 0);
ellipse(column, row, diameter, diameter);
}
然而,运行这个程序时,画布上并没有绘制出气球。这是因为我们自己定义的函数不会自动调用,必须显式调用才能执行。所以,在
setup()
函数中添加对
balloon()
函数的显式调用:
void setup()
{
size(200, 200);
balloon();
}
void balloon()
{
int lineLength = 50;
int diameter = 20;
int column = int( random(width) );
int row = int( random(height) );
line(column, row, column, row + lineLength);
fill(255, 0, 0);
ellipse(column, row, diameter, diameter);
}
现在运行程序,会在画布的随机位置绘制出一个红色气球。
程序的执行流程如下:
graph TD;
A[开始运行程序] --> B[Processing自动调用setup()函数];
B --> C[执行setup()函数中的size(200, 200),生成200x200像素的画布];
C --> D[调用balloon()函数];
D --> E[跳转到balloon()函数,执行变量初始化语句];
E --> F[执行line()函数,绘制气球的绳子];
F --> G[执行fill()函数,设置填充颜色为红色];
G --> H[执行ellipse()函数,绘制气球的主体];
H --> I[返回setup()函数中调用balloon()函数的位置];
I --> J[程序执行结束];
总结
通过以上内容,我们全面了解了 void 函数的概念、创建和使用方法。void 函数可以让代码更易读、可复用,我们可以根据需要创建自己的 void 函数来完成特定的任务。在创建和使用 void 函数时,需要注意以下几点:
- 在 Processing 的 Active 模式下工作,定义并使用
setup()
函数作为程序的入口。
- 函数由函数头和函数体组成,函数头包含返回值类型、函数名和所需参数,函数体包含要执行的语句。
- 自己创建的函数需要显式调用才能执行,而
setup()
函数会在程序运行时自动调用一次。
- 局部变量的作用域仅限于定义它的函数内部。
希望这些内容能帮助你更好地掌握 void 函数的使用,在编程中灵活运用函数来实现各种功能。
超级会员免费看
1369

被折叠的 条评论
为什么被折叠?



