版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数主讲:沈涵飞C语言程序设计函数的定义与调用分段函数为什么要用函数如果程序的功能比较多,规模比较大,把所有代码都写在main函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼采用“组装”的办法简化程序设计的过程事先编好一批实现各种不同功能的函数,把它们保存在函数库中,需要时直接用函数就是功能,每一个函数用来实现一个特定的功能,函数的名字应反映其代表的功能结构化程序设计StructuredProgramming程序的结构mainabcfghdeie简单分段函数的求值分段函数如下:x(x<1)y=2x-1(1<=x<10)3x-11(x>=10)输入:x
(整数),输出:
y示例输入:4示例输出:7#include<stdio.h>intmain(){intx,y;scanf("%d",&x);if(x<1)y=x;if(1<=x<10)y=2*x-1;if(x>=10)y=3*x-11;printf("%d\n",y);
return0;}函数的基本结构#include<stdio.h>intmain(){intx,y;scanf("%d",&x);if(x<1)y=x;elseif(x<10)y=2*x-1;
elsey=3*x-11;printf("%d",y);return0;}intf(intx){inty;if(x<1)y=x;elseif(x<10)y=2*x-1;
elsey=3*x-11;
returny;}返回类型函数名称(参数列表){
函数体}函数可以简化逻辑判断intf(intx){if(x<1)returnx;if(x<10)return2*x-1;return3*x-11;}intf(intx){inty;if(x<1)y=x;elseif(x<10)y=2*x-1;
elsey=3*x-11;
returny;}优先使用库函数根据函数的基本结构编写自定义函数输入通过参数列表输出通过return函数定义中的参数:形式参数函数调用中的参数:实际参数函数能简化逻辑判断,但也要考虑可读性小结
函数的定义和调用
#include<stdio.h>
intf(intx){if(x<1)returnx;if(x<10)return2*x-1;return3*x-11;}intmain(){intn;scanf("%d",&n);printf("%d\n",f(n));return0;}函数主讲:沈涵飞C语言程序设计数组作为函数参数寻找数组中的最大值寻找一组数的最大值#include<stdio.h>#defineN6intmain(){inta[N]={1,4,6,9,2,3};intmax=0,i;for(i=1;i<N;i++)if(a[i]>a[max])max=i;printf("%d\n",a[max]);return0;}#include<stdio.h>#defineN6intfind_max(inta[],intn){inti,max=0;for(i=1;i<n;i++)if(a[i]>a[max])max=i;returnmax;}intmain(){inta[N]={1,4,6,9,2,3};intmax=find_max(a,N);printf("%d\n",a[max]);return0;}数组名数组长度函数f的空间值传递#include<stdio.h>
intf(intx){inty;if(x<1)y=x;elseif(x<10)y=2*x-1;elsey=3*x-11;returny;}intmain(){intn;scanf("%d",&n);printf("%d\n",f(n));return0;}申请x和y的空间计算返回y的值y函数main的空间xn匿名形式参数实际参数存放f(n)地址传递#include<stdio.h>#defineN6intfind_max(inta[],intn){inti,max=0;for(i=1;i<n;i++)if(a[i]>a[max])max=i;returnmax;}intmain(){inta[N]={1,4,6,9,2,3};intmax=find_max(a,N);printf("%d\n",a[max]);return0;}函数main的空间
find_max的空间146923max6nmaxa[]ifind_max直接使用main函数内的a数组空间冒泡排序#include<stdio.h>voidbubble_sort(intv[],intn){inti,j,t;for(i=0;i<n-1;i++)for(j=0;j<n-1-i;j++)if(v[j]>v[j+1]){t=v[j];v[j]=v[j+1];v[j+1]=t;}}intmain(){inti,v[6]={1,4,6,9,2,3};
bubble_sort(v,6);for(i=0;i<6;i++)printf("%d",v[i]);printf("\n");return0;}函数main的空间bubble_sort的空间1469236nv[]函数bubble_sort直接使用main函数内的v
数组空间123
4
69无须返回const的类型修饰符#include<stdio.h>#defineN6intfind_max(constinta[],intn){inti,max=0;for(i=1;i<n;i++)if(a[i]>a[max])max=i;returnmax;}intmain(){inta[N]={1,4,6,9,2,3};intmax=find_max(a,N);printf("%d\n",a[max]);return0;}函数main的空间find_max的空间146923max6nmaxa[]i
find_max可读不可写数组a形式参数和实际参数值传递和地址传递const修饰数组:可读不可写小结
数组作为函数参数
#include<stdio.h>#defineN6intfind_max(inta[],intn){inti,max=0;for(i=1;i<n;i++)if(a[i]>a[max])max=i;returnmax;}intmain(){inta[N]={1,4,6,9,2,3};intmax=find_max(a,N);printf("%d\n",a[max]);return0;}形式参数实际参数函数主讲:沈涵飞C语言程序设计递归初步:计算年龄函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。intage(intn){if(n==1)return10;returnage(n-1)+2;}
例题:有5个学生坐在一起问第5个学生多少岁?他说比第4个学生大2岁问第4个学生岁数,他说比第3个学生大2岁问第3个学生,又说比第2个学生大2岁问第2个学生,说比第1个学生大2岁最后问第1个学生,他说是10岁请问第5个学生多大?学生的年龄递推的程序
有5个学生坐在一起问第5个学生多少岁?他说比第4个学生大2岁问第4个学生岁数,他说比第3个学生大2岁问第3个学生,又说比第2个学生大2岁问第2个学生,说比第1个学生大2岁最后问第1个学生,他说是10岁请问第5个学生多大?#include<stdio.h>intmain(){inti,age[10];age[1]=10;for(i=2;i<=5;i++)age[i]=age[i-1]+2;printf("NO.5,age:%d\n",age[5]);return0;}递推:根据已有结果计算新值函数的递归调用解题思路age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10intage(intn);age(n)表示第n个学生的年龄age(n)=10n=1age(n)=age(n-1)+2
n>1函数的定义极其重要
age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回溯阶段递推阶段结束递归的条件递归的背后是堆栈Stack递归简化了问题的处理(汉诺塔问题)递归需要有终止条件递归背后的数据结构是堆栈Stack递归可能会存在效率问题尽可能用递推,不用递归!小结
递归:计算年龄
#include<stdio.h>intage(intn){if(n==1)return10;returnage(n-1)+2;}
intmain(){printf("NO.5,age:%d\n",age(5));return0;}调用函数自身函数主讲:沈涵飞C语言程序设计全局变量和静态变量斐波那契数列递归版本的优化斐波那契数列斐波那契数列指的是这样一个数列:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368特别指出:第0项是0,第1项是第一个1。这个数列从第三项开始,每一项都等于前两项之和。斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(LeonardoFibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的列昂纳多”。1202年,他撰写了《算盘全书》(LiberAbacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。递推程序及运行时间计算#include<stdio.h>#include<time.h>intmain(){intf[100];inti,n=40;f[0]=0;f[1]=1;
for(i=2;i<=n;i++){f[i]=f[i-1]+f[i-2];printf("%2d:%d\n",i,f[i]);
}printf("%d:%d\n",n,f[n]);
printf("Timeused=%.3lf\n",
(double)clock()/CLOCKS_PER_SEC);return0;}计时函数clock()的使用。该函数返回程序目前为止运行的时间,以毫秒为单位。这样,在程序结束之前调用它,便可获得整个程序的运行时间。这个时间除以常数CLOCKS_PER_SEC之后得到的值以“秒”为单位。常数CLOCKS_PER_SEC与操作系统有关,请不要直接使用clock()的返回值,而应总是除以CLOCKS_PER_SEC。递推:根据已有结果计算新值全局变量统计执行次数#include<stdio.h>#include<time.h>intc=0;intf(intn){
c++;if(n==0||n==1)returnn;returnf(n-1)+f(n-2);}intmain(){inti,n=40;for(i=1;i<=n;i++)printf("%2d:%d\n",i,f(i));printf("total=%d\n",c);printf("Timeused=%.3lf\n",(double)clock()/CLOCKS_PER_SEC);return0;}全局变量全局变量:也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,属于所在源程序文件,其作用域是整个源程序。使用静态变量优化递归程序#include<stdio.h>#include<time.h>intc=0;intf(intn){
staticinta[100];c++;if(a[n]>0)returna[n];if(n==0||n==1)returna[n]=n;returna[n]=f(n-1)+f(n-2);}intmain(){inti,n=40;for(i=1;i<=n;i++)printf("%2d:%d\n",i,f(i));printf("total=%d\n",c);printf("Timeused=%.3lf\n",(double)clock()/CLOCKS_PER_SEC);return0;}静态变量静态(局部)变量在函数内定义它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。另外一个值得注意的特性是:静态变量默认初始化为零。使用固定模式(double)clock()/CLOCKS_PER_SEC计算程序运行时间全局变量:最长的生存期和最广的使用范围静态(局部)变量:全局变量的生存期,局部变量的使用范围小结
全局变量和静态变量
#include<stdio.h>#include<time.h>intc=0;intf(intn){
staticinta[100];c++;if(a[n]>0)returna[n];if(n==0||n==1)returna[n]=n;returna[n]=f(n-1)+f(n-2);}全局变量静态变量函数主讲:沈涵飞C语言程序设计经典递归问题汉诺塔汉诺塔问题古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可利用B座。请编程序输出移动这些盘子的详细步骤。汉诺塔问题的程序框架voidmove(charsrc,chardst){printf("move%c->%c\n",src,dst);}
voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{
}}
intmain(){hanoi(3,'A','B','C');return0;}把盘子从位置src移动到位置dst把n个盘子从位置one借助于位置two移动到位置threeABC将3个盘子从A移到C的全过程ABC将2个盘子从A移到Bhanoi(n-1,one,three,two);将3个盘子从A移到C的全过程ABC将2个盘子从A移到Bhanoi(n-1,one,three,two);将3个盘子从A移到C的全过程ABC将1个盘子从A移到Cmove(one,three);将3个盘子从A移到C的全过程ABC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年1月江苏扬州市机关生活服务中心招聘厨师2人考试参考试题及答案解析
- 首都医科大学附属北京回龙观医院派遣人员招聘5人考试参考试题及答案解析
- 2026广西柳州市融安县招聘城镇公益性岗位人员30人考试备考试题及答案解析
- 2026青海西宁市妇幼保健计划生育服务中心招聘6人考试备考试题及答案解析
- 2026辽宁鞍山市海城市融媒体中心公益性岗位招聘2人考试参考试题及答案解析
- 2026山西忻州市五寨县廉洁征兵考试参考题库及答案解析
- 2026青海智特安全环境技术服务有限公司招聘技术员6人考试备考试题及答案解析
- 2026年黄山学院师资博士后招聘11名笔试模拟试题及答案解析
- 2026上海复旦大学附属肿瘤医院泌尿外科大学科团队招聘考试参考试题及答案解析
- 2026贵州毕节市财政局选聘监管企业兼职外部董事考试参考试题及答案解析
- 安全技术与管理毕业论文
- 2025年新疆中考数学真题试卷及答案
- 温岭市恩力天金属表面处理有限公司年处理10万吨磷化金属表面技改项目环评报告
- 职务侵占罪法律培训
- 【2025版】人教版(PEP)三年级下册英语教学工作计划(及进度表)
- 劳动仲裁申请书电子版模板
- JJF 1183-2025 温度变送器校准规范
- 2024“五史”全文课件
- 家用燃气灶结构、工作原理、配件介绍、常见故障处理
- 人教版七年级数学上册期末试题及参考答案(偏难)
- 关节挛缩的治疗及预防
评论
0/150
提交评论