当前位置:首页 >> 工学 >>

百度文库C语言专升本辅导第四章


C 语言程序设计详解

1

第四章 模块化程序设计

一、函数 1、 C 程 序 结 构 一个简单的函数调用例子。 main () {printstar(); print_ message (); printstar(); } prin tsta r() { printf(“ ************ **************\n” ); } prin t_ message() { printf(“How do you d o!\n” ); } 说明: ① 用 C 语 言 编 写 函 数 至 少 要 编 写 一 个 ma in()函 数 , 行 C 程 序 就 是 执 行 相 应 执 的 main()函 数 ,调 用 其 他 函 数 后 流 程 回 到 ma in 函 数 ,在 ma in 函 数 中 结 束 整 个 程 序的运行。 ②一个 C 程序可由一个主函数和若干个函数组成。由主函数调用其他函数, 其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。 ③ 所 有 函 数 都 是 平 行 的 ,即 在 定 义 函 数 时 互 相 独 立 的 ,一 个 函 数 并 不 从 属 于 另一个函数,即函数不能嵌套调用 ④从用户使用的角度看,函数有两种:标准函数,用户自定义函数。 ⑤从函数的形式看,函数分两类:无参函数、有参函数。 例 1: 以 下 正 确 的 说 法 是 ( ) 建 立 函 数 的 目 的 之 一 是 : A) 提 高 程 序 的 执 行 效 率 B) 提 高 程 序 的 可 读 性 C) 减 少 程 序 的 篇 幅 D) 减 少 程 序 文 件 所 占 内 存 答案:B

C 语言程序设计详解
例 2: 以 下 正 确 的 说 法 是 ( ) A) 用 户 若 需 调 用 标 准 库 函 数 , 调 用 前 必 须 重 新 定 义 B) 用 户 可 以 重 新 定 义 标 准 函 数 , 若 如 此 , 该 函 数 将 失 去 原 有 含 义 C) 系 统 根 本 不 允 许 用 户 重 新 定 义 标 准 库 函 数

2

D) 用 户 若 需 调 用 标 准 库 函 数 , 调 用 前 不 必 使 用 预 编 译 命 令 将 该 函 数 所 在 文 件包括到用户源文件中,系统自动去调。 答案:B 2、 函 数 的 定 义 函数定义就是在程序中设定一个函数模块。 例 3: main ( ) { doub le su m(in t a,do uble b );/*函 数 声 明 */ } double su m(in t a,d ou ble b ) /*函 数 定 义 */ { /*函 数 体 */ } 注意: ①函数名应符合 C 语言对标识符的规定。以字母或下划线开头,后跟字母、 数字下划线的组合。 ② 形 式 参 数 写 在 函 数 后 面 的 一 对 圆 括 号 内 ,表 示 将 从 主 调 函 数 中 接 收 哪 些 类 型的信息,程序进行编译时,并不为形式参数分配存储空间。只有在被调用时, 形式参数才临时地占有存储空间。 ③ 函 数 返 回 值 类 型 ,如 省 略 返 回 值 类 型 系 统 默 认 为 in t 型 , 对 不 需 要 使 用 函 数 返 回 值 的 函 数 , 应 定 义 为 void 类 型 。 ④ 函 数 的 外 部 性 , 函 数 不 能 嵌 套 ,一 个 函 数 不 能 定 义 在 别 的 函 数 内 部 。 3、 函 数 声 明 在 主 调 函 数 中 ,要 对 在 本 函 数 中 将 要 调 用 的 函 数 事 先 作 一 声 明 。所 谓“ 声 明 ” 是 指 向 编 译 系 统 提 供 必 要 的 信 息 :函 数 名 ,函 数 的 类 型 ,函 数 参 数 的 个 数 ,类 型 及排列次序。 ①函数声明末尾要加;

C 语言程序设计详解

3

