23、深入理解并创建 void 函数

深入理解并创建 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()
{
}
  1. 在花括号内放置希望在调用 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()
  • 函数体
    1. 定义并初始化两个变量,分别存储线段(气球的绳子)的长度和气球的直径:
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 函数的使用,在编程中灵活运用函数来实现各种功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值