26、函数返回值的创建与应用

函数返回值的创建与应用

在编程中,创建能够返回值的函数是一项重要的技能,它可以让我们的代码更加灵活和高效。下面将通过几个具体的例子来详细介绍如何创建和使用这些函数。

1. 骰子模拟程序

首先,我们有一个模拟掷单个骰子的程序,代码如下:

void setup()
{
    int die;
    die = roll();
    println(die);
}

int roll()
{
    int result;
    result = int( random(1, 7) );
    return result;
}

这个程序中, roll() 函数会随机生成一个 1 到 6 之间的整数并返回。在 setup() 函数中调用 roll() 函数,将返回值赋给 die 变量,然后将其输出到控制台。

模拟掷两个骰子

如果我们想要模拟掷两个骰子,可以对程序进行修改。具体步骤如下:
1. 重新保存程序为 MoreRolling
2. 在 setup() 函数中定义两个变量 die1 die2 来存储每个骰子的值。
3. 分别调用 roll() 函数为 die1 die2 赋值。
4. 修改 println() 函数来显示两个骰子的值。

修改后的代码如下:

void setup()
{
    int die1;
    int die2;
    die1 = roll();
    die2 = roll();
    println(die1 + " " + die2);
}

int roll()
{
    int result;
    result = int( random(1, 7) );
    return result;
}

每次运行程序, roll() 函数会被调用两次,控制台会显示两个骰子的值。

重复掷骰子直到两个骰子的值相同

如果我们想要创建一个游戏,重复掷两个骰子直到它们的值相同,可以使用 do-while 循环。代码如下:

void setup()
{
    int die1;
    int die2;
    do
    {
        die1 = roll();
        die2 = roll();
        println(die1 + " " + die2);
    }
    while (die1 != die2);
}

int roll()
{
    int result;
    result = int( random(1, 7) );
    return result;
}

运行这个程序, roll() 函数的两次调用会一直重复,直到两个返回值相同为止。

2. 为返回值函数添加参数

对于一些游戏,如大富翁,需要掷多个骰子并使用它们的总和。我们可以修改 roll() 函数,使其能够模拟掷多个骰子的情况。具体步骤如下:
1. 重新保存程序为 ParameterRolling
2. 为 roll() 函数添加一个参数 numberOfDice ,用于指定要掷的骰子数量。
3. 在 roll() 函数中使用 for 循环来模拟重复掷单个骰子的过程,并计算总和。
4. 修改 setup() 函数,使其与修改后的 roll() 函数兼容。

修改后的代码如下:

void setup()
{
    int dice;
    dice = roll(2);
    println(dice);
}

int roll(int numberOfDice)
{
    int result = 0;
    for (int count = 1; count <= numberOfDice; count = count + 1)
    {
        result = result + int( random(1, 7) );
    }
    return result;
}

运行这个程序,控制台显示的随机值范围将取决于指定的骰子数量。例如,模拟掷两个骰子时,值的范围是 2 到 12。

下面是这个程序的执行流程:

graph TD;
    A[开始程序] --> B[调用 setup() 函数];
    B --> C[声明 dice 变量];
    C --> D[调用 roll(2) 函数];
    D --> E[跳转到 roll() 函数,传递参数 2];
    E --> F[声明并初始化 result 变量为 0];
    F --> G[执行 for 循环两次];
    G --> H[每次循环生成随机数并累加到 result];
    H --> I[for 循环结束,result 包含总和];
    I --> J[执行 return result 语句];
    J --> K[返回 setup() 函数,将 result 值赋给 dice];
    K --> L[执行 println(dice) 语句];
    L --> M[程序结束];
3. 直角三角形示例

我们还可以创建一个函数来计算直角三角形的斜边长度。以下是具体步骤:
1. 重新保存程序为 HypFunction
2. 将程序从静态模式转换为活动模式,将现有语句放在 setup() 函数中。
3. 创建一个名为 hyp() 的函数,该函数接受两个参数 legA legB ,分别表示三角形的两条直角边。
4. 在 hyp() 函数中计算斜边长度并返回。
5. 修改 setup() 函数,调用 hyp() 函数来计算斜边长度。