② 函 数 声 明 可 以 不 写 形 参 名 ,但 必 须 写 类 型 标 识 符 。如 上 例 中 可 以 把 声 明 改 为 : doub le su m(a,b ); 例 4 : 若 调 用 一 个 函 数 , 且 此 函 数 中 没 有 re turn 语 句 , 则 正 确 的 说 法 是 ( ) A) 没 有 返 回 值 B) 返 回 若 干 个 系 统 默 认 值 C) 能 返 回 一 个 用 户 所 希 望 的 函 数 值 D) 返 回 一 个 不 确 定 的 值 答案:D 例 5、 C 语 言 规 定 , 函 数 返 回 值 的 类 型 是 由 ( ) A) retu rn 语 句 中 的 表 达 式 类 型 决 定 B) 调 用 该 函 数 时 的 主 调 函 数 类 型 所 决 定 C) 调 用 该 函 数 时 系 统 临 时 决 定 D) 在 定 义 该 函 数 时 所 指 定 的 函 数 类 型 所 决 定 答案:D 例 6、 下 面 函 数 调 用 语 句 含 有 实 参 个 数 为 ( ) func ((exp1 ,exp2 ),(exp3,exp4, exp5)); 答案:2 。 例 7 、 若 输 入 的 值 是 -1 25,以 下 程 序 的 运 行 结 果 是 ( ) # inc lude “ ma th.h ” ma in() { int n; scanf(“%d” ,&n ); n=fabs(n ); fun(n ); } fun(in t n) { int k,r; for(k=2;k<=sqrt(n);k++) { r=n%k; while (r==0) { printf(“%d” ,k); n=n/k ; if(n>1) p rin tf(“ *” ); } } su m(in t ,double ); 但 不 能 只 写 形 式 参 名 而 不 写 类 型 如 : doub le

C 语言程序设计详解
if(n!=1) prin tf(“%d \n”, n); } 答 案 : -125=-5*5*5 。 例 9、 以 下 正 确 的 函 数 定 义 形 式 是 ( ) A) double fun(in t x, in t y) B) double fun(in t x ;int y) C) double fun(in t x, in t y); D) double fun(in t x, y) ; 答案:A 。 例 10 、 以 下 正 确 的 函 数 形 式 是 ( ) A) double fun(in t x, in t y) {z=x+ y;re tu rn z ;} B) fun (int x, y) {in t z ; retu rn z ;} C) fun (int x,int y) {in t x, y;doub le z; z=x+ y;re tu rn z ;} D) doub le fu n(int x ,in t y) {doble z ; z=x+ y;re tu rn z;} 答案:D 4、 函 数 的 传 值 调 用 参数是函数调用时进行信息交换的载体,关于形参与实参的说明:

4

① 在 定 义 函 数 中 指 定 的 形 参 ,在 未 出 现 函 数 调 用 时 ,它 们 并 不 占 用 内 存 中 的 存 储 单 元 。只 有 在 函 数 调 用 时 ,函 数 中 的 形 参 才 被 分 配 内 存 单 元 ,形 参 与 实 参 各 占一个独立的存储空间,函数返回时,临时存储区被撤销。 ② 在 被 定 义 的 函 数 中 ,必 须 指 定 形 参 的 类 型 ,实 参 可 以 是 常 量 、变 量 或 表 达 式,但要求它们有确切的值。实参与形参的类型应相同或赋值兼容。 ③ C 语 言 规 定 ,实 参 变 量 对 形 参 变 量 的 数 据 传 递 是“ 值 传 递 ” ,即 单 向 传 递 , 只由实参传给形参,而不能由形参传回来给实能。 例 11 、 main ( ) { int a=3,b=5;

C 语言程序设计详解
vo id swap(in t x, in t y); swap (a,b ); prin tf(“%d ,%d”, a,b); } vo id swap (int x ,in t y) {in t te mp ; te mp=x ;x= y;y= te mp ; } 输 出 结 果 : 3, 5 。 例 12 、 以 下 正 确 的 说 法 是 ( ) 在 C 语言中, A) 实 参 与 其 对 应 的 形 参 各 占 用 独 立 的 存 储 单 元 。 B) 实 参 和 与 其 对 应 的 形 参 共 占 用 一 个 存 储 单 元 C) 只 有 当 实 参 和 与 其 对 应 的 形 参 同 名 时 才 共 占 用 存 储 单 元 。 D) 形 参 是 虚 拟 的 , 不 占 用 存 储 单 元 。 答案:A 。 例 13 、 以 下 不 正 确 的 说 法 是 ( ) C 语言规定 A) 实 参 可 以 是 常 量 、 变 量 或 表 达 式 B) 形 参 可 以 是 常 量 、 变 量 或 表 达 式 C) 实 参 可 以 为 任 意 类 型 D) 实 参 类 型 应 与 其 对 应 形 参 的 一 致 答案:B 5、 函 数 的 递 归 调 用

