560 likes | 627 Views
第. 7. 章. 数 组. 用 a1 , a2 , a3 , a4 四个整型变量来表示 4 个学生的年龄。输出这些学生的年龄时,可以使用以下语句: printf( ” %d %d %d %d ” ,a1,a2,a3,a4);. 问题的引出. 一维数组. 二维数组. 字符数组与字符串. 数组应用举例. 第. 7. 章. 数 组. 当输入学生为 40 个时,就需要引入 40 个变量,显得十分繁琐。 C 语言提供了 数组 这一数据类型来解决这类问题。 如同样是输出学生的年龄,使用的语句如下: for(i=1;i<=4;i++)
E N D
第 7 章 数 组 用 a1,a2,a3,a4四个整型变量来表示4个学生的年龄。输出这些学生的年龄时,可以使用以下语句: printf(”%d %d %d %d”,a1,a2,a3,a4); 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 当输入学生为40个时,就需要引入40个变量,显得十分繁琐。C语言提供了数组这一数据类型来解决这类问题。 如同样是输出学生的年龄,使用的语句如下: for(i=1;i<=4;i++) printf(”%d”,a[i]); 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • 数组基本知识概述: • 数组类型是一种构造类型数据。 • 同名带下标的变量形成一个数组,带下标的变量统称为数组元素。同一数组中的每个元素只是下标不同。 • 例如:具有10个数组元素的数组a的数组元素为a[0],a[1],……,a[9]。0,1,……,9叫下标。 • 使用数组类型的好处是可以让一批具有相同性质的数据共用一个变量名,(用下标区别),而不必为每一个数据选定一个名字,利用下标使用循环结构去访问每一个数组元素,使程序设计简洁。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • C中数组类型的特点:(1)数组元素的数量必须确定,不允许变动。(2)数组元素的数据类型必须相同,不允许混合。(3)数组必须先定义后使用。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 7.2 一维数组 问题的引出 一维数组 7.2.1 一维数组的说明、引用和存储 二维数组 7.2.2 一维数组的初始化 字符数组与字符串 7.2.3 一维数组的经典实例 数组应用举例
第 7 章 数 组 • 【例7.1】一维数组说明的一个实例。 • #include <stdio.h> • main() • { int i; • int a[40]; • /*描述学生年龄的一维数组的说明*/ • a[0]=18; • a[1]=20; • for(i=2;i<40;i++) • a[i]=19; • } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 具有一个下标的数组称为一维数组 一维数组一般形式为: <类型说明符> <数组名>[<常量表达式>] <类型说明符>:说明了数组元素所属的数据类型,可以是整型、浮点型等,决定了该数组的各个元素能存放的数据类型。 <常量表达式>:指明了数组的大小,即数组元素的个数,也称为数组的长度,它必须是一个整型值,并且不可缺省。常量表达式中不能出现变量,但可使用符号常量,常量表达式只能而且必须用方括号括住,不能用圆括号。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 下面是一些一维数组说明的例子: int array[100]; /*说明一个元素个数为 100的整型数组*/ float f[20]; /*说明一个元素个数为20的浮点型数组*/ char c[50]; /*说明一个元素个数为50的字符型数组*/ int a[10+20]; /*说明一个元素个数为30的整型数组,这里10+20是一个常量表达式*/ 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 数组元素的引用是通过数组名和下标来确定的,一般形式是: <数组名>[<下标表达式>] <下标表达式>表示了数组中的某一个元素的顺序号,必须是整型常量、整型变量或整型表达式。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 说明: 1)、若数组的元素个数说明为n,则下标表达式的范围是从0到n-1,共n个整数,超出这个范围就称为数组下标越界。 C中下标超界并不引起编译上的错误,但可能会产生一些意想不到的问题。 2)、数组元素可以象普通数据一样进行赋值和算术运算以及输入和输出操作。 3)、数组的使用通过逐个引用数组元素来实现,不能一次引用整个数组。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 例:从键盘读入10个整数存放在一数组中,然后按逆顺序输出。(程序见cyy2\L7_1.c) 问题的引出 main() { int i; int a[10]; for (i=0;i<=9;i++) {printf("Input No:%2d data:",i+1); scanf("%d",&a[i]);} for (i=9;i>=0;i--) printf("%8d",a[i]); printf("\n"); } 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • 数组存放形式:在说明一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素。 • 如说明一个元素个数为10的整型数组a: • int a[10]; • 则它在内存中存放的形式如图: 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 一维数组的初始化有多种方法,具体如下: (1) 对数组全部元素初始化,如: int a[10]= {0,1,2,3,4,5,6,7,8,9}; (2) 对数组部分元素初始化,如: int a[6]={0,1,2,3}; 相当于: int a[6]={0,1,2,3,0,0}; (3) 对数组全部元素显式赋值时可不指定数组长度,如: int a[]={0,1,2,3,4}; 相当于: int a[5]={0,1,2,3,4}; 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • 【例7.2】一维数组的输入与输出。 • #include <stdio.h> • main() • { int i; • int a[4]; • /*说明了一个元素个数为4的整型数组*/ • printf(”\n输入数组a(共4个整数):”); • for(i=0;i<4;i++) • scanf(”%d”,&a[i]); • printf(”\n输出数组a:”); • for(i=0;i<4;i++) • printf(”a[%d]=%d ”,i,a[i]); • } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例 Cyy2\L7_2.c
第 7 章 数 组 运行结果如下: 输入数组a(共4个整数):4 5 6 12 输出数组a: a[0]=4 a[1]=5 a[2]=6 a[3]=12 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 例7.3 求数组中的最大和最小值 。 main() {int i,max,min; int term[10]; for (i=0;i<=9;i++) {printf("Input No:%2d data:",i+1); scanf("%d",&term[i]);} max=term[0];min=term[0]; for (i=1;i<10;i++) {if (term[i]<min) min=term[i]; if (term[i]>max) max=term[i]; } printf("max=%d\n",max); printf("min=%d\n",min); } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例 Cyy2\L7_3.c
第 7 章 数 组 例7.4 将数组中的数逆序放置后输出 。 #define N 10 main() { int i,temp; int a[N]={23,90,87,76,100,0,167,3,8,287}; printf("Old array:"); for (i=0;i<N;i++) printf("%5d",a[i]); for (i=0;i<N/2;i++) {temp=a[i];a[i]=a[N-i-1];a[N-i-1]=temp;} printf("\nNew array:"); for (i=0;i<N;i++) printf("%5d",a[i]); printf("\n"); } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例 Cyy2\L7_4.c
第 7 章 数 组 例7.5 用数组求Fibonacci数列前20项 。 问题的引出 main() { int i; long f[20]={1,1}; for (i=2;i<20;i++) f[i]=f[i-1]+f[i-2]; for (i=0;i<20;i++) {if(i%5==0) printf("\n"); printf("%8ld",f[i]);} printf("\n"); } 一维数组 二维数组 字符数组与字符串 数组应用举例 Cyy2\L7_5.c
第 7 章 数 组 例7.6 线性查找的实现 。 #define N 10 main() { int i,x,find=0; int a[N]={23,90,87,76,100,23,167,3,87,287}; printf("Input a integer to find:"); scanf("%d",&x); for (i=0;i<N;i++) if (x==a[i]) {printf("%d in a[%d]\n",x,i); find=1;} if(find==0) printf("%d not find\n",x); } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例 注:课本上的程序只能找到一个数,这里能找到所有的数。 Cyy2\L7_6.c
第 7 章 数 组 例7.7 冒泡(起泡)排序的实现 。(利用冒泡法对10个数由小到大排序,设10个数存放在数组a的a[1]~a[10]中,a[0]不用) 问题的引出 算法: (1)从a[1]到a[10]相邻两数两两比较(a[1]与a[2],a[2]与a[3],….),把小数放在前面,大数放在后面,则最大数放在a[10]。 (2)从a[1]到a[9] 相邻两数两两比较,把小数放在前面,大数放在后面,则第二大数放在a[9]。 …… (9)对a[1]和a[2]比较,小数放在前面,大数放在后面,则a [1]为最小数。 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 原始数据: 25 15 30 8 10 a[1] a[2] a[3] a[4] a[5] 演示如下: (以5个元素排序为例) 15 8 8 15 10 25 15 25 8 10 25 10 30 30 排序完毕! 第四趟排序 第三趟排序 第一趟排序 第二趟排序 Cyy2\L7_7.c
第 7 章 数 组 7.3 二维数组 问题的引出 一维数组 7.3.1 二维数组的说明、引用和存储 二维数组 7.3.2 二维数组的初始化 字符数组与字符串 7.3.3 二维数组的经典实例 数组应用举例
第 7 章 数 组 • 具有多个下标的数组称为多维数组,二维数组是具有两个下标的数组。 • 学生年龄表 • 若用一维数组描述,就要用到两个数组: • int num[5]; /*存放学号*/ • int age[5]; /*存放年龄*/ • 可用二维数组来处理,有下列说明语句: • int age[2][5]; 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • 二维数组说明的一般形式: • <类型标识符> <数组名>[<常量表达式>][<常量表达式>] • <类型标识符>前面也可以出现<存储类型> • 二维数组的说明形式同一维数组基本相同,只不过它的<常量表达式>有2个。 • N维数组的说明形式也基本相同,它的<常量表达式>个数有N个。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 二维数组元素引用的一般形式如下: <数组名>[<下标表达式>][<下标表达式>] 对上述二维数组age而言,以下都是对二维数组元素的正确引用: age[0][1] age[i][3] 0<=i<=1 age[1][i+2] 0<=(i+2)<=4即 -2<=i<=2 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 注意:在说明二维数组时不能写成age[3,4],而要写成age[3][4];对二维数组元素的引用不能写成a[0,0],而要写成a[0][0]。 在C语言中把二维数组看成是一个数组的数组,即可以把二维数组看作是一个特殊的一维数组,该一维数组的每个数据元素也是一个一维数组。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 在C语言中,二维数组的元素是按行存储的,即在内存中先放第一行元素,再放第二行元素……。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 a[0][0] a[0][1] a[0][2] a[0]3] a[0][4] a[1][0] a[1[1] a[1][2] a[1][3] a[1][4] 二维数组的存放形式 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 二维数组的初始化有以下四种形式: 1)按行依次对二维数组赋初值 static int a[2][5]={{1,2,3,4,5},{15,16,14,16,17}}; 2)将所有数据写在一个花括号内,按数组元素排列的顺序对各数组元素赋初值。 static inta[2][5]={1,2,3,4,5,15,16,14,16,17}; 3)可以对部分元素显式赋初值 static int a[2][3]={{1},{4}}; 4)若对全部元素显式赋初值,则数组第一维的元素个数在说明时可以不指定,但第二维的元素个数仍然不能缺省。 int a[][3]={1,2,3,4,5,6}; 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • 【例7.8】求一个4×4矩阵对角线元素之和。 • #include <stdio.h> • main() • { static int a[4][4]={{12,76,4,1},{-19,28,55,-6}, • {2,10,13,-2},{3,-9,112,-100}}; • /*矩阵元素初始化*/ • int i,sum; /*sum:用于求和*/ • sum=0; • /*遍历所有的对角线元素,并求和*/ • for(i=0;i<4;i++) • sum+=a[i][i]; • printf(”对角线和为%d\n”,sum); • } • 运行结果如下: • 对角线和为-47 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例 Cyy2\L7_8.c
第 7 章 数 组 补充例:设有矩阵a4×5和b5×3 求c=a×b 分析:c为4×3的矩阵,它的元素cij= 问题的引出 程序见cyy2\B7_1.c main() { int i,j,k; int a[5][6],b[6][4],c[5][4]; clrscr(); printf("Input array a(4*5):\n"); for (i=1;i<=4;i++) {printf("Row %d:",i); for (j=1;j<=5;j++) scanf("%d",&a[i][j]); } 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 printf("Input array b(5*3):\n"); for (i=1;i<=5;i++) {printf("Row %d:",i); for (j=1;j<=3;j++) scanf("%d",&b[i][j]); } printf("Array c=a*b(4*3):\n"); for (i=1;i<=4;i++) {for (j=1;j<=3;j++) {c[i][j]=0; for (k=1;k<=5;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; printf("%8d",c[i][j]); } printf("\n"); } } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 7.4 字符数组与字符串 问题的引出 一维数组 7.4.1 字符数组的说明与初始化 二维数组 7.4.2 字符串 字符数组与字符串 7.4.3 字符数组的经典实例 数组应用举例
第 7 章 数 组 • 字符数组是数组元素类型为字符的数组,字符数组中的每一个元素保存的是字符。 • 字符数组说明的一般形式是: • char <数组名>[<常量表达式>] • 字符数组初始化: • char ch[8]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’}; 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 【例7.11】字符数组使用的一个实例。 假设有10本书按0-9编好号,当某本书被读过后,在上面做一个标记’T’,表示已读过,否则做一个标记’F’,表示未读。现要求随便抽一本书,判断它是否读过。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • #include <stdio.h> • main() • {char book[10]= • {’T’,’F’,’F’,’T’,’F’,’T’,’T’,’F’,’T’,’F’}; • int num; • printf(”请给出书的编号(0-9):”); • scanf(”%d”,&num); • if(book[num]==’T’) • printf(”该书已读过”); • else • printf(”该书未读过”); • } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例 Cyy2\L7_11.c
第 7 章 数 组 • 运行结果如下: • 请给出书的编号(0-9):5 • 该书已读过 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 补充例:从键盘接受最多10个字符,遇回车结束,并输出这些字符。 程序见cyy2\B7_2.c 问题的引出 #include <stdio.h> main() {char c[11]; int i; for (i=1;(c[i]=getchar())!='\n' && i<=10;i++) printf("%c",c[i]); printf("\n"); } 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • C语言没有提供字符串数据类型,没有字符串变量,而是将字符串作为字符数组来处理。 • 可以通过字符数组来处理字符串。 • 通常字符数组的长度大于字符串实际长度,为了测定字符串的实际长度,C规定一个字符串结束标志。以‘\0’代表。 • 在字符数组末尾出现串结束符’\0’,就成字符串,就可调用相应的字符串处理函数进行处理。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 • 如对于字符数组char s[10],若将它用来存放字符串”A String”,则在内存中的该字符数组存放的形式如: • s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] • 字符串的存放形式 问题的引出 一维数组 二维数组 • 对字符串常量,C自动加’\0’作为结束符。 字符数组与字符串 • 对字符数组中元素一个一个赋值时,往往人为加上一个 ‘\0’,以方便作为字符串处理。 数组应用举例
第 7 章 数 组 • 字符串的初始化有以下两种形式: • 与字符数组的初始化形式相同: • char str[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’\0’};① • 字符串可以进行部分初始化,即 • char pstr[8]={’a’,’b’,’c’,’d’,’\0’}; ② • 其中未赋值的部分将自动赋值为’\0’,因此pstr也可以进行如下的初始化 • char pstr[8]={’a’,’b’,’c’,’d’}; ③ • ②式与③式是等价的。 • char ch[8]={’A’,’ ’,’S’,’t’,’r’,’i’,’n’,’g’}; ④ • ④式与③式是不一样的, ③式是部分初始化,后面自动保存有串结束符‘\0’,而④式中ch数组的长度与初始化的字符个数相等,没有串结束符‘\0’,是一个不 带串结束符的字符数组,不能对它使用与字 符串有关的标准库函数。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 (2) 对字符串的初始化还有两种简写形式,如对 char str[]= {’a’,’b’,’c’,’d ’,’e’,’f’,’g’,’h’,’\0’}; 下列两式都是等价的简写形式: char str[]=”A string”; char str[]={”A string”}; 系统会自动在字符串后添加一个串结束符’\0’。 问题的引出 一维数组 二维数组 字符数组与字符串 注1:字符串常量用双引号,字符用单引号。 注2:此法定义的数组长度为字符串实际长度加1(系统自动加了‘\0’)。 注3:只有在字符数组定义时才可把整个字符串“赋给”字符数组,在执行代码中是不允许的,必须调用相应的函数才能进行“赋值”操作。 数组应用举例
第 7 章 数 组 • 字符数组的输入输出 • 方法一:作为一般数组逐个字符输入输出。(用格式符“%c ”) • 方法二:作为字符串(保存有串结束符)整体输入输出。(用格式符“%s” ) • 注意: • 1) 结束符’\0’不输出。 • 2) 用”%s”格式输出字符串时,输出项是字符数组名,而不是数组元素名。 • 3) 若数组长度大于字符串实际长度,也只输出到’\0’结束。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 4) 若字符数组包含多个’\0’,则遇第一个’\0’时输出结束。 5) 利用”%s”格式的scanf()输入多个字符串时,字符串间以空格分隔;scanf()中的输入项是字符数组名,不能再加地址符&;各输入项取字符串时遇空格或回车结束。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 【例7.12】输出一个三角图形。 该程序要求在屏幕上打印出一个由字符’*’组成的三角形。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 #include <stdio.h> main() { /*说明并初始化一个二维字符数组*/ char triangle[][5]={{’ ’,’ ’,’*’,’ ’,’ ’}, {’ ’,’*’,’ ’,’*’,’ ’}, {’*’, ’ ’, ’*’,’ ’, ’*’}}; int i,j; for(i=0;i<3;i++) { for(j=0;j<5;j++) printf(”%c”,triangle[i][j]); printf(”\n”); /*输出一行元素后换行*/ } } 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 运行结果如下: * * * * * * 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例
第 7 章 数 组 7.5 数组应用举例 问题的引出 一维数组 7.5.1 排序 二维数组 7.5.2 二分查找 字符数组与字符串 7.5.3 用高斯消去法求解线性方程组 数组应用举例 7.5.4 一个数模求解实例
第 7 章 数 组 1. 直接插入排序法 直接插入排序法按元素原来的顺序,先将下标为0的元素作为已排好数据,然后从下标为1的元素开始,依次把后面的元素按大小插入到前面的元素中间,直到将全部元素插完为止,从而完成排序功能。 问题的引出 一维数组 二维数组 字符数组与字符串 数组应用举例