c语言基础 ppt第6新章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

20/51
函数的递归调用 例4 求n!
问题分析:计算n!的公式可写成如下形式
1 n 0,1 n! n *(n 1)! n 1
显然,这是一个递归形式的公式,在描述“阶乘”算法 时又用到了“阶乘”的概念。
递归结束的条件是n = 0或1。
21/51
函数的递归调用 例4 求n!

for j=0 to 6 输出结果
结 束
10/51
#include <stdio.h> #define N 7 void main() { int nCardArray[N]={13,8,6,1,2,3,4}; int t,i,j; for(i=0;i<N-1;i++) for(j=0;j<N-1-i;j++) if(nCardArray[j]>nCardArray[j+1]) { t=nCardArray[j]; nCardArray[j]=nCardArray[j+1]; nCardArray[j+1]=t; } for(i=0;i<N;i++) printf("%d ", nCardArray[i]); printf("\n"); 11/51 }
开 始 开 始 开 始
输入累加数 和指数
设定循环控制变量、初始 化、接收传入累加数和指数
设定循环控制变量、初始 化、接收传入底数和指数
调用Add(累加 数,指数)
for i=0 to 累加数
for i=0 to 指数
lSum+=Power (i, 指数) 输出结果
lPowerVal=lPowerVal*底数值
4/51
深入模块化设计与应用
兔子繁殖问题(Fibonacci’s Rabbits)
程序2
#include <stdio.h> void main() { int i,a=1,b=1,c=0; printf("%5d%5d",a,b); /* 输出1,2月份兔子的数量 */ for(i=0;i<=3;i++) { c=a+b; /* 计算当月兔子的数量 */ a=b+c; /* 计算n+1个月的兔子的数量 */ b=c+a; /* 计算n+2个月的兔子的数量 */ printf("%5d%5d%5d",c,a,b);/* 输出当月兔子的数量 */ } printf("\n"); 5/51 }
for j=0 to 6 输出结果
14/51
结 束
#include <stdio.h> #define N 7 void main() { int nCardArray[N]={13,8,6,1,2,3,4}; int t,i,j,43;+) { k=i; for(j=i;j<N;j++) if(nCardArray[k]>nCardArray[j]) k=j; if(k!=i) { t=nCardArray[k]; nCardArray[k]=nCardArray[i]; nCardArray[i]=t; } } for(i=0;i<N;i++) printf("%d ", nCardArray[i]); printf("\n"); }
1
2
3
4
6
8
13
12/51
深入模块化设计与应用
排序算法 接下来问题就是如何从含n个数的数列中找出最 小数。 方法:拿数列中第一个元素和第二个元素比较, 符合条件(前一个大于后一个)就记住较小元素的位 置,然后拿此位置上的元素和第三个元素比较,符合 条件(前一个大于后一个)就记住较小元素的位置, 然后拿此位置上的元素和第四个元素比较,…,当整 个数列元素都比较完成后,可以找到当前数列中的最 小元素的位置,最后将此元素和第一个元素互换。这 个过程也可以用循环实现。 用这种方法完成的排序称之为“选择排序”。 13/51
1
2
3
4
6
8
13
8/51
说明:这个过程可以用循环结构实现,需要循环6次: for(i=0;i<6;i++) 或 for(i=1;i<7;i++)
深入模块化设计与应用 排序算法
例2 问题描述:从纸牌同一花色的13张牌中任取7张,顺序为: 13,8,6,1,2,3,4,请按照从小到大进行排序。
问题分析(续):接下来问题就是如何找出最大数。 方法:将数列中相邻的两个元素依次进行比较,将 符合条件(前一个大于后一个)的进行互换,当整 个数列元素都比较完成后,可以找到当前数列中的 最大值。(且最大数位于数列最后一位) 这个过程也 可以用循环实现。 用这种方法完成的排序称之为“冒泡排序”。
2/51
深入模块化设计与应用 例1 问题描述:一对兔子从出生后第三个月开始,每 月生一对小兔子。小兔子到第三个月又开始生下一 代小兔子。假若兔子只生不死,一月份抱来一对刚 出生的小兔子,问一年中每个月各有多少只兔子。
f(n)=f(n-1)+f(n-2) n≥3 f(1)=f(2)=1
3/51
深入模块化设计与应用
}
19/51
深入模块化设计与应用
函数的嵌套调用
long Add(int n,int k) { long lSum=0; int i; for(i=1;i<=n;i++) lSum += Power(i, k); return lSum; }
long Power (int n,int k) { long lPowerVal=n; int i; for(i=1;i<k;i++) lPowerVal *= n; return lPowerVal; }
深入模块化设计与应用
排序算法 例2 问题描述:从纸牌同一花色的13张牌中任取7张,顺序为: 13,8,6,1,2,3,4,请按照从小到大进行排序。 问题分析:这个问题可以分成以下几步: 1、从这13,8,6,1,2,3,4七个数中找出最小数(1),放在 第一位; 2、从余下的13,8,6,2,3,4六个数中找出最小数(2),放在 第二位; 3、从余下的13,8,6,3,4五个数中找出最小数(3),放在第 三位; 4、从余下的13,8,6,4四个数中找出最小数(4),放在第四位; 5、从余下的13,8,6三个数中找出最小数(6),放在第五位; 6、从余下的13,8两个数中找出最小数(8),放在第六位。
9/51
开 始
冒泡排序
声明存储数列变量nCardArray[] 声明外层循环控制变量i 声明内层循环控制变量j 声明临时变量temp
for i=0 to 5
for j=0 to 5-i
nCarrdArray[j]>nCrrdArray[j +1] 真 nCarrdArray[j]与nCrrdArray[j+1]值互换
C语言程序设计
第6章 深入模块化设计与应用
•算法 •排序算法 •嵌套调用 •递归调用 •指针作为函数参数 •数组名作为函数参数
1/51
深入模块化设计与应用
算法
程序=数据结构+算法 就计算机科学来说,算法就是计算机解决问 题的过程。
算法的基本性质:有穷性、确定性、可行性、 可输入、可输出。
算法设计的基本质量要求:正确性、健壮性、 可读性、高效率与低存储量的需求。
兔子繁殖问题(Fibonacci’s Rabbits) 程序1 说明: a)需要循环10次
b)需要3个“空间”: #include <stdio.h> a,b,c void main() { int i,a=1,b=1,c=0; printf("%5d%5d",a,b); /* 输出1,2月份兔子的数量 */ for(i=0;i<10;i++) { c=a+b; /* 计算当月兔子的数量 */ printf("%5d",c); /* 输出当月兔子的数量 */ a=b; b=c; /* 找到下月的前两月的兔子的数量 b、c */ } printf("\n"); } 1 1 2 3 5 8 13 21 34 55 89 144
6/51
深入模块化设计与应用 当设计一个算法或编写一个程序去解决一个问 题时,希望它需要的时间和空间尽可能少。但往 往这两个目标互相矛盾。
同时追逐这两个目标的过程,也是一个艰辛的 过程。需要经验,也需要努力。 大家可以试一试用自己的方法解决“兔子繁殖 问题”,比较一下,是不是比上面三种方法更好 ?
开 始
选择排序
声明存储数列变量nCardArray[] 声明外层循环控制变量i 声明内层循环控制变量j 声明临时下标变量k
for i=0 to 5
k=i
for j=i to 6
nCarrdArray[k]>nCrrdArray[j ] 是 k=j

