第7章数组V1.0_第1页
第7章数组V1.0_第2页
第7章数组V1.0_第3页
第7章数组V1.0_第4页
第7章数组V1.0_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第七章,数 组,2,C的数 据类型,基本类型,整型 字符型 实型(浮点型) 枚举类型,构造类型,数组类型 结构体类型 共用体类型,指针类型,空类型,单精度型 双精度型,3,一、数组的基本概念 二、一维数组 三、二维数组 四、字符数组,主要内容,4,一、数组的基本概念,数组是一种构造数据类型。 数组是有序数据的集合。 数组中的每一个元素都属于同一数据类型。 用一个统一的数组名和下标唯一地确定数组中的元素。 如: int s10,5,二、一维数组,一维数组的定义,格式,类型说明符 数组名常量表达式,举例,int a10;,整型表达式,表达式中可以使用符号常量。,6,说明,1. 数组名的命名规则

2、应遵循标识符的命名规则。,2. 数组名后是方括号,而非圆括号。,标识符只能由字母、数字、下划线组成。且第一个字符 必须为字母或下划线,7,3. 常量表达式表示元素的个数,即数组长度。,a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,注意: 下标为小数时将自动取整. a5.2, a5.8等价于a5,8,4. 常量表达式中可以包含常量和符号常量,不能包含变量。,#define N 10 main() int aN, bN+10,C2+3; ,#define N 10 main() int n=5; int an, bN+10,C2+3; ,9,5.数组名不能与其它变量

3、名相同。,main() int a; float a10; ,6.允许在同一个类型说明中,说明多个数组和多个变量。,int a,b,c,d,k110,k220;,10,一维数组元素的引用,格式,数组名下标,a0,11,2. 数组元素只能逐个引用。数组元素的引用与同类型的一般变量使用方式一样。, int a10; /定义数组a a0=10; a2=a0*5; scanf(“%d”, , int a10; printf(“%d”,a); /一次引用整个数组a,错误! ,不能一次引用整个数组。,1.数组元素通常也称为下标变量,数组必须先定义,后使用。,说明,12, int i,a10; for (i

4、=0; i=0; i-) printf(“%2d”,ai); ,3. 当逐个使用数组中的每一个元素时,通常借助for循环语句。,9 8 7 6 5 4 3 2 1 0, int i,a10; for (i=0; i=9; i+) ai=i; printf(%2d,ai); ,0 1 2 3 4 5 6 7 8 9,12 13 14 15 16 17 18 19 20 21,?,13,4. 下标可以是整型变量或整型表达式。 如:a0=a3*2 5.区分: int a10; t=a7;,14,一维数组的初始化,格式,类型说明符 数组名常量表达式 =值,值值;,int a10 = 0,1,2,3,4

5、,5,6,7,8,9;,15,说明,1. 定义数组时,对数组元素赋初值。,2. 可以只给一部分数组元素赋初值。,3. 要想使数组中全部元素数据为0,则采用如下形式。,int a10=0,1,2,3,4,5,6,7,8,9;,int a10=0,1,2,3,4;,int a10=0,0,0,0,0,0,0,0,0,0; 或int a10=0;,int a =0,1,2,3,4;,4. 在对全部数组元素赋初值时,可以不指定数组长度(元素的个数),16,输入10个数,并挑选出最大值。,main() int i,max; int a10; printf(input 10 numbers:n); for

6、(i=0;imax) max=ai; printf(maxmum=%dn,max); ,例7-1,一维数组程序举例,17,例7-2,#include stdio.h void main() int i; int f40=1,1; printf(%12d%12d,f0,f1); for (i=2;i40;i+) fi=fi-2+fi-1; if (i%5=0)printf(n); printf(%12d,fi); ,求Fibonacci数列的前40个数,18,例7-3,用冒泡法对10个数排序。(由小到大),void main() int a10; int i,j,t; printf(input

7、10 numbers:n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers:n); for (i=0;i10;i+) printf(%d ,ai); ,19,思考:1)若由大到小输出,该怎样设计? for (i=9;i=0;i-) printf(%d ,ai); 或 if (aiai+1) 2)对30个数排序?对60个数排序列?如何设计?,20,#include stdio.h #define N 30 void main() int aN; int i,j,t; printf(input %d numbers

8、:n,N); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers:n); for (i=0;i=N-1;i+) printf(%d ,ai); ,21,三、二维数组,二维数组的定义,格式,类型说明符 数组名常量表达式1 常量表达式2,举例,int a34;,22,说明,1。二维数组中元素的排列顺序是:先行后列。 因此,可以把二维数组看成是一个矩阵。,2。二维数组元素仍然是从a00开始。,int a34;,a00,a01,a02,a03 a10,a11,a12,a13 a20,a21,a22,a23,23,3.二维数组

