您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 编程语言基础-C语言--第5章-数组
第五章数组•在C语言中,数组是一种构造类型,即它是由基本类型数据按照一定规则组成的新类型.•数组中每个值的类型必须与数组的类型相同,使用数组名和下标来唯一确定数组中的元素。5.1一维数组的定义和使用•5.1.1一维数组的定义类型说明符数组名[常量表达式];例如:inta[10];/*数组名为a,有10个int类型元素*/doublescores[50*2];/*数组名为scores,有100个double元素*/定义数组时需要注意以下几个问题:•数组名命名规则和变量名相同,应遵循标识符命名规则;•常量表达式表示数组元素的个数(即数组的长度),在定义数组时必须指定该值。•引用元素时下标从0开始。•常量表达式中可以包括常量和符号常量,但不能包含变量。•数组元素在内存中是连续存放的,数组名本身表示内存的首地址。5.1.2一维数组元素的引用•C语言规定只能逐个引用数组元素而不能一次引用整个数组。•数组元素的表示形式为:数组名[下标];例如:inta[10];a数组的10个元素分别是:a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。例6-1输入10个学生的成绩并求总分。main(){inti;floatscores[10],sum=0;for(i=0;i10;i++){scanf(%f,&scores[i]);sum+=scores[i];}printf(sum=%.2f,sum);getch();}运行结果如下:56678446819032556392sum=66.605.1.3一维数组的初始化1.对全部元素赋值。例如:inta[10]={1,2,3,4,5,6,7,8,9,10};2.只对部分元素赋值。例如:inta[10]={1,2,3,4,5};3.如果在{}中指定了所有元素的值,则数组的长度可省略不写。例如:inta[10]={1,2,3,4,5,6,7,8,9,10};可改写为:inta[]={1,2,3,4,5,6,7,8,9,10};例6-2输出Fibonacci序列的前10个数。main(){inti;inta[10]={1,1};/*序列的第1,2个数值为1*/for(i=2;i10;i++)/*从第3个数开始,按规律求值*/a[i]=a[i-1]+a[i-2];for(i=0;i10;i++)printf(%4d,a[i]);getch();}运行结果如下:112358132134555.2.1二维数组的定义及引用•二维数组的定义方式为:数组名[行标][列标]注意:数组下标从0开始,因此行标范围是0~M-1,列标范围是0~N-1。例如:#defineM3#defineN5intc[M][N];定义了二维数组c,它是一个具有M行N列的二维数组,共有M×N个元素。C采用行优先的方式来存储二维数组,即先在内存中顺序存储第一行(行标为0)的元素,再存放第二行的元素,依此类推。5.2.2二维数组的定义及引用1.分行全部赋值。例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2.分行部分赋值。例如:inta[3][4]={{1,2},{5},{9,10,11}};3.按一维数组形式赋值。例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};4。如果对全部元素赋值(无论是一维形式还是分行形式),则定义数组时可省略第一维长度,但第二维长度不能省略。例如:inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};例6-3输入一个3*4矩阵,找出矩阵中负数的个数并输出。main(){inta[3][4];inti,j,count=0;printf(inputmatrix:\n);for(i=0;i3;i++)for(j=0;j4;j++){scanf(%d,&a[i][j]);if(a[i][j]0)count++;}printf(thenumberofnegativeis%d,count);getch();}5.3字符数组的定义和使用5.3.1字符数组的定义及元素引用字符数组的定义类似于前面所介绍的数组定义,例如:chars[10];5.3.2字符数组的初始化chars1[10]={'f','a','s','h','i','o','n'};该定义只对前8个元素赋值,后2个元素为零值(即ASCII码为0的字符)。它在内存中的表示如图5-4所示。fashion\0\0•由于采用字符串常量的方式对字符数组初始化时,系统会系统增加一个‘\0’,因此对于语句:chars2[]=fashion;•系统将认为数组s的长度是7,占8个字节。该数组在内存中的表示如:上述语句等价于:chars2[8]={'f','a','s','h','i','o','n'};fashion\05.3.3字符数组的输入输出•同其他类型的数组一样,字符输出的输入与输出可以逐个元素进行处理。例如:chars[10];for(i=0;i10;i++)scanf(“%c”,&s[i]);for(i=0;i10;i++)printf(“%c”,s[i]);•由于字符数组可以按照字符串形式处理,因此在输入输出时可以使用格式符“%s”整体进行。例如:chars[10]=“hello!”;printf(“%s”,s);•输出时,系统检测到结束标志‘\0’即停止输出,因此输出结果为:hello!•以“%s”输出时需要注意,该格式表示输出字符串,因此在输出项中应该写数组名,而不能使用数组元素的形式,即语句:printf(“%s”,s[0]);这种形式是不对的。•输入时,系统遇到第一个‘\0’即停止输出,即使该字符后仍有其他字符。例如:chars[10]=“hello!\0ab”;printf(“%s”,s);•输出结果为:hello!•使用scanf进行字符串输入时,系统以空格或回车作为一个字符串的输入结束标志。使用gets函数或puts函数对字符数组进行整体输入与输出。•在使用gets函数或puts函数之前,应包含头文件“stdio.h”。使用gets函数对字符数组进行整体输入格式:gets(字符数组名)作用:从键盘上输入一个字符串赋给该数组。例如:chars[20];gets(s);若从键盘上输入:thankyou此时字符数组s的值为字符串“thankyou”。使用puts函数对字符数组进行整体输出格式:puts(字符数组名)或:puts(字符串常量)作用:将一个字符数组或字符串输出。例如:charstr[20]={OneTwo\0Three};printf(%s,str);puts(str);puts(thankyou!\0abc);5.3.4字符串处理函数•C语言的函数库中提供了许多字符串的处理函数(头文件为string.h),使用户能够方便地处理字符串。•这里介绍一些常用的函数如下:求串长函数strlen(s)、串复制函数strcpy(s1,s2)、串连接函数strcat(s1,s2)、串比较函数strcpy(s1,s2)。•说明:其中的参数是符合指定要求的字符串数据。1.strlen(字符数组)•作用:计算字符串s的长度,即首次出现'\0'之前的字符个数。•参数要求:字符串s既可以是字符串常量,也可以是字符数组。例如:chars1[]={perfect};/*strlen(s1)等于7*/chars2[20]={One\0Two\0Three};/*strlen(s2)等于3*/chars3[]=thank&you!\0abc;/*strlen(s3)等于10*/strlen(abc\t1234\n)等于9;strlen(abc\t1234\123\n)等于10。其中,’\t’、’\n’和’\123’均为转义字符,按一个字符计算。2.串复制函数strcpy(s1,s2)•作用:将字符串s2的内容复制到字符串s1中。•参数要求:s1必须是容量足够大的字符数组;s2既可以是字符串常量,也可以是字符数组。•不允许象其他变量一样对字符数组整体赋值,例如下面语句是错误的:chars1[10],s2[]=“hello!”;s1=s2;•因为数组名s1是地址常量,不能进行赋值运算,必须采用strcpy函数进行复制。例如:chars1[10]=thankyou!,chars2[]=“hello!”;strcpy(s1,s2);执行后,s1的状态如图5-8所示。hello!\04.串比较函数strcpy(s1,s2)•作用:比较字符串s1和字符串s2内容的大小。•参数要求:s1和s2既可以是字符串常量,也可以是字符数组。•字符串比较并不是比较它们的长度,而是依据这样的规则:对两个字符串从左至右依次比较对应的字符(按照字符的ASCII码值进行比较),直到遇到不同字符为止。若全部字符相同,则认为两字符串相等,否则以遇到的第一个不同字符的大小来决定两个字符串的大小。例如:•“abc”大于“ABC”(因为'a''A')•“abCdef”小于“abcd”(因为'C''c')•“ABC”等于“ABC”•“COM”小于“COMPUTER”调用函数strcmp(s1,s2)的结果:•若s1小于s2,则函数值0;•若s1等于s2,则函数值==0;•若s1大于s2,则函数值0。•该函数的返回值返回比较的结果:字符数组1=字符数组2,函数值=0;字符数组1字符数组2,函数值0;字符数组1字符数组2,函数值0;例如:chars1[]=“thank”,s2[]=“you”;if(strcmp(s1,s2)0)printf(“bigger\n”);5.4数组的应用举例例6-4:找出10个学生中成绩低于其平均成绩的人数并输出。分析:可以定义一个长度为10的实型数组scores存储10个学生成绩。先计算出平均成绩,然后统计成绩低于平均成绩的人数。程序如下:main(){inti,count=0;/*count存储人数,初始化为0*/floatscores[10],ave;/*ave存储平均成绩*/for(i=0;i10;i++){scanf(%f,&scores[i]);ave+=scores[i];/*累加成绩求总分*/}ave/=10;/*求出平均成绩*/for(i=0;i10;i++)if(scores[i]ave)count++;/*若低于平均成绩,计数器加1*/printf(%2d,count);getch();}例5-5:输入5个学生的3门课程成绩,求得每个学生的平均成绩和每门课程的平均成绩。例5-6已有一个排好序的序列,输入一个数插入到该序列中,使之仍然保持有序。例如:将15插入到有序序列{3,7,10,12,18,20}中。例5-7编写一个程序,将字符串转置后并输出。例如“abcde”→“edcba”。本章小结•C语言中定义数组时,方括号中必须是常量表达式,表明该数组元素的个数。•数组元素的下标从0开始,最大下标=元素个数-1。•字符串是以‘\0’为结尾的一维字符数组。可以在scanf和printf函数中使用“%s”格式对字符串输入输出。•字符串变量间不能相互赋值,应使用字符串复制函数strcpy实现,字符串数据间不能进行比较运算,应该使用字符串比较函数strcmp实现。字符串处理函数的头文件名为“string.h”。
本文标题:编程语言基础-C语言--第5章-数组
链接地址:https://www.777doc.com/doc-4059823 .html