k<>i 真

nCarrdArray[j]与nCrrdArray[j+1]值互换
#include <stdio.h> #include <stdlib.h> long fac (int n)/*计算n!*/ { long f; 递归出口 if(n<0) printf("n<0,data error!"); else if(n==0||n==1) f=1; else f=fac(n-1)*n; return (f); 递归式 } void main(void) { int n=0,k=0; long s; printf("input number:"); scanf("%d",&n); s=fac(n); printf("n!=%d\n",s); }
22/51
void main(void) { int n=0,k=0; long s; printf("input number:"); scanf("%d",&n); s=fac(n); printf("n!=%d\n",s); }
15/51
深入模块化设计与应用
函数的嵌套调用 函数的嵌套调用,也是化整为零,逐步求精的 设计思想的一种体现。简单的说,就是在调用一个 函数的过程中又调用了另一个函数,其一般形式下 图所示。
16/51
深入模块化设计与应用
函数的嵌套调用
函数的嵌套调用的执行过程:
17/51
深入模块化设计与应用
函数的嵌套调用 例3 计算s=1k+2k+3k+……+Nk。
说明:a)需要循环4次 b)需要3个“空间”:a,b,c c)和程序1相比,循环次数有 所减少,但所需空间未变
深入模块化设计与应用
兔子繁殖问题(Fibonacci’s Rabbits) 程序3 说明:a)需要循环5次
#include <stdio.h> b)需要2个“空间”:a,b void main() c)和程序2相比,循环次数增 { 加一次,但所需空间减少一个 int i,a=1,b=1; printf("%5d%5d",a,b); /* 输出1,2月份兔子的数量 */ for(i=0;i<=4;i++) { a=a+b; /* 计算第n月兔子的数量 */ b=a+b; /* 计算第n+1个月的兔子的数量 */ printf("%5d%5d",a,b); /* 输出两个月兔子的数量 */ } printf("\n"); }
7/51
深入模块化设计与应用 排序算法
例2 问题描述:从纸牌同一花色的13张牌中任取7张,顺序为: 13,8,6,1,2,3,4,请按照从小到大进行排序。
问题分析:这个问题可以分成以下几步: 1、从这13,8,6,1,2,3,4七个数中找出最大数(13),放在最后; 2、从余下的8,6,1,2,3,4六个数中找出最大数(8),放在倒数第 二位; 3、从余下的6,1,2,3,4五个数中找出最大数(6),放在倒数第三 位; 4、从余下的1,2,3,4四个数中找出最大数(4),放在倒数第四位; 5、从余下的1,2,3三个数中找出最大数(3),放在倒数第五位; 6、从余下的1,2两个数中找出最大数(2),放在倒数第六位。
结束 主函数流程图
返回结果 Add函数流程图
返回结果 Power函数流程图 18/51
深入模块化设计与应用
函数的嵌套调用
#include <stdio.h> void main() { int n=0,k=0;
printf("Input add to number:"); scanf("%d",&n); printf("Input number of power:"); scanf("%d",&k); printf("Sum of %d powers of integers from 1 to %d = ",k,n); printf("%ld\n",Add(n,k));
相关文档
最新文档