320 likes | 410 Views
第 7 章 数组. 本章教学内容: 7 . 1 一维数组的定义和引用 7 . 2 二维数组的定义和引用 7 . 3 字符数组 本章教学重点 一维数组与排序 二维数组与矩阵 字符数组与字符串. 数组. 是固定数目、 类型相同 的数据的有序集合。. 7.1 一维数组的定义和引用. 问题: 有如下几组数据,它们分别该如何存储、处理呢. 如何存储和处理一个班 80 名同学 C 语言课程的成绩,如:求平均成绩,打印其中高于平均线的成绩。如果对一个班 80 名同学有 5 门课的成绩呢? 如何存储和处理一行字符,如统计各个字符的个数?
E N D
第7章 数组 • 本章教学内容: • 7.1 一维数组的定义和引用 • 7.2 二维数组的定义和引用 • 7.3 字符数组 • 本章教学重点 • 一维数组与排序 • 二维数组与矩阵 • 字符数组与字符串 计算机工程学院 伍俊明
数组 是固定数目、类型相同的数据的有序集合。 7.1 一维数组的定义和引用 问题:有如下几组数据,它们分别该如何存储、处理呢 • 如何存储和处理一个班80名同学C语言课程的成绩,如:求平均成绩,打印其中高于平均线的成绩。如果对一个班80名同学有5门课的成绩呢? • 如何存储和处理一行字符,如统计各个字符的个数? • 如何存储和处理一个m行、n列的矩阵? 这些数据的特点是: 1、具有相同的数据类型 2、使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。
7.1 一维数组的定义和引用 一、一维数组的定义 类型 数组名[常量表达式]; • 说明: • 数组名的命名规则与变量名相同 • 类型是指数组中元素的类型 • 常量表达式指明了元素的个数,不得含变量 • 例:int a[5]; a[0] a[1] a[2] a[3] a[4] a[1] a[2] a[3] a[4] a[0] 10002 10004 10006 10008 10000 计算机工程学院 伍俊明 计算机工程学院 伍俊明
7.1 一维数组的定义和引用 二、一维数组元素的引用 • 数组元素 数组名[下标] • 例:int a[5]有五个元素a[0]、a[1]、a[2]、a[3]、a[4] • 注意: • 数组定义中的5与元素中的下标3含义不同 • 数组元素的下标从0开始,末元素下标为n-1 • 数组元素可以看作是元素所属类型的变量进行操作 • 例7.1 数组元素的引用 举例 计算机工程学院 伍俊明
7.1 一维数组的定义和引用 三、一组数组的初始化 • 数组初始化:定义数组的同时给数组元素赋初值 int a[10]={1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; • 数组初始化时可以只给部分元素赋初值,所给数据依次赋给0号元素开始的若干元素 int a[10]={1, 3, 5, 7, 9}; /*a[5]~a[9]均为0*/ • 数组初始化可以由数据个数确定数组的长度 int a[ ]={1, 2, 3, 4, 5}; /*a的元素个数自动变成5*/ • 要想使一个数组的全部元素为0,初始化如下: int a[10]={0}; 计算机工程学院 伍俊明
7.1 一维数组的定义和引用 四、一维数组程序举例 • 例7.2 求Fibonacci数列的前20项,每行输出5个 #include <stdio.h> void main(){ int i; int f[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++){ if(i%5==0) printf("\n"); printf("%12d",f[i]); } } 解题思路 f[0]=1; f[1]=1; f[i]=f[i-2]+f[i-1], i>=2 运行结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 计算机工程学院 伍俊明
第 一 趟 比 较 7.1 一维数组的定义和引用 • 例7.3 作起泡法对10个数排序(由小到大)。 • 解题思路: • 每一趟中,从第一个元素开始,将相邻的两个元素做比较,大的数移到后头——最大数移到本趟最后 • n个数需要进行n-1趟的比较和移动 计算机工程学院 伍俊明
第 二 趟 比 较 7.1 一维数组的定义和引用 • 第2趟 • 经过n-1趟比较和移动后就可完成排序 • 程序: 程序运行结果如下: input 10 numbers: 1 0 4 8 12 65 -76 100 -45 123↙ the sorted numbers: -76 -45 0 1 4 8 12 65 100 123 计算机工程学院 伍俊明
7.1 一维数组的定义和引用 • 例:在给定的有序数组a中查找用户输入的值,并提示查找的结果。 • 解题思路 • 数组必须确保是有序的,如从小到大排序 • 采用二分查找方法求解 • 先找出有序数组中间的元素 • 如要找的数值等于中间元素,查找成功; • 如要找的数值小于中间元素,则在左半部分继续查找; • 如要找的数值大于中间元素,则在右半部分继续查找 #include <stdio.h> #define N 10 void main( ){ int a[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, d; int low=0, high=N-1, mid; printf(“请输入要查找的数值:”); scanf(“%d”, &d); while (low<=high) { mid=(low+high)/2; if (a[mid]==d) { /*查找成功的情形*/ printf(“查找成功:a[%d]=%d\n”, mid, d); return } else if (a[mid]>d]) /*需继续在左半部分查找*/ high=mid-1; else /*需继续在右半部分查找*/ low=mid+1; } /*while*/ } 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 一、二维数组的定义 类型 数组名[常量表达式1][常量表达式2]; 例如: float x[2][3]; 地址值数组元素 x[0][0] x[0][1] x[0][2] x[1][0] x[1][1] x[1][2] 2000H 2004H 2008H 200cH 2010H 2014H inta[3,4],b(3,4),c[ ][ ],d(3)(4); 以行序为主,依次顺序排放。 二维数组可视为特殊的一维数组 x[0]是一个一维数组名, 有3个浮点型元素 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 二、二维数组元素的引用 数组名[行下标][列下标] • 例:float a[3][4], b[5][10]; a[2][3]=6; a[1][0]=a[0][3]+10; b[1][2]=a[2][3]/2; a[3][4]=3; /* 下标越界 */ a[1,2]=1; /* 应写成 a[1][2]=1; */ 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 三、二维数组的初始化 • 分行给二维数组赋初值 例:int a[2][3]={{1,2,3},{4,5,6}}; 初始化后结果: 1 2 3 4 5 6 • 按数组元素在内存中排列的顺序对各元素赋初值 例:int a[2][3]={1,2,3,4,5,6}; 等价于int a[][3]={1,2,3,4,5,6}; • 给部分元素赋初值 例:int a[2][3]={{1},{4}}; 初始化后结果: 1 0 0 4 0 0 分析下列情形: int a[3][4]= {{1}, {0, 6}, {0, 0, 11}}; int b[3][4]= {{1}, { }, {9}}; 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 • 说明: • 如果对全部元素赋初值,则定义数组时可以不指定第一维的长度,但第二维的长度不能省,例: int a[3][4]={1, 2, 3, 4, ,5 ,6, 7, 8, 9, 10, 11, 12}; 等价于: int a[ ][4]={1, 2, 3, 4, ,5 ,6, 7, 8, 9, 10, 11, 12}; • 赋初值时可通过花括号对来确定第一维的长度,例:int a[ ][4]={{0, 0, 3}, { }, {0, 10)}; • 所有未初始化的数值型元素初值取0。 不可省! a结果: a[0]: 0 0 3 a[1]: 0 0 0 a[2]: 0 10 0 计算机工程学院 伍俊明
例如:a= 1 2 3 1 4 4 5 6 b= 2 5 3 6 7.2 二维数组的定义和引用 四、二维数组程序举例 • 例7.4 将一个数组a的行和列元素互换,存到另一数组中。 #include <stdio.h> void main() { int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; printf(″array a:\n″); for (i=0;i<=1;i++){ for (j=0;j<=2;j++){ printf(“%5d”, a[i][j]); b[j][i]=a[i][j]; } /*for j */ printf(″\n″); } 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 printf(″array b:\n″); for (i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d″,b[i][j]); printf(“\n”); } /*for i*/ } /*程序结束*/ • 运行结果 运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 36 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 • 例7.5 在3*4的矩阵中,输出最大元素及其行号列号 #include “stdio.h” void main( ) { int i, j, row=0, colum=0, max; int a[3][4]={{1,2,3,4}, {9,8,7,6}, {-10,10,-5,2}}; max=a[0][0]; row=colum=0; for (i=0; i<3; i++) for (j=0; j<4; j++) if (a[i][j]>max) { max=abs(a[i][j]); row=i; colum=j; } /*if a[i][j]*/ printf(“max=%d, row=%d, colum=%d\n”, max, row, colum); } 计算机工程学院 伍俊明
7.2 二维数组的定义和引用 • 例:某班有3门课程(语文、数学、英语)的成绩。先输入学生人数,然后按编号从小到大的顺序依次输入学生成绩,最后统计每门课程全班的总成绩和平均成绩,以及每个学生课程的总成绩和平均成绩。 • 解题思路: • 假设该班人数不超过50人,定义一个数组score[50][5], • score[0]、score[1]、score[2]三列分别存放三门课成绩 • score[3]、score[4]分别存放总分和平均分。 • 程序 • 第一部分:读入原始数据——学生成绩 • 第二部分:数据处理——计算总分和均分 • 第三部分:输出结果 计算机工程学院 伍俊明
7.3 字符数组 一、字符数组的定义 • 字符数组:用来存放字符的数组 • 例:char[10]; c[0]=′I′; c[1]=′ ′;c[2]=′a′; c[3]=′m′; c[4]=′ ′; c[5]=′h′; c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′; • 字符数组与整型数组也相通。 计算机工程学院 伍俊明
7.3 字符数组 二、字符数组的初始化 • 初始化时给各个元素赋值,未赋值的元素为空字符 • 例:char c[10]={ ‘I’,‘ ’,‘a’,‘m’,‘ ’,‘h’,‘a’,‘p’,‘p’,‘y’}; char diamond[5][5]={{‘ ’,‘ ’,‘*’}, {‘ ’,‘*’,‘ ’,‘*’}, {‘*’,‘ ’,‘ ’,‘ ’,‘*’}, {‘ ’,‘*’,‘ ’,‘*’}, {‘ ’,‘ ’,‘*’} } char c[10]={‘c’, ‘ ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’, ‘m’}; • 数组如未初始化,则各个元素的值无法预料 • 如果花括号内提供的字符个数大于数组长度,按语法错误处理 计算机工程学院 伍俊明
7.3 字符数组 三、字符数组的引用 • 例7.6 引用字符数组中的元素,得到一个字符串。 • 例7.7 输出菱形图。 计算机工程学院 伍俊明
7.3 字符数组 四、字符数组与字符串 • 字符数组常用来存储和处理字符串。一个字符数组中如果含有空字符‘\0’,就可以构成一个字符串。 • 可用字符串常量来初始化字符数组。 例:char c[]={“I love c language”}; 或 char c[]=“I love c language”; char str[10]=“China”; • 字符数组可以不r含有‘\0’字符,此时不宜作字符串。 例:char c[6]={‘C’,‘h’ ,‘i’ ,‘n’ ,‘a’}; char c[6]={‘C’,‘h’ ,‘i’ ,‘n’ ,‘a’ ,‘\0’}; 不等价 计算机工程学院 伍俊明
7.3 字符数组 五、字符数组的输入输出 • 逐个字符输入输出——格式符用%c • 例:输入一串字符,并输出之 #include <stdio.h> void main( ){ int i; char c[10]; printf(“请输入一串字符(少于10个):”); for (i=0; i<10; i++) scanf(“%d”, &c[i]); printf(“所输入一串字符是:”); for (i=0; i<10; i++) printf(“%c”, c[i]); printf(“\n”); } 计算机工程学院 伍俊明
7.3 字符数组 五、字符数组的输入输出 • 整体作为字符串一次输入或输出——格式符用%s • 例:char c[15]; scanf(“%s”, c); printf(“%s”, c); 数组名实际上就是首元素的地址,不能用&c 整个数组用作字符串,输出荐不能写成c[0] 运行情况1: China China char c[]={‘H’, ‘o’ , ‘w’ , ‘\0’ , ‘a’ , ‘r’ , ‘e’ , ‘\0’ , ‘y’ , ‘o’ , ‘u’ , ‘?’ , ‘\0’}; printf(“%s”, c); 结果如何? 运行情况2: How are you? How How 计算机工程学院 伍俊明
7.3 字符数组 六、字符串处理函数 1、puts函数 • 形式:puts(字符数组) • 功能:将字符串送终端输出 • 例:char str[]={″China\nBeijing″}; puts(str); 2、gets函数 • gets(字符数组) • 功能:从终端上读入一串字符,送到字符数组中 • 例:char str[20]; gets(str); puts(str); 运行情况1: China Beijing 运行情况2: How are you? How are you? 计算机工程学院 伍俊明
7.3 字符数组 六、字符串处理函数 3、strcat函数 • 形式:strcat(字符数组1,字符数组2) • 功能:把字符数组1中的内容并入到字符数组1的末尾 • 例:char str1[20]={“Lianyungang,”}, str2={“Jiangsu”}; puts(“%s”, strcat(str1, str2)); 字符数组1必须有足够大的空间 str1 str2 str1 计算机工程学院 伍俊明
7.3 字符数组 六、字符串处理函数 4、strcpy函数 • 形式:strcpy(字符数组1,字符串2) • 功能:将字符串2复制到字符数组1中。 • 例:char str1[20]=“Lianyungang”, str2[]=“Jiangsu”; strcpy(str1, str2); puts(str1); 字符数组1必须有足够大的空间 str1 str2 str1 计算机工程学院 伍俊明
7.3 字符数组 六、字符串处理函数 5、strcmp函数 • 数组:strcmp(字符串1,字符串2) • 功能:比较两个字符串的大小(逐字符比较ASCII码) • 返回值:正数——字符串1>字符串2 0——字符串1=字符串2 负数——字符串1<字符串2 • 例:char str1[]=“China”, str2[]=“America”; if (strcmp(str1, str2)) printf(“Yes”); • 例: “computer”>“compare”, “these”<“this” 计算机工程学院 伍俊明
7.3 字符数组 六、字符串处理函数 6、strlen函数 • 形式:strlen(字符串) • 功能:返回字符串的长度(即字符个数,不含‘\0’) • 例:char str[10]={“China”}; pritnf(“%d”, strlen(str)); /*结果是5,而不是6!*/ 7、strlwr函数 • 形式:strlwr(字符串) • 功能:将字符串中的所有大写字母换成小写字母 8、strupr函数 • 形式:strupr(字符串) • 功能:将字符串中的所有小写字母换成大写字母 计算机工程学院 伍俊明
7.3 字符数组 七、字符数组应用举例 • 例7.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开。 num单词计数器 word单词指示器 0—遇到空格 1—不是空格 如前一个是空格,当前非空格,出现新单词。 计算机工程学院 伍俊明
7.3 字符数组 • 例7.9 输入3个字符串,输出其中最大者 #include<stdio.h> #include<string.h> void main ( ) { char string[20]; char str[3][20]; int i; for (i=0;i<3;i++) gets (str[i]); if (strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]); if (strcmp(str[2],string)>0) strcpy(string,str[2]); printf("\nthe largest string is:\n%s\n",string); } 计算机工程学院 伍俊明
7.3 字符数组 • 例:输入若干个姓名,查找指定的姓名 • 解题思路 • 输入若干人的姓名 • 输入要查找的姓名 • 由于姓名表未排序,采用顺序查找算法确定指定姓名是否在名字列表中 #include <stdio.h> #include <string.h> #define N 5 void main( ){ int i; char s[10], name[N][10]; printf(“请输入%d个人的姓名:”, N); for (i=0; i<N; i++) scanf(“%s”, name[i]); printf(“请输入要查找的姓名:”); scanf(“%s”, s); for (i=0; i<N; i++) if (strcmp(name[i], s)==0) break; if (i<N) printf(“查找到此人!\n”); else printf(“查无此人!\n”); } 计算机工程学院 伍俊明
第7章 数组 • 作业(P152) • 7.2 • 7.3 • 7.4(上机) • 7.6(上机) • 7.8 • 7.9 • 7.10(上机) • 7.15 计算机工程学院 伍俊明