27、编程中的函数返回值与数组使用

编程中的函数返回值与数组使用

在编程里,我们常常需要定义和运用各类函数,其中能返回值的函数尤为重要。

1. 创建返回值的函数

在同一个程序中,我们可以定义并使用多个函数,数量上没有限制。函数可分为返回值的函数和无返回值的 void 函数,并且在同一程序里能同时定义和使用这两种类型的函数。

下面通过一个将浮点数四舍五入到指定小数位的例子来详细说明。

1.1 浮点数精度问题

浮点数在某些情况下精度不准确,特别是在小数位较小时。例如:

println(3.0/9.0);

输出结果是 0.33333334 ,而正确结果应为 0.33333333 。并且,有时处理过多小数位不太方便,比如处理货币金额时,通常只需要保留两位小数。

1.2 四舍五入公式

对于一个带小数的数,如 3.168 ,将其四舍五入到十分位的步骤如下:
1. 该数乘以 10: 3.168 * 10 = 31.68
2. 将结果四舍五入为整数: round(31.68) = 32
3. 整数除以 10: 32 / 10.0 = 3.2

在 Processing 代码中可表示为:

round(numberToRound * 10) / 10.0

注意这里除以 10.0 是为了避免整数除法。

同理,将其四舍五入到百分位的步骤为:
1. 该数乘以 100: 3.168 * 100 = 316.8
2. 将结果四舍五入为整数: round(316.8) = 317
3. 整数除以 100: 317 / 100.0 = 3.17

Processing 代码表示为:

round(numberToRound * 100) / 100.0

更通用的公式是,如果要将数四舍五入到 n 位小数:
1. 该数乘以 10^n
2. 将结果四舍五入为整数
3. 整数除以 10^n

Processing 代码表示为:

round(numberToRound * pow(10, places)) / pow(10, places)

由于 pow() 函数返回浮点数,所以无需担心整数除法问题。

1.3 编写四舍五入函数

定义函数时,函数头需要包含三个信息:
1. 返回值类型:因为四舍五入后的结果仍为浮点数,所以返回类型为 float
2. 函数名:这里命名为 roundPlaces()
3. 参数列表:需要传入要四舍五入的浮点数和指定的小数位数。

完整的函数定义如下:

float roundPlaces(float numberToRound, int places)
{
    float result;
    result = round(numberToRound * pow(10, places)) / pow(10, places);
    return result;
}

setup() 函数中调用该函数:

void setup()
{
    float unrounded = 3.168;
    int decimals = 2;
    float rounded;
    rounded = roundPlaces(unrounded, decimals);
    println(unrounded + " --> " + rounded);
}

若要使程序具有交互性,让用户输入要四舍五入的数和小数位数,可添加如下代码:

import static javax.swing.JOptionPane.*;
void setup()
{
    String input;
    String output;
    float unrounded;
    int decimals;
    float rounded;
    char rightArrow = char(8594);
    input = showInputDialog("Enter a number to be rounded:");
    unrounded = float(input);
    input = showInputDialog("Enter a number of decimal places");
    decimals = int(input);
    rounded = roundPlaces(unrounded, decimals);
    output = unrounded + " " + rightArrow + " " + rounded;
    showMessageDialog(frame, output);
}
2. 函数总结
  • 能返回值的函数通常简称为“函数”。
  • 定义返回值的函数需要指定非 void 的返回类型,并且要有 return 语句。
  • void 函数一样,返回值的函数可在同一程序中多次调用,也能定义一个或多个参数。
  • 同一程序中可定义和使用多个 void 或非 void 函数。
3. 相关练习

