C语言程序设计第7章函数进阶和结构化编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
******************************************************* running sums, minimums, and maximums
******************************************************* Count Item Sum Minimum Maximum
break; case 2: printf("cylind:%.2lf\n",vol_cylind());
break; case 3: printf("cone:%.2lf\n",vol_cone());
break; } }
/* ball:v=4/3*PI*r*r*r */ double vol_ball() { double r; printf("Please input r:"); scanf("%lf",&r); return 4.0/3*PI*r*r*r; }
void main(void)
{ prn_banner();
prn_headings();
read_and_prn_data();
}
显示标题函数: void prn_banner(void) {printf("\n***************************************************"); printf("\n running sums, minimums, and maximums "); printf("\n***************************************************\n");} 显示各列上部的标题函数: void prn_headings(void) { printf("%5s%12s%12s ","Count","Item","Sum");
例:王小二自夸刀工不错,有人放一张大的煎饼在砧板上, 问他:“饼不许离开砧板,切100刀最多能分成多少 块?”
q(1)=1+1=2
q(2)=1+1+2=4
q(3)=1+1+2+3=7
q(4)=1+1+2+3+4=11切1刀 用归纳法不难得出:
切2刀
切3刀
切饼问题示意图
切4刀
q(n)= q(n-1)+n(通项公式)
/* cylind : v=PI*r*r*h */ double vol_cylind() { double r,h;
printf("Please input r&h:"); scanf("%lf%lf",&r,&h); return PI*r*r*h; } /* cone : v=PI*r*r*h/3.0 */ double vol_cone() { double r,h; printf("Please input r&h:"); scanf("%lf%lf",&r,&h); return PI*r*r*h/3.0; }
scanf("%d%d",&m,&n);
f*=i;
t=cmn(m,n);
return f;
printf("C(%d,%d)=%10.0f\n",m,n,t);
}
}
float cmn(int m,int n)
{ float res;
res=fac(m)/(fac(n)*fac(m-n));
return res;
break; } }while(fish[1]==1||fish[1]%5!=1); for(i=1;i<=5;i++) printf("%10d",fish[i]); printf("\n"); }
7.3.2 递推数列
如果一个数列从某一项起,它的任何一项都可以用它前 面的若干项来确定,这样的数列被称为递推数列,表 示某项与其前面的若干项的关系就称为递推公式。例 如Fibonacci数列如下:
7.1.3 结构化编码
经模块化设计后,每个模块都可以独立编码。编程时应 选用顺序、选择和循环3种控制结构,并使程序具有良 好的风格。
1.见名知义命名对象名 2.使用注释 3.使程序结构清晰 4.使程序具有良好的交互性
例: 读入一组整数存入一个整型数组中,要求显示出计数、当前 整数、当前数为止的所有整数之和、当前数为止的最小整数以及 当前数为止的最大整数。除此之外,假设必须要显示如下所示的 标题及标题下方分列显示的信息。
1,1,2,3,5,8,13,…,
令fib(n)表示Fibonacci数列的第n项,依据数列中项与 项之间的关系可写出如下Fibonacci数列的递推公式:
fib(n)=fib(n-1)+fib(n-2) n=3,4,… (通项公式)
fib(1)=fib(2)=1
(边界条件)
7.3.3 递推算法的程序实现
模块2.1 模块2.2
7.1.2 模块化设计
模块化设计时要遵循模块独立性的原则,即模块之间的 联系应该尽量简单。具体体现在:
1.一个模块只完成一个指定的功能 2.模块间只通过参数进行调用 3.一个模块只有一个入口和一个出口 4.模块内慎用全局变量
在C语言中,模块一般通过函数来实现,一个模块对应 一个函数。
a函数
b函数
调用a函数
调用b函 数
结束
a函数源自文库束
b函数结
束
函数嵌套调用结构示意图
例:求组合数。
#include<stdio.h>
void main()
float fac(int n)
{ int m,n;
{ int i;
float t;
float f=1;
printf("Input m&n:");
for(i=2;i<=n;i++)
#include<stdio.h> double fun(double); void main( ) { double eps=1e-10,sum;
sum=fun(eps); printf("\nPI=%.8lf",sum); } double fun(double eps) { double sum=0.5,t,t1,t2,t3; int odd=1,even=2; t=t1=t2=1.0; t3=0.5; while(t>1e-10) { t1=t1*(even-1)/even;
odd+=2 ; even+=2; t2=1.0/odd; t3=t3/4.0; t=t1*t2*t3; sum+=t; } return sum*6; }
例:A、B、C、D、E合伙夜间捕鱼,凌晨时都已 疲惫不堪,各自在河边的树丛中找地方睡着了。 目上三竿,A第一个醒来,他将鱼平分作5份, 把多余的一条扔回湖中,拿自己的一份回家去 了;B第二个醒来,也将鱼平分作5份,把多余 的一条扔回湖中,只拿自己的一份;接着C、 D、E依次醒来,也都按同样的办法分鱼。问5 人至少合伙捕到多少条鱼?每个人醒来后看到 的鱼数是多少条?
#include <stdio.h> void main() { int fish[6]={1,1,1,1,1,1}, i;
do { fish[5]=fish[5]+5;
for(i=4;i>0;i--) { if(fish[i+1]%5==1)
fish[i]=fish[i+1]*5/4+1; else
#include<stdio.h> #include<math.h> #define PI 3.141592654 void calculate(int); void main(void) { int sel;
/* 循环选择计算圆形体的体积,直到输入非1~3数字为止 */ while(1) { printf("\t\t%s","1--ball\n");
fish[1]=5人所捕的总鱼数 fish[2]=(fish[1]-1)*4/5 fish[3]=(fish[2]-1)*4/5 fish[4]=(fish[3]-1)*4/5 fish[5]=(fish[4]-1)*4/5 写成一般式为: fish[i]=(fish[i-1]-1)*4/5 i=2,3,…,5
printf("\t\t%s","2--cylind\n"); printf("\t\t%s","3--cone\n"); printf("\t\t%s","other--exit\n"); printf("\t\tPlease input your selete: "); scanf("%d",&sel); if(sel<1||sel>3)
预处理命令/函数原型声明/主函数:
#include <stdio.h>
#include <stdlib.h>
void prn_banner(void);
/* 函数声明 */
void prn_headings(void);
/* 函数声明 */
void read_and_prn_data(void); /* 函数声明 */
int fish[6]={1,1,1,1,1,1}, i
fish[5]=fish[5]+5 for(i=4; i>0; i--)
Y
fish[i+1]%5==1
N
fish[i]=fish[i+1]*5/4+1
break
当fish[1]==1||fish[1]%5!=1 输出计算结果fish[1]~fish[5]
{ printf("\n input error\nplease input 1~3\n"); break; } else
calculate(sel); } }
void calculate(int sel) { double vol_ball(void);
double vol_cylind(void); double vol_cone(void); switch(sel) { case 1: printf("ball:%.2lf\n",vol_ball());
q(0)=1 (边界条件,一刀不切只有一块)
#include<stdio.h> #include<conio.h> #define N 100 void main() { int i,q[101]; q[0]=1; for(i=1;i<=N;i++)
第7章 函数进阶和结构化编程
学习目标
1.掌握源程序结构中函数的组织方法;
2.理解结构化程序设计思想,并能利用它来解 决问题;
3. 理解函数嵌套调用的概念,并能熟练利用函 数的嵌套调用来解决问题;
4.理解递推、递归及其算法实现;
5.理解编译预处理的概念,能熟练应用宏定义 和文件包含;
6.了解用户自定义库模块。
{ sum+=a[i]; smallest=min(a[i],smallest); biggest=max(a[i],biggest); printf("%5d%12d%12d%12d%12d\n",i+1,a[i],sum,smallest,biggest);
} }
7.2 函数的嵌套调用
main函数
printf("%12s%12s\n\n","Minimum","Maximum"); } 初始化数据并按要求显示函数: void read_and_prn_data(void) { int i,sum,smallest,biggest;
int a[10]={1,2,6,7,0,-6,19,52,10,-10}; sum=0;smallest=biggest=a[0]; for(i=0;i<10;i++)
}
例: 设计一个用于计算常用圆形体体积的计算器,该计算 器可支持多次反复计算。采用菜单方式输入1或2或3,分 别表示需要计算球体、圆柱体和圆锥体的体积,计算时 需输入函数所需的相应参数。
main函数
calculate函数
vol_ball函数 vol_cylind函数 vol_cone函数 圆形体体积计算器函数调用结构
7.1 结构化编程
结构化程序设计(Structured Programming)是一种良 好的程序设计技术,它由著名计算机科学家E·W·Dijkst ra于1969年提出
7.1.1 自顶向下分析问题
自顶向下分析问题就是把一个较大的复杂问题分解成几 个小问题后再解决。
待解决的问题
模块1 模块2 模块3
7.3 递推
7.3.1 递推的一般概念 递推也称为迭代,思路是通过数学推导,将一个复杂的运算 化解为若干简单运算的重复执行。
例:通过公式:
… 1 1 1 1 3 1 3 1 1 5 1 3 5 1 1 7
6 22 3 2 24 5 2 246 7 2
计算的近似值,计算过程在所加项的值小于10-10时终止。
******************************************************* Count Item Sum Minimum Maximum
break; case 2: printf("cylind:%.2lf\n",vol_cylind());
break; case 3: printf("cone:%.2lf\n",vol_cone());
break; } }
/* ball:v=4/3*PI*r*r*r */ double vol_ball() { double r; printf("Please input r:"); scanf("%lf",&r); return 4.0/3*PI*r*r*r; }
void main(void)
{ prn_banner();
prn_headings();
read_and_prn_data();
}
显示标题函数: void prn_banner(void) {printf("\n***************************************************"); printf("\n running sums, minimums, and maximums "); printf("\n***************************************************\n");} 显示各列上部的标题函数: void prn_headings(void) { printf("%5s%12s%12s ","Count","Item","Sum");
例:王小二自夸刀工不错,有人放一张大的煎饼在砧板上, 问他:“饼不许离开砧板,切100刀最多能分成多少 块?”
q(1)=1+1=2
q(2)=1+1+2=4
q(3)=1+1+2+3=7
q(4)=1+1+2+3+4=11切1刀 用归纳法不难得出:
切2刀
切3刀
切饼问题示意图
切4刀
q(n)= q(n-1)+n(通项公式)
/* cylind : v=PI*r*r*h */ double vol_cylind() { double r,h;
printf("Please input r&h:"); scanf("%lf%lf",&r,&h); return PI*r*r*h; } /* cone : v=PI*r*r*h/3.0 */ double vol_cone() { double r,h; printf("Please input r&h:"); scanf("%lf%lf",&r,&h); return PI*r*r*h/3.0; }
scanf("%d%d",&m,&n);
f*=i;
t=cmn(m,n);
return f;
printf("C(%d,%d)=%10.0f\n",m,n,t);
}
}
float cmn(int m,int n)
{ float res;
res=fac(m)/(fac(n)*fac(m-n));
return res;
break; } }while(fish[1]==1||fish[1]%5!=1); for(i=1;i<=5;i++) printf("%10d",fish[i]); printf("\n"); }
7.3.2 递推数列
如果一个数列从某一项起,它的任何一项都可以用它前 面的若干项来确定,这样的数列被称为递推数列,表 示某项与其前面的若干项的关系就称为递推公式。例 如Fibonacci数列如下:
7.1.3 结构化编码
经模块化设计后,每个模块都可以独立编码。编程时应 选用顺序、选择和循环3种控制结构,并使程序具有良 好的风格。
1.见名知义命名对象名 2.使用注释 3.使程序结构清晰 4.使程序具有良好的交互性
例: 读入一组整数存入一个整型数组中,要求显示出计数、当前 整数、当前数为止的所有整数之和、当前数为止的最小整数以及 当前数为止的最大整数。除此之外,假设必须要显示如下所示的 标题及标题下方分列显示的信息。
1,1,2,3,5,8,13,…,
令fib(n)表示Fibonacci数列的第n项,依据数列中项与 项之间的关系可写出如下Fibonacci数列的递推公式:
fib(n)=fib(n-1)+fib(n-2) n=3,4,… (通项公式)
fib(1)=fib(2)=1
(边界条件)
7.3.3 递推算法的程序实现
模块2.1 模块2.2
7.1.2 模块化设计
模块化设计时要遵循模块独立性的原则,即模块之间的 联系应该尽量简单。具体体现在:
1.一个模块只完成一个指定的功能 2.模块间只通过参数进行调用 3.一个模块只有一个入口和一个出口 4.模块内慎用全局变量
在C语言中,模块一般通过函数来实现,一个模块对应 一个函数。
a函数
b函数
调用a函数
调用b函 数
结束
a函数源自文库束
b函数结
束
函数嵌套调用结构示意图
例:求组合数。
#include<stdio.h>
void main()
float fac(int n)
{ int m,n;
{ int i;
float t;
float f=1;
printf("Input m&n:");
for(i=2;i<=n;i++)
#include<stdio.h> double fun(double); void main( ) { double eps=1e-10,sum;
sum=fun(eps); printf("\nPI=%.8lf",sum); } double fun(double eps) { double sum=0.5,t,t1,t2,t3; int odd=1,even=2; t=t1=t2=1.0; t3=0.5; while(t>1e-10) { t1=t1*(even-1)/even;
odd+=2 ; even+=2; t2=1.0/odd; t3=t3/4.0; t=t1*t2*t3; sum+=t; } return sum*6; }
例:A、B、C、D、E合伙夜间捕鱼,凌晨时都已 疲惫不堪,各自在河边的树丛中找地方睡着了。 目上三竿,A第一个醒来,他将鱼平分作5份, 把多余的一条扔回湖中,拿自己的一份回家去 了;B第二个醒来,也将鱼平分作5份,把多余 的一条扔回湖中,只拿自己的一份;接着C、 D、E依次醒来,也都按同样的办法分鱼。问5 人至少合伙捕到多少条鱼?每个人醒来后看到 的鱼数是多少条?
#include <stdio.h> void main() { int fish[6]={1,1,1,1,1,1}, i;
do { fish[5]=fish[5]+5;
for(i=4;i>0;i--) { if(fish[i+1]%5==1)
fish[i]=fish[i+1]*5/4+1; else
#include<stdio.h> #include<math.h> #define PI 3.141592654 void calculate(int); void main(void) { int sel;
/* 循环选择计算圆形体的体积,直到输入非1~3数字为止 */ while(1) { printf("\t\t%s","1--ball\n");
fish[1]=5人所捕的总鱼数 fish[2]=(fish[1]-1)*4/5 fish[3]=(fish[2]-1)*4/5 fish[4]=(fish[3]-1)*4/5 fish[5]=(fish[4]-1)*4/5 写成一般式为: fish[i]=(fish[i-1]-1)*4/5 i=2,3,…,5
printf("\t\t%s","2--cylind\n"); printf("\t\t%s","3--cone\n"); printf("\t\t%s","other--exit\n"); printf("\t\tPlease input your selete: "); scanf("%d",&sel); if(sel<1||sel>3)
预处理命令/函数原型声明/主函数:
#include <stdio.h>
#include <stdlib.h>
void prn_banner(void);
/* 函数声明 */
void prn_headings(void);
/* 函数声明 */
void read_and_prn_data(void); /* 函数声明 */
int fish[6]={1,1,1,1,1,1}, i
fish[5]=fish[5]+5 for(i=4; i>0; i--)
Y
fish[i+1]%5==1
N
fish[i]=fish[i+1]*5/4+1
break
当fish[1]==1||fish[1]%5!=1 输出计算结果fish[1]~fish[5]
{ printf("\n input error\nplease input 1~3\n"); break; } else
calculate(sel); } }
void calculate(int sel) { double vol_ball(void);
double vol_cylind(void); double vol_cone(void); switch(sel) { case 1: printf("ball:%.2lf\n",vol_ball());
q(0)=1 (边界条件,一刀不切只有一块)
#include<stdio.h> #include<conio.h> #define N 100 void main() { int i,q[101]; q[0]=1; for(i=1;i<=N;i++)
第7章 函数进阶和结构化编程
学习目标
1.掌握源程序结构中函数的组织方法;
2.理解结构化程序设计思想,并能利用它来解 决问题;
3. 理解函数嵌套调用的概念,并能熟练利用函 数的嵌套调用来解决问题;
4.理解递推、递归及其算法实现;
5.理解编译预处理的概念,能熟练应用宏定义 和文件包含;
6.了解用户自定义库模块。
{ sum+=a[i]; smallest=min(a[i],smallest); biggest=max(a[i],biggest); printf("%5d%12d%12d%12d%12d\n",i+1,a[i],sum,smallest,biggest);
} }
7.2 函数的嵌套调用
main函数
printf("%12s%12s\n\n","Minimum","Maximum"); } 初始化数据并按要求显示函数: void read_and_prn_data(void) { int i,sum,smallest,biggest;
int a[10]={1,2,6,7,0,-6,19,52,10,-10}; sum=0;smallest=biggest=a[0]; for(i=0;i<10;i++)
}
例: 设计一个用于计算常用圆形体体积的计算器,该计算 器可支持多次反复计算。采用菜单方式输入1或2或3,分 别表示需要计算球体、圆柱体和圆锥体的体积,计算时 需输入函数所需的相应参数。
main函数
calculate函数
vol_ball函数 vol_cylind函数 vol_cone函数 圆形体体积计算器函数调用结构
7.1 结构化编程
结构化程序设计(Structured Programming)是一种良 好的程序设计技术,它由著名计算机科学家E·W·Dijkst ra于1969年提出
7.1.1 自顶向下分析问题
自顶向下分析问题就是把一个较大的复杂问题分解成几 个小问题后再解决。
待解决的问题
模块1 模块2 模块3
7.3 递推
7.3.1 递推的一般概念 递推也称为迭代,思路是通过数学推导,将一个复杂的运算 化解为若干简单运算的重复执行。
例:通过公式:
… 1 1 1 1 3 1 3 1 1 5 1 3 5 1 1 7
6 22 3 2 24 5 2 246 7 2
计算的近似值,计算过程在所加项的值小于10-10时终止。