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

下载本文档

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

文档简介

C语言程序设计C语言程序设计第四章函数4.1库函数4.2自定义函数4.3函数的参数传递与返回值4.4递归函数4.5局部变量、全局变量与变量作用域4.6函数综合应用第四章函数学习目标:理解函数在程序设计中的作用和地位掌握函数的定义、原型声明和调用方法熟练掌握函数的参数传递与返回值理解局部变量、全局变量、静态变量和变量的作用域掌握递归函数的编写技术理解和掌握结构设计和模块化程序设计方法了解地址和指针的概念,了解地址做函数参数的特点和作用学习目标:为什么要用函数?问题:如果程序的功能比较多,规模比较大,把所有代码都写在main函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼为什么要用函数?问题:解决的方法:用模块化程序设计的思路采用“组装”的办法简化程序设计的过程可以使用库函数:事先编好一批实现各种不同功能的函数,把它们保存在函数库中,需要时直接用可以使用自己编写的函数:在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能,函数的名字应反映其代表的功能C程序可由一个主函数和若干个其他函数构成,主函数调用其他函数,其他函数也可以互相调用,同一个函数可以被一个或多个函数调用任意多次在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,同时可以方便地实现模块化的程序设计解决的方法:用模块化程序设计的思路C语言程序设计函数刘课件导例:平方根表1.问题描述输出100以内整数的平方根表,要求每行输出10个。2.问题分析C语言提供了一个库函数sqrt(),使用时直接调用该库函数就可以计算出平方根值。导例:平方根表3.算法描述(1)定义两个整型变量m,n。(2)输出平方根表时,要注意格式。首先输出表头,输出0~9的整数。(3)然后按照格式要求输出平方根表,m为行数0~9,n为列数0~9,则表内对应第m行第n列的表值为sqrt(m*10+n),每行10个。3.算法描述1111#include<stdio.h>#include<math.h>//数学类头文件intmain(){ intm,n;

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.4f",sqrt(m*10+n));//调用库函数sqrt() printf("\n");}4.程序实现return0;}#include<stdio.h>for(n=0;n<16.程序分析库函数sqrt()原型放在文件math.h文件中,所在若在程序中使用该函数,就需要在程序头加上语句#include<math.h>。程序中语句段for(n=0;n<10;n++)是输出表头,输出列号:0~9;表头表示出0-9列的列号。用输出函数printf(“%7.4f”)控制输出的值为保留4位小数的实数。6.程序分析4.1.3库函数使用方法库函数的定义已经在C语言提供的标准函数库中,所以调用时,需要在程序的前面利用编译预处理命令include将相应的函数原型加入到程序中。#include指令的一般形式如下:

#include<文件名>或

#include“文件名”例如:#include<math.h>4.1.3库函数使用方法C语言程序设计函数刘课件4.1.4常用的库函数常用的函数头文件,各自包含的函数类别如下:math.h:包含与数学相关的函数ctype.h:包含与字符处理有关的函数string.h:包含与字符串处理有关的函数stdio.h:包含与输入输出有关的函数stdlib.h:包含与动态分配存储空间和数值转换有关的函数process.h:包含与过程控制有关的函数4.1.4常用的库函数4.2自定义函数

4.2.1导例:阶乘累加和4.2.2导例:三色球问题 4.2.3函数的定义、声明和调用 4.2.4函数调用过程分析

4.2自定义函数 导例:计算圆柱体积

输入圆柱体的高和半径,求圆柱体积,volume=π*r2*h。要求定义和调用函数cylinder(r,h)计算圆柱体的体积。导例:计算圆柱体积输入圆柱体的高和半径,求圆柱体积,/*计算圆柱体积*/#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函数声明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); /*调用函数,返回值赋给volume*/ volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}/*计算圆柱体积*//*定义求圆柱体积的函数*/doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;/*计算体积*/