代码如下:

void setup()
{
    size(300, 300);
    int leg1;
    leg1 = 150;
    int leg2;
    leg2 = 200;
    triangle(0, 0, leg1, 0, 0, leg2);
    float hypotenuse;
    hypotenuse = hyp(leg1, leg2);
    println("Hypotenuse: " + hypotenuse);
}

float hyp(int legA, int legB)
{
    float result;
    result = sqrt((legA * legA) + (legB * legB));
    return result;
}

运行这个程序,会在画布上绘制一个直角三角形,并在控制台显示斜边的长度。

随机选择直角边长度

我们还可以修改程序,随机选择两条直角边的长度。代码如下:

void setup()
{
    size(300, 300);
    int leg1;
    leg1 = int( random(width) );
    println("leg1: " + leg1);
    int leg2;
    leg2 = int( random(height) );
    println("leg2: " + leg2);
    triangle(0, 0, leg1, 0, 0, leg2);
    float hypotenuse;
    hypotenuse = hyp(leg1, leg2);
    println("Hypotenuse: " + hypotenuse);
}

float hyp(int legA, int legB)
{
    float result;
    result = sqrt((legA * legA) + (legB * legB));
    return result;
}

运行这个程序,画布上会绘制一个随机大小的直角三角形,并在控制台显示随机选择的直角边长度和计算出的斜边长度。

4. 同一程序中的多个函数

有时候,我们希望在同一个程序中定义多个函数。例如,我们可以添加一个函数来计算三角形的面积。具体步骤如下:
1. 重新保存程序为 TwoFunctions
2. 在 hyp() 函数之后定义一个名为 triangleArea() 的函数。
3. 为 triangleArea() 函数指定返回值类型为 float ,函数名和两个参数 base altitude
4. 在 triangleArea() 函数中计算三角形的面积并返回。
5. 在 setup() 函数中调用 triangleArea() 函数,并显示计算出的面积。

代码如下:

void setup()
{
    size(300, 300);
    int leg1;
    leg1 = int( random(width) );
    println("leg1: " + leg1);
    int leg2;
    leg2 = int( random(height) );
    println("leg2: " + leg2);
    triangle(0, 0, leg1, 0, 0, leg2);
    float hypotenuse;
    hypotenuse = hyp(leg1, leg2);
    println("Hypotenuse: " + hypotenuse);
    float area;
    area = triangleArea(leg1, leg2);
    println("Area: " + area);
}

float hyp(int legA, int legB)
{
    float result;
    result = sqrt((legA * legA) + (legB * legB));
    return result;
}

float triangleArea(int base, int altitude)
{
    float result;
    result = base * altitude * 0.5;
    return result;
}

运行这个程序,会在画布上绘制一个随机大小的直角三角形,并在控制台显示直角边长度、斜边长度和三角形的面积。

以下是程序的执行流程表格:
| 步骤 | 操作 |
| ---- | ---- |
| 1 | 开始程序,调用 setup() 函数 |
| 2 | 声明并初始化 leg1 leg2 变量,随机选择直角边长度 |
| 3 | 绘制直角三角形 |
| 4 | 调用 hyp() 函数计算斜边长度 |
| 5 | 显示斜边长度 |
| 6 | 调用 triangleArea() 函数计算三角形面积 |
| 7 | 显示三角形面积 |
| 8 | 程序结束 |

通过这些例子,我们可以看到如何创建和使用返回值的函数,以及如何在同一个程序中定义多个函数。这些技巧可以让我们的代码更加模块化和可维护。

函数返回值的创建与应用

5. 函数调用与执行流程分析

在同一程序中使用多个函数时,理解函数调用和执行流程至关重要。以 TwoFunctions 程序为例,其执行过程中函数调用和返回的情况较为复杂。

第一次函数调用: hyp() 函数

当程序执行到 hypotenuse = hyp(leg1, leg2); 时,会发生第一次函数调用。具体流程如下:
1. 程序从 setup() 函数跳转到 hyp() 函数。
2. leg1 leg2 的值作为参数传递给 hyp() 函数的 legA legB 参数变量。
3. hyp() 函数内部计算斜边长度,将结果存储在 result 变量中。
4. 执行 return result; 语句,程序返回 setup() 函数,并将计算得到的斜边长度赋值给 hypotenuse 变量。

