《(7)--ch7 C语言程序设计函数.ppt》由会员分享,可在线阅读,更多相关《(7)--ch7 C语言程序设计函数.ppt(90页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章 函数核心概念核心概念n结构化程序设计n自顶向下,逐步细化n近似树型的结构n在C语言中每个节点都是函数实现的,根是main函数,内部结点是调用孩子函数实现其功能n函数n具有独立功能的程序模块,由函数头和函数体组成,其中函数名、函数参数、函数返回值是非常重要的三个组成部分n函数名:给具有独立功能的程序模块取的一个标示符n函数参数:函数的接口,接收调用者传过来的值n函数返回值:即函数值,该函数执行数据处理,获得的一个值,返还给调用者学习目标学习目标n了解函数的基本概念及其分类n掌握函数的定义方法n了解函数说明的作用与方法n掌握函数的调用方法n掌握变量、函数的作用域和生命周期n掌握函数调用时参
2、数传递的特点n掌握递归函数的定义和使用章节内容章节内容7.1 求素数求素数7.2 俄罗斯方块的旋转 7.3 汉诺塔 7.4 明文与密文 7.5 内部函数和外部函数 7.1 求素数求素数 n案例:案例:编程实现打印出100200,400500以内的所有素数。#include#includevoid main()int i,m,k;for(k=101;k200;k=k+2)/*打印出100-200之间的素数*/m=(int)sqrt(k);for(i=2;i m)printf(%5d,k);for(k=401;k500;k=k+2)/*打印出400-500之间的素数*/m=(int)sqrt(k)
3、;for(i=2;im)printf(%5d,k);这种方法有几个不足:代码完全复制,使得源文件变长;复制代码要更换所使用的变量,否则会出错例例7.1 从键盘输入从键盘输入10个大于个大于1的正整数,的正整数,输出其中的素数。输出其中的素数。n设计自定义函数isprime(x),用来判断某数x是否为素数,如果x是素数,则返回1,否则返回0。#include#include void main()int i,k10;int isprime(int x);/*函数说明*/printf(输入10个数据:n);for(i=0;i10;i+)/*输入10个数据*/scanf(%d,&ki);printf
4、(上述数据中的素数有:n);for(i=0;i10;i+)/*打印输入的10个数据中的素数*/if(isprime(ki)/*函数调用*/printf(%3d,ki);printf(n);int isprime(int x)/*函数的定义*/int i;for(i=2;i=(int)sqrt(x);i+)if(x%i=0)return 0;/*x能被i除尽,不是素数*/return 1;/*如果x不能被所有的i整除,则x是素数*/函数返回值类型函数名函数参数n有了判断一个数是否为素数的函数之后,如果要求输出100200和400500之间的素数,在main函数中只需要使用两次循环即可,如下所示:
5、for(k=101;k200;k=k+2)if(isprime(k)printf(%5d,k);for(k=401;ky?x:y;return(z);例 有参函数(现代风格)int max(int x,y)int z;z=xy?x:y;return(z);例 空函数 dummy()函数体为空例 无参函数 printstar()printf(“*n”);或 printstar(void)printf(“*n”);函数类型 函数名(形参表)形参类型说明说明部分语句部分传统风格:例 有参函数(传统风格)int max(x,y)int x,y;int z;z=xy?x:y;return(z);7.1.
6、2函数的参数和函数的值函数的参数和函数的值n形式参数和实际参数形式参数和实际参数n函数定义中的参数称为形参;函数定义中的参数称为形参;n函数调用中出现的参数称为实参函数调用中出现的参数称为实参;n主调函数把实参的值传送给被调函数的形参变量,从而实现主调函数向被调函数的数据传送。n 特点(1)形参变量只有在被调用时才分配存储空间,在调用结束时,即释放所分配的内存单元。(2)实参必须具有确定的值。(3)实参和形参在数量、类型、顺序上应严格一致,否则会发生类型不匹配的错误。(4)函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。(5)实参与形参分别占用不
7、同的存储单元。例例7.2形参与实参所占用的内存单元不同。形参与实参所占用的内存单元不同。#include void para_adress(int x)printf(形参x的地址:=0X%X;x=%dn,&x,x);void main()int i=10;printf(实参i的地址:=0X%x;i=%dn,&i,i);para_adress(i);某次运行的结果:实参i的地址:=0X12FF7C;i=10形参x的地址:=0X12FF2C;x=10例例7.3 验证实参到形参的单向值传递。验证实参到形参的单向值传递。#include void sum(int a,int s);/*函数说明*/vo
8、id main()int n=5,sm=0;printf(主函数实参:n n=%d,sm=%dn,n,sm);sum(n,sm);/*函数调用*/printf(函数执行后主函数实参:n n=%d,sm=%dn,n,sm);void sum(int a,int s)/*函数定义*/int i;printf(子函数:实参送到形参n a=%d,s=%d,a,s);s=0;for(i=1;i=a;i+)s=s+i;printf(子函执行后形参:n a=%d,s=%dn,a,s);运行结果:主函数实参:n=5,sm=0子函数:实参送到形参 a=5,s=0子函执行后形参:a=5,s=15函数执行后主函数实
9、参:n=5,sm=0n函数的值函数的值n函数的值是指函数被调用后函数执行的结果,函数执行结束后会将此值返回给主调函数。n说明:(1)函数的值只能通过return语句返回主调函数。return 语句的一般形式为:return 表达式;或者为:return(表达式);执行到任何一条return语句,则本函数执行结束,并返回主调函数,故每次调用只能有一个return 语句被执行,也只能返回一个函数值。(2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。(3)如果函数值为整型,在函数定义时可以省去函数类型说明。但是最好不要省略,以提高程序的可读性。(
10、4)无返回值的函数,可以明确定义为“空类型”,类型说明符为void。7.1.3 函数说明与函数调用函数说明与函数调用函数说明n语言规定,所有函数在调用之前必先对函数返回值数据类型、函数名和函数的参数个数与各个参数的类型进行说明,这就是函数说明,又称函数原型,它类似函数定义时的函数头。它指明了该用户标示符是函数,是什么类型,什么参数列表。n函数说明由函数返回类型、函数名和参数表组成,并以分号结束;它与函数定义的返回值数据类型、函数名和参数表必须一致,否则会引起编译错误。n函数说明可以不包含参数的名字,但必须包含所有参数的类型,用逗号分开。这也意味着函数说明的参数名字可以与函数定义时名字不同。n例
11、如:int area(int,int);等价于 int area(int a,int b);n如果函数的定义出现在主调函数之前,则该函数的说明可以省略,即用函数的定义充当了函数说明,例如:#include void sum(int a,int s)/*函数定义*/void main()sum(n,sm);n库函数在调用之前同样也要进行函数说明,库函数的函数说明包含在相应的头文件(.h)里,故当需要用到库函数时,需要用#include 命令将头文件包含进来。n函数调用函数调用 在程序中,函数调用就是执行相应的函数,在程序中,函数调用就是执行相应的函数,它的一般形式为:它的一般形式为:函数名函数名
12、(实际参数表实际参数表)n如果函数有返回值,可以作为一个简单表达式使用,可以与其他操作数和操作符组成复杂表达式,也可以作为调用函数的实参n如果函数没有返回值,则该调用只能单独出现作为函数语句。在语言中,调用函数常用的方式有以下几种:n(1)赋值表达式的右值:例如:z=max(x,y);是一个赋值表达式,把max的返回值赋予变量z。这种方式要求函数是有返回值的。n(2)单独的函数语句:函数调用的一般形式加上分号即构成函数语句。例如:printf(%d,a);scanf(%d,&b);这两个函数都是以函数语句的方式调用函数,任何函数调用都可以作为函数语句形式出现,无论函数有无返回值。但如果函数没有
13、返回值,也只能以这种方式调用。n(3)函数作为实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如:printf(%d,max(x,y);n注:控制语句中的条件表达式中亦可以出现函数的调用,例如:if(isprime(x).在这种方式中,函数也是要求有返回值的。n在函数调用中实参有副作用,还应该注意实参求值顺序。求值顺序不同,计算的结果可能不同。所谓求值顺序是指对实参表中各实参表达式是自左至右顺序求值,还是自右至左顺序求值。对此,各系统的规定不一定相同,Visual C+是采用自右至左顺序求值。例例7.4函数作为赋值表达式
14、的右值函数作为赋值表达式的右值#include void main()int a,b,maxab;int max(int a,int b);/*函数说明*/printf(请输入两个数据a b:n);scanf(%d%d,&a,&b);maxab=max(a,b);printf(maxab=%dn,maxab);int max(int a,int b)/*函数的定义*/if(ab)return a;else return b;例例7.5 函数作为单独的函数语句函数作为单独的函数语句#include void chessboard();/*/函数说明*/void main()chessboard(
15、);void chessboard()printf(n);printf(“n);printf(n);printf(n);printf(n);printf(n);printf(n);printf(n);printf(n);printf(you()n);printf(computer()n);printf(n);printf(n);printf(n);printf(n);printf(“n);printf(n);printf(n);printf(n);printf(n);printf(n);7.2 俄罗斯方块的旋转俄罗斯方块的旋转俄罗斯方块输出的图形基本上有七种:点阵方式是比较恰当的存储和输出方式
16、不同方向俄罗斯方块显示顺序不同方向俄罗斯方块显示顺序方向方向1的算法的算法俄罗斯方块旋转的主函数算法描述俄罗斯方块旋转的主函数算法描述n#include n#include /*用到了srand、rand函数*/n#include /*用到了time函数*/n#include /*用到了getch函数*/nint fk24=1,0,0,0,1,1,1,0;/*第2种图形*/nvoid drawfk(int fx)/*显示某种方块的方向fx图*/nnint i,j;nswitch(fx)nn case 0:/*方向0*/nn case 1:/*方向1*/nn case 2:/*方向2*/n n
17、case 3:/*方向3*/n n n方向方向0:for(i=0;i2;i+)for(j=0;j4;j+)if(fkij)printf();elseprintf();printf(n);break;方向方向1:for(i=0;i=0;j-)if(fkji)printf();elseprintf();printf(n);break;方向方向2:for(i=1;i=0;i-)for(j=3;j=0;j-)if(fkij)printf();elseprintf();printf(n);break;方向方向3:for(i=3;i=0;i-)for(j=0;j2;j+)if(fkji)printf();
18、elseprintf();printf(n);break;void main()int fx;char choice;srand(unsigned)time(NULL);/*播种子*/fx=rand()%4;do drawfk(fx);choice=getch();if(choice=L|choice=l)/*顺时针旋转*/fx=+fx%4;else fx=(fx+3)%4;system(cls);/*在Visual C+表示清除字符界面的函数*/while(choice!=27);变量的分类变量的分类n有了函数,可以使变量使用得更加灵活,为有了函数,可以使变量使用得更加灵活,为了更好使用,对
19、变量进行了划分了更好使用,对变量进行了划分n按照作用域分按照作用域分n局部变量局部变量n全局变量全局变量n按照生命周期分按照生命周期分n自动变量自动变量n静态变量静态变量n寄存器变量寄存器变量 7.2.1 局部变量和全局变量局部变量和全局变量n局部变量局部变量n局部变量是在函数内部定义的,其作用域仅限于函数内部,局部变量是在函数内部定义的,其作用域仅限于函数内部,所以局部变量也称为所以局部变量也称为内部变量内部变量,离开该函数后就不能再使用,离开该函数后就不能再使用该函数的内部变量了。该函数的内部变量了。说明:说明:(1)在主调函数内部定义的局部变量,在被调函数中也是无法)在主调函数内部定义的
20、局部变量,在被调函数中也是无法使用的,在被调函数中定义的局部变量在主调函数中也是无使用的,在被调函数中定义的局部变量在主调函数中也是无法使用的。法使用的。(2)形参变量是属于被调函数的局部变量,它仅仅在被调函数)形参变量是属于被调函数的局部变量,它仅仅在被调函数中可以使用。中可以使用。(3)允许在不同的函数中使用相同的变量名,它们代表不同的)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。对象,分配不同的单元,互不干扰,也不会发生混淆。(4)在复合语句中也可定义变量,其作用域只在复合语句花括)在复合语句中也可定义变量,其作用域只在复合语句花括号
21、范围内。如果在复合语句中定义了与复合语句外变量同名号范围内。如果在复合语句中定义了与复合语句外变量同名的变量,那么在复合语句内只有内部变量有效,外部定义的的变量,那么在复合语句内只有内部变量有效,外部定义的变量无效。变量无效。例例7.7 局部变量的作用域局部变量的作用域#include void main()int i=1;/*/printf(%Xn,&i);int i=3;printf(%Xn,&i);printf(%dn,i);/*/printf(%dn,i);/*/12FF7C12FF7831n全局变量全局变量n全局变量是在函数外部定义的变量,又称全局变量是在函数外部定义的变量,又称外部
22、变外部变量量。其作用域是从定义处开始到源程序结束。使。其作用域是从定义处开始到源程序结束。使用全局变量说明符用全局变量说明符extern可以扩展全局变量的作可以扩展全局变量的作用域。用域。n如果如果extern位于函数内部,则全局变量作用域位于函数内部,则全局变量作用域扩展至该函数内扩展至该函数内extern处到函数尾;处到函数尾;n如果如果extern位于同一个工程的其他源文件,则位于同一个工程的其他源文件,则全局变量作用域扩展至该源文件全局变量作用域扩展至该源文件extern处到该处到该源文件结尾处。源文件结尾处。例例7.8 全局变量的应用全局变量的应用n从键盘输入长方体的长、宽、高,并分
23、别定义为l、w、h,用函数求体积及其及三个不同面的面积。n由于函数只能有一个返回值,要想通过一个函数得到三个侧面的面积和体积,可以考虑把三个侧面面积放在三个全局变量s1,s2,s3中,而函数的返回值为体积,则执行函数之后,体积与三个侧面积都能求出来。#include int vs(int l,int w,int h)extern int s1,s2,s3;/*因为全局变量s1,s2,s3是在该函数之后定义的,故这里需要对其进行说明,将作用域扩展到vs函数内部*/int v;v=l*w*h;s1=l*w;s2=w*h;s3=l*h;return v;void main()int v,l,w,h;
24、extern int s1,s2,s3;/*因为全局变量s1,s2,s3是在该函数之后定义的,故这里需要对其进行说明,将作用域扩展到main函数内部*/printf(ninput length,width and heightn);scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(nv=%d,s1=%d,s2=%d,s3=%dn,v,s1,s2,s3);int s1,s2,s3;/*定义全局变量存放三个侧面积 */n由于全局变量在同一个文件中的所有函数都可以访问,它提供了一种函数之间传递信息的便利方式,但使得访问全局变量的这些函数之间的耦合度加强,不利于程序的
25、维护。权衡利弊应该尽量少使用全局变量,尽量使用函数参数和函数返回值的方式来传递信息。例7.9 外部变量与局部变量。外部变量与局部变量。#include int a=3,b=5;/*a,b为全局变量*/int max(int a,int b)/*a,b为局部变量*/int c;/*c为局部变量*/c=ab?a:b;return(c);void main()int a=8;/*a为局部变量*/printf(“%dn”,max(a,b);/*max实参a是main的局部变量*/n运行结果:87.2.3 变量的存储类别变量的存储类别n变量只能存放在静态存储区或者动态存储区。n静态存储区的变量在程序开始
26、运行时分配,运行结束时收回,在程序运行期间始终占用固定的存储空间。n动态存储区的变量是在程序运行期间动态进行分配和回收。n静态存储区定义的变量缺省值为0,动态存储区定义的变量缺省值是随机的。n存放在静态区的变量只有一次分配内存的过程,在程序结束之前一直占据相同地址的内存单元,所以每次访问的都是同一个内存,静态区的内存变量的生命周期是整个程序的执行期。n动态存储区的内存变量的生命周期一般是一个函数的执行期,每次执行函数,动态存储区的变量都要创建和撤销。每次函数调用时再重新分配空间,动态区的内存变量所占的内存地址可能不相同。n全局变量都存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序执
27、行完毕才释放。n动态存储区存放以下数据:n函数形式参数;n自动变量(未加static声明的局部变量);n函数返回值;变量修饰符变量修饰符nauto变量变量n局部变量如不专门声明为局部变量如不专门声明为static存储类别,都是动存储类别,都是动态地分配存储空间的,数据存储在动态存储区中,态地分配存储空间的,数据存储在动态存储区中,所以所以auto变量是缺省定义的。变量是缺省定义的。n用用static声明局部变量声明局部变量 n静态局部变量并不会随着函数的返回而释放,它在整个程序运行期间只初始化一次,之后每次函数调用都是在前一次静态局部变量值的基础上继续参与运算。例例7.10 考察静态局部变量的
28、值。考察静态局部变量的值。#include int fstatic()static c=3;/*定义静态局部变量*/c=c+1;return(c);void main()int i;for(i=0;i1时,该算法可以通过三个步骤来实现:先将A柱上的n-1个金片使用C柱作为过渡柱移到B柱上;递归调用hanoi(A,C,B,n-1)函数;将A柱上最后一个大金片移动到C柱上;将B柱上的n-1个金片使用A柱作为过渡柱移动C柱上;递归调用hanoi(B,A,C,n-1)函数;n(2)当n=1时,只需要将A柱上的金片移动到C柱上即可。void hanoi(char A,char B,char C,int
29、n)if(n1)hanoi(A,C,B,n-1);printf(%c-%cn,A,C);hanoi(B,A,C,n-1);else if(n=1)printf(%c-%cn,A,C);#include#define N 3 /*初始化为3个金片*/void main(void)void hanoi(char A,char B,char C,int n);/*函数说明*/hanoi(A,B,C,N);运行结果:A-CA-BC-BA-CB-AB-CA-C嵌套调用嵌套调用n递归函数是嵌套调用函数的一种特例,递归函数一般有一下几个特征:(1)有一个递归终止条件。(2)在求解问题规模为n的递归函数中,一
30、定要将问题规模分解成若干步骤与若干问题规模小于n的问题求解。(3)从逻辑上来讲,上述两点一定分属于一个选择结构中的两个分支,否则不能逻辑终止。例例7.13 求斐波那契(求斐波那契(Fibonacci)数列的)数列的第第12项。项。n斐波那契在算盘书中提出了一个有趣的兔子问题:一般兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?n拿新出生的一对小兔子分析一下:n第一个月小兔子没有繁殖能力,所以还是一对;n第二个月小兔变成了成兔,但是还没有生殖能力,所以还是一对n第三个月,即两个月后,老兔才生下一对小兔子,所以第三个月兔子总数共
31、有两对;n第四个月,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;n n根据兔子繁殖的规律,第n个月兔子对的数量为两个部分:第n-1个月兔子对的总数加上第n-2月兔子生出的新兔子对数。nFibonacci数列有如下公式。fib(1)=1fib(2)=1fib(n)=fib(n-1)+fib(n-2)n2时Fibonacci公式:公式:#include int fib(int n);/*函数说明*/void main(void)printf(%dn,fib(12);int fib(int n)if(n2)return fib(n-1)+fib(n-2);else if(n=1|n=
32、2)return 1;else return-1;例例7.14 编程求编程求1!+2!+3!+4!+12!的值。!的值。n递归解法#include long fact(int n)if(n=1)return 1;elsereturn(n*fact(n-1);void main()int i;long result=0;for(i=1;i=12;i+)result=result+fact(i);printf(%ldn,result);7.4 明文与密文明文与密文#include void encr(char mm80)int i;for(i=0;mmi!=0;i+)mmi=mmi198;/*加密
33、或还原*/void main()char mm80=2012.2.14&test;/*密码明文*/printf(明文:%sn,mm);encr(mm);/*明文加密成密文*/printf(密文:%sn,mm);运行结果:明文:2012.2.14&test密文:赧黥梏梓蜞玻挡n数组元素作函数实参数组元素作函数实参n数组元素就是下标变量,它与普通变量并无区别。如果它作为函数实参与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。例例7.16 判断整数数组中各元素的值,若大于判断整数数组中各元素的值,若大于0 则输出值本身,若小于等于则输出值本身,若小于等
34、于0则输出则输出0。#include void printdata(int v)/*形参的定义为普通整型数据*/if(v0)v=0;printf(%d,v);void main()int a5,i;printf(input 5 numbersn);for(i=0;i5;i+)scanf(%d,&ai);for(i=0;i5;i+)printdata(ai);/*将数组元素ai做为参数*/printf(n);for(i=0;i5;i+)printf(%d,ai);printf(n);input 5 numbers4 5 8-9-84 5 8 0 0 4 5 8-9-8数组名作为函数参数数组名作为
35、函数参数 n数组名作函数参数时,并不是把实参数组的每一个元素的值都赋予形参数组的各个元素。实际上形参数组并不存在,编译系统不为整个形参数组分配内存,只为形参分配一个内存用来存放该数组的地址。n数组名作函数参数时所进行的传送是将数组的首地址传送给形参,其实它也遵守同样的单向值传递的规则,也就是说把实参数组的首地址赋予形参数组名。n形参数组名取得该首地址之后,也就等于有了该数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。所以形参数组元素的改变也就是实参数组数组的改变。但在整个函数内部,实参只是数组的首地址,是常量,形参是存放了数组首地址的变量,可以在函数内部接受其他数组的首地址,
36、可以发生改变。例例7.17 数组a中存放了一个学生5门课程的成绩,设计函数求学生的平均成绩。#include float aver(float a5)int i;float av,s=0;for(i=0;i5;i+)s=s+ai;av=s/5;return av;void main()float sco5,av;int i;printf(input 5 scores:n);for(i=0;i5;i+)scanf(%f,&scoi);av=aver(sco);/*数组名做实参*/printf(average score is%.2fn,av);数组名作为函数参数的注意点:数组名作为函数参数的注意
37、点:(1)形参数组和实参数组的类型必须一致,否则将引起错误。(2)实参虽然能把数组首地址传给形参,但不能告知数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。所以通常另外设计一个参数用来表示数组的长度。例如,可以写为:void f(int a)或写为void f(int a,int n)/*参数n用来接收数组a的长度*/(3)多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,仅仅可省去第一维的长度。因此,以下写法都是合法的。int max(int a310)或int max(int a10)
38、7.5 内部函数和外部函数内部函数和外部函数n内部函数内部函数n如果有一个函数,只能被本源文件中的函数调用,而不能被其它源文件中定义的函数调用,这种函数称为内部函数。n在定义一个函数时,如果在函数类型前再加一个static关键字,那么这个函数就指定为内部函数,如下所示:static 函数类型 函数名(函数参数表)声明部分 语句部分n内部函数又称静态函数,请注意此处static的含义不是指存储方式,而是指函数的作用域仅局限于本源文件。n使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为内部函数会屏蔽同外部的联系。n外部函数n在定义函数时,如
39、果没有加关键字static,或冠以关键字extern,表示此函数是外部函数,这类函数是可以被其他源文件的函数所调用的。extern 函数类型 函数名(函数参数表)声明部分 语句部分n调用外部函数时,需要对其进行说明,格式如下:extern 函数类型 函数名(参数类型表);n例例7.18 file1.c,file2.c,file3.c,file4.c四个文件协同完成从键盘输入一个字符串,程序实现将字符串中指定的字符删去,然后输出修改后的字符串。n/*file1.c(文件1)*/#include#include extern void enter_string(char str);extern v
40、oid delete_string(char str,char ch);extern void print_string(char str);void main()char c;char str80;printf(请输入字符串n);enter_string(str);printf(请输入要删除的字符n);scanf(%c,&c);delete_string(str,c);printf(删除后的字符串n);print_string(str);getch();/*中断程序执行,等待用户敲入任意键再执行,让用户看清字符界面的信息*/n/*file2.c(文件2)*/#include void enter_string(char str80)gets(str);n/*file2.c(文件3)*/#include void delete_string(char str,char ch)int i,j;for(i=j=0;stri!=0;i+)if(stri!=ch)strj+=stri;strj=0;n/*file4.c(文件4)*/#include void print_string(char str)printf(%sn,str);程序执行结果:请输入字符串www.zhku.edu.con请输入要删除的字符O删除后的字符串作业作业n6、7、8、9、10