returnresult; /*返回结果*/}Enterradiusandheight:3.010Volume=282.743/*定义求圆柱体积的函数*/Enterradiusa#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函数声明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;

}Enterradiusandheight:3.010Volume=282.743问题:函数是如何运行的?#include<stdio.h>doublecylin4.2.1导例:阶乘累加和1.问题描述

从键盘输入1个整数,计算1~n的各个数的阶乘的累加和,即1+2!+3!+…+n!。2.问题分析

实现各个数的阶乘的累加和,需要先计算每个数的阶乘,然后累加到一起。4.2.1导例:阶乘累加和sum=0;for(i=1;i<=n;i++){item=i!;sum=sum+item;}可用一个函数factorial()专门来计算每个数的阶乘,然后用一个循环语句来计算1~n的各个阶乘的累加的结果。sum=0;4.程序实现#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!+…+%d!=%.0f\n",n,sum);return0;}doublefactorial(inti)//函数定义{intj;doubleresult=1;for(j=1;j<=i;j++)result=result*j;

returnresult;

//返回结果}4.程序实现doublefactorial(inti)一、函数的定义函数定义的基本形式是:函数类型函数名(形参表)

/*函数头,没有分号*/{函数实现过程/*函数体*/}形参表给出函数所有形参的名称和类型,它的格式为:

类型1形参1,类型2形参2,……类型n形参n4.2.3函数的定义、声明和调用一、函数的定义4.2.3函数的定义、声明和调用函数类型函数名(形参表)

/*函数首部*/{ /*函数体*/

函数实现过程

return表达式;}把函数运算的结果回送给主函数只能返回一个值函数返回值的类型没有分号doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}函数类型函数名(形参表) /*函数首部*/把函数运算的doublecylinder(doubler,doubleh)

/*函数首部*/{

/*函数体,写在一对大括号内*/doubleresult; result=3.1415926*r*r*h;/*计算圆柱体积*/

returnresult; /*返回运算结果*/ }1、分析函数的定义函数类型函数名形参表与函数类型一致doublecylinder(doubler,dou形参类型1参数1,类型2参数2,……,类型n参数n参数之间用逗号分隔,每个参数前面的类型都必须分别写明函数类型函数名(形参表){

函数实现过程

return表达式;}不能写成doubler,hdoublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}形参类型1参数1,类型2参数2,……,类型ndoublefactorial(inti)//函数定义{

intj;doubleresult=1;for(j=1;j<=i;j++) result=result*j;

return

result;//返回结果}例:intmaxValue(intd1,intd2){if(d1>=d2)returnd1;elsereturnd2;}doublefactorial(inti)/2.函数原型声明函数类型函数名(形参表);doublecylinder(doubler,doubleh);doublefactorial(intn);voidpyramid(intn);函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。只写函数定义中的第1行(函数首部),并以分号结束。2.函数原型声明函数类型函数名(形参表);只写函数定义中的2、函数的声明函数类型函数名(形参表);

//以分号结束doublefactorial(intn);voidball(intx);2、函数的声明3、函数的调用定义一个函数后,就可以通过程序来调用这个函数。调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。调用自定义函数时,程序中必须有与调用函数相对应的函数定义。3、函数的调用定义一个函数后,就可以通过程序来调用这个函数。函数调用的一般形式为:

函数名(实际参数表);

factorial(i);实际参数与形式参数的数据类型和个数一一对应,以分号结束函数调用的形式函数调用的一般形式为:函数调用的形式for(i=1;i<=n;i++) sum=sum+factorial(i);//函数调用

函数的调用doublefactorial(inti)//函数定义{

intj;doubleresult=1;for(j=1;j<=i;j++) result=result*j;

return

result;//返回结果}for(i=1;i<=n;i++)函数的调用例求两个数中的最大值#include<stdio.h>voidmain(){inta,b,c,max(intx,inty);scanf(“%d,%d”,&a,&b);

c=max(a,b);printf(“Maxis%d”,c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}形参实参定义函数时,形参调用函数时,实参