5

在调用一个函数的过程中又出现直接或间接地调用该函数本身, 为函数的 称 递归调用。 例 14 、 用 递 归 方 法 计 算 n!的 函 数 rfa ct( )。 假 设 n 为 正 数 。 求 n!可 以 用 递 推 方 法 , 即 从 1 开 始 , 乘 2 , 再 乘 3……一 直 乘 到 n。 这 种 方 法 容 易 理 解 ,也 容 易 实 现 。递 推 法 的 特 点 是 从 一 个 已 知 的 事 实 出 发 ,按 一 定 规 律 推出下一个事实,再从这个新的已知的事实出发,再向下推出一个新的事实。 floa t rfac1 (int n ) { in t i; floa t t;

C 语言程序设计详解
for(i=1 ;i<=n;i++) t=t*I; retu rn(t); }

6

求 n!也 可 以 用 递 归 方 法 , 即 5!=5 *4!, 而 4 !=4 *3!,3!=3 *2 !,2!=2 *1 !,1!=1, 可 用下面的递归公式表示。 =1 rfact(n) =rfac t(n -1)*n long rfac t(in t n ) { if( n<=1) retu rn(1); else re tu rn(n *rfa ct(n -1 )); } 分析:递归总是由两部分组成的: ①递归方式 ②递归终止条件 例 15 、 求 1/n! ①递归方式 ②递归终止条件 n> 1 n=1 f15 (n)= f15(n -1)*1 /n f15=1 n>1 n=1

double f15 (in t n ) { if(n==1) return (1); e lse return (f15 (n -1 )*1/n); } 例 16 、 s=1+1/2+1/3+…….+1/n ①递归方式 ②递归终止条件 double f16 (in t n ) { if(n==1) return (1); e lse n> 1 n=1 f16 (n)= f16(n -1)*1 /n f16 (n)=1

C 语言程序设计详解
return (f16 (n -1 )+1/n); } 例 17 、 s=1-1/2+1 /3 -1 /4+…..1/n ①递归方式 ②递归终止条件 n> 1 n=1 精 确 到 10 - 6

7

f17 (n)= f17(n -1)±1/n f17 (n)=1

double f17 (in t n, in t fla g) { if(n==1) return (1); e lse return (f17 (n -1 , -flag )+1/n *flag); } main () {in t n, flag; scan f(“ %d”, &n); if (n %2==0) flag== -1 ; else flag==1 ; printf(“%lf”, f17(n ,fla g)); } 例 18 、 以 下 程 序 的 功 能 是 用 递 归 法 计 算 学 生 的 年 龄 , 已 知 第 一 位 学 生 年 龄 最 小 , 为 10 岁 , 其 余 学 生 一 个 比 一 个 大 2 岁 , 求 第 5 位 学 生 的 年 龄 。 ①递归方式 ②递归终止条件 n> 1 n=1 f18 (n)= f18(n -1)+2 f18 (n)=10

