C语言 数组

上传人:小*** 文档编号:243155768 上传时间:2024-09-17 格式:PPT 页数:55 大小:262.50KB
返回 下载 相关 举报
C语言 数组_第1页
第1页 / 共55页
C语言 数组_第2页
第2页 / 共55页
C语言 数组_第3页
第3页 / 共55页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第七章 数 组,数组是内存中的一种数据集合,用于存贮较大量的相同类型的数据元素,在程序中数组有一个名字,并通过下标访问数组的某个元素。,7.1,一维数组,一、一维数组的定义,语法格式:元素类型名 数组名,元素个数,;,如,:,int,a5,b8;double y15,c20;,#define N 10,long,posN;int,cN+1;/*,正确*,/,例如:,int,n=10,an;/*,错误*,/,只能是整型常量表达式,二、一维数组元素的引用,语法格式:,数组名,下标表达式,如,:,若有定义,int,a4;,则元素,a0,a1,a2,a3,是数组的有效元素。,a4,并非有效元素,属于下标超范围。下标超范围会引起死机或程序错误,但,C,语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围,。,必须是整型表达式,数组下标固定从,0,开始编号,7.1,一维数组,一维数组的元素在内存中是连续存放的。,例如:若有,int,a10;,,则,a,数组中包含的,10,个元素在内存中的存储情况如下:,三、一维数组存贮空间分析:,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,如,: double a5;,该数组共,5,个元素,存贮,5,个,double,型实数,共占用,40,字节,存贮空间。,7.1,一维数组,四、一维数组的初始化,在定义数组时,允许对,静态,(,数组定义前加有,static,保留字,),数组、,外部数组,(,定义于所有函数以及复合语句之外,),及,main(),定义的,auto,型数组,进行,初始化,。,7.1,一维数组,初始化格式:,static,类型说明符 数组名,=,常量列表,;,例,: static,int,a4=1,2,3,4;,(1),static,与外部数组不初始化,初值自动为,0,(2),初始化时,可以不指定元素个数,static,int,a,=1,2,3,4;,则数组,a,自动为,4,个元素,,与上面的定义形式完全等价。,(3),可以,只对前部分元素,进行初始化,余下的元,素初值自动为,0,。,(main(),中的,auto,型也是这样),如,: static,int,a5=1,2,3;,则,a3,与,a4,自动为,0,。,说明,:,四、一维数组的初始化,例,7.1,将数值,5,,,3,,,4,,,5,,,3,,,6,,,6,,,4,,,3,,,2,,,9,赋予数组,a,并求其和。,程序:,#include,int,a=5,3,4,5,3,6,6,4,3,2,9;,main(),int,sum,i,;,sum=0;,for (i=0;i=10;i+),sum+=,ai,;,printf(sum,=%,dn,sum,);,7.1.3,一维数组应用举例,例,7.2,编写一程序,求全班,40,个学生计算机的平均成绩。,其算法可用如图,7.1,所示的流程图表示。,程序,:,(,要求学生自己写出,),开始,结束,输出,v,s=0,i=0,假,真,i40,输入,ai,,,s=,s+ai,i=i+1,v=s/40,7.1.3,一维数组应用举例,基本思想,:每一趟在,n-i+1(i=1,2,.,n-1),个记录中(第,i,趟)选取关键字最小的记录作为有序序列中第,i,个记录。,方法,:,n,个数,比较,n-1,趟 第,i,趟,(i=1,2,.,n-1),比较,n-i,次,选择一个最小的记录交换一次。,选择排序总共要进行(,n-1)+(n-2)+1=n(n-1)/2,比较,最多,n-1,次交换。,例,7.3,使用,选择法,对输入的,10,个整型数据进行从小到大排序。,选择排序法,a0,a1,a2,a3,a5,28,41,36,7,16,7,41,36,28,16,7,16,36,28,41,7,16,28,36,41,7,16,28,36,41,原始数据,第一轮,第二轮,第三轮,第四轮,比较次数,4,3,2,1,for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(ajak) k=j; if(k!=i) t=ai;ai=ak;ak=t; ,要求学生写出完整程序,语言描述:,/*k,指示当前比较的最小值下标*,/,练习,:,写出该程序,选择排序法,一、二维数组的定义,语法格式:,元素类型名 数组名,下标,1,维数,下标,2,维数,;,如,:,int,a58;,/*5,行,8,列整型数组*,/,又如:,#define N 6,long mNN; /*N,行,N,列长整型数组*,/,行数,列数,7.2,二维数组,二、二维数组元素的引用,语法格式:,数组名,行,下标,列,下标,其中,下标表达式必须是,整型表达式,;,下标固定从,0,开始编号,。,如,:,若有定义,int,a34;,则,左上角,元素下标为,a00,右下角,元素下标为,a23,。,C,语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围,。,例如,若有,int,a23;,,则,a,数组中包含的二行三列共,6,个元素在内存中的存储情况如下:,a00,a01,a02,a10,a11,a12,三、二维数组存贮空间分析:,也只能对,static,或外部数组、,main(),中的,auto,型数组进行初始化。,初始化方法:,标准形式,static,int,a23=,1,2,3,4,5,6,;,注意:用内层,表示行,每行可视作一个一维,数组,并,按行初始化,。,2.,对所有元素初始化,可以缺省行数和内层,如,:,上述初始化可写为,static,int,a,3=1,2,3,4,5,6,或,static,int,a,3=1,2,3,4,5,6;,或,static,int,a23=1,2,3,4,5,6;,7.2.2,、二维数组的初始化,(3),static,与外部数组不初始化,初值自动为,0,(4),每行可以只对前几列元素,进行初始化,余下的元素初值自动为,0,。,如,: static,int,a3=1,2,3;,则,矩阵元素初值如下,:,(5),指定行数时,,可以,只初始化前面几行,,余下各行元素初值自动为,0.,如,: static,int,a43=1,2,3,4,5,6;,则矩阵初值如下:,1 0 0,2 3 0,1 0 0,2 3 4,5 6 0,0 0 0,7.2.2,、二维数组的初始化,例,7.4,将下表存入数组,a,,按行求元素之和并显示。,25 13 32,10 54 53,7.2.3,应用举例,程序:,#include,main(),int,a24,i;,a00=25;a01=13;a02=32;,a10=10;a11=54;a12=53;,for (,i,=0;i=1;i+),a,i,3=ai0+ai1+ai2;,for (i=0;i=1;i+),printf(%d,%d,%d,%d,n,ai0,ai1,ai2,ai3);,例,7.5,:输入一个三行四列的矩阵,A,,,计算其转,置矩阵,B,,,输出矩阵,B,。,2 3,4 5 6,1 4,2 5,3 6,A,B,bji=aij,7.2.3,应用举例,7.2.3,应用举例,#include,main(),int,a23=1,2,3,4,5,6;,int,b32,i,j;,printf(array,a:n);,for (i=0;i=1;i+), for (j=0;j=2;j+), printf(%5d,aij);,bji,=,aij,;,printf(n,);,printf(array,b:n,);,for (i=0;i=2;i+), for (j=0;j=1;j+),printf(%5d,bij);,printf(n,);,程序,:,例,7.6,编写一程序,求全班,40,个学生每个学生三门功课的平均成绩。,1.,定义数据结构,40,个学生,3,门功课的存放,:,int,a4030;,每个学生三门功课的平均成绩存放,:,int,v40;,2.,输入学生成绩,3.,求每个学生平均成绩,:,vi,= (ai0+ai1+ai2)/3,,,4.,输出结果,.,分析:,7.2.3,应用举例,程序:,#include,main(),int,a403,s,i,j,v40;,for(i,=0;i40;i+),for(j,=0;j3;j+),scanf,(%d,&aij,);,for(i,=0;i40;i+),s=0;,for(j,=0;j3;j+),s=,s+aij,;,vi,=s/3;,for(i,=0;i40;i+),printf(%d,%,dn,i,vi,);,例,7.7,在,N,行,M,列的二维数组,x,中,找出数组的最大值以及此最大值所在的行、列下标。,分析,:1.,定义二维数组,:,int,xNM,;,定义变量,max:,存放最大值,line:,存放最大值行号,col,:,存放最大值列号,2.,找最大值,:max,初始值,= x00, line,及,col,的初始值为,0,, 再将二维数组,x,中的元素逐个与,max,进行比较,确定新的,max,和,line,及,col,的值,直到二维数组,x,中的元素全部处理完。,3.,输出数据,7.2.3,应用举例,程序运行结果如下:,input array numbers:,12 31 40,20 67 80,max=80line=1,col,=2,程序:,#define N 2,#define M 3,#include ,stdio.h,main(),int,i,j,xNM,max,line,col,;,printf(input,array numbers:n);,for(i,=0;i,N;i,+),for(j,=0;j,M;j,+),scanf(%d,&xij,);,max=x00;,line=,col,=0;,for(i,=0;i,N;i,+),for(j,=0;j,M;j,+),if(max,xij,),max=,xij,;,line=i;,col,=j;,printf(nmax,=%,dtline,=%,dtcol,=%,dn,max,line,col,);,7.3.1,字符数组的定义、引用与初始化,1,字符数组的定义,一维字符数组的定义形式如下:,char,数组名,常量表达式,;,例如:,char a10;,二维字符数组的定义形式如下:,char,数组名,常量表达式,1,常量表达式,2,;,例如:,char a34;,7.3,字符数组,7.3,字符数组,2,字符数组元素的引用,一维字符数组元素的引用形式如下:,数组名,下标,例如:,a2,a1+1,二维字符数组的元素的引用形式如下:,数组名,行下标,列下标,例如:,a10,a03-2,7.3,字符数组,3,字符数组的初始化,一维字符数组的初始化形式如下,:,static,类型说明符 数组名,=,字符常量列表,;,例如:,char a10=,H,e,l,l,o,!,二维字符数组的初始化形式如下,:,static,类型说明符 数组名,=,字符常量列表,;,例如:,char a23=A,B,C,D,7.3,字符数组,说明:,(,1,)如果花括号中提供的字符个数大于数组长度,则作语法错误处理。,(,2,)如果花括号中提供的字符个数小于数组长度,则只将这些字符赋给数组中的前面那些元素,其余元素自动定为空字符(即,0,)。,(,3,)如果花括号中提供的字符个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。,7.3.2,字符串与字符数组,1,字符串和字符串结束标志,C,语言约定用,0,作为字符串的结束标志,它占内存空间,但不计入串的长度。,0,的代码值为,0,。,字符型一维数组来存储,一个字符串,,用字符型二维数组来存储,多个字符串,。,7.3.2,字符串与字符数组,2,用字符串常量给数组赋初值(初始化)。,例如,如果有:,char c6=“china”;,或,char c6= “china”;,或,char c = “china”;,则数组,c,在内存中的存储情况如下:,c0,c1,c2,c3,c4,c5,c,h,i,n,a,0,3,字符数组与字符串的输入输出,(,1,)用格式符“,%c”,逐个字符输入输出:,7.3.2,字符串与字符数组,#include,main(), char a10;,int,i;,for(i,=0;i10;i+),scanf(%,c,&,ai,);,printf(n,);,for(i,=0;i10;i+),printf(%,c,ai,);,(,2,)用格式符“,%s”,整个字符串输入输出:,#include,main(),char a10;,scanf(%,s,a,);,printf(n,);,printf(%,s,a,);,7.3.2,字符串与字符数组,注意:,(,1,)用,%s,格式输出字符数组时,遇,0,结束输出,且输出字符中不包含,0,。,(,2,)若数组中包含一个以上的,0,,则遇第一个,0,时结束输出。,(,3,)用,%s,格式输入或输出字符数组时,函数,scanf,的地址项、函数,printf,的输出项都是字符数组名。这时数组名前不能再加,&,符号,因为数组名就是数组的起始地址。,(,4,)用语句“,scanf(%s,s,);”,为字符数组,s,输入数据时,遇空格键或回车键时结束输入,但所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加,0,。,(,5,)用一个,scanf,函数输入多个字符串,输入时应以空格键或回车键作为字符串间的分隔。,7.3.2,字符串与字符数组,使用字符串函数时应在程序前包含头文件:,#include,(,1,),puts(,字符串,),:字符串输出函数。,功能:将一个字符串输出到终端。输出的字符串包含转义字符。,示例:,char,str, =china,nbeijing,;,puts(str,);,输出:,china,beijing,7.3.3,字符串函数,7.3.3,字符串函数,(,2,),gets,(字符数组):字符串数组输入函数。,功能:从终端输入一个字符串到字符数组,该函数返回值是字符数组的起始地址。,示例:,char str10 ;,gets(str,);,如果键盘输入:,China,则数组,str,在内存中的存储情况如下:,str0,str1,str2,str3,str4,str5,str6,str7,str8,str9,c,h,i,a,n,0,0,0,0,0,注意:用,puts,和,gets,函数只能输入或输出一个字符串。,7.3.3,字符串函数,(,3,),strcat,(,字符数组,1,字符数组,2),:连接两个字符串函数。,功能:连接两个字符串中的字符,把字符串,2,接到字符串,1,的后面,结果放在字符串,1,中,函数调用后得到一个函数值,字符串,1,的地址。,示例:如果有:,char str110 =Ch;,char str2 =,ina,;,strcat(str1,str2);,则:字符数组,str1,中存储的字符串为“,Ch,ina,”,。,说明:,(,1,)字符数组,1,必须足够大,以便能容纳连接后的新字符串。,(,2,)连接前两个字符串后面都有一个,0,,连接时将字符串,1,后面的,0,取消,只在新串的最后保留一个,0,。,7.3.3,字符串函数,(,4,),strcpy,(,字符数组,字符串,),:字符串复制函数。,功能,:将字符串拷贝到字符数组中去。,示例,:如果有:,char str110,,,str2 = china;,strcpy,(str1,str2);,则:字符数组,str1,中存储的字符串为“,Ch,ina,”,。,示例,:下面的用法是不合法的:,str1=china;,str1=str2;,如果用赋值语句,则只能将字符逐个赋给一字符数组元素。,示例,:,char a6;,a0=c;a1=h;a2=i;a3=n;a4=a;a5= 0,7.3.3,字符串函数,(,5,),strcmp,(,字符串,1,,字符串,2),:字符串比较函数。,功能:按,ASCII,码值大小比较,将两个字符串自左至右逐个字符相比较,直到出现不同的字符或到,0,为止。如果全部字符相同,则认为相等;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。比较的结果由函数值带回。,(,1,)字符串,1=,字符串,2,,函数值为,0,。,(,2,)字符串,1,字符串,2,,函数值为正整数。,(,3,)字符串,1,字符串,2,,函数值为负整数。,7.3.3,字符串函数,示例:如果有:,char str110 =Chinese, str2 =China;,int,a;,a=strcmp(str1,str2);,则:,a,的值为一正整数。,注意:对两个字符比较,不能用以下形式:,if(str1= =str2)printf(yes);,而只能用:,if(strcmp(str1,str2)= =0)printf(yes);,。,7.3.3,字符串函数,(,6,),strlen,(,字符数组,),:求字符串长度函数。,功能:求字符串长度。函数值为字符串的实际长度,不包括,0,在内。,示例:如果有:,char str10=china;,printf(%d,strlen(str,);,则输出结果为:,5,7.3.3,字符串函数,(,7,),strlwr,(,字符串,),:字符串小写函数。,功能:将字符串中的大写字母转换成小写字母。,(,8,),strupr,(,字符串,),:字符串大写函数。,功能:将字符串中的小写字母转换成大写字母。,7.3.3,字符串函数,例,7.8,用户从键盘输入一个字符串(字符串中不包含空格),当输入回车时认为输入结束,统计输入字符串中的小写英文字母、大写英文字母、数字字符、其他字符的个数。,分析:,字符串放在字符数组,s,用普通的整型变量,m,,,n,,,x,,,y,分别存储统计得到的输入字符串中的小写英文字母、大写英文字母、数字字符、其他字符的个数。,用一个单循环控制,对字符数组,s,中的元素逐个进行判断,根据不同情况(元素值是否为小写英文字母、大写英文字母、数字字符、其他字符)对相应计数变量计数。,循环控制条件是当前所处理的字符串中的字符不是字符串结束标志,0,,即一个字符串的所有字符还没有处理完毕。,程序:,#include ,main(),int,i,m,n,x,y,;,char s80;,printf(input,a string:n);,scanf(%s,s,);,m=n=x=y=0;,i=0;,while(si,!=0),if(si,=,a&si,=,A&si,=0,else y+;,i+;,printf(az:%dnAZ:%dn09:%dnothers:%dn,m,n,x,y);,7.3.3,字符串函数,例,7.9,将字符串,s1,从第,m,个字符开始剩余的所有字符送入字符数组,s2,中。,分析:,该程序用一个单循环控制,将字符数组,s1,中的元素从第,m,个字符开始剩余的所有字符依次逐个送入字符数组,s2,中。,程序中用两个整型变量,i,、,j,分别标识元素在原字符数组,s1,中的下标和在目标数组,s2,中的下标,每循环一次,即传送一个字符后,,i,、,j,的值增,1,。,循环控制条件是当前所处理的原字符数组,s1,中的元素不是字符串结束标志,0,,即原字符数组,s1,中从第,m,个字符开始剩余的所有字符还没有处理完毕。,程序:,#include ,main(),int,i,j,m,;,char s180,s280;,printf(input,a string:n);,gets(s1);,printf(input,start point:n);,scanf(%d,&m,);,i=m-1;,j=0;,while(s1i!=0),s2j=s1i;,i+;,j+;,s2j=0;,puts(s2);,7.4,本章考点,一维数组的定义、引用及初始化。,二维数组的定义、引用及初始化。,字符串和字符数组。,字符串处理函数。,7.5,典型试题详解,1,以下能正确定义一维数组的选项是,_,。,A,),int,num; B,),#define N 100;,int,numN,;,C,),int,num0100 D,),int,N=100;,int,numN,;,正确答案:,B,(知识点:一维数组的定义),7.5,典型试题详解,2,假设,int,类型变量占用两个字节,其有定义:,int,x10=0,2,4;,,则数组,x,在内存中所占的字节数是,_,。,A,),3B,),6C,),10D,),20,正确答案:,D,(知识点:一维数组的定义),7.5,典型试题详解,3,以下程序运行后的输出结果是,_,。,main(),int,i,n,=0,0,0,0,0;,for(i,=1;i=4;i+),ni,=ni-1*2+1;,printf(%d,ni,);,正确答案:,1 3 7 15,(知识点:一维数组的定义与引用),7.5,典型试题详解,4,以下数组定义中不正确的是,_,。,A,),int,a23;,B,),int,b3=0,1,2,3;,C,),int,c100100=0,;,D,),int3= 1,2,1,2,3,1,2,3,4;,正确答案:,D,(知识点:二维数组的初始化),试题分析:二维数组初始化时,对数组第一维的长度可以不指定,但第二维的长度不能省略。,7.5,典型试题详解,5,有以下程序:,main (),int,aa44= 1,2,3,4,5,6,7,8,3,9,10,2,4,2,9,6;,int,i,s,=0;,for(i,=0;i4;i+),s+=,aail,printf(%dn,s,),执行后的输出结果是,_,。,A,),11B,),19 C,),13D,),20,正确答案:,B,(知识点:二维数组的定义、引用及初始化),试题分析:该程序是求,aa0l,、,aa1l,、,aa2l,、,aa3l,之和并输出。,7.5,典型试题详解,6,以下不能正确进行字符串赋初值的语句是,_,。,A,),char str5=good!; B,),char,str, =good!;,C,),char str6=good!; D,),char str5=g, o,,,o,,,d;,正确答案:,A,(知识点:字符数组的初始化),试题分析:每个字符串末尾都有一个结束,0,,因此,字符串,good!,在内存中占,6,个字符型存储单元,在初始化时,可以不指定数组的大小,或指定一个大于或等于,6,的值。选项,D,中给出的初值个数小于数组的大小,5,,则将初值赋给数组前面的元素,其后的元素值为,0,。,7.5,典型试题详解,7,以下程序的输出结果是,_,。,main(),char ch35= AAAA, BBB, CC,;,printf(%sn,ch1);,A,),AAAAB,),BBBC,),BBBCCD,),CC,正确答案:,B,(知识点:字符数组的初始化),试题分析:程序中定义,ch,是一个字符型的二维数组,由于二维数组可以看做是由一维数组构成的一维数组,,ch35,是由,ch0,、,ch1,、,ch2,构成的,而,ch0,、,ch1,、,ch2,又都是由,5,个字符型元素构成的一维数组,因此,ch1,即是二维数组,ch35,的第二行的字符串,BBB,所在一维数组的名字,因为其元素是字符类型,可以用数组的名字(即数组的首地址)来表示所存储的字符串,BBB,,输出时去掉字符串定界符“,”,。,7.5,典型试题详解,8,有下列程序:,main(),char s = n123,printf(%d,%dn,strlen(s),sizeof(s,);,程序运行后的输出结果是,_,。,A,)赋初值的字符串有错,B,),6,7,C,),5,6 D,),6,6,正确答案:,C,(知识点:字符串处理函数、转义字符),试题分析:程序的输出结果是,strlen(s,),和,sizeof(s,),两个函数的值。函数,strlen(s,),是求字符串,s,(用字符数组存储)的长度,即字符串,s,中有效字符的个数,不包括字符串结束标志,0,根据对,s,的初始化处理,字符串,s,中包含两个转义字符,n,和,,因此字符串,s,的长度为,5,。函数,sizeof(s,),是求字符数组,s,在内存中所占的字节数,根据程序中对,s,的初始化处理,字符数组,s,的长度省略,即由其后的初始值来确定,是字符串,s,中有效字符的个数加,1,(即加上字符串结束标志,0,),为,6,,由于每个数组元素是字符类型,在内存中占一个字节,所以字符数组,s,在内存中所占的字节数为,6,。注意,如果字符串,s,的长度在定义时给出了确定的值,则计算其在内存中所占字节数时,按给定的长度计算。,7.5,典型试题详解,9,当执行下面的程序时,如果输入,ABC,,则输出是,_,。,#include,#include,main(),char ss10=12345;,gets(ss,);,strcat(ss, 6789);,printf(%s,ss,);,A,),ABC6789B,),ABC67C,),12345ABC6D,),ABC456789,正确答案:,A,(知识点:字符串处理函数),7.5,典型试题详解,试题分析:程序开始虽然对字符数组,ss,进行了初始化,但其后又用函数,gets(ss,),从键盘上重新输入为字符串,ABC,,再通过函数,strcat(ss, 6789),将字符串,6789,连接到,ss,的尾部,字符串,ss,即为,ABC6789,。,7.5,典型试题详解,10,下列程序执行后的输出结果是,_,。,main(),char arr24;,strcpy(arr0, you);,strcpy(arr1, me);,arr03=,printf(%sn,arr0);,A,),you&me,B,),youC,),meD,),err,正确答案:,A,(知识点:字符串处理函数),试题分析:程序中定义了二维字符数组,arr24,,即包括两个字符型一维数组,arr0,和,arr1,,通过两个字符串复制函数,strcpy(arr0, you),和,strcpy(arr1, me),将字符串,you,和字符串,me,分别复制到,arr0,和,arr1,,这时,再赋,arr03,的值为字符,&,,即覆盖了字符串,you,后的字符串结束标志,0,,由于二维数组在内存中是按行连续存放的,当输出字符串,arr0,时,将从,arr0,的第一个字符开始输出,直到遇到第一个字符串结束标志,0,(即,arr1,中字符串,me,后的结束标志)为止。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!