C语言程序设计基础课件 04 函数_第1页
C语言程序设计基础课件 04 函数_第2页
C语言程序设计基础课件 04 函数_第3页
C语言程序设计基础课件 04 函数_第4页
C语言程序设计基础课件 04 函数_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数C语言程序设计基础目录CONTENTS01库函数020304自定义函数函数的参数传递与返回值递归函数05局部变量、全局变量与变量作用域06函数综合应用01库函数库函数概述函数的概念函数是一段可重复调用、功能相对独立完整的程序段,是模块化程序设计的基础。C语言程序由一个main()函数和零个或多个其他函数组成,函数可分布在不同文件中,编译后与库函数代码链接形成可执行程序。使用函数的优点使用函数可避免重复书写代码,将代码分成模块,便于编写、跟踪和理解程序。函数的分类函数分为库函数和自定义函数。库函数是系统预先定义的公共函数,使用时需包含相应头文件;自定义函数是根据特殊需求设计的。导例:平方根表问题描述问题分析算法描述程序实现运行结果程序分析输出100以内整数的平方根表,要求每行输出10个。输出表头,每行输出行号,和对应的行列值10个平方根程序输出一个10×10的表格,每行10个平方根值,从0.00到9.95,格式整齐。强调了#include<math.h>的必要性,以及如何通过循环和格式化输出实现表格的打印。程序通过嵌套循环实现,外层循环控制行,内层循环计算并输出每行的平方根,使用printf格式化输出保留两位小数。方案1通过牛顿迭代法手动计算平方根,但代码复杂且效率低。方案2直接调用库函数sqrt(),代码简洁且准确。导例:平方根表程序实现#include<stdio.h>#include<math.h>intmain(){intm,n;printf("");for(n=0;n<10;n++)printf("%7d",n); //输出表头printf("\n");for(m=0;m<10;m++){printf("%d",m);for(n=0;n<10;n++)printf("%7.2f",sqrt(m*10+n)); //调用库函数sqrt()printf("\n");}return0;}导例:随机生成扑克牌问题描述随机生成一个1-54之间的数,输出对应的扑克牌花色和面值030201040506问题分析算法描述程序实现运行结果程序分析每张扑克牌有花色和面值两个属性,可通过随机函数rand()生成随机数,通过取模和整除操作确定花色和面值,利用switch语句输出对应结果。随机生成1个整数,根据该数值判别扑克牌的花色和面值。程序通过srand(time(NULL))初始化随机种子,然后调用rand()生成随机数,通过一系列条件判断和switch语句输出扑克牌的花色和面值。。多次运行程序,输出如'spadeA'、'club8'等随机扑克牌结果,验证了随机性。说明使用随机函数的方法,包括初始化随机种子、生成随机数等。导例:随机生成扑克牌程序实现#include<stdio.h> //使用库函数printf()、scanf()和符号常量NULL#include<stdlib.h> //使用库函数rand()和srand()#include<time.h> //使用库函数time()intmain(){intcard,suit,rank;srand((unsigned)time(NULL)); //初始化随机种子为当前系统时间card=rand()%54+1; //随机产生1~54之间的数if(card==53) printf("redjoker"); //大王elseif(card==54) printf("blackjoker"); //小王else{suit=(card-1)/13; //花色switch(suit){case0:printf("spade");break; //黑桃case1:printf("heart");break; //红桃case2:printf("club");break; //梅花case3:printf("diamond");break; //方块

}rank=card%13; //面值switch(rank){case0:printf("K");break;case1:printf("A");break;case11:printf("J");break;case12:printf("Q");break;default:printf("%d",rank);break;}printf("\n");}return0;}库函数使用方法头文件使用库函数时,需在程序前面用#include命令包含相应的头文件。#include指令有#include<文件名>和#include\文件名\两种形式,前者到系统指定目录查找,后者先在当前目录查找。头文件内容头文件包含符号常量定义、类型定义及函数原型等,包含头文件相当于进行函数声明。预处理过程在预处理阶段,头文件的内容会被复制到源程序中#include指令的位置,完成函数的声明。常用库函数数学函数在VC6.0环境下,使用数学函数需包含头文件math.h,如sin()、cos()、tan()等。随机函数C语言提供了srand()和rand()函数产生随机数,需包含头文件stdlib.h和time.h。随机数是伪随机数,可通过设置随机种子使每次产生的随机数不同。02自定义函数导例:阶乘累加和问题描述问题分析算法描述程序实现运行结果程序分析从键盘输入1个整数,计算1~n的各个数的阶乘的累加和,即1+2!+3!+…+n!。定义函数factorial(),在main()函数中输入整数n,循环调用factorial()函数并累加结果。输入20,程序输出2561327494111820300,验证了程序的正确性。说明自定义函数的定义、声明和调用方法,以及累加和变量类型的选择。程序中定义了factorial()函数计算阶乘,主函数通过循环调用该函数并累加结果,最后输出累加和。可使用for语句循环实现,也可定义一个函数专门计算阶乘。使用函数可提高代码复用性。导例:阶乘累加和程序实现#include<stdio.h>doublefactorial(inti); //函数声明intmain(void){ inti,n;doublesum=0;printf("Enter1integers:");scanf("%d",&n);for(i=1;i<=n;i++)sum=sum+factorial(i); //函数调用printf("1!+2!+3!+…+%d!=%.0f\n",n,sum);return0;}doublefactorial(inti) //函数定义{intj;doubleresult=1;for(j=1;j<=i;j++)result=result*j;returnresult;}导例:素数判断问题描述输入两个整数m和n(m<n),输出区间[m,n]内的所有素数,每行输出10个030201040506问题分析算法描述程序实现运行结果程序分析定义一个函数prime()判断素数,主函数中通过循环调用该函数并输出结果。定义函数prime(),在main()函数中输入m和n,循环调用prime()函数并输出素数程序中定义了prime()函数判断素数,主函数通过循环调用该函数并输出结果,每行10个素数。。输入100和300,程序输出区间内的素数,每行10个,格式整齐。明使用随机函数的方法,包括初始化随机种子、生成随机数等。导例:素数判断程序实现#include<stdio.h>#include<math.h>intmain(){ intcount=0,i,m,n; intprime(inti);//函数声明

