




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三 项目名称:循环结构程序设计 实验目的实验目的1、熟练掌握、熟练掌握for语句的使用;语句的使用;2、熟练掌握、熟练掌握break语句与语句与continue语句语句的使用;的使用;3、能够用循环实现一些常用算法;、能够用循环实现一些常用算法;4、循环嵌套的应用。、循环嵌套的应用。 实验四:项目名称:数组实验目的实验目的1、熟练掌握一维数组、二维数组定义、赋值和输入输出方法;2、熟练掌握字符数组和字符串函数的使用;3、掌握有关数组的一些常用算法; 实验内容:习题6.5,6.13,6.15实验目的实验目的1 1、掌握函数的定义方法;、掌握函数的定义方法;2 2、掌握函数的调用及函数声明;、
2、掌握函数的调用及函数声明;3 3、掌握局部变量和全局变量的使用。、掌握局部变量和全局变量的使用。实验内容实验内容1 1、习题、习题7.37.3;2 2、习题、习题7.87.8;3 3、习题、习题7.187.18;(选做);(选做)4 4、找出以下程序的正确运行结果,并对结果进、找出以下程序的正确运行结果,并对结果进行分析行分析实验五项目名称:函数#define MAX 10int aMAX,i;main()() printf(“n”););sub1();sub3(a););sub2();();sub3(a););sub2()() int aMAX,i,max;max = 5;for(i = 0
3、;i max;i + +)ai = i;sub1()() for(i = 0;i MAX;i + +)ai = i + i;sub3(int a) int i;for(i = 0;i MAX;i + +)printf(%d,ai););printf(n);实验六 指针和结构体实验内容:实验内容:第八章习题:第八章习题:8.6(要求预习报告)(要求预习报告)第九章习题:第九章习题:9.5第七章 用函数实现模块化程序设计秦丹阳秦丹阳黑龙江大学电子工程学院黑龙江大学电子工程学院通信工程系通信工程系TEL: 86608943E-mail: 7.17.1 为什么要用函数为什么要用函数模块化程序设计模块化
4、程序设计v基本思想:将一个大的程序按功能分割成一基本思想:将一个大的程序按功能分割成一些小模块些小模块, ,每个模块用来实现一个特定的功能。每个模块用来实现一个特定的功能。v特点:特点:l各模块相对独立、功能单一、结构清晰、各模块相对独立、功能单一、结构清晰、接口简单接口简单l控制了程序设计的复杂性控制了程序设计的复杂性l提高元件的可靠性提高元件的可靠性l缩短开发周期缩短开发周期l避免程序开发的重复劳动避免程序开发的重复劳动l易于维护和功能扩充易于维护和功能扩充v开发方法开发方法: : 自上向下自上向下, ,逐步分解,分而治之逐步分解,分而治之C是模块化程序设计语言是模块化程序设计语言程序中函
5、数调用示意图#include /*8-1.c*/int main() void printstar();/*对对printstar函数进行声明函数进行声明*/void print_message(); /*对对print_message函数进行声明函数进行声明*/printstar(); /*调用调用printstar函数函数*/print_message();/*调用调用print_message函数函数*/printstar();return 0;/*调用调用printstar函数函数*/void printstar()/*定义定义printstar函数函数*/printf(“*n”);v
6、oid print_message() /*定义定义print_message函数函数*/ printf(“ How do you do! n”);* How do you do!*函数说明函数说明一个一个C C程序是由一个或多个程序模块组成,每程序是由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。一个源程一个程序模块作为一个源程序文件。一个源程序文件可以为多个序文件可以为多个C C程序共用。程序共用。每个源程序文件由若干函数组成。每个源程序文件由若干函数组成。 一个源程一个源程序文件是一个编译单位。序文件是一个编译单位。C C程序的执行程序的执行从从mainmain函数开始函数开
7、始,也从,也从mainmain函数函数终止。终止。必须有且必须有且只能有一个名为只能有一个名为mainmain的主函数的主函数源程序中所有的函数在结构上都是平行的,即源程序中所有的函数在结构上都是平行的,即在定义函数时是分别进行的,互相独立的。在定义函数时是分别进行的,互相独立的。一个函数并不从属于另一个函数,即函数不能一个函数并不从属于另一个函数,即函数不能嵌套定义。嵌套定义。mainmain函数可以调用其他函数,其他函数之间可函数可以调用其他函数,其他函数之间可以互相调用。以互相调用。mainmain函数是系统调用的函数是系统调用的。函数分类函数分类v从用户角度从用户角度l标准函数(库函数
8、):由系统提供,用户不用定义,标准函数(库函数):由系统提供,用户不用定义,可以直接使用可以直接使用l用户自定义函数:用以解决用户专门需要的函数用户自定义函数:用以解决用户专门需要的函数v从函数形式从函数形式l无参函数无参函数在调用无参函数时,主调函数不向被调用函数传在调用无参函数时,主调函数不向被调用函数传递数据。一般用来执行指定的一组操作。递数据。一般用来执行指定的一组操作。l有参函数有参函数 在调用函数时,主调函数在调用被调用函数时,在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据。通过参数向被调用函数传递数据。使用库函数应注意:1、函数功能2、函数参数的数目和顺序
9、,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件void printstar() void print_message()int max(int x,int y)7.27.2 怎么定义函数怎么定义函数7.2.1 7.2.1 为什么要定义函数为什么要定义函数v定义函数应包括的内容定义函数应包括的内容l指定函数的名字,以便以后按名调用指定函数的名字,以便以后按名调用l指定函数的类型,即函数返回值的类型指定函数的类型,即函数返回值的类型l指定函数参数的名字和类型,以便在调用时指定函数参数的名字和类型,以便在调用时向它们传递数据向它们传递数据l指定函数功能指定函数功能int max(
10、int x,int y)7.2.2 7.2.2 定义函数的方法定义函数的方法v定义无参函数定义无参函数合法标识符函数返回值类型缺省int型无返回值void函数体函数类型 函数名()声明部分语句部分函数类型 函数名(void)声明部分语句部分例 无参函数 void printstar( ) printf(“*n”); 或 void printstar(void ) printf(“*n”); v定义有参函数定义有参函数合法标识符函数返回值类型缺省int型无返回值void函数体函数类型 函数名(形式参数列表)声明部分语句部分例 有参函数 int max(int x,int y) int z; z=
11、xy?x:y; return(z); 例 有参函数 int max(int x, y) int z; z=xy?x:y; return(z); v定义空函数定义空函数函数类型 函数名()例 空函数 void dummy( ) 函数体为空#include /*1-3.c*/int main() int max(int x, int y); int a, b, c; scanf(“%d, %d”, &a, &b); c = max(a, b); printf(“max = %dn”, c); return 0;输入:4,6输出:6int max(int x, int y)int z
12、;if(x y) z = x;else z = y;return(z); 求最大值函数函数类型 函数名(形参表)形参类型说明说明部分语句部分传统风格:例 有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 7.37.3 调用函数调用函数7.3.1 7.3.1 函数调用的形式函数调用的形式v函数调用的一般形式函数调用的一般形式 函数名函数名( (实参表列实参表列) )说明:说明:l若调用无参函数,则实参表为空,但括号若调用无参函数,则实参表为空,但括号不能省略不能省略l若实参表列包含多个实参,则各参数间用若实参表列包含多个实参
13、,则各参数间用逗号隔开。逗号隔开。l实参与形参实参与形参个数相等个数相等,类型一致类型一致,按顺序按顺序一一对应一一对应l实参表求值顺序,因系统而定(实参表求值顺序,因系统而定(Turbo C Turbo C 自右向左自右向左)void printstar( ) void main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);int max(int x, int y) int z; z=xy?x:y; return(z);void main()/*8
14、-7.c*/ int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例 参数求值顺序void main() int i=2,p; p=f(i, i+); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);运行结果:0运行结果:1调用方式调用方式v函数调用语句:把函数调用单独作为一个语句函数调用语
15、句:把函数调用单独作为一个语句 例例 printstar();printstar(); printf(“Hello,World!n”); printf(“Hello,World!n”);v函数表达式:函数调用出现在另一个表达式中函数表达式:函数调用出现在另一个表达式中 例例 m=max(a,b)m=max(a,b)* *2;2;v函数参数:函数参数:函数调用作为另一个函数调用时的实参函数调用作为另一个函数调用时的实参 例例 printf(“%d”,max(a,b);printf(“%d”,max(a,b); m=max(a,max(b,c); m=max(a,max(b,c); 说明说明: :
16、调用函数不一定要求包括分号调用函数不一定要求包括分号7.3.2 7.3.2 函数调用时的数据传递函数调用时的数据传递v形式参数和实际参数形式参数和实际参数l形式参数:定义函数时函数名后面括号中的形式参数:定义函数时函数名后面括号中的变量名。简称变量名。简称“形参形参”l实际参数:在主调函数中调用一个函数时,实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数或表达式。简称函数名后面括号中的参数或表达式。简称“实参实参”v实参和形参间的数据传递(虚实结合)实参和形参间的数据传递(虚实结合)l在调用函数过程中,系统会把实参的值传递在调用函数过程中,系统会把实参的值传递给被调用函数的形参给被
17、调用函数的形参l该值在函数调用期间有效,可以参加该函数该值在函数调用期间有效,可以参加该函数中的运算中的运算c=max(a,b);(main 函数) (max 函数)int max(int x, int y) int z; z=xy?x:y; return(z); 【例例7.2】输入两个整数,要求输出其中值较大者,要求用函数实现输入两个整数,要求输出其中值较大者,要求用函数实现int main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c); retur
18、n 0;int max(int x, int y) int z; z=xy?x:y; return(z);形参实参对max函数的声明定义有参函数maxv说明:说明:l实参可以是常量、变量或表达式,但必须实参可以是常量、变量或表达式,但必须有确定的值。在调用时将实参的值赋给形参有确定的值。在调用时将实参的值赋给形参l形参必须指定类型形参必须指定类型l形参与实参形参与实参类型一致,个数相同类型一致,个数相同l若形参与实参类型不一致,自动按形参类若形参与实参类型不一致,自动按形参类型转换型转换函数调用转换函数调用转换如:如:max(3,a+b)7.3.3 7.3.3 函数调用过程函数调用过程v形参在
19、未被调用时,不占内存中的存储单元形参在未被调用时,不占内存中的存储单元v在发生函数调用时,形参被临时分配内存单元在发生函数调用时,形参被临时分配内存单元v将实参对应的值传递给形参将实参对应的值传递给形参v在执行被调用函数期间,由于形参已经有值,在执行被调用函数期间,由于形参已经有值,可以利用形参进行相关的运算可以利用形参进行相关的运算v通过通过returnreturn语句将函数值带回到主调函数。若语句将函数值带回到主调函数。若函数不需要返回值,则不需要函数不需要返回值,则不需要returnreturn语句语句(voidvoid)v调用结束,形参内存调用结束,形参内存 单元被释放。单元被释放。c
20、=max(a,b);(main 函数) (max 函数)int max(int x, int y) int z; z=xy?x:y; return(z); 例 计算x的立方#include /*8-2.c*/float cube(float x) return(x*x*x);void main() float a, product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct28参数
21、传递方式参数传递方式v值传递值传递方式方式l方式:函数调用时方式:函数调用时, ,为形参分配单元为形参分配单元, ,并将实并将实参的值参的值复制复制到形参中;调用结束,形参单元到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值被释放,实参单元仍保留并维持原值l特点:特点:u形参与实参占用形参与实参占用不同不同的内存单元的内存单元u单向单向传递(实参传递(实参-形参)形参)711x:y:调用前:调用结束:711x:y:例 交换两个数/*8-3.c*/#include void main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(sw
22、apped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:temp#include /*8-4.c*/ long sum(int a, int b); long factorial(int n);void main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(i
23、nt a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long rtn=1; int i; for(i=1;iy?x:y; return(z); void main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);int max(int x, int y) int z; z=xy?x:y; return(z);v说明:说
24、明:l函数中可有多个函数中可有多个returnreturn语句语句l如果不需要从被调函数带回函数值可不要如果不需要从被调函数带回函数值可不要returnreturn语语句句lreturnreturn语句后面的括号可以不要;语句后面的括号可以不要;returnreturn后面的值后面的值可以是一个表达式。可以是一个表达式。l若无若无returnreturn语句,遇语句,遇 时,自动返回调用函数时,自动返回调用函数l在定义函数时需指定函数值的类型,如无函数类型在定义函数时需指定函数值的类型,如无函数类型说明,则自动按整型处理。说明,则自动按整型处理。l函数类型要与函数类型要与returnretur
25、n语句中的表达式类型一致。语句中的表达式类型一致。若若函数类型与函数类型与returnreturn语句中表达式值的类型不一致,按语句中表达式值的类型不一致,按前者为准,自动转换前者为准,自动转换-函数调用转换函数调用转换l不带回值的函数,应当用不带回值的函数,应当用voidvoid定义函数为无类型定义函数为无类型(空类型),此时函数体中不得出现(空类型),此时函数体中不得出现returnreturn语句。语句。例 无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; int max(int x, int y) return
26、xy?x:y;例 函数返回值类型转换void main()/*8-6.c*/ int max(float x, float y) float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);int max(float x, float y) float z; z=xy?x:y; return(z); printstar()/*8-5.c*/ printf(*);void main() int a; a=printstar(); printf(%d,a);例 函数带回不确定值输出:10void pr
27、intstar() printf(*);void main() int a; a=printstar(); printf(%d,a);编译错误!对被调用函数要求:对被调用函数要求:v必须是必须是已经定义已经定义的函数的函数v若使用库函数若使用库函数: : #include #include .hv用户自定义函数用户自定义函数: :若该函数的位置在主调函数后若该函数的位置在主调函数后面时,在主调函数中对被调用面时,在主调函数中对被调用函数函数作声明作声明7.47.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型【例例7.47.4 】 输入两个实数,用一个函数求出它们之和输入两个实数,
28、用一个函数求出它们之和main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函数可不作函数说明(Borland C+不行)/*ch7_5.c*/float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b);
29、printf(sum is %f,c);被调函数出现在主调函数之前,不必函数说明/*8-8.c*/int main() float add(float x,float y); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c); return 0;float add(float x, float y) float z; z=x+y; return(z);float add(float,float);v函数声明函数声明l一般形式:一般形式:函数类型函数类
30、型 函数名函数名( (形参类型形参类型1 1 形参名形参名1,1,形参类型形参类型2 2 形参名形参名2 2 ,);); 或或函数类型函数类型 函数名函数名( (形参类型形参类型1 1,形参类型,形参类型2 2,););l作用:告诉编译系统作用:告诉编译系统函数类型、参数个数及类型,函数类型、参数个数及类型,以便检验以便检验l函数定义函数定义与与函数声明函数声明不同(;)不同(;)l函数声明位置:函数声明位置:程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)l下列情况下,可不作函数下列情况下,可不作函数声声明明u若函数返值是若函数返值是charchar或或intint型型,系统
31、自动按,系统自动按intint型处理型处理u被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前u文件开头已对本文件中所调用的函数进行了声明文件开头已对本文件中所调用的函数进行了声明l有些系统要求函数声明指出函数返值类型和形参类有些系统要求函数声明指出函数返值类型和形参类型,并且对型,并且对void void 和和 int int 型函数也要进行函数型函数也要进行函数声声明明void main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);
32、int max(int x, int y) int z; z=xy?x:y; return(z);7.57.5 函数的嵌套调用函数的嵌套调用C C规定:规定:函数定义不可嵌套函数定义不可嵌套,但,但可以嵌套可以嵌套调用调用函数函数main( )调用函数a结束a函数b函数调用函数b例 求三个数中最大数和最小数的差值#include /*8-9.c*/ int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&am
33、p;a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数【例7.5】输入4个整数,找出其中最大
34、的数。用函数的嵌套调用处理#include int main()int max4(int a,int b,int c,int d);int a,b,c,d,max;printf(please enter 4 interger numbers:);scanf(%d %d %d %d,&a,&b,&c,&d);max=max4(a,b,c,d);printf(max=%dn,max);return 0;int max4(int a,int b,int c,int d)int max2(int a,int b);int m;m=max2(a,b);m=max2(m,c
35、);m=max2(m,d);return(m); int max2(int a,int b)if(a=b)return a;elsereturn b;定义:函数直接或间接的调用自身叫函数的递归调用定义:函数直接或间接的调用自身叫函数的递归调用f( )调调f调调f2调调f1f1( )f2( )v说明说明lC C编译系统对递归函数的自调用次数没有限制编译系统对递归函数的自调用次数没有限制l每调用函数一次,在内存堆栈区分配空间,用于存放函数变每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出量、返回值等信息,所以递归次数过多,可能引起堆栈溢出in
36、t f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);7.6 函数的递归调用函数的递归调用例 求n的阶乘) 1()!1() 1 , 0(1!nnnnn/*ch7_8.c*/#include int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; retu
37、rn(f);main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);7.77.7 数组作为函数参数数组作为函数参数(5.6)(5.6)7.7.1 7.7.1 数组元素作函数实参数组元素作函数实参值传递值传递【例7.9】 输入10个数,要求输出其中值最大的元素和该数是第几个数.定义一个数组a,长度为10,用来存放10个数.设计一个函数max,用来求两个数中的大者.主函数中定义一个变量m,用来存放max函数返回值#include int main( ) i
38、nt max(int x,int y); int a10,i,n,m; printf(Enter 10 integer numbers:); for(i=0;i10;i+)scanf(%d,&ai); printf(n); for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“the largest number is %dn”,m); printf(“ it is the %dthnumber.n”, n+1); return 0;int max(int x,int y) return(xy?x:y);例 两个数组大小比较(5.7)432105
39、a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b为有10个元素的整型数组比较两数组对应元素变量n,m,k记录aibi, ai=bi,aik,认为数组ab 若nk,认为数组ab 若n=k,认为数组a=b#include /*8-11.c*/void main() int a10,b10,i,n=0,m=0,k=0; printf(Enter array a:n); for(i=0;i10;i+)scanf(%d,&ai); pri
40、ntf(Enter array b:n); for(i=0;i10;i+)scanf(%d,&bi); for(i=0;iy) flag=1; else if(xy) flag=-1; else flag=0; return(flag);7.7.2 数组名作函数参数数组名作函数参数v地址传递:地址传递:传递的是数组首元素的地址传递的是数组首元素的地址v在主调函数与被调函数分别定义数组在主调函数与被调函数分别定义数组,且类型且类型应一致应一致v形参数组大小形参数组大小(多维数组第一维多维数组第一维)可不指定可不指定v形参数组名是形参数组名是地址变量地址变量【例例7.10】有一个一维数组有
41、一个一维数组score,内放内放10个学生成绩个学生成绩,求平均成绩求平均成绩 #include /*8-12.c*/ int main() float average(float array10); float score10, aver; int i; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%f, &scorei); printf(n); aver=average(score); printf(Average is:%5.2f, aver); return 0; float average(float array1
42、0) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum = sum + arrayi; aver = sum/10; return aver; 实参用数组名实参用数组名形参用数组定义形参用数组定义, float array .2109score562312.88arrayv地址传递:地址传递:传递的是数组首元素的地址传递的是数组首元素的地址v在主调函数与被调函数分别定义数组在主调函数与被调函数分别定义数组,且类型且类型应一致应一致v形参数组大小形参数组大小(多维数组第一维多维数组第一维)可不指定可不指定v形参数组名是形参数组名是地址变量
43、地址变量例 求学生的平均成绩(形参数组长度可变).2109score562312.88array #include /*8-13.c*/ void main() float average(float array10, int n); float array10,aver; int i; printf(Input 10 scores:n); for( i=0; i10; i+ )scanf(%f, &arrayi); aver=average(array,10); printf(Average is:%.2f, aver); #include /*8-13.c*/ void main(
44、) float average(float array, int n); float array_16,aver_1; float array_25,aver_2; int i; printf(Input 6 scores:n); for( i=0; i6; i+ )scanf(%f, &array_1i); aver_1=average(array,6); printf(Input 5 scores:n); for( i=0; i5; i+ )scanf(%f, &array_2i); aver_2=average(array,5); printf(Average of ar
45、ray1 is:%.2f, aver_1); printf(Average of array2 is:%.2f, aver_2); float average(float array, int n) int i; float aver,sum=0; for( i=0; in; i+ ) sum += arrayi; aver = sum/n; return aver; 例 数组元素与 数组名 作函数参数比较12a调用前a0a112a调用a0a112xy21xy交换12a返回#include void swap2(int x,int y) int z; z=x; x=y; y=z;void ma
46、in() int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值传递12a调用前12ax调用21ax交换21a返回#include void swap2(int x) int z; z=x0; x0=x1; x1=z;void main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1);地址传递例 数组元素与 数组名 作函数参数比较【例7.12】 用选择法对数组中10个整数按由大到小排序排序过程:排序过程:(1)首先通过)首先通过n-1次比较,从次比较,从n个数中找出最小的,个数中找出最小
47、的, 将它与第一个数将它与第一个数 交换交换第一趟选择排序第一趟选择排序,结果,结果最小最小的数被安置在第一个元素位置上的数被安置在第一个元素位置上(2)再通过)再通过n-2次比较,从剩余的次比较,从剩余的n-1个数中找出关键字个数中找出关键字次小次小的记录,的记录, 将它与第二个数交换将它与第二个数交换第二趟选择排序第二趟选择排序(3)重复上述过程,共经过)重复上述过程,共经过n-1趟排序后,排序结束趟排序后,排序结束例初始: 49 38 65 97 76 13 27 kji=11349一趟: 13 38 65 97 76 49 27 i=22738二趟: 13 27 65 97 76 49
48、 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 49 65 76 97 kkkkjjjjjjjjjj/*7-5.c*/#include void main() int a10,i,j,k,x; printf(Input 10 numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for(i=0;i9;i+) k=i; for(j=i+1;j10;j+) if(ajak) k=j; if(i!=k)
49、x=ai; ai=ak; ak=x; printf(The sorted numbers:n); for(i=0;i10;i+)printf(%d ,ai);例 数组排序-简单选择排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; void main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a
50、,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例 数组排序-简单选择排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; void main() int a10,i; for(i=0;i10;i+)sca
51、nf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=10123456789a9132732495768768899arrayi=8例 数组排序-简单选择排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; a
52、rrayi=arrayk; arrayk=t; void main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);【例7.13】 有一个3*4的矩阵,求所有元素中的最大值1 3 5 72 4 6 815 17 34 12ijmax=11 3 5 72 4 6 815 17 34 12ijmax=31 3 5 72 4 6 815 17 34 12ijmax=5j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72
53、 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=34int max_value(int array34) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);void main() int a34=1,3,5,7, 2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);多维形参数组第一维维数可省略,第二维必须相同 int array47.7.3 7.7.3 多维数
54、组名作函数参数多维数组名作函数参数例 求二维数组中各行元素之和get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0;for(j=0;jcol;j+) resulti+=xij; void main() int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);
55、314679asum_rowxresult18127.87.8 局部变量和全局变量局部变量和全局变量从变量的作用域(空间)角度来分,变量可以分为从变量的作用域(空间)角度来分,变量可以分为全局变量和局部变量全局变量和局部变量.1局部变量局部变量-内部变量内部变量v定义:在定义:在函数内定义函数内定义,只在本函数内有效只在本函数内有效v说明:说明:lmainmain中定义的变量只在中定义的变量只在mainmain中有效中有效l不同函数中同名变量,占不同内存单元不同函数中同名变量,占不同内存单元l形参属于局部变量形参属于局部变量l可定义在复合语句中有效的变量可定义在复合语句中有效的
56、变量float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效例 不同函数中同名变量void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例 复合语句中变量#define N 5main() int i; int aN=1,2,3
57、,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);运行结果:5 4 3 2 1例 复合语句中变量#define N 5/*8-15.c*/main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);例 不同函数中同名变量void main()/*8-16.c*/ int a,b; a=
58、3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=.2全局变量全局变量-外部变量外部变量v定义:定义: 在在函数外定义函数外定义,可为,可为本文件所有函数共用本文件所有函数共用v有效范围:有效范围: 从从定义变量的位置开始定义变量的位置开始到本源文件结束到本源文件结束int p=1,q=5;float f
59、1(int a) int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .c1,c2的作用范围p,q的作用范围 应尽量少使用全局变量,因为:Y全局变量在程序全部执行过程中占用存储单元Y降低了函数的通用性、可靠性,可移植性Y降低程序清晰性,容易出错l说明:说明:u设置全局变量的作用是增加函数间数据联设置全局变量的作用是增加函数间数据联系的渠道。系的渠道。u若外部变量与局部变量同名,则在局部变若外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被屏蔽量的作用范围内,外部变量被屏蔽,不起作用。不
60、起作用。float max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayib?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);运行结果:max=8/*8-18.c*/int i;main() void prt(); for(i=0;i5;i+) prt();void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);例 外部变量副作用运行结果:*练习#include int x=5,y=6;void fun1()int x=3,y=4;printf(%d,%dn,x,y);void fun2(int x,int y)printf(%d,%dn,x,y);int main()fun1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西安烟囱拆除合同协议书
- 交易协议书合同模板下载
- 快递招商合同协议书范本
- 餐饮股份6人合同协议书
- 嵌入式系统用户环境分析试题及答案
- 农村房子买卖合同协议书
- 计算机一级WPS使用技巧试题及答案
- C语言逻辑思维与编程技巧提升试题及答案
- 河南省郑州市第四十八中学2016届九年级数学上学期第一次月考试题(无答案) 北师大版
- 房屋出售合同协议书图片
- YOLO目标检测算法的改进与优化
- 《液相色谱-质谱联用》课件
- 大数据与商业决策的应用试题及答案
- 学做卤菜签合同协议
- GB/T 15340-2025天然、合成生胶取样及其制样方法
- 公路法知识培训课件
- 《乡土中国》课件统编版高一语文必修上册
- 马拉松方案策划
- 2025年全国青少年禁毒知识竞赛题库及答案(中学生组)
- 毕业设计(论文)-基于PLC的自动上料系统设计
- 武装部面试题及答案
评论
0/150
提交评论