int f18 (in t n ) { if(n==1) return (10); e lse return (f18 (n -1 )+2); } 例 19 、 求 u,v 两 数 的 最 大 公 约 数 ①递归方式 ②递归终止条件 v!=0 v= =0 f19 (u, v)= f19(v, u%v) f19 (u, v)=u

int f19 (in t u ,in t v) { if (v==0) retu rn(u ); e lse re turn (f19(v,u %v)); }

C 语言程序设计详解
例 20 、 兔 子 繁 殖 问 题 、 牛 群 繁 殖 问 题 ①递归方式 ②递归终止条件 n> 1 n=1 n=2 f20 (n)= f20(n -1)+f20(n -2 ) f20 (n)=1 f20(n )=1

8

int f20 (in t n ) { if(n==1) return (1); else if(n==2) re turn (1); e lse return (f20 (n -1 )+f20(n -2)); } 例 21 、 写 出 计 算 Ackermann 函 数 ack(m,n) 的 递 归 函 数 。 对 于

m>=0,n>=0,Ack(m,n)定 义 为 : a ck(0, n)=n+1 a ck(m,0)=ac k(m-1, 1) a ck(m,n)=ac k(m-1, ack(m,n -1 )) ①递归方式 ②递归终止条件 n> 1 n=0 m=0 ack (m,n )=ack (m-1,ack (m,n -1)) ack (m,n )=ack (m-1,1) ack (m,n)=n+1

d ouble ack (in t m, in t n) { if(m==0) retu rn(n+1 ); else if(n==0) retu rn(a ck(m-1,1 )); else retu rn(a ck(m-1, ack(m,n -1 ))); } 例 22 、分 别 写 出 Hermite 多 项 式 H n (x)的 值 的 递 推 和 递 归 函 数 。H n (x )定 义 如 下: H 0 (x)=1 H 1 (x)=2x H n (x)=2xH n - 1 (x)-2 (n -1)H n - 2 (x) 递推法:

C 语言程序设计详解
doub le h1 (int n,floa t x) { floa t s1=1,s2=2 *x, s3; int i; if(n==0) re turn (1); else if(n==1) re turn (2 *x); else { for(i=2 ;i<=n;i++) {s3=2 *x *s2+2 *(n -1)*s1; s1=s2; s2=s3; } } } 递归法: ①递归方式 ②递归终止条件 n> 1 n=0 n=1 h(n ,x)=2 *x *h (n -1,x)-2 *(n -1)*h (n -2 ,x) h(n ,x)=1 h (n,x )=2 *x

9

double h 1(int n,floa t x ) { if(n==0) return (1); e lse if(n==1) retu rn(2 *x ); e lse re turn (2 *x *h (n -1,x )-2 *(n -1)*h (n -2 ,x )); } 例 23 、 求 a 的 平 方 根 递推法: double sq_root(doub le a) { doub le x ; x=a; wh ile(fabx(x *x )-a)>= 1e -6) x=(x+a /x)*0. 5; re turn (x); } 递归法: ①递归方式 fabx (x *x)-a)>=1e -6 sqroo t(x, a)=sq roo t((x+a/x )*0 .5,a) sq root(x,a)=x

② 递 归 终 止 条 件 fabx (x *x )-a )<1e -6 do uble sq root(doub le x,d ouble a) { if(fab s(x *x )-a<1e -6 ) re tu rn(x ); else

C 语言程序设计详解
retu rn(sqroo t((x+a /x )*0.5,a )) } 例 24 、 求 一 个 给 定 数 字 的 所 有 质 因 子 , 如 7 2=2 *2 *2 *3 *3 递推法: vo id yiz i(in t n) {in t i=2,flag=0; while (n!=1) { if(n%i==0) { if(flag==0) e lse n=n /i; } else i=i+1 ; } } 递归法: vo id yiz i(in t n, in t i,in t flag ) {if (n !=1) { if(n%i==0) { if (flag==0) {prin tf(“%d=%d”,n i); flag=1 ;} else prin tf(“ *%d ”,i); yiz i(n/i, i,fla g); } e lse yiz i(n, i+1, fla g); } } 例 24 、 用 递 归 法 将 一 个 整 数 n 转 换 成 字 符 串 vo id con ve r(in t n ) {in t i; if(i=n /10)!=0) c on vert(i); putcha r(n %10+’0’); } 二、变量的存储属性 1、 动 态 变 量