以下是一些相关的编程练习:
1. 编写 randomMonth() 函数,返回 1 到 12 之间的随机整数,并在 setup() 函数中调用该函数,将结果赋值给 month 变量,然后在控制台显示 month 的值。
2. 编写 circum() 函数,接收一个 float 类型的 diameter 参数,利用 Processing 内置的 PI 常量计算并返回直径为 diameter 的圆的周长。在 setup() 函数中声明变量 diam 并赋值,调用 circum() 函数,将结果赋值给 circumference 变量,最后在控制台显示 diam circumference 的值。
3. 修改上一题的程序,随机选取 1 到 100 之间的直径。
4. 编写 circleArea() 函数,接收一个 float 类型的 circleRadius 参数,计算并返回半径为 circleRadius 的圆的面积。在 setup() 函数中声明变量 radius 并赋值,调用 circleArea() 函数,将结果赋值给 area 变量,最后在控制台显示 radius area 的值。
5. 修改上一题的程序,随机选取 1 到 100 之间的直径。
6. 编写 sphereVolume() 函数,接收一个 float 类型的 sphereRadius 参数,计算并返回半径为 sphereRadius 的球体的体积。在 setup() 函数中声明变量 radius 并赋值,调用 sphereVolume() 函数,将结果赋值给 volume 变量,最后在控制台显示 radius volume 的值。
7. 修改上一题的程序,随机选取 1 到 100 之间的直径。
8. 编写 coneVolume() 函数,接收 float 类型的 coneRadius coneAltitude 参数,计算并返回半径为 coneRadius 、高为 coneAltitude 的圆锥的体积。在 setup() 函数中声明变量 radius altitude 并赋值,调用 coneVolume() 函数,将结果赋值给 volume 变量,最后在控制台显示 radius altitude volume 的值。
9. 编写 yardsToMeters() 函数,接收一个 float 类型的码数作为参数,返回对应的米数(1 码 = 0.9144 米)。在 setup() 函数中随机选取 1 到 100 之间的整数作为码数,赋值给 yards 变量,调用 yardsToMeters() 函数,将结果赋值给 meters 变量,最后在控制台显示选取的码数和对应的米数。
10. 修改上一题的程序,允许用户在对话框中输入要转换的码数。
11. 编写 monthDays() 函数,接收一个月份数字,返回表示该月天数的字符串。在 setup() 函数中随机选取 1 到 12 之间的整数,调用 monthDays() 函数,在控制台显示选取的月份和对应的天数。
12. 修改上一题的程序,允许用户在对话框中输入月份数字。

4. 数组的使用

当需要处理一组相关且类型相同的数据时,使用数组是个不错的选择。

4.1 数组的概念

数组是由固定数量、相同类型的元素按特定顺序排列而成的。具体特点如下:
1. 固定数量 :数组存储的元素数量是固定的,其存储容量一般不会改变。
2. 相同类型 :数组中所有元素的类型必须相同。
3. 特定顺序 :数组中的元素按特定顺序排列。

数组中的每个元素都有一个索引,在计算机编程中,数组索引通常从 0 开始。例如,有一组温度数据 57, 10, 32, 78, 212, 101 ,若将其存储在名为 temperatures 的数组中,要访问数组中索引为 3 的元素,可使用 temperatures[3] ,该元素的值为 78

4.2 数组的声明

在 Processing 中创建数组变量,首先要进行声明。声明数组变量时,先指定元素类型,然后在类型后面添加左右方括号。例如:

int[] temperatures;

此语句只是让 Processing 创建一个名为 temperatures 的变量,用于存储一个 int 类型数组在计算机内存中的地址,但数组并未实际创建,内存地址也未知。

4.3 数组的初始化

有时候,我们在创建数组时就知道其初始值。这时,可以在数组声明语句中使用赋值运算符 = 来初始化数组。例如:

int[] temperatures = {57, 10, 32, 78, 212, 101};

需要注意的是,不能分开声明数组变量和指定初始值,以下代码会产生错误:

int[] temperatures;
temperatures = {57, 10, 32, 78, 212, 101}; // 错误!

当在一个语句中声明并初始化数组时,Processing 会完成以下三件事:
1. 在计算机内存中为新数组分配空间。
2. 将列出的值插入到数组的相应位置。
3. 将新数组在计算机内存中的地址存储在数组变量中。

我们可以通过调用 print() 函数来验证数组变量存储的是数组的内存地址:

int[] temperatures = {57, 10, 32, 78, 212, 101};
print(temperatures);

