浙江大学C颜晖原版课件C6函数

上传人:sha****en 文档编号:23468574 上传时间:2021-06-09 格式:PPT 页数:48 大小:173KB
返回 下载 相关 举报
浙江大学C颜晖原版课件C6函数_第1页
第1页 / 共48页
浙江大学C颜晖原版课件C6函数_第2页
第2页 / 共48页
浙江大学C颜晖原版课件C6函数_第3页
第3页 / 共48页
点击查看更多>>
资源描述
第 六 章 函 数n 函 数 的 基 本 使 用n 函 数 的 嵌 套 调 用n 函 数 的 递 归 调 用 n 变 量 存 储 特 征n 宏 函 数 的 概 念 k!n!+m! f=1;for(i=1; i=n; i+) f=f*i;scanf(%d%d%d, fk=1;for(i=1; i=k; i+) fk = fk*i;fm=1;for(i=1; i=m; i+) fm = fm*i;fn=1;for(i=1; i=n; i+) fn = fn*i; printf(%fn, fm/(fn+fk); 反 复 使 用 的 代 码 段 # include void main() int k, m, n; float fk, fm, fn; scanf(%d%d%d, fk=1; for(i=1; i=k; i+) fk = fk*i; fm=1; for(i=1; i=m; i+) fm = fm*i; fn=1; for(i=1; i=n; i+) fn = fn*i; printf(%fn, fm/(fn+fk); # include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(%d%d%d, fm = fact(m); fn = fact(n); fk = fact(k); printf(%fn, fm/(fn+fk);float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; # include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(%d%d%d, fm = fact(m); fn = fact(n); fk = fact(k); printf(%fn, fm/(fn+fk);float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; mainscanf printffact库 函 数 自 定 义 函 数 库 函 数main 主 调 函数fact 被 调 用 函数调 用定 义 函 数 的 概 念n 库 函 数 scanf() printf() sqrt()n 功 能 独 立 , 反 复 使 用 的 代 码 段 计 算 阶 乘 fact() n 模 块 化 编 程 学 生 成 绩 档 案 管 理 软 件 成 绩 输 入 成 绩 修 改 成 绩 统 计 成 绩 打 印 # include void main() int in; printf(1. INPUT 2.EDIT 3. PROCESS 4.PRINT 5.EXITn); while(1) printf(please input 1-5:); scanf(%d, if (in=5) break; switch(in) case 1: input( ); break; case 2: edit( ); break; case 3: process( ); break; case 4: print( ); break; void input( ) /* .成 绩 输 入 */ .void edit( ) /* 成 绩 修 改 */ . 4个 函 数 的 定 义void process( ) /* 成 绩 统 计 */ . void print( ) /* 成 绩 打 印 */ . 函 数 的 定 义 和 调 用void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); 调 用 定 义float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; 函 数 的 定 义 和 调 用返 回 值 类 型 函 数 名 (形 式 参 数 表 ) void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; 调 用定 义 函 数 名 (实 际 参 数 表 )参 数 传 递 返 回 值 类 型 函 数 名 (形 式 参 数 表 ) void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i 形 参函 数 的 参 数 函 数 名 (实 际 参 数 表 ) main() output( ); void output( ) printf(”*n”); printf(”* very good *n”); printf(”*n”); main( ) int x,y,z; scanf(“%d%d”, z=max(x, y); printf(“%d”,z);int max (int a , int b ) int c ; c=ab ? a : b ; return( c ) ;问 题 :实 参 可 以 是 表 达式 吗 ?如 果 实 参 和 形 参的 类 型 不 一 样 ? 返 回 值 类 型 函 数 名 (形 式 参 数 表 ) void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; ib ? a : b ; return( c ) ;int 问 题 :如 果 返 回 值 的 类型 与 return (exp) 中 的 exp不一 致 ? 实 参 实 参 与 形 参 参 数 传 递void main() int x, y, z; scanf(“%d%d”, z=max( x, y ); printf(“%d”,z) int max(int a , int b ) int c; c=ab ? a : b; return c;常 量变 量表 达 式 形 参 : 变 量 实 参 与 形 参 参 数 传 递 int max(int a , int b ) int c; c=ab ? a : b; return c;void main() int x, y, z; scanf(“%d%d”, z=max( x, y ); printf(“%d”,z) x 3y 5z abc 5355 1、 实 参 与 形 参 : 个 数 相 同 、 类 型 一 致 、 按 顺 序 传 递 2、 实 参 - 形 参 , 值 传 递 单 向 形 参 值 的 变 化 不 会 影 响 实 参 的 值 实 参 和 形 参 可 以 同 名实 参 与 形 参 参 数 传 递void main() int x, y, z; scanf(“%d%d”, z=max( x, y ); printf(“%d”,z) int max(int a , int b ) int c; c=ab ? a : b; return c; void main( ) int x, y; scanf(%d%d, swap(x, y); printf(%d%d, x, y);阅 读 程 序void swap(int x, int y) int t; t = x; x = y; y = t; 输 入 3 5 函 数 的 说 明void swap(int a, int b) int t; t = a; a = b; b = t;void main( ) int x, y; scanf(%d%d, swap(x, y); printf(%d%d, x, y); void main( ) int x, y; scanf(%d%d, swap(x, y); printf(%d%d, x, y);void swap(int a, int b) int t; t = a; a = b; b = t; void swap(int a, int b); 函 数 在 被 调 用 前 必 须 先 定 义 或 说 明 ! 函 数 调 用 小 结函 数 调 用 时 , 实 参 计 算 值 , 复 制 给 相 应 位 置 的 形 参 ;函 数 执 行 完 后 , 通 过 return (exp), 可 返 回 结 果 。调 用 其 他 函 数 ,必 须 先 说 明 !有 多 个 实 参 时 后 面 的 先 计 算 形 参 的 改 变不 影 响 实 参 数 量 、 类 型 、 顺 序一 致 一 个 结 果 分 析 函 数 调 用 过 程# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(%d%d%d, fm = fact(m); fn = fact(n); fk = fact(k); printf(%fn, fm/(fn+fk);float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; 例 T6-1 1!+2!+n!算 法 :k =1 to n s=s+f f=k! k+s=0;for(k=1;k=n;k+) f=fact(k); s=s+f; float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return(f); 例 T6-2 x+x2+xn算 法 :k =1 to n s=s+f f= xk k+s=0;for(k=1;k=n;k+) f=mypow(x,k); s=s+f; float mypow(float x, int n) int i; float f=1; for(i=1; i=n; i+) f = f*x; return(f); 例 T6-3 编 写 函 数 比 较 2个 变 量 是 否 相 等equal(x, y)当 x=y, 返 回 1 否 则 , 返 回 0 int equal(int x, int y) if(x=y) return 1; else return 0;void main( ) int x, y; scanf(%d%d, if(equal(x,y) printf(x=y); else printf(x! =y); int equal(int x, int y) return(x=y); 例 T6-4 输 出 100200间 所 有 素 数算 法 :m =100 to 200 if m是 素 数 print m int prime(int m) int i, n=sqrt(m); for(i=2; in) return 1; else return 0;for(m=100; m=200; m+) if(prime(m) printf(%d,m) prime(m)if m是 素 数 ,返 回 1 否 则 , 返 回 0 函 数 的 顺 序 调 用 和 嵌 套 调 用n 顺 序 调 用void main( ) f1( ); f2( ); f1() f2() mainf1 f2main f1f2 函 数 的 顺 序 调 用 和 嵌 套 调 用n 嵌 套 调 用void main( ) f1( ); f1() f2( ); f2() mainf1 f2mainf1f2 例 求 三 角 形 面 积 area=s(s-a)(s-b)(s-c)s=(a+b+c)/2 mainareasmainarea s# include # include void main() float a, b, c; float area(float a, float b, float c); float s(float a, float b, float c); scanf(%f%f%f, printf(%fn, area(a, b, c);float area(float a, float b, float c) float ss; ss=s(a,b,c); return sqrt(ss*(ss-a)*(ss-b)*(ss-c); float s(float a, float b, float c) return (a+b+c)/2; 递 归 式递 归 出 口函 数 的 递 归 调 用 (递 归 函 数 )求 n!递 归 定 义 n! = n * (n-1)! (n 1) n! = 1 (n = 0,1)void main() float fact(int n); printf(%fn, fact(5); float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; fact(n)=n*fact(n-1); 递 归 函 数 求 n! 的 实 现 过 程 fact(3) 3*fact(2) 2*fact(1) 126 float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; 函 数 的 递 归 调 用 (递 归 函 数 )n 用 递 归 实 现 的 问 题 , 满 足 两 个 条 件 : 问 题 可 以 逐 步 简 化 成 自 身 较 简 单 的 形 式 (递 归 式 )n! = n * (n-1)! n n-1i = n + i i=1 i=1 递 归 最 终 能 结 束 (递 归 出 口 )两个条件缺一不可解决递归问题的两个着眼点 变 量 作 用 范 围 (作 用 域 ) 在 函 数 内 定 义 的 变 量 ( 包 括 形 参 ) 。局 部 变 量 作 用 范 围 : 本 函 数 内 部 。 定 义 在 复 合 语 句 内 的 变 量 。 作 用 范 围 : 复 合 语 句 内 部 。全 局 变 量 : 在 函 数 以 外 定 义 的 变 量 , 不 从 属 于任 一 函 数 。作 用 范 围 : 从 定 义 处 到 源 文 件 结 束 ( 包 括 各 函 数 ) 变 量 作 用 范 围 示 例n 区 分 局 部 变 量 和 全 局 变 量int x=1;void main( ) int a=2; . int b=3; . f( ); .int t=4 ;void f( ) int x=5, b=6; .int a=7; x=? a=? b=?b=? x=? b=? t=? a=? x=1 a=2 b=3没 定 义 5 b=6 t=4 a没 定 义 若 局 部 变 量 与全 局 变 量 同 名 ,局 部 变 量 优 先 变 量 作 用 范 围 示 例int x=1;int f(int x) return(x+); main( ) int y; y=f(2) ; x=f(x) ; printf(“%d%d”, y, x); x=1 变 量 作 用 范 围n 如 果 局 部 变 量 与 全 局 变 量 同 名 ,局 部 变 量 优 先 。n 不 要 滥 用 全 局 变 量 。 副 作 用 int x=1;void f1() x+;void f2() x=5;void main( ) x=10; f1(); printf(%d , x); f2(); printf(%d , x);11 5 变 量 存 储 形 式 和 生 存 期1、 动 态 存 储自 动 变 量 (auto): 普 通 的 局 部 变 量int x, y; auto int x, y;char c1; auto char c1; 函 数 调 用 时 , 才 定 义 变 量 , 分 配 存 储 单 元 ; 函 数 调 用 结 束 , 收 回 存 储 单 元 。即 使 对 同 一 函 数 的 几 次 调 用 , 分 配 的 存 储 单 元 也 不 同 。 fact(3) 3*fact(2) 2*fact(1) 126 float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; n=3n=2n=1 变 量 存 储 形 式2、 静 态 存 储在 静 态 存 储 区 分 配 单 元执 行 程 序 时 定 义 变 量 , 分 配 单 元 , 运 行 结 束 时 收 回 。 全 局 变 量 静 态 局 部 变 量 静 态 全 局 变 量 int k;main() int i; k=2; for(i=4; i0; i-) fun();fun() int j=2; printf(j=%d, k=%dn, j, k); k=k*k; j=j*j; 示 例j=2, k=2j=2, k=4j=2, k=16j=2, k=256作 用 域 生 存 期 int gobal=1;void fun();void main() int i; for(i=0; i3; i+) fun();void fun() int local=1; static int static_local=1; printf(gobal=%d, local=%d, static_local=%dn,gobal, local, static_local); gobal+; local+; static_local+; 静 态 局 部 变 量gobal=1, local=1, static_local=1 gobal=2, local=1, static_local=2 gobal=3, local=1, static_local=3 作 用 域 生 存 期 int gobal=1;void fun();void main() int i; for(i=0; i3; i+) fun();void fun() int local=1; static int static_local=1; printf(gobal=%d, local=%d, static_local=%dn,gobal, local, static_local); gobal+; local+; static_local+; 变 量 的 初 始 化作 用 域 生 存 期int local;local=1; static int static_local;static_local=1; 等 价 吗 ?静 态 变 量 初 值 为 0 变 量 存 储 形 式3、 外 部 变 量extern int x; 4、 寄 存 器 变 量register int k;某 些 系 统 对 寄 存 器 变 量 的 使 用 会 比 普 通 变 量 运 行速 度 快 , 但 中 寄 存 器 变 量 与 auto变 量 等 价 。 程 序 模 块 结 构文 件 模 块 的 连 接 #include F1.cvoid main() int n; long t; scanf(%d, t = fact(n); printf(%ldn, t); 文 件 名 F1.c long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i;return res; 文 件 名 F2.c long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i;return res; void main() int n; long t; scanf(%d, t = fact(n); printf(%ldn, t); 文 件 名 F1.c 程 序 模 块 结 构一 、 文 件 包 含 可 以 实 现 一 个 文 件 把 另 一 个 文 件 的 全 部 内 容 包 含 进 来 。 格 式 : # include 文 件 名 说 明 :1、 #include 不 是 语 句 , 无 需 分 号 。2、 如 果 要 连 接 多 个 文 件 , 可 用 多 个 include包 含 , 顺 序 按 调 用 关系 , 被 调 的 应 在 调 用 的 前 面 。 允 许 多 层 调 用 。3、 . 文 件 与 . 性 质 相 同 , 都 是 程 序 文 件 , . 文 件 突 出了 头 文 件 (head)的 性 质 。4、 include有 两 种 写 法 : #include ”file1.c #include 只 在 tcinclude 文 件 夹 下 找 适 用 于 系 统 头 文 件 除 此 之 外 , 还 到 程 序 所 在 文 件 夹 下 查 找 适 用 于 自 定 义 头 文 件 二 、 使 用 工 程 文 件extern long fact(int k);void main() int n; long t; scanf(%d, t = fact(n); printf(%ldn, t); 文 件 名 file1.c long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i; return res; 文 件 名 F2.c 外 部 变 量两 个 文 件 分 别 独 立 编 译 , 进 行 连 接 时 会 自 动 连 接 file1.obj和 file2.obj, 形 成 一 个 完 整 的 可 执 行 文 件 。int x;extern int f1(); void main() f1( ); 文 件 名 file1.c extern x;/*使 用 file1.c中 的 全局 变 量 x */f1( ) 文 件 名 file2.c扩 大 全 局 变 量的 作 用 域调 用 另 一 模 块中 的 函 数 静 态 全 局 变 量静 态 全 局 变 量 ( 或 函 数 ) 将 只 限 制 在 一 个 文 件 中 使用 , 可 以 避 免 不 同 人 编 写 程 序 时 的 相 互 干 扰 。static int x;extern int f1(); void main() f1( ); 文 件 名 file1.c extern x;/*使 用 file1.c中 的 全局 变 量 x */static int f1( ) 文 件 名 file2.c无 法 引 用无 法 调 用 限 制 全 局 变 量 的 作 用 域 变 量 存 储 类 别 小 结 存 储 类 别 函 数 内 函 数 外 初 值作 用 域 生 存 期 作 用 域 生 存 期局 部变 量 auto / register 随 机静 态 局 部 变 量 0 全 局变 量 静 态 全 局 变 量 本 文 件 0全 局 变 量 0 宏 定 义# define 宏 名 标 识 符 宏 定 义 字 符 串编译时,把程序中所有与宏名相同的字符串,用宏定义字符串替代。 # define PI 3.14 # define arr_size 4 带 参 数 的 宏 定 义例 : 用 宏 实 现 两 个 变 量 值 的 交 换 # define f(a,b,t) t=a; a=b; b=t;void main( ) int x,y,t ; scanf(“%d%d” , f(x,y,t) printf(“%d %dn”, x, y) ; t=x; x=y; y=t;编 译 时 被 替 换注 意 :(1) 带 参 数 的 宏 定 义 不 是 函 数 , 宏 与 函 数 是 两 种 不 同 的 概 念 。 (2) 宏 可 以 实 现 简 单 的 函 数 功 能
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!