模块化编程:函数定义与调用

版权申诉
0 下载量 127 浏览量 更新于2024-07-07 收藏 992KB PDF 举报
"该资源是关于函数的定义和调用的课件,涵盖了函数的概念、定义、调用、参数传递、嵌套调用、递归调用、变量作用域和存储类别以及编译预处理等内容,并通过计算组合数的程序示例来说明函数在解决重复代码和模块化程序设计中的应用。" 在编程中,函数是组织代码的基本单元,它封装了一段可重复使用的代码,可以执行特定任务。函数的定义和调用是程序设计的关键部分,有助于提高代码的复用性和可读性。 函数的概念: 函数是一组相关操作的集合,可以接受输入(参数),并返回结果(返回值)。函数使得代码结构清晰,降低复杂度,便于维护。在C语言中,函数由函数名、参数列表和函数体组成。 函数的定义: 定义一个函数通常包括声明函数类型、函数名、参数列表和函数体。例如,计算阶乘的`fact`函数: ```c double fact(int n) {/*计算n!函数*/ int i; double result = 1; for(i = 1; i <= n; i++) result *= i; return result; } ``` 在这个例子中,`double`是函数的返回类型,表示返回一个双精度浮点数;`fact`是函数名;`(int n)`是参数列表,表示函数接受一个整数`n`作为输入。 函数的调用: 在程序中,我们通过函数名和传递的参数来调用函数。例如,调用`fact`函数计算阶乘: ```c Cnm = fact(m) / (fact(n) * fact(m - n)); ``` 函数的参数传递: 参数传递有两种方式:传值和传引用。在C语言中,默认是传值,意味着函数接收到的是参数值的副本,不会影响原始变量。如果需要函数能修改原变量,可以使用指针参数进行传引用。 变量的作用域和存储类别: 变量在程序中有不同的作用域,如局部作用域(只在函数内部可见)、全局作用域(在整个源文件或多个源文件中可见)。存储类别包括自动(函数调用时创建)、静态(在整个程序运行期间存在)、寄存器(尽可能存储在CPU寄存器中,速度较快)和外部(全局且可被其他文件访问)。 函数的嵌套调用和递归调用: 嵌套调用是指在一个函数内部调用另一个函数。递归调用是函数直接或间接地调用自身,如上面的`fact`函数可以实现递归计算阶乘: ```c double fact(int n) { if (n == 0) return 1; else return n * fact(n - 1); } ``` 这种递归方法简洁,但需要注意避免无限递归和效率问题。 编译预处理: 编译预处理指令以`#`开头,如`#include`用于包含头文件,`#define`用于定义宏等。预处理器在实际编译之前处理这些指令,简化源代码。 通过模块化程序设计,我们可以将复杂问题分解为独立的函数,每个函数解决一部分小问题,然后将这些函数组合起来,以解决整体问题。这样,代码易于理解和维护,也方便团队协作。在上述计算组合数的例子中,通过将阶乘计算封装到单独的`fact`函数,实现了代码的复用,提高了程序的可读性和效率。

为什么function y=myfun(X)%问题一目标函数 %P为违约概率 P=[4.4901e-111 6.60623e-15 7.68032e-11 0.007247314 2.50069e-07 2.15396e-10 2.94705e-11 4.87396e-11 8.59366e-09 5.94481e-06 0.000371065 3.41489e-06 5.60873e-09 0.000469465 2.00014e-07 5.00066e-07 8.2025e-08 9.08461e-08 9.6715e-10 7.29328e-07 4.41833e-06 1.77322e-07 1.58563e-07 9.51448e-08 0.088172208 1.4874e-06 5.74562e-07 0.000520471 0.521131447 0.000605418 8.79791e-07 0.000978475 0.000117916 5.13213e-05 0.000287595 0.883311226 0.00011256 0.000411525 0.243954983 0.079683551 0.103336874 6.70351e-06 0.001197113 0.014224718 0.000609612 0.019271399 0.004518329 1.68283e-06 0.054471398 0.175329789 0.000406706 0.943555623 0.064860147 4.24276e-07 0.046837987 0.062945587 0.000347477 0.000575744 8.22513e-07 0.000754555 0.000401314 0.000877429 0.000233442 3.62872e-06 0.001025476 0.000862572 0.001042486 0.257983673 0.106539695 0.000584556 0.000834802 0.086557877 0.180885238 0.001073287 0.000609361 0.001210604 0.212989238 0.167339606 0.001093772 0.229861622 4.97329e-06 0.977307926 0.000211465 5.31377e-06 0.00104578 0.11414342 0.19826523 6.22023e-06 8.33075e-06 0.20684399 7.33043e-06 5.16035e-16 0.001365569 0.165368564 0.000895718 0.114302777 0.001514608 0.000996671 0.953892892 0.975436983 1 0.962824657 0.971288328 0.143061377 0.233731624 0.00113885 0.952132631 0.971587812 0.96260471 0.050235014 0.845818834 0.95325841 0.955270802 0.968177082 0.956739165 0.979440957 0.949251393 0.975528342 0.975977374 0.967301778 0.974146885 0.972149912 1]; y=0; for i=1:123 y=y-(X(2*i-1)*X(2*i)*(1-P(i))-X(2*i-1)*(1+X(2*i))*P(i))*(1-f(X(2*i),i)); end end报错输入参数数目不足

2023-07-12 上传