函数的调用例求两个数中的最大值形参实参定义函数时,形参函数的调用函数调用的形式对于实现计算功能的函数,函数调用通常出现在两种情况:赋值语句

volume=cylinder(radius,height);输出函数的实参

printf(“%f”,cylinder(radius,height));函数调用的形式对于实现计算功能的函数,函数调用通常出现在函数调用的过程计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。函数遇return返回主函数函数调用的过程计算机在执行程序时,从主函数main开始执行,分析函数调用的过程#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);

printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;}调用函数实参

形参执行函数中的语句返回调用它的地方分析函数调用的过程#include<stdio.h>调用函参数传递函数定义时的参数被称为形式参数(简称形参)doublecylinder(doubler,doubleh);函数调用时的参数被称为实际参数(简称实参)volume=cylinder(radius,height);参数传递:实参

形参在参数传递过程中,实参把值复制给形参。形参和实参一一对应:数量一致,类型一致,顺序一致形参:变量,用于接受实参传递过来的值实参:常量、变量或表达式单向传递参数传递函数定义时的参数被称为形式参数(简称形参)单向传递函数结果返回完成确定的运算,将运算结果返回给主调函数。函数结果返回的形式:return表达式;return(表达式);函数结果返回完成确定的运算,将运算结果返回给主调函数。在执行函数调用时,实参把值计算出来,拷贝给相应位置的形参;函数执行完后,通过

return(),可返回一个结果值。

实参与形参有多个实参时形参的改变个数相同、类型一致后面的先计算不影响实参变量的值只能返回一个结果,类型与函数定义时一致要调用函数,必须先要声明!小结:要调用函数,小结:4.3函数的参数传递与返回值4.3.1导例:爬动的蠕虫 4.3.2导例:日K蜡烛图 4.3.3函数的参数传递 4.3.4函数的返回值4.3函数的参数传递与返回值从函数是否有参数和返回值的角度,可以将函数分为:①有参数有返回值函数②有参数无返回值函数

③无参数有返回值函数④无参数无返回值函数从函数是否有参数和返回值的角度,可以将函数分为:导例:判断素数的函数求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。

算法描述:对2~100之间的每个数进行判断,若是素数,则输出该数。for(m=2;m<=100;m++)if(m是素数)printf("%d",m);prime(m)!=0①有参数有返回值函数导例:判断素数的函数求100以内的全部素数,每行输出10个。例5-4源程序#include<stdio.h>#include<math.h>intmain(void){ intcount,m;

intprime(intm); count=0; for(m=2;m<=100;m++){ if(prime(m)!=0){ printf("%6d",m); count++; if(count%10==0) printf("\n");} } printf("\n");}intprime(intm){inti,n;if(m==1)return

0;

n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0){

return

0; }

return

1;}例5-4源程序#include<stdio.h>int输出5之内的数字金字塔。/*输出数字金字塔*/#include<stdio.h>intmain(void){

voidpyramid(intn); /*函数声明*/

pyramid(5); /*调用函数,输出数字金字塔*/ return0;}voidpyramid(intn) /*函数定义*/{ inti,j; for(i=1;i<=n;i++){ /*需要输出的行数*/ for(j=1;j<=n-i;j++) /*输出每行左边的空格*/ printf(""); for(j=1;j<=i;j++) /*输出每行的数字*/ printf("%d",i); /*每个数字的前后各有一个空格*/ putchar('\n'); }}

122333444455555

for(i=1;i<=n;i++){

for(j=1;j<=n-i;j++) printf(“”);

一行中的数字显示}②有参数无返回值函数for(i=1;i<=n;i++){

一行的处理}一行中的空格处理;一行中的数字显示}输出5之内的数字金字塔。/*输出数字金字塔*/不返回运算结果的函数定义void

函数名(参数表) /*函数首部*/{ /*函数体*/

函数实现过程

return;

/*可以省略return*/}这类函数通常用于屏幕输出等表示不返回结果不能省略,否则函数类型被默认定义为int不返回运算结果的函数定义void函数名(参数表) /*#include<stdio.h>intmain(void){

intin();intn; /*函数声明*/

