《C编程技巧:117个问题解决方案示例 》 —3 函数和数组
第3章
函数和数组
除基本类型外,C还包含派生类型。图3-1显示了C中基本类型和派生类型的图形表示。基本类型与派生类型的关系好比是砖与墙的关系。派生类型使用一个或多个基本类型作为构建块构建。函数和数组都是C中的派生类型。
图3-1 C中的基本和派生数据类型。类型type和数据类型data type是同义词
在C中,可以通过多种方式解释函数的概念。这里有些例子:
函数是子程序。它允许你将大型计算任务分解为较小的计算任务。
函数是由大括号分隔的一段代码,它执行一些明确定义的任务并返回一个值。
函数是程序的构建块。它有助于使现有代码可重用。
函数也被视为C中的派生类型。请参见图3-1。
函数是扩展C语言库的一种方法。
每个函数都需要编写。编写函数意味着编写该函数的程序语句。C中的函数可以分为三类:main()函数、库函数和用户定义函数。在此简要描述这些类别:
main()函数:C程序中此函数必不可少。每个C程序中都会有一个(也是唯一一个)main()函数。当操作系统执行C程序时,它实际上执行的是main()函数。main()函数根据要求调用库函数和用户定义的函数。程序员需要编写main()函数的代码。
库函数:这些函数也称为系统定义函数或内置函数。例如,printf()和scanf()是库函数。库函数在C程序中是可选的。但是,构建一个没有库函数的有用程序几乎是不可能的。程序员不需要编写库函数代码。编译器开发人员对库函数进行编码,编译它们,并将它们放在库中供你使用。
用户定义函数:用户定义函数在C程序中是可选的。用户定义函数根据要求调用其他用户定义函数或库函数。程序员需要对用户定义函数进行编写。
从技术上讲,main()函数也是用户定义函数,因为程序员(即用户)需要编写(即定义)该函数。但是在程序可能包含的所有函数中,函数main()享有特殊的状态。实际上,函数main()代表一个完整的C程序。当操作系统执行C程序时,它实际上执行的是main()函数。没有其他函数可以调用main()函数。另一方面,main()函数当然可以调用其他函数。main()函数在C程序中是必需的,而其他函数都是可选的。这证明了main()函数的类别是单独的。
数组:数组是具有相同数据类型和名称,但下标或索引不同的项目列表。数组可以是一维的或多维的。一维数组可以图形方式表示为列表。二维数组可以图形方式表示为表格。三维数组可以图形方式表示为方块或立方体。对于四维和更高维数组,不能进行图形表示。
3.1 确定圆周率的值
问题
你想确定数学常数的值。
解决方案
编写一个C程序,使用蒙特卡洛方法确定数学常数的值,使用以下规格说明:
程序要求用户输入投掷次数为N(2≤N≤5000)。如果用户输入该范围之外的数字N,则程序要求用户重新输入此数字。
每次投掷都会生成一对坐标x和y,范围为0≤x, y≤1,用来表示一个点。然后测试它以确定产生的点是否位于圆内。
程序使用图3-2中所示的标准公式,计算的值。
代码
以下是使用这些规格说明编写的C程序的代码。在文本编辑器中键入以下C程序,并将其保存在文件夹C:\Code中,文件名为monte.c:
图3-2 用蒙特卡洛方法确定值
编译并执行此程序。这个程序的运行结果在这里给出:
工作原理
(pi)的准确值是3.141 59。阻止你接近此准确值的最重要因素是C编译器生成的随机值不是真正随机的。尽管有这个缺点,此程序已经足够准确地确定了的值。如果使用函数srand(),则可以向此函数输入种子值,然后生成的随机值将更随机。
蒙特卡洛市位于摩纳哥,以***和赌场而闻名。蒙特卡洛方法基于简单的概率定律,其工作原理如下:想象一个边长为2r的正方形和半径为r的圆,两者都与坐标系的原点O同心。为简单起见,你只考虑第一象限中这些图形的四分之一部分,如图3-2所示。如果你随机在正方形内的任何地方生成大量的点,那么这些点将几乎均匀地占据所有可用空间。在此程序中,你最多可以生成5 000个点。
在LOC 18~21中,创建一对坐标(fltX和fltY),其值在0~1的范围内(包括边界值),并且这对坐标定义位于正方形某处的点(如图3-2所示)。函数rand()创建一个0~RAND_MAX范围内的随机整数,其中RAND_MAX是编译器定义的常量。在LOC 22中,计算原点与产生的点之间的距离fltR。生成的每个点都会增加intSquare的值,但是,如果该点的fltR值等于或小于1,那么该点也会增加intCircle的值。在图3-2中,变量intCircle和intSquare分别由项N_Circle和N_Square表示。
跨越LOC 17~25的for循环迭代intToss次。程序在LOC 26中计算的值。在LOC 27中,将该值显示在屏幕上。
- 点赞
- 收藏
- 关注作者
评论(0)