9、可看成特殊的一维数组,它的元素又是一个一维数组。 数组a可看成一个一维数组,有三个元素: a0 a00,a01,a02,a03 a1 a10,a11,a12,a13 a2 a20,a21,a22,a23,24,二维数组元素的引用,格式,数组名下标1 下标2,说明,1。数组必须先定义,后使用。,25,2。数组元素只能逐个引用,而不能一次引用整个数组。数组元素的引用与同类型的一般变量使用方式一样。 下面的程序有什么问题?, int a23; a01=10; a23=a01*5; scanf(“%d”, ,26, int i,j; float a45; for (i=0; i=3; i+) for

10、(j=0; j=4; j+) scanf(“%d”, ,3.二维数组输入/输出的一般格式。, int i,j; float a45; for (i=0; i4; i+) for (j=0; j5; j+) printf(“%d”,aij); printf(”n”); ,27,二维数组的初始化,说明,1。分行给二维数组赋初值。,2。按数组的排列顺序对各数组元素赋初值。,int a23=1,2,3,4,5,6;,int b23=1,2,3,4,5,6;,1 2 3 4 5 6,1 2 3 4 5 6,28,3.可以对部分元素赋初值。分行进行。,int c34=1,5,9;,4。在对全部数组元素赋初

11、值时,数组第一维的长度可以不指定。,int e 3=1,2,3,4,5,6;,int d34=1,5,6,0,9,7;,int f 4=0,0,3,0,0,10;,1 0 0 0 5 6 0 0 0 9 7 0,1 2 3 4 5 6,0 0 3 0 0 0 0 0 0 10 0 0,1 0 0 0 5 0 0 0 9 0 0 0,29,二维数组程序举例,例1,将一个二维数组元素的行和列元素互换,存在另一个二维数组中。,30,void main() int b32,i,j,a23; printf(“input array a:n); for (i=0;i=1;i+) for (j=0;j=2;

12、j+) scanf(%d, ,31,void 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); ,32,在二维数组a中选出各行最大的元素组成一个一维数组b。,a=( 3 16 87 65 4 32 11 108 10 25 1

13、2 37) b=( 87 108 37 ),思路: 在数组A的每一行中寻找最大的元素,找到之后把该值赋予数组B相应的元素即可。,例2,33,int a34; int b3,i,j,m; printf(array a:); for(i=0;im) m=aij; bi=m; printf(narray b:n); for(i=0;i=2;i+) printf(%5d,bi); printf(n);,34,练习:7.3,35,四、字符数组,(一)、字符数组 (二)、字符串,36,(一)、字符数组,定义,初始化,char c5=h,a,p,p,y;,char c5;,注意: 如果初值个数大于数组长度,

14、按语法错误处理。 如果初值个数小于数组长度,只将这些字符赋给前面那元 素,其余元素自动赋空字符(0)。 可以定义和初始化一个二维字符数组。,37,引用,main() int i; char c5=h,a,p,p,y; for (i=0;i5;i+) printf(%c,ci); printf(n); ,happy,38,(二)、字符串,定义,初始化,char c5=“good”;,char c5;,与字符数组的定义相同,char c5=“good”;,char c=“good”;,char c=g,o,o,d;,区别?数组长度是否相同?,39,输入及输出,方式一,逐个字符输入/输出。(用格式符

15、%c),方式二,将整个字符串一次输入或输出。 (在scanf/printf函数中使用格式符%s),方式三,将整个字符串一次输入或输出。 (使用gets/puts函数),40,char c10 ; scanf(%s,c); printf(%s,c);,happy happy,例1,在语言中规定,数组名就代表了该数组的首地址。 整个数组是以首地址开头的一块连续的内存单元。,41,main() char st15; printf(input string:n); scanf(%s,st); printf(%sn,st); ,happy happy,good bye good,例2,说明: 对一个字符

16、数组,若不作初始化赋值,则必须说明数组长度。 当用scanf函数输入字符串时,字符串中不能含有空格,否则将 以空格作为串的结束符。,42,#include stdio.h main() char s115,s215,s315; printf(input string:n); scanf(%s%s%s,s1,s2,s3); printf(s1:%sns2:%sns3:%sn,s1,s2,s3); ,例3,43,char c10 ; gets(c); puts(c);,happy happy,good bye good bye,gets函数并不以空格作为字符串输入结束的标志, 而只以回车作为输入结

17、束。这是与scanf函数不同的。,例4,44,字符串函数,字符串连接函数 strcat(字符数组1,字符数组2);,字符串拷贝函数 strcpy(字符数组1,字符串2);,字符串比较函数 strcmp(字符串1,字符串2);,测字符串长度函数 strlen(字符数组);,输入或输出函数。 gets/puts (字符数组名);,转换为小写字母函数 strlwr(字符串);,转换为大写字母函数 Strupr(字符串);,45,输入或输出函数。 gets/puts,gets/puts (字符数组名);,格式,char str10,s; gets(str); puts(str); s=getchar(

18、); /注意与上两句的用法的不同之处。 putchar(s);,46,字符串连接函数strcat,格式:strcat (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1 中字符串的 后面,并删去字符串1后的串标志“0”。 本函数返回值是字符数组1的首地址。,47,#includestring.h main() char st130=My name is ; char st210; printf(input your name:n); gets(st2); strcat(st1,st2); puts(st1); ,本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。

19、 字符数组1应定义足够的长度,确保能全部装入被连接的字符串。,48,字符串拷贝函数strcpy,格式:strcpy (字符数组名1,字符数组名2) 功能: 把字符数组2中的字符串拷贝到字符数组1中。 串结束标志“0”也一同拷贝。 字符数组名2,也可以是一个字符串常量。 这时相当于把一个字符串赋予一个字符数组。,49,#includestring.h #includestdio.h main() char st115=hello,st2 =C Language; strcpy(st1,st2); puts(st1); ,50,格式: strcmp(字符数组名1,字符数组名2) 功能: 按ASCI

20、I码值 自左到右比较两个数组中的字符串, 直到出现不同的字符或遇到0为止。 并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串1字符串2,返回值0; 字符串1字符串2,返回值0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。,字符串比较函数strcmp,51,#includestring.h main() int k; char st115,st2=language; printf(input a string:n); gets(st1); k=strcmp(st1,st2); if(k=0) printf(st1=st2n); if(k0) printf(st1st2n); if(k0) printf(st1st2n); ,52,If (str1str2)/错! If (strcmp(str1,str2)0)/对!,53,#includestring.h main() int k; char st=C language; k=st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论