一、课节笔记
第四章 函数与预处理
Ⅰ、概述
1.模块化程序设计
(1)基本思想:将一个大程序按照功能分割成若干个小模块
(2)开发方法:自上而下,逐步分解,分而治之
2.※ C++ 是模块化程序设计语言 ※
Ⅱ、定义函数的一般形式
1.一般格式:
函数类型 函数名(形参类型说明表)
{
说明部分
语句部分
}
Ⅲ、函数参数和函数的值
1.形式参数和实际参数
2.函数返回值
(1)返回语句:
1)形式:return (表达式);
(括号可省略)
2)功能:是程序控制从被调用函数返回到调用函数之中,同时把返回值带给调用函数
Ⅳ、函数的调用
1.函数调用一般格式
函数名([实参表列]); 注:(1)实参形参个数相等
如c=max(a,b);
(2)实参表列可为表达式,则须注意运算顺序(从右向左)
例:i=1
max(i++,i++);
max(++i,++i);
∨ \vee ∨ ∨ \vee ∨
max(2,1);
max(3,2);
2.调用方式
(1)函数语句 例:
printstar();
(2)函数表达式 例:m=max(a,b)*2;
(3)函数参数 例:m=max(a,max(b,c));
3.函数说明
(1)函数要求:1)必须已经存在(已经声明)
2)库函数:#include<··>
3)用户自定义函数:函数类型说明
(2)函数说明(一般形式):函数类型 函数名(形参类型[形参名],形参类型[形参名],···)
Ⅴ、函数的嵌套调用
※定义函数时不得嵌套※
※但可以嵌套调用函数※
Ⅵ、函数的递归调用
例1 求 n ! = { 1 , n = 0 n ( n − 1 ) ! , n > 0 n!=\left\{\begin{matrix}1 & ,n=0\\ n(n-1)!&,n>0 \end{matrix}\right. n!={1n(n−1)!,n=0,n>0
作者之前写过一篇讲解通过函数的递归调用解决汉诺塔问题的博客,希望大家多多支持( •̀ ω •́ )✧
主要思想就是将问题通过类比,找到一个方法作为主要支架将其不断拆分为若干有限个小步骤,再通过每一个小步骤之间的顺序、运算结构来整合为所求问题。就如本题,我们想要求 n ! n! n!其实就是要求 n 与 ( n − 1 ) ! n与(n-1)! n与(n−1)!的积(当然n比较大),我们再将 ( n − 1 ) ! (n-1)! (n−1)!化为 ( n − 1 ) (n-1) (n−1)与 ( n − 2 ) ! (n-2)! (n−2)!的积,如此下去 ∀ n ∈ N + \forall n\in N_{+} \; ∀n∈N+都可以拆解为多个因子的因式,直到最后一个因子为0,结束递归即可
程序如下:
#include<iostream>
using namespace std;
int fac(int n)
{if (n == 0)return 1;elsereturn n * fac(n - 1);
}
int main()
{int n;cin>>n;cout << fac(n);return 0;
}
Ⅶ、局部变量与全局变量
1.局部变量—内部变量
Def.在函数内定义,只在本函数内有效
注:(1)不同函数中同名变量占不同内存单元
(2)形参属于局部变量
(3)可在复合语句中定义有效变量
2.全局变量—外部变量
Def.在函数外定义,可为本文件中所有函数共用
注(有效范围): (1)从定义函数的位置开始到本源文件结束
(2)有extern
说明的部分
(3)有extern
说明的其他源文件
(4)若外部变量与局部变量同名,则外部变量被屏蔽
Ⅷ、变量的存储类别
- 变量是对程序中数据的存储空间的抽象
- 属性:(1)数据类型:变量所持有的数据的性质(操作属性)
- 变量的存储类型(不同于数据类型)
auto
- - -自动型
register
- - -寄存器型
extern
- - -外部型
static
- - -静态型
-----→(具有全局寿命和局部可见性)
Ⅸ、内部函数和外部函数
- 内部函数:函数只能被本文件中其他函数所调用
- 外部函数:函数能被其他文件调用
Ⅹ、预处理命令
- 作用:对源程序编译之前做一些处理,生成扩展C源程序
- 种类:①文件包含
#include
②宏定义#define
③条件编译#if...#else...#endif...
等 - 格式:(1)以
#
开头
(2)占单独书写行
(3)句尾不加;
二、梳理总结
最近疫情严重,刚刚返乡,不觉间已经很久没有记录笔记。所有的考试也都推迟到下学期初,希望疫情早早结束,不再反复。后续笔记也会接连更新,预计还有四大章节的内容,之后会以每篇一章的长度进行更新。