运行程序后,控制台输出类似 [I@2a139a55 的内容, @ 符号后面的字符表示数组在内存中的十六进制地址。

综上所述,数组变量并不直接包含实际的数组,而是存储数组在计算机内存中的地址。通过合理运用数组,我们可以更高效地处理大量同类型的数据。希望大家通过本文的介绍和练习,能更好地掌握创建返回值的函数和数组的使用。

编程中的函数返回值与数组使用(续)

5. 数组的操作示例

为了更好地理解数组的使用,下面给出一些具体的操作示例。

5.1 遍历数组

遍历数组就是依次访问数组中的每个元素。在 Processing 中,可以使用 for 循环来实现。以下是遍历 temperatures 数组并打印每个元素的示例代码:

int[] temperatures = {57, 10, 32, 78, 212, 101};
for (int i = 0; i < temperatures.length; i++) {
    println("Index " + i + ": " + temperatures[i]);
}

在上述代码中, temperatures.length 表示数组的长度,即数组中元素的个数。 for 循环从索引 0 开始,依次访问数组中的每个元素,并将其索引和值打印到控制台。

5.2 修改数组元素

可以通过索引直接修改数组中的元素。例如,将 temperatures 数组中索引为 2 的元素修改为 35:

int[] temperatures = {57, 10, 32, 78, 212, 101};
temperatures[2] = 35;
println("Modified temperatures: ");
for (int i = 0; i < temperatures.length; i++) {
    println("Index " + i + ": " + temperatures[i]);
}

运行上述代码后,会发现数组中索引为 2 的元素值变为了 35。

5.3 数组求和

可以通过遍历数组并累加每个元素的值来计算数组中所有元素的和。以下是计算 temperatures 数组元素和的示例代码:

int[] temperatures = {57, 10, 32, 78, 212, 101};
int sum = 0;
for (int i = 0; i < temperatures.length; i++) {
    sum += temperatures[i];
}
println("Sum of temperatures: " + sum);

在上述代码中,使用 sum 变量来累加数组中的每个元素的值,最终得到数组元素的总和。

6. 多维数组

除了一维数组,还可以使用多维数组来存储更复杂的数据结构。例如,二维数组可以看作是一个表格,有行和列。

6.1 二维数组的声明和初始化

以下是声明和初始化一个二维数组的示例代码:

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

在上述代码中, matrix 是一个 3 行 3 列的二维数组。可以通过两个索引来访问二维数组中的元素,第一个索引表示行,第二个索引表示列。例如,要访问第二行第三列的元素,可以使用 matrix[1][2] (注意索引从 0 开始)。

6.2 遍历二维数组

可以使用嵌套的 for 循环来遍历二维数组。以下是遍历 matrix 二维数组并打印每个元素的示例代码:

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        println("Element at row " + i + ", column " + j + ": " + matrix[i][j]);
    }
}

在上述代码中,外层 for 循环控制行,内层 for 循环控制列,通过嵌套循环可以依次访问二维数组中的每个元素。

7. 数组的应用场景

数组在编程中有广泛的应用场景,以下是一些常见的应用场景:

应用场景 描述
数据存储 可以使用数组来存储一组相关的数据,如温度、成绩、坐标等。
排序算法 许多排序算法(如冒泡排序、选择排序、快速排序等)都需要使用数组来存储待排序的数据。
图像处理 在图像处理中,数组可以用来存储图像的像素值,通过对数组元素的操作来实现图像的处理和变换。
游戏开发 在游戏开发中,数组可以用来存储游戏中的角色位置、道具信息等。
8. 总结

本文详细介绍了编程中创建返回值的函数和数组的使用。通过将浮点数四舍五入到指定小数位的例子,我们学习了如何定义和调用返回值的函数,以及函数头中需要包含的信息。同时,我们还了解了数组的概念、声明、初始化和操作,包括一维数组和二维数组的使用。数组在编程中是一种非常重要的数据结构,能够帮助我们更高效地处理大量同类型的数据。希望读者通过本文的学习,能够掌握这些知识,并在实际编程中灵活运用。

以下是一个简单的流程图,展示了创建返回值函数和使用数组的基本流程:

graph TD;
    A[开始] --> B[创建返回值函数]
    B --> C[定义函数头(返回类型、函数名、参数列表)]
    C --> D[编写函数体]
    D --> E[返回结果]
    B --> F[调用函数]
    F --> G[使用返回值]
    A --> H[使用数组]
    H --> I[声明数组]
    I --> J[初始化数组]
    J --> K[操作数组(遍历、修改、求和等)]
    K --> L[结束]
    G --> L

通过这个流程图,我们可以更清晰地看到创建返回值函数和使用数组的整个过程。在实际编程中,我们可以根据具体需求灵活运用这些知识,提高编程效率和代码质量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值