n=in();/*函数调用*/printf(“%d”,n); return0;}intin(){intx;scanf(“%d”,&x);returnx;}③无参数有返回值函数#include<stdio.h>③无参数有返回值函数函数没有返回值——在声明函数的时候,函数名前使用了保留字void。用函数调用语句调用。#include<stdio.h>voidmain(){voidprintstar();/*函数声明*/voidprint_message();/*函数声明*/printstar();print_message();printstar();}voidprintstar()

{printf(“*********\n”);

}

voidprint_message(){printf(“Howdoyoudo!\n”);}输出:*****************

Howdoyoudo!*****************④无参数无返回值函数函数没有返回值——在声明函数的时候,函数名前使用了保留字vo4.3.3函数的参数传递在调用函数时,实参与形参结合的具体过程是:计算实参表达式的值;将实参的值按赋值转换规则转换成对应形参的数据类型;为形参分配存储空间;将类型转换后的实参的值传递给对应的形参变量,然后执行函数。4.3.3函数的参数传递

C语言中,函数的参数传递有两种方式,即传值和传地址。

传值:简单地将实参的值复制一份给形参,一旦复制完成,实参与其对应的形参便没有任何关系,这时在函数内对形参的任何改变都不会影响到实参。

传地址:将实参地址传递给形参,在函数内对形参所对应数据的处理实际上就是处理对应的实参。简单地理解就是此时实参和形参同一的,对形参的处理就是对对应的实参的处理。

C语言中,当函数的参数为指针类型或数组类型时采用传地址的方式,其他类型采用传值方式。C语言中,函数的参数传递有两种方式,即传值和传地址。4.3.4函数的返回值

函数的调用本质上是一个表达式,它将返回特定类型数据的值(即返回值),因此只要该值能出现的位置,都可以使用该函数调用表达式。从函数返回值的类型看,有两种类型:①是完成确定的运算,并由运算结果返回给主调函数,称为有返回值的函数;函数类型用返回值类型指定。②是完成指定的工作,没有确定的运算结果需返回给主调函数,称为无返回值的函数。函数类型用void指定。4.3.4函数的返回值1、有返回值函数有返回值函数在函数定义时必须说明返回值的类型,在函数体中由return语句给出具体的返回值。有返回值return语句的一般形式如下:return表达式;

return(表达式);先求解表达式的值,再返回其值。通常表达式的结果类型与函数的返回值类型一致return语句的作用有两个:一是结束函数的运行;二是带着运算结果(表达式的值)返回主调函数。1、有返回值函数函数有返回值:函数执行完毕后,返回一个相应类型的数值。用return语句返回该值:return表达式;用函数调用表达式调用。如:printf(“Theaverageis%6.2f”,average(dataArray,n));ave=average(dataArray,n);函数有返回值:函数执行完毕后,返回一个相应类型的数值。如:2、无返回值函数无返回值函数只完成某种特定的处理,函数执行后无须向调用者返回计算结果。

无返回值函数在函数定义时必须将返回值的类型说明为void(即空类型),函数体中的return语句只结束函数的执行。如果函数类型为void,则函数返回直接用return语句,不必跟上一个表达式。

无返回值return语句的一般形式如下:return;在函数定义中也可以没有return语句,此时函数执行到最后一条语句。2、无返回值函数4.4递归函数4.4.1导例:假币问题(三分法) 4.4.2导例:Fibonacci数列 4.4.3递归函数的执行过程 4.4.4递归函数的效率分析4.4递归函数4.4.2导例:Fibonacci数列1.问题描述从键盘输入一个整数n,输出斐波那契数列(fibonacci)的前n项。要求每行打印10个数后换行。2.问题分析斐波那契数列为1,1,2,3,5,8,13……即从第三项开始,各项值都等于前两项值之和。斐波那契数列的定义为:1n=0f(n)=1n=1f(n-1)+f(n-2)n>14.4.2导例:Fibonacci数列采用非递归方法,程序片段如下:

