您好,欢迎访问三七文档
当前位置:首页 > 医学/心理学 > 药学 > C语言程序设计实用教程
书名:C语言程序设计实用教程ISBN:7-111-16742-2作者:陈方出版社:机械工业出版社本书配有电子课件第4章数组实际处理的数据,常常是一批批的,而不止是一个。比如,10个同学的年龄,它们都是整型数据,仍用前面的定义方法,可用下面语句说明:intage0,age1,age2,age3,age4,age5,age6,age7,age8,age9;这里写了10个age,比较麻烦。C语言提供了数组的表示方法:intage[10];数组是具有相同数据类型的变量的集合。各元素可独立地作为一个变量被赋值和使用。数组中每个特定元素都用下标来访问。数组可以是一维的也可以是多维的。4.1一维数组4.1.1一维数组的定义一维数组定义的一般形式为:类型说明符数组名[常量表达式];例如:inta[10];它表示数组名为a,有10个元素,每个元素都是整型,这10个元素是:a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]第4章数组说明:(1)数组名定义规则和变量名相同,遵循标识符定义规则。(2)常量表达式要用方括号“[]”括起来,不能用圆括号(下面用法不对:inta(0);)。(3)常量表达式表示元素的个数,即数组长度。(4)常量表达式中包括常量和符号常量,不能包含变量。C语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:intn;inta[n];(5)数组元素的下标从0开始,到(常量表达式-1)为止。因此在如上定义的数组中无a[10]元素。4.1.2一维数组元素的引用数组和其他变量一样必须先定义,后使用。C语言规定除字符数组外,只能逐个引用数组元素,而不能一次引用整个数组。第4章数组[例4-1]按顺序给数组的10个元素赋值,然后按逆序输出。程序如下:main(){inti,a[10];for(i=0;i=9;i++)a[i]=i;/*顺序给数组元素赋值*/for(i=9;i=0;i--)printf(%d,a[i]);/*逆序输出数组元素的值*/}程序运行结果:9876543210第4章数组4.1.3一维数组的初始化可以先定义数组,再给它的元素赋值,也可以在定义数组时给它赋值(称为数组的初始化)。对数组元素的初始化可以用以下方法实现:(1)在定义数组时对数组元素赋初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};将数组元素的初值依次放在一对花括弧内。上面的数组a经过初始化后得:a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。(2)可以只给一部分元素赋值。例如:inta[10]={0,1,2,3,4};定义a数组有10个元素,但花括弧只提供5个初值,这表示只给前5个元素赋初值,此时后5个元素值自动赋值为0。(3)在对全部数组元素赋初值时,可以不指定数组长度。例如:inta[5]={1,2,3,4,5};可以写成inta[]={1,2,3,4,5};在第2种写法中,花括弧中有五个数,系统就会据此自动定义数组a的长度为5。第4章数组[例4-2]用数组来处理求Fibonacci数列问题。main(){inti,f[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){if(i%5==0)printf(\n);/*每行输出5个数据*/printf(%8d,f[i]);}}程序运行结果:11235813213455891442333776109871597258441816765第4章数组[例4-3]用冒泡法对10个数排序(由小到大)。冒泡法的思路是:将相邻两个数比较,将小的调到前头。若有10个数:7,0,4,8,5,9,6,1,3,2。先进行第1趟比较,第1次将7和0对调,第2次将第2和第3个数(7和4)对调,如此共进行9次,得到0-4-7-5-8-6-1-3-2-(9)的顺序,可以看到:最大的数9已“沉底”,成为最下面的一个数。经第1趟(共9次比较)后,已得到最大的数9。然后进行第2趟比较,对前9个数按上法进行比较,经过8次比较,得到0-4-5-7-6-1-3-2-(8-9)的顺序;第3趟比较,得到0-4-5-6-1-3-2-(7-8-9)的顺序;第4趟比较,得到0-4-5-1-3-2-(6-7-8-9)的顺序;第5趟比较,得到0-4-1-3-2-(5-6-7-8-9)的顺序;第6趟比较,得到0-1-3-2-(4-5-6-7-8-9)的顺序;第7趟比较,得到0-1-2-(3-4-5-6-7-8-9)的顺序;已得到由小到大的顺序,第8、9趟比较不会改变顺序。共比较九趟,在第1趟中要进行两两比较9次(10-1),第2趟比较8次(10-2)……第9趟比较1次(10-9)。可以推知,如果有n个数,只要进行n1趟比较,在第j趟比较中要进行nj次两两比较。main(){inti,j,t;,a[10]={7,0,4,8,5,9,6,1,3,2};for(i=1;i=9;i++)/*外循环,比较9趟*/for(j=0;j10-i;j++)/*内循环,第i趟比较10-i次*/if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;i10;i++)printf(“%d”,a[i]);/*按已排好的次序输出*/}程序运行结果:0123456789第4章数组4.2二维数组4.2.1二维数组的定义二维数组定义的一般形式为类型说明符数组名[常量表达式1][常量表达式2]例如:floata[3][4];定义a为34(3行4列)的数组。注意:不能写成floata[3,4]。C语言中,二维数组中元素排列的排序是:按行存放,即在内存中先顺序存放第1行的元素,再存放第2行的元素。上面定义的数组元素在内存中的存储顺序是:第1行:a[0][0]a[0][1]a[0][2]a[0][3]第2行:a[1][0]a[1][1]a[1][2]a[1][3]第3行:a[2][0]a[2][1]a[2][2]a[2][3]注意:C语言中二维数组的行号、列号都是从0开始计数,与人们习惯的记法不同。如上述数组第2行第3列的元素为a[1][2],而不是a[2][3]。第4章数组4.2.2二维数组的引用二维数组的元素的表示形式为:数组名[下标][下标]例如:a[2][3]引用时注意:(1)使用数组元素时,注意下标值应在已定义数组大小的范围内。如数组a[n][m],数组元素由a[0][0]到a[n-1][m-1]共n*m个。(2)下标也可以是整型表达式,如a[2-1][2*2-1]。(3)数组元素可以出现在表达式中,也可以被赋值。例如:a[1][2]=a[2][3]/2。4.2.3二维数组的初始化可以用下面方法对二维数组初始化。(1)分行给二维数组赋初值。例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};第4章数组这种赋初值方法比较直观,将第1个花括弧内的数据赋给第1行的元素,将第2个花括弧内的数据赋给第2行的元素……,即按行赋初值。(2)将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};效果与第1种方法相同,但如果数据多,写成一大片,容易遗漏,也不易检查。第1种方法一行对一行,界限清楚。(3)可以对部分元素赋初值:①对各行中的某一元素赋初值:例如:inta[3][4]={{1},{5},{9}};初始化后的数组元素如下:100050009000这种方法对非0元素少时比较方便,不必将所有的0都写出来,只需输入少量数据。第4章数组②对某几行元素赋初值:inta[3][4]={{1},{5,6}};数组元素为:100056000000(4)第一维的长度可以不指定:①对全部元素赋初值时,定义时第一维的长度不指定,则第二维的长度不能省。例如:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};等价于:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};系统会根据数据总个数分配存储空间,一共12个数据,每行4列,可确定为3行。②分行赋初值定义时,可以只对部分元素赋初值而省略第一维的长度。例如:inta[][4]={{0,0,3},{},{0,10}};第4章数组[例4-5]有一个34的矩阵,编程序求出其中值最小的那个元素的值及其所在的行号和列号。[解]先用N-S流程图表示算法,如教材书上图4-2所示。据此写出以下程序:main(){inti,j,row=0,colum=0,min;inta[][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};/*第4种赋值方法*/min=a[0][0];for(i=0;i=2;i++)/*外循环*/for(j=0;j=3;j++)/*内循环*/if(a[i][j]min){min=a[i][j];row=i;colum=j;}printf(min=%d,row=%d,colum=%d\n,min,row,colum);}程序运行结果:min=-10,row=2,colum=0第4章数组4.3字符数组用来存放字符的数组是字符数组。字符数组中的一个元素存放一个字符。4.3.1字符数组的定义字符数组的定义形式为:char数组名[常量表达式];例如:charc[10];由于在C语言中字符型和整型可以通用,所以上面的定义又可以写为:intc[10];但一般用类型char定义。4.3.2字符数组的初始化(1)可以在定义字符数组时初始化各元素。例如:charc[10]={'I','','a','m','','h','a','p','p','y'};第4章数组(2)如果花括弧中提供的初值个数数组长度,则作语法错误处理;如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即‘\0’)。例如:charc[6]={'g','o','o','d'};此时c[4]和c[5]都为‘\0’。(3)如果初值个数与数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:charc[]={'g','o','o','d'};数组c的长度自动定为4。(4)二维字符数组也可以初始化。4.3.3字符数组的引用引用字符数组中的一个元素,可以得到一个字符。[例4-6]输出一个字符串。第4章数组程序如下:main(){charc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i10;i++)printf(%c,c[i]);/*依次引用字符数组的元素c[i]*/printf(\n);}程序运行结果:Iamaboy4.3.4字符串和字符串结束标志字符串的初始化:用字符串常量来初始化字符数组。例如:charc[11]={Iamhappy};或charc[]={Iamhappy};或charc[11]=Iamhappy;或charc[]=Iamhappy;注意:上述数组c包括8个字母、2个空格,但它长度不是10,而是11。因为字符串常量的最后由系统加上一个‘\0’。因此字符串初始化时,可以省略字符数组的长度,由系统自动匹配;如果要标出字符数组的长度,则应大于双引号内的实际各种字符的个数。第4章数组4.3.5字符数组的输入输出用%c(char)格式符可以逐个字符输入或输出,用的机会较少;在大多数情况下,我们采用整个字符串输入输出,用%s(string)格式符可以实现整个字符串的输入输出。(1)字符数组的输出——printf(%s)函数①可用printf来输出字符,输出字符不包括结束符‘\0’。②用%s格式符输出字符串时,printf函数中的输出项是字符数
本文标题:C语言程序设计实用教程
链接地址:https://www.777doc.com/doc-2908142 .html