10

{p rin tf(“ %d=%d”,n, i); prin tf(“ *%d”, i);

flag=1; }

动态变量是 C 程序中使用最多的一种变量,在程序执行过程中自动进行建

C 语言程序设计详解

11

立 和 撤 销 ,它 们 存 在 于 程 序 的 局 部 ,也 只 在 这 个 局 部 中 可 以 使 用 ,这 种 变 量 称 为 动 态 变 量 , 动 态 变 量 有 两 种 : 自 动 ( au to) 变 量 和 寄 存 器 ( reg iste r) 变 量 。 在一个函数内部定义的变量是局部 例 25 : 写 出 程 序 运 行 结 果 : main () { in t x=1 ; { void prt(vo id ); in t x=3 ; prt( ); printf(“x=%d\n ”,x); } prin tf(“x=%d \n”,x ); } vo id prt(void ) { int x=5; prin tf(“x=%d” ,x); } 注意: 1、系 统 在 程 序 执 行 过 程 中 动 态 建 立 动 态 撤 消 ,在 赋 值 前 它 的 值 是 不 确 定 的 。 2、 局 部 可 用 。 3、 外 层 的 变 量 被 内 层 的 同 名 变 量 屏 蔽 。 例 26 : 以 下 正 确 的 说 法 是 ( ) 如果在一个函数中的复合语句中定义了一个变量,则该变量( ) A) 只 在 该 复 合 语 句 中 有 效 B) 在 该 函 数 中 有 效 C) 在 本 程 序 范 围 内 均 有 效 D) 为 非 法 变 量 例 27 : 以 下 正 确 的 说 法 为 ( ) A) 在 不 同 函 数 中 可 以 使 用 相 同 名 字 的 变 量 B) 形 式 参 数 是 局 部 变 量 C) 在 函 数 内 定 义 的 变 量 只 在 本 函 数 范 围 内 有 效 D) 在 函 数 内 的 复 合 语 句 中 定 义 的 变 量 在 本 函 数 范 围 内 有 效 2、 寄 存 器 变 量 reg ister

C 语言程序设计详解
通常把使用频率较高的变量定义为寄存器变量。 3、 静 态 变 量 注意: ① 在 编 译 时 为 其 分 配 空 间 , 如 不 赋 初 值 , 初 值 为 0。 ②局部可用或全局可用。 ③静态变量具有可继承性。 4、 外 部 变 量 在一个文件中,定义在所有函数之外的变量称为外部变量。 注意: ①在编译时为其分配空间。 ②全局可用。 ③限定本文件的外部变量只在本文件使用 sta tic int a=3; main ( ) { } sta tic

12

④将外部变量的作用域在本文件范围内(或在其它文件)扩充。 exte rn 三、编译预处理 注意: ①编译预处理是在编译前对源程序进行的一些预加工。 ② C 语 言 的 预 处 理 命 令 均 以 “ #” 开 头 , 末 尾 不 加 分 号 ③编译预处理命令可以出现在程序中的任何位置 1、 宏 替 换 ①字符串宏替换 ②带参的宏替换 注意: ①宏名与宏体之间应以空格相隔 ②宏名不能用引号 ③ 较 长 的 定 义 在 一 行 写 不 下 时 , 可 在 末 尾 加 \。 ④对带参宏定义时、宏休及其各个形参应用括号括起来。

