您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 新版C语言程序设计(下)
数组是构造类型的数据。6-1一维数组的定义和引用定义方式:类型说明符数组名[常量表达式];如inta[5];数组引用时,只能引用数组的元素,而不能指望引用整个数组。数组元素的表示形式为:数组名[下标]main(){inti,a[10];for(i=0;i=10;i++)a[i]=i;for(i=9;i=0;i--)printf(”%d”,a[i]);}C中数组元素下标从0开始一维数组的初始化定义数组时对数组元素赋初值,如staticinta[10]={1,3,5,7,9,11,13,15,17,19};也可以staticinta[10]={1,3,5,7,9};//不赋值的元素初值为0。还可以这样staticinta[]={1,3,5,7,9};少于10个元素可以数组长度允许空缺一维数组程序举例冒泡法排序设有5个数排序:125625378562512783562578123567825123785625123大循环第1次第2次第3次第4次原数组第1次大循环后数组排序后的数组小循环(比较)4次3次2次1次程序如下:main(){inta[5],i,j,t;printf(”Input5numbers:\n”);for(i=0;i5;i++)scanf(”%d”,&a[i]);for(j=1;j=4;j++){for(i=1;i=5-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}for(i=0;i5;i++)printf(”\n%d”,a[i]);}大循环4次小循环元素上小下大则互换二维数组的定义的一般形式:类型说明符数组名[常量表达式][常量表达式]如floata[3][4];数组a共有12个元素,即a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3],在内存中的排列次序即如此,多维数组依此类推。二维数组的初始化staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};或staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};也可以staticinta[3][4]={{1,3,5,7},{9},{0,19,21}};还可以staticinta[][4]={{1,3,5,7},{},{17,19}};缺省的数组元素为0二维数组程序举例main(){staticinta[2][3]={{1,3,5},{7,9,11}};intb[3][2];inti,j;printf(”arraya:\n“);for(i=0;i=1;i++){for(j=0;j=2;j++){printf(”%5d“,a[i][j]);b[i][j]=a[i][j];}printf(“\n”);}二维数组程序举例(续)printf(”arrayb:\n“);for(i=0;i=2;i++){for(j=0;j=1;j++)printf(”%5d“,b[i][j]);printf(“\n”);}}十进制5位整数形式换行字符数组的每一个元素为字符.字符数组定义的形式:char数组名[常量表达式];可定义同时赋值:staticcharch1[6]={’H’,’e’,’l’,’l’,’o’,’!’};staticcharch1[]={’H’,’e’,’l’,’l’,’o’,’!’};staticcharch1[]={”Hello!”};/*用字符串常量给字符数组赋值,字符串结尾有一个特殊字符’\0‘,因而字符数组长度为7。*/字符数组的输出staticcharch1[]={”Hello!”};printf(”%s”,ch1);输出为Hello!//输出字符不包括结尾字符\0字符数组的输入staticcharch1[7];scanf(”%s”,ch1);//此时键入Hello!回车,注意不能超过6个字符,不足可以。数组名即地址字符串处理函数1输出一个字符串puts(字符数组名)staticintstring1[]={”China”};puts(string1);China2输入一个字符串gets(字符数组名)gets(string2);3字符串拷贝strcpy(字符数组1,字符数组2)strcpy(str1,str2);//将str2拷贝到str1字符数组str1的长度须大于等于str2。字符数组str1必须是字符数组名,而字符数组str2可以是字符数组名,也可以是字符串常量。如strcpy(str1,”China”);4字符串比较strcmp(字符数组1,字符数组2)strcmp(str1,str2);str1与str2均可是字符数组名或字符串常量。Strcmp函数的返回值是:str1=str2,则函数的返回值为0;str1str2,则函数的返回值为一个正整数;str1str2,则函数的返回值为一个负整数。7-1概述C语言的基本单位是函数。函数相当于其他语言中的子程序。一个C程序由一个主函数和若干个函数组成。一个函数中可以调用若干个函数,反之,一个函数可以被多个函数调用,调用次数不限。一个C源程序文件(***.c)是一个编译单位。一个C程序可由一个源程序文件或多个源程序文件组成。C程序的执行从main函数开始,在main函数结束,main函数由系统定义。函数与函数之间是平行的独立的,不能在一个函数中定义另一个函数(所谓嵌套定义)。函数可以互相调用(不能调用main函数),被调用的函数可以调用别的函数(嵌套调用),并可以调用自己。在程序设计中,常将一些常用的功能模块编写成函数,存放在函数库中(通常由软件厂商提供),函数库中的函数称为库函数。除了标准库函数外,很多软件公司还为用户提供许多实用的非标准的库函数。用户要尽可能熟悉库函数。从函数的参数形式看,可分为有参函数和无参函数。1无参函数的定义形式类型标识符函数名(){说明部分语句}//{}中称为函数体,若空缺,则为空函数。2有参函数的定义形式类型标识符函数名(形式参数表列)形式参数说明{说明部分语句}7-3-1形式参数和实际参数intsum(x,y)//x,y为形参intx,y;//形参说明{intz;z=x+y;return(z);}main(){inta,b,c;a=45;b=24;c=sum(a,b);//a,b为实参printf(“a=%d,b=%d,c=%d,\n”,a,b,c);}返回值函数的形参与函数的实参数据类型应一致。实参变量对形参变量的数据传递是单向的值传递。只是由实参将它的值传递给形参,而不能由形参传回给实参。函数调用时,系统给形参分配内存单元,调用结束后,形参单元被释放。实参在函数调用前后不会变化。ANSI新标准规定,形参说明可以类似PASCAL所用方法:intsum(intx,inty){…}形参表中作类型说明7-3-2函数的返回值函数的返回值是通过return语句获得的。定义函数时应指定函数的类型(如缺省,则约定为整型),函数的类型决定函数返回值的类型。函数中若没有return语句(系统会给一个警告),并不表示函数不带回返回值,而只是不带回一个用户所需要的、有用的函数值。如果明确函数不带回值,则须在定义函数时,在函数名前冠以void,表示空类型或无类型。如:如:voidputchar(c)charc;{……}7-4函数的调用7-4-1函数调用的一般形式无参函数调用:函数名();有参函数调用:函数名(实参表列);实参与形参须一一对应。例7-3-17-4函数的调用7-4-2函数调用方式按函数调用在程序中的位置来分,可分为1函数语句如getchar();2函数表达式如c=100+sum(a,b);3函数参数如printf(”%d\n”,sum(a,b));sum1=sum(c+sum(a,b);函数的返回值作为另一函数的参数7-4-3对被凋函数的说明若函数1调用函数2,我们通常称函数1为主调函数,函数2为被调函数。被调函数如果是库函数,则须在主调函数所在的源程序文件的开头用include命令包含相应的头文件(如includestdio.h)。7-4-3对被凋函数的说明被调函数如果是用户自己定义的函数,且被调函数与主调函数同在一个源文件中,则一般需在主调函数中对被调函数的类型作说明(被调函数定义在前,则可省)。说明的形式为类型标识符函数名();请注意它与函数调用语句的区别。函数调用语句前没有类型标识符7-5函数的嵌套调用被调函数也可以调用其他函数,层层嵌套,层数不限(例略)。7-6函数的递归调用函数直接或间接调用自己,称函数的递归调用。C语言中,允许有限次的有终止的递归调用。例如用递归的方法求n!或求xn就是递推的问题,只要n有限大,都能用函数的递归调用来求解。函数的递归调用的应用例-Hanoi塔问题设有三根针,名为A、B、C。在A针上放有n个大小不等的盘子(如图)。ABC要求将A针中的盘子搬到C针中去,规定每次只能搬动一个盘,可以借助于B针过渡,并必须保证每针中的盘,大盘在下,小盘在上。搬动过程ABC程序如下:voidmoveone(get1,put1)//搬一个盘函数charget1,put1;{printf(”%c-%c\n”,get1,put1);}voidhanoi(n,a,b,c)//搬n个盘函数chara,b,c;intn;{if(n==1)moveone(a,c);else{hanoi(n-1,a,c,b);moveone(a,c);hanoi(n-1,b,a,c);}}hanoi函数递归调用递归调用main(){intm;printf(”Inputthenumberofthediskes:\n”);scanf(”%d”,&m);printf(”Thesteptomoving%3ddiskes:\n”,m);hanoi(m,‘A’,’B’,’C’);}本程序运行情况如下:Inputthenumberofthediskes:3(回车)Thesteptomoving3diskes:调用hanoi函数A--CA--BC--BA--CB--AB--CA--C数组作为函数参数是指数组名和数组的元素作函数参数。数组的元素作函数(实际)参数与变量作函数参数用法一样,是实参向形参的单向的数值传递。数组名可以作函数的形参和实参。请看程序例:有一个名为score的一维数组,存放某班30位同学的某课成绩,求全班平均成绩。Exa771.c请注意,数组名作函数参数时,不是单向的(实参到形参)值传递,而是实参数组的起始地址(数组名即数组的起始地址)传递给形参数组,使两个数组共同占有一段内存。因而,函数调用前后,实参数组是有可能被调用所改变的。从变量的作用域来区分,变量分为局部变量和全局变量。函数内部定义的变量称为局部变量,它只在本函数内有效。在本函数外即无效,即不能在本函数外使用。函数的形式参数同于局部变量,也只在本函数内有效。不同函数中允许使用同名的变量(如常用的i、j、n等)。我们在此前举例中多为局部变量。在函数以外定义的变量称为外部变量,也称全局变量。全局变量为本程序文件的各函数所共用。它的使用范围是从变量被定义开始到程序结束。例7-8-1求10个学生成绩(一个一维数组)的平均值、最高分和最低分。floatmax=0,min=0;//定义两个全局变量floataverage(floatarray[],intn){inti;floataver,sum=array[0];max=min=array[0];for(i=1;in;i++){if(array[i]max)max=array[i];elseif(array[i]min)min=array[i];sum=sum+array[i];}数组作函数参数例7-8-1续aver=sum/n;re
本文标题:新版C语言程序设计(下)
链接地址:https://www.777doc.com/doc-3114948 .html