first=1,second=1;scanf("%d",&n);for(i=0;i<n;i++){result=first+second; printf("%.0f",result);first=second;

second=result;

}采用非递归方法,程序片段如下:#include<stdio.h>intfib(intk);main(){intn,i,count=0;printf("Enter1integers\n:");scanf("%d",&n);for(i=0;i<n;i++){printf("%10d",fib(i));count++;if(count%5==0)printf("\n");}}intfib(intn){intf;if(n==0)f=1;elseif(n==1)f=1;else

f=fib(n-1)+fib(n-2);returnf;}#include<stdio.h>intfib(int6.程序分析6.程序分析4.4.3递归函数的执行过程递归函数要注意两点:

①递归出口:递归的结束条件,说明到何时不再递归调用;否则无限制递归,终将使栈空间溢出;

②递归公式:当前函数结果与准备调用的函数结果之间的关系,即原问题是如何分解为子问题的。

1n=0fact(1)=1递归出口n!=n×(n-1)!n>1fact(n)=n*fact(n-1)递归公式

4.4.3递归函数的执行过程实现阶乘递归算法的递归函数

longfact(intn){ if(n==0)return1; elsereturnn*fact(n-1);}

实现阶乘递归算法的递归函数y=fact(3)

3*fact(2)2*fact(1)1*fact(0)111*112*123*26递归函数的调用过程y=fact(3)3*fact(2)2*fact(1)1*递归程序的内部执行过程函数的递归调用类似于多个函数的嵌套调用,只不过调用函数和被调用函数是同一个函数。递归调用的内部执行过程如下:①运行开始时,系统设立工作栈来保存每次调用的运行环境,包括形参、局部变量和返回地址;②递归调用前,将调用函数的形参、局部变量以及调用后的返回地址进栈;③调用结束后,将栈顶数据出栈,恢复调用前的运行环境,使相应的形参和局部变量恢复为调用前的值,然后从返回地址指定的位置继续执行调用函数。递归程序的内部执行过程4.4.4递归函数的效率分析递归函数如果很缓慢地逼近到递归结束条件,会使性能大大下降。递归增加了系统开销,时间上,执行调用与返回的额外工作要占用CPU时间。空间上,随着每递归一次,栈内存就多占一块,即要分配相应的存储空间,并完成参数的传递、函数的返回等,在程序的执行效率和所消耗的存储空间上,和非递归相比没有任何优势。一般的递归都可以通过相应的方法转化为非递归的,所以不推荐使用递归,特别是不推荐使用递归层次较多的递归。4.4.4递归函数的效率分析4.5C局部变量、全局变量与变量作用域4.5.1导例:富翁与骗子 4.5.2导例:简易库存存取货管理 4.5.3局部变量和全局变量 4.5.4变量的作用域和生存期4.5C局部变量、全局变量与变量作用域分别输入2个复数的实部与虚部,用函数实现计算2个复数之和与之积。分析若2个复数分别为: c1=x1+y1i,c2=x2+y2i,则:

c1+c2=(x1+x2)+(y1+y2)i

c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i

复数运算分别输入2个复数的实部与虚部,用函数实现计算2个复数之和与之#include<stdio.h>floatresult_real,result_imag; /*全局变量,用于存放函数结果*/intmain(void){ floatimag1,imag2,real1,real2;/*两个复数的实、虚部变量*/

/*函数声明*/ voidcomplex_prod(floatreal1,floatimag1,floatreal2,floatimag2); voidcomplex_add(floatreal1,floatimag1,floatreal2,floatimag2); printf("Enter1stcomplexnumber(realandimaginary):"); scanf("%f%f",&real1,&imag1); /*输入第一个复数*/ printf("Enter2ndcomplexnumber(realandimaginary):"); scanf("%f%f",&real2,&imag2); /*输入第两个复数*/