graph LR;
    A[setup() 函数] --> B[调用 hyp(leg1, leg2)];
    B --> C[跳转到 hyp() 函数];
    C --> D[leg1 值传递给 legA, leg2 值传递给 legB];
    D --> E[计算斜边长度并存储在 result];
    E --> F[执行 return result];
    F --> G[返回 setup() 函数,赋值给 hypotenuse];
第二次函数调用: triangleArea() 函数

当程序执行到 area = triangleArea(leg1, leg2); 时,会发生第二次函数调用。具体流程如下:
1. 程序从 setup() 函数跳转到 triangleArea() 函数。
2. leg1 leg2 的值作为参数传递给 triangleArea() 函数的 base altitude 参数变量。
3. triangleArea() 函数内部计算三角形面积,将结果存储在 result 变量中。
4. 执行 return result; 语句,程序返回 setup() 函数,并将计算得到的三角形面积赋值给 area 变量。

graph LR;
    A[setup() 函数] --> B[调用 triangleArea(leg1, leg2)];
    B --> C[跳转到 triangleArea() 函数];
    C --> D[leg1 值传递给 base, leg2 值传递给 altitude];
    D --> E[计算三角形面积并存储在 result];
    E --> F[执行 return result];
    F --> G[返回 setup() 函数,赋值给 area];
6. 代码优化与注意事项

在编写返回值函数和使用多个函数时,有一些优化和注意事项需要我们关注。

代码优化
  • 变量声明与初始化 :在函数中,尽量将变量的声明和初始化放在同一语句中,使代码更加简洁。例如在 roll() 函数中, int result = 0; 比先声明 int result; 再初始化 result = 0; 更简洁。
  • 避免整数除法问题 :在计算三角形面积时,要注意避免整数除法。如 result = 1 / 2 * base * altitude; 会因为 1 / 2 是整数除法而结果为 0。应使用 result = base * altitude * 0.5; 来确保计算结果的准确性。
注意事项
  • 参数传递 :调用函数时,要确保传递的参数类型和数量与函数定义中的参数一致。例如在调用 roll(int numberOfDice) 函数时,必须传递一个 int 类型的参数。
  • 变量作用域 :不同函数中的变量作用域是相互独立的。在 setup() 函数中定义的 leg1 leg2 hyp() 函数中的 legA legB 虽然可以使用相同的变量名,但它们是不同的变量,作用域分别局限于各自的函数内部。
7. 总结与拓展应用

通过前面的多个例子,我们掌握了创建返回值函数、为函数添加参数以及在同一程序中使用多个函数的方法。这些技巧可以应用到更复杂的程序开发中。

总结
  • 创建返回值函数时,要明确函数的返回值类型、函数名和参数列表。
  • 为函数添加参数可以使函数更加灵活,能够处理不同的输入。
  • 在同一程序中使用多个函数可以将不同的功能模块化,提高代码的可维护性和可读性。
拓展应用
  • 游戏开发 :可以利用返回值函数和多函数编程来开发更复杂的游戏。例如,在一个角色扮演游戏中,可以创建不同的函数来处理角色的攻击、防御、技能释放等功能。
  • 数据处理 :在数据处理程序中,可以使用多个函数分别完成数据的读取、清洗、分析和输出等任务,使程序结构更加清晰。

以下是一个简单的拓展应用示例,模拟一个简单的游戏,玩家可以选择掷不同数量的骰子并计算总分:

void setup()
{
    int choice = int(random(1, 4)); // 随机选择掷 1 - 3 个骰子
    int total = roll(choice);
    println("你选择掷 " + choice + " 个骰子,总分为: " + total);
}

int roll(int numberOfDice)
{
    int result = 0;
    for (int count = 1; count <= numberOfDice; count++)
    {
        result = result + int(random(1, 7));
    }
    return result;
}

通过不断练习和拓展这些编程技巧,我们可以编写出更加高效、灵活和复杂的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值