scanf("%d%d",&m,&n);for(i=m;i<=n;i++){if(i%2==1&&prime(i)||i==2)//函数调用{ printf("%6d",i);count++; if(count%10==0) printf("\n");}}return0;}

intprime(inti)//函数定义{intj,x;if(i==1)return0;x=sqrt(i);for(j=2;j<=x;j++)if(i%j==0)return0; return1;}函数的定义、声明和调用函数的定义函数定义包括函数头和函数体两部分。函数头由函数类型、函数名和形参表组成;函数体由函数实现过程和return语句组成。函数的调用函数调用指定被调用函数的名字和所需信息,将实参传递给形参并执行函数体后返回结果。调用标准库函数需包含相应头文件,调用自定义函数需有对应的函数定义。函数的声明在函数调用前,若函数未定义,需进行函数声明。声明目的是告诉编译器函数的相关信息,保证调用正确。函数调用过程分析函数调用过程程序从main()函数开始执行。遇到函数调用时,主函数暂停执行,执行被调用函数,执行完毕后返回主函数继续执行。栈的作用系统通过工作栈保存返回信息,保证函数嵌套调用的正确执行。栈是后进先出的数据结构,函数调用时将当前函数的运行环境和返回地址进栈,被调用函数执行结束后出栈。03函数的参数传递与返回值导例:富翁与骗子问题描述一个骗子对富翁说:“你每天只需存入一分钱,第二天存入两分钱,依此类推,以后每天存入的资金是前一天的2倍,存期一个月。可以从存入第一天起每天支取30万,直到30天期满。”编写程序计算30天后富翁支取了多少钱,存入多少钱?富翁是否亏损,亏损多少?如果获利,获利多少?存入金额大于取现金额的最少天数是多少?030201040506问题分析算法描述程序实现运行结果程序分析定义两个函数deposit()和withdraw()分别计算存入和支取资金,通过比较两者大小判断盈亏。定义函数prime(),在main()函数中输入m和n,循环调用prime()函数并输出素数定义两个函数deposit()和withdraw()分别计算存入和支取资金。主函数通过调用这两个函数,比较两者大小判断盈亏。。输出30天存入和支取的资金,判断盈亏情况,输出存入金额大于取现金额的最少天数。说明参数传递过程和返回值的使用,以及函数调用的逻辑。导例:富翁与骗子导例:富翁与骗子程序实现#include<stdio.h>intdeposit(intday);intwithdraw(intcount,intday);intmain(){inti,dep,draw,profit; dep=deposit(30);draw=withdraw(300000,30);printf("30天存入%d元钱\n",dep);printf("30天取得%d元钱\n",draw);profit=draw-dep;if(profit>0)printf("富翁获利%d元钱\n",profit);elseprintf("富翁亏损%d元钱\n",-profit);for(i=1;i<=30;i++)if((deposit(i)-withdraw(300000,i))>0){printf("存入金额大于取现金额的最少天数是%d天\n",i);break;}return0;}

intdeposit(intday) //存入资金总和{inti; longdep=1,number=1; for(i=1;i<day;i++){number*=2;dep+=number;}return(dep/100);}

intwithdraw(intcount,intday) //支取资金总和{longdraw;draw=count*day;returndraw;}导例:数字三角形问题描述从键盘输入一个整数n,输出数字三角形。030201040506问题分析算法描述程序实现运行结果程序分析定义函数Rt()处理数字三角形,根据n值输出相应的三角形。输入整数n,主函数调用Rt()函数输出数字三角形。定义一个Rt()处理数字三角形,主函数通过调用这个函数,输出相应的三角形。。输出数字三角形。说明参数传递和返回值的特点,以及函数无返回值的情况。导例:数字三角形程序实现#include<stdio.h>intmain(){intn;voidRt(intn);scanf("%d",&n);Rt(n);return0;}

voidRt(intn){inti,j;for(i=1;i<=n;i++) {for(j=1;j<=i;j++) printf("%-4d",j); putchar('\n'); }}函数的参数传递值传递方式值传递将实参的值复制给形参,形参的改变不会影响实参。在函数定义时,形参为普通类型,调用时系统为形参分配存储空间,调用结束后释放。地址传递方式地址传递将实参地址传递给形参,对形参的处理就是对实参的处理。当函数参数为指针类型或数组类型时采用地址传递方式。传递方式的选择若希望实参值不变,采用值传递;若希望实参值改变或返回多个值,采用地址传递。函数的返回值有返回值函数有返回值函数在函数执行结束后返回一个结果,由return语句给出。return语句结束函数运行并返回表达式的值。无返回值函数无返回值函数只完成特定处理,不返回计算结果,函数类型为void,return语句只结束函数执行。函数返回值的注意事项无论函数是否有返回值,都应明确指定返回值类型。函数体中要有对应的return;语句。04递归函数导例:假币问题(三分法)问题描述有n个硬币,已知有一个是假币,而且它的重量比真币小,现在有一个天平,问最多需要称几次可以把那个假币找出来。。030201040506问题分析算法描述程序实现运行结果程序分析定义可采用二分法或三分法,三分法更高效。定义函数fake(),根据硬币数量递归计算称重次数。定义函数fake(),根据硬币数量递归计算称重次数。主函数通过调用这个函数,采用递归算法,获得假币次数。。输入硬币数,输出称重次数说明递归函数的定义和调用方法,以及递归出口的重要性。导例:假币问题(三分法)程序实现#include<stdio.h>intfake(intcoin);main(){intcoin;printf("输入硬币数:");scanf("%d",&coin);printf("需要称%d次\n",fake(coin));//递归函数调用}intfake(intcoin){intnumber;switch(coin){case1:number=0;break;case2:case3:number=1;break;default:number=1+fake(coin/3);}returnnumber;}导例:

Fibonacci数列问题描述从键盘输入一个整数n,输出斐波那契数列(Fibonacci)的前n项。要求每行打印10个数后换行。。030201040506问题分析算法描述程序实现运行结果程序分析可采用递归或非递归方法,递归方法易理解但效率低。定义函数fib(),递归计算斐波那契数列的某一项。实现函数声明、定义和调用,注意递归出口的设置。输出斐波那契数列的前n项。说明递归函数的定义和调用方法,以及递归的效率问题。导例:Fibonacci数列程序实现#include<stdio.h>intfib(intk);main(){intn,value,count=0;printf("Enter1integers\n:");scanf("%d",&value);for(n=0;n<value;n++){printf("%10d",fib(n));count++;if(count%5==0)printf("\n");}}

intfib(intn){intf;if(n==0)f=1;elseif(n==1)f=1;elsef=fib(n-1)+fib(n-2);returnf;}递归函数的执行过程递归将问题分解为子问题,通过函数自身调用解决子问题。递归的基本思想系统通过工作栈保存返回信息,保证递归调用的正确执行。递归过程中,每次递归调用时将当前函数的运行环境和返回地址进栈,递归结束后出栈。递归的执行过程递归函数要设置递归出口,避免无限制递归导致栈溢出。同时要找出递归公式,将原问题分解为子问题。递归的注意事项递归函数的效率分析递归的性能问题递归增加系统开销,时间上执行调用与返回的额外工作占用CPU时间,空间上每次递归需分配存储空间。递归与非递归的比较递归程序易读,但效率低;非递归程序效率高,但编程难度大、可读性差。应根据实际情况选择使用。05局部变量、全局变量与变量作用域导例:公园人数统计问题描述统计某公园A门和B门进出人数和公园总人数。。030201040506问题分析算法描述程序实现运行结果程序分析定义函数分别计算A门和B门进出人数,使用全局变量统计总人数。采用模块化设计,通过函数调用统计人数。定义全局变量和局部变量,函数声明、定义和调用。输出公园总人数。说明局部变量的作用域和生存周期,以及全局变量的使用。导例:公园人数统计程序实现#include<stdio.h>intsum=0;/*全局变量*/intmain(){chargate;intflag,i,num;/*局部变量*/voidam(int,int);voidbm(int,int);for(i=1;i<=3;i++){printf("输入公园a/b门进入/离开人数:");scanf("%c%d%d",&gate,&flag,&num);if(gate=='a')am(flag,num);elseif(gate=='b')bm(flag,num);getchar();}printf("公园总人数是%d人\n",sum);return0;}

voidin(intn){sum+=n;}voidout(intn){sum-=n;}

voidam(intflag,intnum) {if(flag==1){printf("a门本次进入%d人\n",num);in(num); }else{printf("a门本次离开%d人\n",num);out(num); }}

voidbm(intflag,intnum) {if(flag==1){printf("b门本次进入%d人\n",num);in(num); }else{printf("b门本次离开%d人\n",num);out(num); }}局部变量和全局变量局部变量局部变量在函数内部或复合语句中定义,作用域限于所在函数或语句块。函数级局部变量在不同函数中可同名,互不干扰;复合语句级局部变量作用域限于复合语句。全局变量全局变量在函数外部定义,作用域从定义处到文件结束。使用全局变量需遵循“先定义后使用”原则,必要时进行外部变量声明。变量作用域和生存期的区别变量作用域是指变量可访问的代码块范围,生存期是指变量存在的时间段。局部变量生存期一般为函数执行周期,全局变量生存期为整个程序运行期。变量的作用域和生存期局部变量的作用域和生存期函数级局部变量作用域限于函数,复合语句级局部变量作用域限于复合语句。静态局部变量在程序运行期间一直存在,再次调用函数时保留上次的值。全局变量的作用域和生存期全局变量作用域为定义处到文件结束,生存期为整个程序运行期。使用全局变量可加强函数间的数据联系,但会降低函数独立性。不同类型变量的比较全局变量、局部变量、静态全局变量、静态局部变量在作用域、分配内存空间等方面存在差异。静态变量改变了变量的存储方式或作用域。06函数综合应用导例:模拟银行ATM机存取款问题描述模拟银行ATM机存取款,实现查询、存款、取款、转账、修改密码等功能。030201040506问题分析算法描述程序实现运行结果程序分析用模块化设计,将各项功能用不同函数实现。定义全局变量保存存款余额和密码,划分模块确定各函数功能,主函数根据用户选择调用相应函数。实现函数声明、定义和调用,注意密码验证和菜单选择的逻辑。实现ATM机的各项功能。说明模块化设计的优点和全局变量的使用问题,应尽量使用局部变量提高程序质量。导例:模拟银行ATM机存取款程序实现#include<stdio.h>#include<conio.h>#include<stdlib.h>doublekey=123456,balance=0;//定义全局变量,保存密码和存款余额intmenu(void); voidcheck(void);voiddeposit(void);voidwithdraw(void);voidtransfer(void);voidchangekey(void);

intmain(){intpassword,times=1,choice;do{times++;printf("请输入密码(6位数字):");scanf("%d",&password);if(password!=key)if(times>3){printf("密码输入三次错误!按任意键退出!\n");getch();exit(0);}elseprintf("密码输入错误!请再次输入密码!\n");}while(password!=key&×<=3);

choice=menu(); //显示菜单项,获取操作类型while(choice!=0) //若输入类型为0,循环结束{switch(choice){case1:check();break; //函数调用,查询case2:deposit();break; //函数调用,存款case3:withdraw();break; //函数调用,取款case4:transfer();break;case5:changekey();break; default:printf("输入错误,请重新输入选择项:");break;//输入错误提示}choice=menu(); //继续输入操作类型}return0;}

intmenu(void) //定义菜单函数{intchoice;printf("********银行ATM机存取款管理系统********\n");printf("********0--退出系统\n");printf("********1--查询账户余额\n");printf("********2--存款\n");printf("********3--取款\n");printf("********4--转账\n");printf("********4--修改密码\n");printf("请输入选择项:");scanf("%d",&choice); //输入操作类型returnchoice;}

voidcheck(void) //定义存款余额查询函数{printf("当前存款余额为:%.2f\n",balance);}

voiddeposit(void) //定义银行存款函数{intnumber;printf("请输入存款金额:");scanf("%d",&number); //输入操作金额balance+=number;printf("当前存款余额为:%.2f\n",balance);}导例:模拟银行ATM机存取款voidwithdraw(void) //定义银行取款函数{intnumber;printf("请输入取款款金额:");scanf("%d",&number); //输入操作金额if(balance<number)printf("余额不足,不能取款");elsebalance-=number;printf("当前存款余额为:%.2f\n",balance);}

voidtransfer(void) //定义银行转账函数{intaccount,number;printf("请输入要转入的账号:");scanf("%d",&account);printf("请输入转账金额:");scanf("%d",&number); //输入操作金额if(balance<number)printf("余额不足,不能转账");else{balance-=number;printf("转账成功!转出金额为:%d,当前存款余额为:%.2f\n",number,balance);}}

voidchangekey(void) //定义银行修改密码函数{intkey1,key2;printf("请输入要修改的密码(6位数字):");scanf("%d",&key1);printf("请再次输入要修改的密码(6位数字):");scanf("%d",&key2);if(key1==key2){printf("密码修改成功!");key=key1;}elseprintf("密码修改不成功!");} 导例:贷款计算器问题描述设计一款简单的贷款计算器,计算等额本金或等额本息还款方式下的月供、利息总额和还款总额。030201040506问题分析算法描述程序实现运行结果程序分析采用模块化设计,将输入、查询、计算等功能用不同函数实现。定义全局变量保存贷款信息,设计菜单函数和各功能函数,根据用户选择调用相应函数。实现函数声明、定义和调用,注意还款方式的计算逻辑。输出贷款的还款信息。说明全局变量的使用问题,可采用其他数据结构替代全局变量。导例:贷款计算器程序实现#include<stdio.h>#include<math.h>intpattern=0,year=0; //pattern还款方式doubleloan=0,rate=0,discount=0;//loan贷款总额,rate年利率,discount折扣intmenu(void);voidinput(void);voidshow(void);voidpay(void);

intmain(){intchoice;while(1){choice=menu();if(choice==0)break;switch(choice){case1:input();break;case2:show();break;case3:pay();break;default:printf("输入错误!");}}return0;}intmenu(void) //菜单界面{intch;printf("\n--------贷款计算器--------\n");printf("输入贷款信息请按1\n");printf("显示贷款信息请按2\n");printf("显示还款信息请按3\n");printf("退出请按0\n");printf("请输入选择:");scanf("%d",&ch);return(ch);}voidinput()//信息输入{printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论