complex_add(real1,imag1,real2,imag2); /*求复数之和*/

printf("additionofcomplexis%f+%fi\n",result_real,result_imag);

complex_prod(real1,imag1,real2,imag2);/*求复数之积*/

printf("productofcomplexis%f+%fi\n",result_real,result_imag); return0;}运行结果Enter1stcomplexnumber(realandimaginary):11Enter2ndcomplexnumber(realandimaginary):-23additionofcomplexis-1.000000+4.000000iproductofcomplexis-5.000000+1.000000i#include<stdio.h>运行结果voidcomplex_add(floatreal1,floatimag1,floatreal2,floatimag2){ result_real=real1+real2; result_imag=imag1+imag2;}voidcomplex_prod(floatreal1,floatimag1,floatreal2,floatimag2){ result_real=real1*real2-imag1*imag2; result_imag=real1*imag2+real2*imag1;}voidcomplex_add(floatreal1,局部变量在函数内定义的变量(包括形参)作用范围:本函数内部定义在复合语句内的变量作用范围:复合语句内部全局变量 在函数以外定义的变量,不从属于任一函数。作用范围:从定义处到源文件结束(包括各函数)4.5.3局部变量和全局变量局部变量4.5.3局部变量和全局变量在复合语句中定义局部变量#include<stdio.h>intmain(void){

int a;a=1;

{ /*复合语句开始*/

intb=2;b=a+b;a=a+b;

} /*复合语句结束*/ printf("%d",a); return0;}b:小范围内的临时变量

输出:4改成b会如何?在复合语句中定义局部变量#include<stdio.h>

全局变量定义#include"stdio.h"intx; /*定义全局变量x*/intf(){

intx=4;/*x为局部变量*/returnx;}intmain(void){inta=1;

x=a; /*对全局变量x赋值*/a=f(); /*a的值为4*/{

intb=2;

b=a+b; /*b的值为6*/

x=x+b; /*全局变量运算*/}printf("%d%d",a,x);return0;}若局部变量与全局变量同名,局部变量优先输出:4,7全局变量定义#include"stdio.h"若局部变量变量作用范围示例intx=1;voidmain(){inta=2;……..{intb=3;…..}f();………..}intt=4;voidf(){intx=5,b=6;…….}inta=7;

x=?a=?b=?b=?

x=5b=6t=4a没定义

x=?b=?t=?a=?变量作用范围示例intx=1;x=?a=?b用函数实现财务现金记账。先输入操作类型(1收入,2支出,0结束),再输入操作金额,计算现金剩余额,经多次操作直到输入操作为0结束。要求定义并调用函数,其中现金收入与现金支出分别用不同函数实现。分析:设变量cash保存现金余额值,由于它被主函数、现金收入与现金支出函数共用,任意使用场合其意义与数值都是明确和唯一的,因此令其为全局变量。财务现金记账用函数实现财务现金记账。先输入操作类型(1收入,2支出,#include<stdio.h>floatcash; /*定义全局变量,保存现金余额*/intmain(void){ intchoice; floatvalue; voidincome(floatnumber),expend(floatnumber); /*函数声明*/

cash=0; /*初始金额=0*/ printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); /*输入操作类型*/ while(choice!=0){ /*若输入类型为0,循环结束*/ if(choice==1||choice==2){ printf("Entercashvalue:"); /*输入操作现金额*/ scanf("%f",&value); if(choice==1)income(value);/*函数调用,计算现金收入*/ else expend(value); /*函数调用,计算现金支出*/ printf("currentcash:%.2f\n",cash); } printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); /*继续输入操作类型*/ } return0;}

