版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语言数组详解演示文稿第1页,共55页。(优选)语言数组详解第2页,共55页。什么是数组???就是一组具有固定数目的、有序的、类型相同的数据的集合。根据数组下标的多少,数组可以分为一维数组和多维数组。例如:一个班级有30个学生,可以用g1,g2,…,g30代表学生的成绩,其中g是数组名,下标代表学生的序号。由于在C语言中无法表示下标,所以就引入了[]
表示下标。g[1]:第1个学生的成绩g[i]:第i个学生的成绩等等第3页,共55页。bd[10]
bd[0]bd[1]bd[2]……bd[9]数组名:数组中的所有元素具有相同的名字bd。数组元素名数组元素下标数组长度为标识数组中的每个元素,C语言对其进行编号。这个编号称之为数组元素下标。(C语言规定下标从0开始)。指定该数组的数据个数用于访问的、具有相同的数据类型。在程序设计中相当于变量名的用法。一个数组就是一组连续的内存空间,用来保存数据,数组中的每一项称为一个元素。第4页,共55页。(一)一维数组(1)——定义及使用类型说明符数组名[常量表达式]
inta[10]任一种基本数据类型或构造数据类型。用户自定义的数组名字,其定名规则与变量名定名规则一样,都需遵循标识符定名规则表示元素的个数,即数组长度。[]——下标运算符单目运算符优先级(1)左结合不能用()第5页,共55页。
注意:1.数组名不能与其它变量名相同voidmain(){inta;floata[10];……}(一)一维数组(1)——定义及使用第6页,共55页。2.
不能在方括号中用变量来表示元素的个数,但可以是符号常数或常量表达式。……intn;scanf("%d",&n);/*表示维数的只能是常量*/inta[n];#defineFD5voidmain(){inta[3+2],b[7+FD];……}(一)一维数组(1)——定义及使用第7页,共55页。3.
方括号中常量表达式表示数组元素的个数。如inta[5]:数组a有5个元素,其下标从0开始,分别为a[0],a[1],a[2],a[3],a[4]。4.允许在同一个类型说明中说明多个数组和多个变量。例如:
inta,b,c,d,k1[10],k2[20];如果出现数组越界,编译系统没有提示的。(一)一维数组(1)——定义及使用第8页,共55页。数组必须先定义,然后使用。数组元素的表示形式为:数组名[下标]
C语言规定只能逐个引用数组元素而不能一次引用整个数组。可以是整型常量或整型表达式(一)一维数组(2)——引用第9页,共55页。全部初始化部分初始化使用输入函数scanf初始化使用表达式赋值inta[10]={0,1,2,3,4,5,6,7,8,9};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;inta[10]={0,1,2,3};a[0]=0;a[1]=1;a[2]=2;a[3]=3;a[4]=0;a[5]=0;a[6]=0; a[7]=0;
a[8]=0; a[9]=0;inta[10];
for(inti=0;i<10;i++) scanf("%d",&a[i]);inta[10]={0,1,2,3};a[4]=a[3]+2;对全部数组元素赋初值时,数组长度可以省略(一)一维数组(3)——初始化一维数组元素的存储方式第10页,共55页。inta[5]={1,2,3,4,5};54321a[4]a[3]a[2]a[1]a[0]20202016201220082004a一维数组元素的存储方式#include<stdio.h>voidmain(){ inta[5]={0,1,2,3,4}; for(inti=0;i<5;i++) printf("a[%d]=%d,其地址是%d\n",i,a[i],&a[i]); printf("数组的首地址为:%d\n",a);printf("数组a在内存中占字节数:%d\n",sizeof(a));}数组名表示数组的起始地址,是一个地址常量第11页,共55页。程序举例1:用选择排序法进行排序。选择排序法是编程中经常用的一种排序算法。具体如下:
先将5个数中最小的数与a[0]对换,再将a[1]到a[4]中最小的数与a[1]对换,这样每比较一轮,找出一个未经排序的数中最小的一个。共比较4轮。inta[5]={3,6,1,9,4};§1.4一维数组程序举例第12页,共55页。第13页,共55页。main(){inti,j,k,t;inta[5]={3,6,1,9,4};for(i=0;i<sizeof(a)/sizeof(int)–1;i++){k=i;for(j=i+1;j<sizeof(a);j++){if(a[j]<a[k])k=j;}if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}}}
第14页,共55页。容易出错的地方数组的起始下标、最后一个元素的下标
定义数组时不指定长度(动态数组)
对数值型数组进行整体操作
用scanf语句时,数组元素前应加&
语句错误,不了解数组定义时与数组元素使用时的区别:scanf(“%d”,a[10]);第15页,共55页。小结一维数组的定义、初始化、引用、输入、输出概念、操作必须掌握
数组中的所有元素,数据类型都一致数组名字代表数组的首地址,是一个常量数组元素具有和相同单个变量一样的属性,凡允许使用单个变量的地方均可以使用数组元素第16页,共55页。(二)二维数组——定义及使用这儿只讨论二维数组,多维数组可由二维数组推导得出二维数组定义的一般形式为:
类型说明符数组名[常量表达式][常量表达式]第一常量表达式为行数,第二个为列数inta[3][4];floata[3,4],b[5,10];/*错误*/第17页,共55页。
二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素…
二维数组在内存中的存放下图表示对a[3][4]数组存放的顺序第18页,共55页。inta[2][3]={1,2,3,4,5,6};a[0]654321a[1][2]a[1][1]a[1][0]a[0][2]a[0][1]20222018201420102006a[0][0]2002a[1](二)二维数组——存储方式#include<stdio.h>voidmain(){ inta[2][3]={1,2,3,4,5,6},i,j;
for(i=0;i<2;i++) for(j=0;j<3;j++) printf("第a[%d][%d]元素=%d,其地址为:%d\n",i,j,a[i][j],&a[i][j]);
printf("a=%d\ta[0]=%d\ta[1]=%d\n",a,a[0],a[1]);}第19页,共55页。(二)二维数组——引用二维数组的表示形式:数组名[下标][下标]注意:下标可以是整型表达式,如a[2-1][2*2-1]
数组元素可以出现在表达式中,也可以被赋值b[1][2]=a[2][3]/2;
在使用数组元素时,应该注意下标值应在已定义的数组大小范围内
inta[3][4];…a[3][4]=5;
严格区分在定义数组时用的a[3][4]和引用元素时的a[3][4]第20页,共55页。全部初始化部分初始化使用输入函数scanf初始化inta[2][3]={0,1,2,3,4,5};inta[2][3]={{0,1,2},{3,4,5}};a[0][0]=0;a[0][1]=1;a[0][2]=2;a[1][0]=3;a[1][1]=4;a[1][2]=5;
inta[2][3]={0,1,2};inta[2][3]={{0},{1}};a[0][0]=0;a[0][1]=1;a[0][2]=2;a[1][0]=0;a[1][1]=0;a[1][2]=0;inta[2][3];
for(inti=0;i<2;i++)for(intj=0;j<3;j++) scanf("%d",&a[i][j]);对全部数组元素赋初值时,第一维的长度可以省略(二)二维数组——初始化第21页,共55页。(二)二维数组——程序举例例3:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。EnglishMathC张807592王616571李596370赵858790周767785第22页,共55页。(二)二维数组——程序举例例3:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。fori=0to2forj=0to4sum[i]+=score[i][j]avg[i]=sum[i]/5fori=0to2outputavg[i]avg+=avg[i]outputavg/3第23页,共55页。#include<stdio.h>#defineN3#defineM5voidmain(){ floatscore[N][M],avg1=0,avg[N],sum[N]={0}; inti,j; for(i=0;i<N;i++) for(j=0;j<M;j++) { printf("第%d门课,第%d个学生的成绩:",i,j); scanf("%f",&score[i][j]); } for(i=0;i<N;i++) { for(j=0;j<M;j++) sum[i]+=score[i][j]; avg[i]=sum[i]/M; } for(i=0;i<N;i++) { printf("第%d门课的平均成绩为%.2f\n",i,avg[i]); avg1+=avg[i]; } printf("各科总平均成绩为%.2f\n",avg1/N);}第24页,共55页。小结二维数组在内存中是按行存放数组元素的下标每一维都是从0开始的数值型数组不能够整体引用可以把二维数组看成是一个特殊的一维数组,即其元素是一个一维数组
二维数组初始化有两种方法:按行赋值或者一行赋值第25页,共55页。(三)字符数组——定义字符数组:用来存放字符数据的数组就是字符数组。定义方式:char数组名[长度]一维数组:chara[10];
二维数组:chara[4][5];第26页,共55页。(三)字符数组——初始化对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。如:Charc[10]={’I’,’’,’a’,’m′,’’,’h’,’a’,
’p’,’p’,’y’};
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括弧中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。注意:第27页,共55页。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即′\0′)。例如:
charc[10]={′c′,′′,′p′,′r′,′o′,′g′,′r′,′a′,′m′};第28页,共55页。在定义字符数组时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:charc[]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′};数组c的长度自动定为10。
第29页,共55页。#include<stdio.h>voidmain(){charc[10]={‘I’,’
’,’a’,’m’,’
’,’a’,’
’,’b’,’o’,’y’};inti;for(i=0;i<10;i++)printf(“%c”,c[i]);printf(“\n”);}(三)字符数组——引用可以引用字符数组中的一个元素,得到一个字符第30页,共55页。在实际编程中,最常用的是字符串。在C中是用字符数组存放字符串。字符串以‘\0’作为串结束符,因此当把字符串存入数组时,也把‘\0’存入数组,并以此作为该字符串是否结束的标志。程序中通过循环扫描字符数组元素,读到‘\0’时候便认为字符串结束。(三)字符数组——字符串和字符串结束标志第31页,共55页。用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志‘\0’。例如:数组charc[]=“cprogram”在内存中的实际存放情况为:
(三)字符数组——字符串和字符串结束标志`\0‘是由C编译系统自动加上的。由于采用了`\0’标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。第32页,共55页。charc[]={″China″};printf(″%s″,c);
例如在内存中数组c的状态第33页,共55页。(三)字符数组——字符数组的输入输出字符数组的输入输出可以有两种方式:
逐个字符输入输出。用”%c”输入或输出一个字符将整个字符串一次输出。用“%s”格式符,charc[]={“China”};printf(“%s”,c);China\0China第34页,共55页。(三)字符数组——字符数组的输入输出注意:
输出字符不包括结束符’\0’;用“%s”格式符输出字符串时,printf函数中的输出项时字符数组名,而不是数组元素名。printf(“%s”,c);
如果数组长度大于字符串实际长度,也只输出遇’\0’结束如果一个字符数组中包含一个以上’\0’
,则遇到第一个’\0’时结束。第35页,共55页。#include<stdio.h>voidmain(){ charst[15]; printf("inputstring:\n"); scanf("%s",st); printf("%s\n",st);}
(三)字符数组——字符数组的输入输出本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。对于字符数组,如果不作初始化赋值,则须说明数组长度。应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如运行上例,当输入的字符串中含有空格时,运行情况为:第36页,共55页。(三)字符数组——字符数组的输入输出#include<stdio.h>voidmain(){charst1[6],st2[6],st3[6],st4[6];printf("inputstring:\n");scanf("%s%s%s%s",st1,st2,st3,st4);printf("%s%s%s%s\n",st1,st2,st3,st4);}从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:第37页,共55页。(三)字符数组——字符数组的输入输出重要一点:在前面介绍过scanf的各输入项必须以地址方式出现,如&a,&b等。但在上例中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。第38页,共55页。(三)字符数组——字符串处理函数C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、转换、复制、搜索几类。用于输入输出的字符串函数,在使用前应包含头文件"stdio.h";使用其它字符串函数则应包含头文件"string.h"。下面介绍几个最常用的字符串函数。第39页,共55页。(三)字符数组——字符串处理函数格式:puts(字符数组名)功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。#include<stdio.h>voidmain(){ staticcharc[]="BASIC\ndBASE"; puts(c);}从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。字符串输出函数puts第40页,共55页。(三)字符数组——字符串处理函数格式:
gets(字符数组名)功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。#include"stdio.h“voidmain(){ charst[15];printf("inputstring:\n");gets(st);puts(st);}
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。字符串输入函数gets第41页,共55页。3.strcat函数其一般形式为:strcat(字符数组1,字符数组2)strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。(三)字符数组——字符串处理函数第42页,共55页。例如:charstr1[30]={″People′sRepublicof″};charstr2[]={″China″};print(″%s″,strcat(str1,str2));
输出:People′sRepublicofChina
第43页,共55页。4.strcpy函数其一般形式为:strcpy(字符数组1,字符串2)
strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:charstr1[10],str2[]={″China″};strcpy(str1,str2);
第44页,共55页。1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,″China″);
3.复制时连同字符串后面的‘\0’一起复制到字符数组1中。
4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。第45页,共55页。5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的:charstr1[10],str2[10];str1=″China″;str1=str2;
而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:chara[5],c1,c2;c1=′A′;c2=′B′;a[0]=′C′;a[1]=′h′;a[2]=′i′;a[3]=′n′;a[4]=′a′;
第46页,共55页。(三)字符数组——字符串处理函数测字符串长度函数strlen格式:strlen(字符数组名)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年工程项目资料管理试题及答案
- 2026年吊装作业指挥规范试题及答案
- 2026年北京林业大学研究生考试专业综合《心理学》模拟试题及答案
- 0-6岁儿童健康管理知识培训试题及答案
- 江苏省徐州市职业卫生检测职业卫生技术服务专业技术人员考试考前模拟题及答案(2026年)
- 2026年湖北省宜都市高一数学下册期末考试模拟卷及答案【基础+提升】
- 河北省2026年度下半年医师执业注册考核人文医学练习题及答案
- 2026年湖北省钟祥市高一数学下册期末考试模拟试卷附完整答案(必刷)
- 2026年广东省南雄市高一数学下册期末考试模拟考试卷附答案(典型题)
- 老年套细胞淋巴瘤诊断与治疗中国专家共识(2026年版)
- 机械加工质量控制标准汇编
- 硫酸储存装卸安全培训
- 心理健康与心理健康教育新方法
- 海图识图课件
- JJG658-2022烘干法水分测定仪
- 2025年人力资源毕业论文范文-20250128-141655
- 华为数字化转型之道
- 化学试卷+答案【黑吉辽蒙卷】【高二】辽宁省名校联盟2025年高二6月份联合考试(6.11-6.12)
- 2025年辅警考试真题及答案题库(附答案)
- 纪检监委笔试题库及答案
- BIM与虚拟地质信息的三维地质建模技术
评论
0/150
提交评论