1 / 32

本章教学内容: 7 . 1 一维数组的定义和引用 7 . 2 二维数组的定义和引用 7 . 3 字符数组 本章教学重点 一维数组与排序 二维数组与矩阵 字符数组与字符串

第 7 章 数组. 本章教学内容: 7 . 1 一维数组的定义和引用 7 . 2 二维数组的定义和引用 7 . 3 字符数组 本章教学重点 一维数组与排序 二维数组与矩阵 字符数组与字符串. 数组. 是固定数目、 类型相同 的数据的有序集合。. 7.1 一维数组的定义和引用. 问题: 有如下几组数据,它们分别该如何存储、处理呢. 如何存储和处理一个班 80 名同学 C 语言课程的成绩,如:求平均成绩,打印其中高于平均线的成绩。如果对一个班 80 名同学有 5 门课的成绩呢? 如何存储和处理一行字符,如统计各个字符的个数?

nuri
Download Presentation

本章教学内容: 7 . 1 一维数组的定义和引用 7 . 2 二维数组的定义和引用 7 . 3 字符数组 本章教学重点 一维数组与排序 二维数组与矩阵 字符数组与字符串

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第7章 数组 • 本章教学内容: • 7.1 一维数组的定义和引用 • 7.2 二维数组的定义和引用 • 7.3 字符数组 • 本章教学重点 • 一维数组与排序 • 二维数组与矩阵 • 字符数组与字符串 计算机工程学院 伍俊明

  2. 数组 是固定数目、类型相同的数据的有序集合。 7.1 一维数组的定义和引用 问题:有如下几组数据,它们分别该如何存储、处理呢 • 如何存储和处理一个班80名同学C语言课程的成绩,如:求平均成绩,打印其中高于平均线的成绩。如果对一个班80名同学有5门课的成绩呢? • 如何存储和处理一行字符,如统计各个字符的个数? • 如何存储和处理一个m行、n列的矩阵? 这些数据的特点是: 1、具有相同的数据类型 2、使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。

  3. 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 计算机工程学院 伍俊明 计算机工程学院 伍俊明

  4. 7.1 一维数组的定义和引用 二、一维数组元素的引用 • 数组元素 数组名[下标] • 例:int a[5]有五个元素a[0]、a[1]、a[2]、a[3]、a[4] • 注意: • 数组定义中的5与元素中的下标3含义不同 • 数组元素的下标从0开始,末元素下标为n-1 • 数组元素可以看作是元素所属类型的变量进行操作 • 例7.1 数组元素的引用 举例 计算机工程学院 伍俊明

  5. 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}; 计算机工程学院 伍俊明

  6. 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. 一 趟 比 较 7.1 一维数组的定义和引用 • 例7.3 作起泡法对10个数排序(由小到大)。 • 解题思路: • 每一趟中,从第一个元素开始,将相邻的两个元素做比较,大的数移到后头——最大数移到本趟最后 • n个数需要进行n-1趟的比较和移动 计算机工程学院 伍俊明

  8. 二 趟 比 较 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 计算机工程学院 伍俊明

  9. 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*/ } 计算机工程学院 伍俊明

  10. 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个浮点型元素 计算机工程学院 伍俊明

  11. 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; */ 计算机工程学院 伍俊明

  12. 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}}; 计算机工程学院 伍俊明

  13. 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 计算机工程学院 伍俊明

  14. 例如: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″); } 计算机工程学院 伍俊明

  15. 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 计算机工程学院 伍俊明

  16. 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); } 计算机工程学院 伍俊明

  17. 7.2 二维数组的定义和引用 • 例:某班有3门课程(语文、数学、英语)的成绩。先输入学生人数,然后按编号从小到大的顺序依次输入学生成绩,最后统计每门课程全班的总成绩和平均成绩,以及每个学生课程的总成绩和平均成绩。 • 解题思路: • 假设该班人数不超过50人,定义一个数组score[50][5], • score[0]、score[1]、score[2]三列分别存放三门课成绩 • score[3]、score[4]分别存放总分和平均分。 • 程序 • 第一部分:读入原始数据——学生成绩 • 第二部分:数据处理——计算总分和均分 • 第三部分:输出结果 计算机工程学院 伍俊明

  18. 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′; • 字符数组与整型数组也相通。 计算机工程学院 伍俊明

  19. 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’}; • 数组如未初始化,则各个元素的值无法预料 • 如果花括号内提供的字符个数大于数组长度,按语法错误处理 计算机工程学院 伍俊明

  20. 7.3 字符数组 三、字符数组的引用 • 例7.6 引用字符数组中的元素,得到一个字符串。 • 例7.7 输出菱形图。 计算机工程学院 伍俊明

  21. 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’}; 不等价 计算机工程学院 伍俊明

  22. 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”); } 计算机工程学院 伍俊明

  23. 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 计算机工程学院 伍俊明

  24. 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? 计算机工程学院 伍俊明

  25. 7.3 字符数组 六、字符串处理函数 3、strcat函数 • 形式:strcat(字符数组1,字符数组2) • 功能:把字符数组1中的内容并入到字符数组1的末尾 • 例:char str1[20]={“Lianyungang,”}, str2={“Jiangsu”}; puts(“%s”, strcat(str1, str2)); 字符数组1必须有足够大的空间 str1 str2 str1 计算机工程学院 伍俊明

  26. 7.3 字符数组 六、字符串处理函数 4、strcpy函数 • 形式:strcpy(字符数组1,字符串2) • 功能:将字符串2复制到字符数组1中。 • 例:char str1[20]=“Lianyungang”, str2[]=“Jiangsu”; strcpy(str1, str2); puts(str1); 字符数组1必须有足够大的空间 str1 str2 str1 计算机工程学院 伍俊明

  27. 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” 计算机工程学院 伍俊明

  28. 7.3 字符数组 六、字符串处理函数 6、strlen函数 • 形式:strlen(字符串) • 功能:返回字符串的长度(即字符个数,不含‘\0’) • 例:char str[10]={“China”}; pritnf(“%d”, strlen(str)); /*结果是5,而不是6!*/ 7、strlwr函数 • 形式:strlwr(字符串) • 功能:将字符串中的所有大写字母换成小写字母 8、strupr函数 • 形式:strupr(字符串) • 功能:将字符串中的所有小写字母换成大写字母 计算机工程学院 伍俊明

  29. 7.3 字符数组 七、字符数组应用举例 • 例7.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开。 num单词计数器 word单词指示器 0—遇到空格 1—不是空格 如前一个是空格,当前非空格,出现新单词。 计算机工程学院 伍俊明

  30. 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); } 计算机工程学院 伍俊明

  31. 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”); } 计算机工程学院 伍俊明

  32. 第7章 数组 • 作业(P152) • 7.2 • 7.3 • 7.4(上机) • 7.6(上机) • 7.8 • 7.9 • 7.10(上机) • 7.15 计算机工程学院 伍俊明

More Related