/*定义计算现金收入函数*/voidincome(floatnumber){cash=cash+number; /*改变全局变量cash*/} /*定义计算现金支出函数*/voidexpend(floatnumber){cash=cash-number; /*改变全局变量cash*/}Enteroperatechoice(0--end,1--income,2--expend):1Entercashvalue:1000currentcash:1000.000000Enteroperatechoice(0--end,1--income,2--expend):2Entercashvalue:456currentcash:544.000000Enteroperatechoice(0--end,1--income,2--expend):0#include<stdio.h> /*定义计算现金收入4.5.3局部变量和全局变量全局变量:定义在函数(包括main函数)外而不属于任意函数的变量。作用范围是从定义开始到程序所在文件的结束,其对作用范围内的所有函数都起作用。局部变量:是指在某个函数之内或语句块内定义的变量;函数的形参列表中的变量也是局部变量;只能在某个函数内部使用。块变量(局部变量):在复合语句中定义的变量。4.5.3局部变量和全局变量4.5.4变量的作用域和生存期变量是存储空间在程序中的一种表示对变量的操作就是对变量所对应的存储空间中所存放的数据的操作。生存期:变量占据存储空间的时间,即变量在什么时间段内存在作用域:变量可以引用的区域,即变量在哪些代码块中能够访问4.5.4变量的作用域和生存期块变量:在复合语句中定义的变量,其生存期为所在的复合语句块中。例:if(x>y){inttemp;temp=x;x=y;y=temp;}块变量:在复合语句中定义的变量,其生存期为所在的复合语句块中局部变量:在函数内部和形式参数表中定义的变量都属于局部变量。作用域是定义这些变量的函数。计算两个整数的最小公倍数#include<stdio.h>intlcm(intx,inty);main(){intm,n,common;scanf(“%d%d”,&m,&n);common=lcm(m,n);printf(“\n%d,%dleasecommonmultipleis%d”,m,n,common);}intlcm(intx,inty){inttemp,multiple;if(x>=y)temp=x;elsetemp=y;multiple=temp;while(temp%x!=0||temp%y!=0){temp+=multip;}returntemp;}局部变量:在函数内部和形式参数表中定义的变量都属于局部变量。全局变量全局变量的生存期是定义这个变量的程序文件作用域是从定义处开始到程序文件的结束处为止如果程序文件中的某些局部变量与之同名,则全局变量的作用域应该去除这部分区域。静态存储:在程序开始运行时系统就为之分配存储空间,等到程序结束时才将为其分配的存储空间回收。变量的生存期是由存储类别控制的自动变量和静态变量全局变量全局变量的生存期是定义这个变量的程序文件静态存储:在自动存储:在函数开始执行时为之分配存储空间,函数执行完毕后,立即回收这些存储空间。在默认情况下,局部变量都属于自动变量。静态局部变量(static变量)格式:static数据类型变量名;在局部变量说明前加上static构成静态局部变量。静态存储,在整个程序运行期间存储空间都不释放。 局部静态变量局部于定义它的函数。出了函数,静态变量的值仍然保存,但不能引用。自动存储:在函数开始执行时为之分配存储空间,函数执行完毕后,全局变量是静态存储。函数的形式参数必须是自动变量。采用下面的语句段调用上面的函数

for(i=1;i<=10;i++){fun();}将会再屏幕上看到12345678910voidfun(){staticcount=0;count++;printf(“%4d”,count);}全局变量是静态存储。采用下面的语句段调用上面的函数将会再屏4.6函数综合应用4.6.1导例:模拟银行ATM机存取款 4.6.2导例:贷款计算器 4.6.3程序主体框架的设计与实现 4.6.4模块化程序设计的基本特征4.6函数综合应用4.6.1导例:模拟银行ATM机存取款1.问题描述模拟银行ATM机存取款,实现单个帐户的查询、存款、取款、转帐、修改密码等功能。4.6.1导例:模拟银行ATM机存取款2.问题分析

进行模块化设计,上述各项需求:查询、存款、取款、转帐、修改密码分别用不同函数实现。由main()函数调用各函数来实现上述需求。首先输入密码进行判断,密码正确后输出一个简单菜单显示项,

温馨提示

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

评论

0/150

提交评论