C 语言程序设计详解
2、 文 件 包 含 格 式 1: #in clu de“ 文 件 标 识 ” 格 式 2: #in clu de<文 件 名 > 例 28: 以 下 叙 述 中 不 正 确 的 是 ( ) A) 预 处 理 命 令 行 都 必 须 以 #开 头 B) 在 程 序 中 凡 是 以 # 号 开 头 的 语 句 行 都 是 预 处 理 命 令 C) C 程 序 在 执 行 过 程 中 对 预 处 理 命 令 行 进 行 处 理 D) 以 下 是 正 确 的 宏 定 义 #define IBM_P C

13

例 29 : 以 下 叙 述 中 正 确 的 是 ( ) A) 在 程 序 的 一 行 上 可 以 出 现 多 个 有 效 的 预 处 理 命 令 行 B) 使 用 带 参 的 宏 时 , 参 数 的 类 型 应 与 宏 定 义 时 的 一 致 C) 宏 替 换 不 占 用 运 行 时 间 , 只 占 编 译 时 间 D) 在 以 下 定 义 中 C R 是 称 为 “ 宏 名 ” 标 识 符 #define C R 045 例 30 : 设 有 以 下 宏 定 义 : #define #define W IDTH LENGTH 80 WIDTH+40 ) 。

则 执 行 赋 值 语 句 : v= LENGTH*20 (v 为 in t 型 变 量 )后 , v 的 值 是 (


相关文章:
C语言专升本辅导_百度文库
百度文库C语言专升本辅导第... 22页 免费 百度文库C语言专升本辅导第... 13页...“等级是 E”); break ; } } 38 第四章 模块化程序设计 一、函数 1、 ...
大学C语言第四章作业答案_百度文库
大​学​C​语​言​第​四​章​作​业​答​案​,​期​末​考​试​的​题​库​,​二​级​C​语​言​...
C语言第四章练习题_百度文库
C语言第四章练习题_IT认证_资格考试/认证_教育专区。注意,本套题目中有些涉汲到函数的调用和指针的使用,大家自已先去看下,不 懂就问,培养自己的自学能力。 ...
c语言程序设计课后习题答案 第四章_百度文库
百度文库 教育专区 高等教育 工学c语言程序设计课后习题答案 第四章_工学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档c语言程序设计课后习题答案 第四...
c语言(第四版)第四章作业_百度文库
c语言(第四版)第四章作业_理学_高等教育_教育专区。第四章8至12题的,小编亲自验证过 第四章作业 8. #include<stdio.h> int main() { int grade,x; ...
2014《C语言程序设计》专升本练习题_百度文库
72 专升本C 语言》练习题一 第 1 页 第 2 页 6 10 第 3 页 第 4 页 第 5 页 第 6 页 第 7 页 第 8 页 专升本C 语言》练习题二 第 9 ...
C语言程序设计教程第四章练习题解析(1)_百度文库
C语言程序设计教程第四章练习题解析(1)_IT认证_资格考试/认证_教育专区。单选题 1、关于 C 语言中的函数,下列描述正确的是() A.函数的定义可以嵌套,但函数的...
C语言第四章作业题2015版_百度文库
提示:平时作业当考试作,凡抄袭一经发现平时成绩为 0、不完成者平时成绩不给分 东华理工大学:C 语言第四章作业题 C 程序设计第四章 题号 姓名 分数 评卷人一...
C语言第四章习题带答案_百度文库
C语言第四章习题带答案-... 10页 免费C​语​言​第​四​章​习​题​带​答​案 暂无评价|0人阅读|0次下载|举报文档 计​算​机...
C语言程序设计 练习题参考答案 第四章_百度文库
C语言程序设计 练习题参考答案 第四章_韩语学习_外语学习_教育专区。C语言程序设计 练习题参考答案 第四章 C 语言程序设计练习题参考答案第四章 (1) 一维数组 ...
更多相关标签: