




已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,数 组,共 26 页 第 2 页,第六章 数组,第一节 数组的概念 第二节 一维数组 第三节 二维数组 第四节 字符数组,共 26 页 第 3 页,6-1 数组的概念,c语言里,计算机如何存放一个数据?,一个班学生某一科目的成绩?(80,58,72) 一个3*3的矩阵 ? 2 3 5 1 0 1 4 5 7,1)具有相同类型 2)固定的数量 3)存在相互关联,利用变量存放数据,不同数据存放在不同变量中,相互没有关联,如何存放多个相互间存在关联的数据?,数组:具有相同数据类型,数量固定的数据的有序集合 数组是一个集合,构成数组的每个数据称为数组元素,把这些具有相同类型,数量固定,相互关联的数据,用一个数组来统一存放,数据特点:,int a; scanf(“%d”,线性关系,行列关系,例如:存储一个班学生成绩用一维数组 float mark46 存储一个3*3的矩阵用二维数组 int a33 其中:mark、a 是数组名。 内是数组的下标。下标的大小限定数组的长度,表示最多能存放多少数据 不同的数组元素:用共同的名字(数组名)和各自的下标来唯一地标识 例如:mark0,mark1mark45 float,int是数组的数据类型, 它限制了数组元素的类型 例如:mark0=80.0 mark0=a错误,6-1 数组的概念,数组按维度分类:一维数组和二维数组 一维数组:可存储一行或一列数据 二维数组:可存储多行和多列数据,6-1 数组的分类,例如:int a33;,例如:float mark46;,共 26 页 第 6 页,第六章 数组,1) 一维数组 数组的定义 数组元素的引用 数组的初始化,数组定义的格式 回顾一下变量定义的格式: 数组的定义:,6-2 一维数组,数组的定义,声明存在一个数组,说明其名称,长度和类型,类型说明符 变量名;,类型说明符 数组名常量表达式;,数组的长度,整数,数组元素的类型 例如:int ,float,例如:int a10;,例如:int a;,数组a可以用于存放10个整数,标识符,1)定义一个数组,可以存放10个整数 int a10 2)定义一个数组,可以存放5个实数 float b5,数组的定义,2)可以同时定义多个数据类型相同的数组,以逗号分隔 例如:int a10,b5;,举例:,类型说明符 数组名常量表达式;,注意:1)常量表达式 不能是变量 例如:int a=10; int ba;错误 可以是符号常量 例如: #define n 10 main() int bn;,等价 int a10;int b5;,数组元素的引用,2.数组元素的引用,数组元素的引用:用共同数组名和各自的下标来唯一地标识 引用格式:数组名下标,例如:int a10;,可引用的数组元素:a0,a1,a9,注意:下标范围是0(长度-1) a0表示第一个数组元素,a9表示最后一个数组元素,常见错误:a10=3;,引用是重点,即如何从数组中提取数据,和存放数据到数组中,提取数据:printf(“%d”,a0); 或 int b=a0; 存放数据:scanf(“%d”,数组存取数据:输入输出语句和赋值操作,举例:输入任意10个整数,要求按序存放在数组中,并且依次输出,数组元素的引用,main() int a10;int i; for ( i=0; i=9; i+ ) scanf (”%d”, ,如何对整个数组的数据进行存取?,数据结构:int a10 算法: 1)输入10个数,依次存放在数组中 2)依次输出数组中存放的10个数,循环1:int i=0 to 9 输入第i个数,存放到ai中 i+,循环2:int i=0 to 9 输出数组中数据元素ai i+,常用循环对数组中的数组元素逐个输入、输出、或进行处理,数组的输入和输出: 数组,只能是逐个存取数组的单个数组元素,不能进行整体操作 1)输入/输出数组:int a10;,数组的引用,错误:直接对整个数组进行输入输出 scanf (”%d%d%d%d%d%d%d%d%d%d”, a); scanf (”%d”, a); printf(”%d”, a); printf(”%d%d%d%d%d%d%d%d%d%d”, a);,正确:用循环对逐个的数组元素进行输入输出,for (k=0; k10; k+) scanf (”%d”, ,数组的引用,2)修改和提取数组: 不能对整个数组进行赋值操作,只能对具体的某个数组元素进行赋值操作和取值操作 例如:赋值:int a10; a=2;错误 a0=2;正确 取值: int b; b=a;错误 b=a0;正确,因为:数组名不是变量,而每个数组元素是变量,可仅对部分元素赋予初值: 例:int a5=1,2; 结果是 a0=1,a1=2,其他=0 char a5=a,b; 结果是 a0=a,其他是0 对所有元素赋予初值时,数组长度可省: 例:int a=1,2 等价 int a2=1,2,数组的初始化,3.数组初始化,格式:数据类型 数组名 常量表达式 初始化数据; 举例:int a5=1,2,3,4,5; 结果:a0=1;a1=2; a2=3;a3=4;a4=5,在定义数组时,给数组赋予一个初始值,数组的初始化,3.数组初始化,int a5=1,2,3,4,5;,数组不能作为一个整体被赋值,int a5; a5=1,2,3,4,5;,不等价,举例: int a5=1,2,3,4,5; a1+a4=?,7,常见错误:,数组一旦定义,按照数组元素的先后顺序和数据类型, 会在内存分配一片连续的存储空间存放数组元素.,数组的存储,例如:int a5; 例如:float a5;,a0,a1,a2,a3,a4,2个字节,存储每个数据元素占多少字节由数组元素的类型决定,int -占2个字节,float -占4个字节,低地址,高地址,2,一共占?字节,int a5=1,2,3,4,5;,数组的概念,数组的初始与数组存储,a0,a1,a2,a3,a4,int b=a0;/取 a0=3;/写,数组元素的引用与数组存储,a0,a1,a2,a3,a4,举例: 例如:输入10个整数,反向输出这10个数,数组的应用,用数组: main() int a10,i; for ( i=0; i=0; i- ) printf(“%d ”, ai); ,不用数组只能正向输出: main() int x, sum=0; for ( i=0; i=9; i+ ) scanf (”%fn”, ,不用数组只能输入后,立即将数据处理或输出 数组的优点是能先保存数据,再进行处理,最后输出处理结果,作业: 例如:输入10个整数,求最大值,最小值和平均值,并找出最大值与最小值在这组数中的位置,数组的应用,数据结构?,算法: 1)输入数组的数据 2)求最大值及位置,最小值及位置,和总值 3)输出结果,int a10,max,min,maxid,minid,循环,循环,排序算法:将无序的数,排成有序数的算法 例如: 9 8 4 5 2 0 0 2 4 5 8 9 冒泡排序:两两比较,较大数放在后,较小的数往上冒,数组的应用,一共6个数,第一轮需要比较5次,一轮过后,最大的数沉底,按照这种方法可依次得到第二轮、第三轮的冒泡结果 第二轮过后,将第二大的数放在倒数第二位置,数组的应用,第1轮结果,第2轮结果,第3轮结果,第4轮结果,第5轮结果,一共n(6)个数,需要比较m(n-1=5)轮 每轮比较(n-m)次:第1轮比较5次,第2轮比较4次.,第5轮比较1次,数据结构 采用一维数组,在不断的两两比较过程中,调整各元素的位置即可。,程序设计 双重循环 用外层循环控制冒泡的轮数m为 n-1(6-1) 次 用内层循环来控制在第m轮冒泡过程中需要进行的大小比较次数为 n-m(6-m)次;,程序实现要点,6-2 数组应用举例-排序问题,输出6个数,从键盘任意 输入6个数,main() int a6; int i,m,t,n; printf(“input numbers (n=6):n“); for (n=0;nai+1) t=ai; ai=ai+1; ai+1=t; printf(“the sorted numbers:n“); for(n=0;n10;n+) printf(“%d“,an); ,6-2 数组应用举例-排序问题,轮,共 26 页 第 23 页,第六章 数组,1)一维数组的定义 int a5; 2)一维数组元素的引用 a0a4 提取数组元素:printf(“%d”,a0); b=a0; 存放数据元素:scanf(“%d”,小结:,一维数组,用于存放一组存在关联的固定数量的数据,共 26 页 第 24 页,第六章 数组,2) 二维数组 数组的定义 数组元素的引用 数组的初始化,二维数组:用于存储多行和多列数据,6-3 二维数组,例如:int a33;,2)4个学生,5门课的成绩,1)矩阵,例如:int a45;,总行数,总列数,二维数组定义的格式,6-3 二维数组,数组的定义,声明存在一个数组,说明其名称,长度和类型,类型说明符 数组名常量表达式1常量表达式2;,第一维的长度, 数组总行数,数组a可以用于存放4行5列的数据,第二维的长度, 数组总列数,例如:int a45;,67 74 80 76 70 70 73 85 70 74 65 70 76 80 87 77 80 90 86 90,int a45;,int a54;,不等价,数据元素的总个数=常量表达式1*常量表达式2,只需要给出一维的前后次序就能确定一个数组元素,6-3 二维数组,例如:int a33;,要确定行和列两个方向的次序才能确定一 个数组元素,例如:mark0,例如:a00,二维数组:,行号,列号,一维数组:,二维数组在概念上是二维的,两个下标可分别在两个方向上变化, 第一个下标控制行,第二个下标控制列,2.二维数组元素的引用,引用格式:数组名下标1下标2,例如:int a34; 总共3行4列数据,可引用的数组元素:,提取数据:printf(“%d”,a00); 或 int b=a00; 存放数据:scanf(“%d”,数据所在行 0总行数-1,数据所在列 0总列数-1,a12:表示第2行第3列数据,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,6-3 二维数组,注意: 下标从0开始,a31,a14,错误,和一维数组一样,只能逐个对数组元素进行存取,举例:输入任意12个整数,存放在一个3行4列的二维数组,并且依次输出,二维数组元素的引用,main() int a34;int i,j; for ( i=0; i=2; i+ ) for(j=0;j=3,j+) scanf(“%d”, ,如何对整个二维数组的数据进行存取?,数据结构:int a34 算法: 1)输入12个数,依次存放在数组中 2)输出数组,外循环:int i=0 to 2 控制行 i+,内循环:int j=0 to 3 控制列 输入数据,存于数据元素aij j+,常用两重循环对数组中的数组元素逐个输入、输出、或进行处理,输入,2.二维数组元素的初始化,6-3 二维数组,1)将所有数据写在一个内,按顺序赋值 例:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 2)按行给数组元素赋初值 例:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 3)按行对部分元素赋初值 例:static int a34=1,0,6,0,0,11; 4)给所有元素赋初值时,可以省略第一维的长度,但不能省第二维 例:static int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定义数组时,给数组赋予一个初始值,6-3 二维数组,二维数组的存储,例如:int a34;,二维数组的存储按行存放,a11,a10,a12,a13,a20,a23,从第一行开始,从左到右存放.到行末,转向下一行第一个元素,又从左到右依次存放,直到最后一个元素.,6-3 二维数组,注意:,1)二维数组可以看成是由若干一维数组组成的数组,a0,a1,a2,a0代表一个一维数组,对应二维数组里的一行,a0,可把二维看做一维,举例:已知矩阵a,编程实现矩阵的转置,二维数组元素的引用,main() int a34=2,3,5,8,1,0,1,2, 4,5,7,6; int i,j; for ( i=0; i=2; i+ ) for(j=0;j=3,j+) bji=aij; ,int a34 初始化 int b43 算法: 1)转置:将数据逐行逐列的复制过去 2)输出结果:a和b,外循环:int i=0 to 2 控制行 i+,内循环:int j=0 to 3 控制列 bji=aij j+,a01 b?,数据结构:,main() int a34=2,3,5,8,1,0,1,2,4,5,7,6; int i,j; for ( i=0; i=2; i+ ) for(j=0;j=3,j+) bji=aij; printf(“a:n”) for ( i=0; i=2; i+ ) for(j=0;j=3,j+) printf(“%4d”,aij); printf(“n”); printf(“b:n”) for ( i=0; i=2; i+ ) for(j=0;j=3,j+) printf(“%4d”,bij); printf(“n”); ,三个并列的 两重循环,转置,输出a,输出b,作业:输入4行4列的二维数组,求: 计算主对角线各元素之和。 计算辅对角线各元素之和。,二维数组元素的引用,2 3 5 8 1 0 1 2 4 5 7 6 1 0 2 3,主对角线元素:a00+a11+a22+a33,辅对角线元素:a03+a12+a21+a30,i=j,i+j=3,i=0 to 3 j=0 to 3 if(i=j) sum=sum+aij,共 26 页 第 36 页,第六章 数组,1)二维数组的定义 int a54; 2)二维数组元素的引用 a00a43 提取数组元素:printf(“%d”,aij); b=aij; 存放数据元素:scanf(“%d”, 数组的输入和输出只能逐一对每个数组元素,所以经常用两重循环,外循环控制行,内循环控制列 3)二维数组的初始,小结:,二维数组,用于存放多行多列的数据,int a34=1,2,3,4,5,6,7,8,9,10,11,12;,共 26 页 第 37 页,第六章 数组,3) 字符数组 字符数组与字符串 字符数组的初始化 字符数组的输入和输出 字符串处理函数,6-4 字符数组,字符数组,字符数组定义: char a8; 字符数组初始化:char a8=s,t,u,d,e,n,t,0 字符数组引用: a0-a7 每个数组元素存放一个字符 存取字符: char b=a0; a0=b;,字符类型(char)的数组,因可用于存放字符串, 所以单独讨论,字符数组与字符串,字符串用字符数组存放 char a8=“student”;,仅一个字符,字符用字符变量存放 char ch=a;,6-4 字符数组,字符数组,一维字符数组存放一个字符串,字符串用字符数组存放 char a8=“student”;,二维字符数组存放若干个字符串,char a38=“student”,“worker”,“teacher”;,a0就是”student”,6-4 字符数组,字符数组的初始化,1)将所有字符逐一写在内,按顺序初始 例:char str8=s,t,u,d,e,n,t; 2)用字符串来初始 例:char str8=“student”; 或者 char str8=“student”;,第一种初始结果和第二种初始结果等价吗?,不一样,因为对于字符串,系统会在最后自动加0,char str8=s,t,u,d,e,n,t,0; 等价,这样,数组str中存放的就是”student”,初始化一个字符数组存放一个字符串,末尾加0,6-4 字符数组,字符数组的输入-字符串的输入,1)用循环将单个字符逐个输入 格式说明用%c,char str15;int i; for(i=0;i=14;i+) scanf(“%c”,输入:i am a student回车,2)用%s将整个字符串输入,输入项直接写数组名,char str15; scanf(“%s”,特殊,其他类型的数组不能这样输入,这与其他类型的数组输入方式相同,输入:student回车,输入:i am a student回车,%s遇到空格和回车终止,所以只能输入不含空格字符串,结果:str是”i”,结果:str是”student”,6-4 字符数组,字符数组的输入-字符串的输入,3)用函数gets()输入,不用循环就可以输入整个串,char str15; gets(str);,输入:i am a student回车,特有方式,允许字符中包含空格,以回车结束输入,结果:str是”i am a student”,6-4 字符数组,字符数组的输出-字符串的输出,1)用循环将单个字符逐个输出 格式说明用%c,char str15=“i am a student”; int i; for(i=0;i=14;i+) printf(“%c”,stri);,输出:i am a student,2)用%s将整个字符串输出,输出项直接写数组名,char str15 =“i am a student”; scanf(“%s”,str);,特殊,其他类型的数组不能这样输出,这与其他类型的数组输出方式相同,输出没有空格的问题,6-4 字符数组,字符数组的输出-字符串的输出,3)用函数puts()输出整个串,char str15 =“i am a student”; puts(str);,输出:i am a student,特有方式,举例:将字符串str2连接到字符串str1之后. str1是”this is a c ”.str2是”programe”.,二维数组元素的引用,main() char str125=“this is a c “; char str29=“programe“; int i=0,j=0; while(str1i!=0)i+; while(str2j!=0) str1i=str2j; i+; j+; puts(str1); ,i=0; while(str1i!=0) i+;,数据结构:,char str125,str29;,char str125=“this is a c”; char str29=“programe”;,算法: 1)找到str1的末尾 2)逐一将str2的字符拷贝到str1后面 3)输出str1,”this is a c ”,”programe”,j=0; while(str2j!=0) str1i=str2j j+;i+; ,举例:用二维字符数组输入输出三个字符串,字符串长度不超过10,二维数组元素的引用,main() char str310; int i,j; for(i=0;i=2;i+) gets(stri); for(i=0;i=2;i+) j=0; while(strij!=0) printf(“%c”,strij); j+; printf(“n”); ,for(i=0;i=2;i+) gets(str1i);,数据结构:,char str310;,算法: 1)逐个输入每个字符串,并存放到数组用,可用gets,可用双重循环 2)逐一将数组中字符串输出 可用puts,可用双重循环,for(i=0;i=2;i+) j=0; while(str1ij!=0) printf(“%c”,str1ij); j+; printf(“n”);,for(i=0;i=2;i+) puts(str1i);,for(i=0;i=2;i+) printf(“%s”,str1i);,6-4 字符数组,字符串处理函数,1) 字符串复制:strcpy(字符数组1,字符数组2),将字符数组2中的字符串复制到字符数组1中,str1=str2; str1=“i am a student”,可以用strcpy(str1,str2)来实现把字符串2赋给字符串1,char str115; char str215 =“i am a student”; strcpy(str1,str2);,strcpy(str1, “i am a student”);,错误,字符串间不能直接赋值,系统提供的实现特定功能的字符串处理函数: strcpy,strcat,strcmp,strlen,6-4 字符数组,2) 字符串连接:strcat(字符数组1,字符数组2),将字符数组2中的字符串连接到字符数组1后面,char str125=“i am a ”; char str28 =“student”; strcat(str1,str2);,结果:str1是i am a student,举例:将字符串str2连接到字符串str1之后. str1是”this is a c ”.str2是”programe”.,二维数组元素的引用,main() char str125=“this is a c “; char str29=“programe“; strcat(str1,str2); puts(str1); ,数据结构:,char str125,str29;,char str125=“this is a c”; char str29=“programe”;,”this is a c ”,”programe”,6-4 字符数组,3) 字符串长度:strlen(字符数组),求字符数组中实际存放的字符个数,不包括字符串结束标志0. 注意:不一定等于数组的长度,char str20=“i am a student”; int i=strlen(str);,结果:i是14,6-4 字符数组,4) 字符串比较:strcmp(字符串1,字符串2),比较两个字符串的大小,例如:ctrcmp(str1,str2);,字符串的比较规则:,两个字符串,从左到右逐个字符比较它们的ascll码 1)字符串1比字符串2大,结果大于0: 2)字符串1比字符串2小,结果小于0 3)字符串1与字符串2相等,结果是0,例:strcmp(”acd”, “abc”),”acd”,”abc”,例:strcmp(”abc”, “abc”),例:strcmp(”abc”, “abc”),字符数量,对应字符完全相等,6-4 字符数组,2) 字符串比较:strcmp(字符串1,字符串2),比较两个字符串的大小,例如:ctrcmp(str1,str2);,c语言中不允许对字符串用关系运算符作如下方式的直 接比较 : str1str2, str1str2 或者 str1=str2,错误,共 26 页 第 53 页,第六章 数组,第一节 数组的概念 第二节 一维数组 第三节 二维数组 第四节 字符数组,6-4 字符数组,补充:,char str =1,2,3,0,4,5,0; printf(“%s”,str); 输出结果是:,printf(“%c”,str);,错误,printf(“%c”,str0);,123,1,6-4 字符数组,从键盘输入一个四位整数,把该整数颠倒过来输出,1234 4321,重点:将每一位都拆分出来,算法:,数据结构:用一个整型变量存放这个四位的整数 int n; 定义4个变量分别存放每一位的数字,int a,b,c,d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计公司工资管理制度
- 2025年中国激光导航扫地机器人行业市场全景分析及前景机遇研判报告
- 评审医疗废物管理制度
- 诊所排污登记管理制度
- 诊断试剂购进管理制度
- 财务租赁合同管理制度
- 财政所应收款管理制度
- 货代公司收款管理制度
- 货物内部流转管理制度
- 货站装卸安全管理制度
- GA∕T 1781-2021 公共安全社会视频资源安全联网设备技术要求
- 超星尔雅学习通《心理行为与文化》章节测试含答案
- 基本药物和国家基本药物制度
- Photoshop二级考试试题及答案
- 裂隙灯数码型slm说明书
- 伤口基础知识和湿性愈合理论
- 晶圆封装测试工序和半导体制造工艺流程
- 重力式桥台的计算公式
- 专家共识--缺血性卒中侧支循环评价知识讲解
- 气动油泵的工作原理
- 安全生产培训:企业如何开展隐患排查.ppt
评论
0/150
提交评论