1 / 48

数 组

第 6 章. 数 组. 6.1 数组的基本概念 6.2 一维数组的定义与引用 6.2.1 定义一维数组 6.2.2 引用一维数组元素 6.2.3 一维数组的初始化 6.2.4 一维数组程序举例 6.3 二维数组的定义与引用 6.2.1 定义二维数组 6.2.2 引用二维数组元素 6.2.3 二维数组的初始化 6.2.4 二维数组程序举例. 6.3 字符数组 6.3.1 定义字符数组 6.3.2 字符数组的初始化 6.3.3 引用字符数组的元素 6.3.4 字符串和字符串桔树标志

dagan
Download Presentation

数 组

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. 第6章 数 组 6.1 数组的基本概念 6.2 一维数组的定义与引用 6.2.1 定义一维数组 6.2.2 引用一维数组元素 6.2.3 一维数组的初始化 6.2.4 一维数组程序举例 6.3 二维数组的定义与引用 6.2.1 定义二维数组 6.2.2 引用二维数组元素 6.2.3 二维数组的初始化 6.2.4 二维数组程序举例 6.3 字符数组 6.3.1 定义字符数组 6.3.2 字符数组的初始化 6.3.3 引用字符数组的元素 6.3.4 字符串和字符串桔树标志 6.3.5 字符数组的输入输出 6.3.6 字符串处理函数 6.3.7 字符数组应用举例 本章小结

  2. 数组的基本概念 6.1 ● 数组是相同类型、有序数据的集合,用统一的数组名来表示, 数组中的每一个分量——元素用下标来区分。 数组元素又称为下标变量,而以前的变量称为简单变量。 向量 a1、a2、a3、……、an a[1] a[2] a[3] …… a[n] 数组名 下标 下标变量 教学进程

  3. 一维数组的定义与引用 问题 ●数组名的命名规则与变量名相同,遵循标识符命名规则。 ● 说明数组大小的常量表达式必须为整型,并且用方括号括起来(不能用圆括号)。注意,下标是从0开始的。 ● 说明数组大小的常量表达式中可以包含常量和符号常量,但不能是变量。 6.2 6.2.1 定义一维数组 ● 定义形式 类型说明符 数组名[常量表达式]; 其中:类型说明符定义数组中各元素的数据类型; 常量表达式说明数组的大小(即数组中元素的个数)。 教学进程

  4. 一维数组 6.2.2 引用一维数组元素 在C语言中,数组必须先定义,然后使用。 只能逐个引用数组元素,不能一次引用数组中的全部元素。 ● 数组元素的表示形式 数组名[下标]; 其中:下标可以是整型常量或整型表达式。例如: a[2+4],a[2*3],a[7/3] 注意定义数组时和引用数组时的“数组名[下标]”的区别,例如: int a[10]; /*定义数组的长度为10*/ t=a[6]; /*使用数组的元素a[6]*/ 教学进程

  5. 一维数组 6.2.2 引用一维数组元素 【例6.1】 引用数组元素。利用循环给数组元素a[0]~a[9]赋值为0~9,然后按逆序输出 #include <stdio.h> void main() { int i,a[10]; for (i=0; i<=9;i++) a[i]=i; for(i=9;i>=0; i--) printf("%d",a[i]); printf("\n"); } 运行结果: 9876543210 赋值 教学进程

  6. 6.2.3 一维数组的初始化 目的 初始化,即在定义数组时直接为各个元素赋初值。 说明 ⑴ 在定义数组时对数组各元素均赋初值。如: int a[10]={0,1,2,3,4,5,6,7,8,9}; ⑵ 可以只给数组的前若干个元素赋初值,此时后面的元素均将自动赋以初值0。如: int a[10]={0,1,2,3,4}; 定义a数组有10个元素,但只给前5个赋了值,后5个自动赋0。 教学进程

  7. 一维数组的初始化 说明 ⑶ 若要全部元素值为0,可以写成: int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10={0}; ⑷ 在对全部元素赋初值时,由于数据的个数已经确定,因此说明语句中可以不指定数组长度,其长度默认为与初值表中数据的个数相同。如: int a[5]={1,2,3,4,5}; 可以写成 int a[ ]={1,2,3,4,5}; 如果不是对全部元素赋初值,则在说明语句中必须说明数组的长度。 教学进程

  8. 6.2.4 一维数组程序举例 【例6.2】用数组来处理求Fibonacci数列的问题。 #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]); } printf("\n"); } 分析:例5.5已介绍,现用数组方法来处理。 使f[0]=f[1]=1,其余为0。 为f[2]~f[19]赋值 每一行输出5个数据 教学进程

  9. 冒泡法排序的思路是:将相邻的两个数比较,将小的调到前头。冒泡法排序的思路是:将相邻的两个数比较,将小的调到前头。 基本过程如下: ● 首先,从头开始往后逐次比较相邻两 个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将它们互换。这样不断地将两个相邻元素中的大者往后移动,最后就将最大者换到了最后,这也是最大元素应有的位置。 ● 然后对剩下的n-1个数重复以上过程,将次大数换到了倒数第二的位置; ● 对剩下的数据重复上述过程,每次减少一个,直到剩下一个数为止。此时数组已经变为有序。 【例6.3】输入10个数,用冒泡法对这10个数由小到大排序。 教学进程

  10. 冒泡排序 原序列 5 1 7 3 1 6 9 4 2 8 6 第1遍 5←→1 7←→3←→1←→6 9←→4←→2←→8←→6 1←→5 7←→3←→1←→6 9←→4←→2←→8←→6 1←→5 7←→3←→1←→6 9←→4←→2←→8←→6 1←→5 3←→7←→1←→6 9←→4←→2←→8←→6 1←→5 3←→1←→7←→6 9←→4←→2←→8←→6 1←→5 3←→1←→6←→7 9←→4←→2←→8←→6 1←→5 3←→1←→6←→7 9←→4←→2←→8←→6 1←→5 3←→1←→6←→7 4←→9←→2←→8←→6 1←→5 3←→1←→6←→7 4←→2←→9←→8←→6 1←→5 3←→1←→6←→7 4←→2←→8←→9←→6 1←→5 3←→1←→6←→7 4←→2←→8←→6←→9 结果 1 5 3 1 6 7 4 2 8 6 9 排序过程: 教学进程

  11. 冒泡排序 上次结果序列 1 5 3 1 6 7 4 2 8 6 9 第2遍 1 5←→3←→1 6←→7←→4←→2←→8←→6 —— 1 5←→3←→1 6←→7←→4←→2←→8←→6 —— 1 3←→5←→1 6←→7←→4←→2←→8←→6 —— 1 3←→1←→5 6←→7←→4←→2←→8←→6 —— 1 3←→1←→56←→7←→4←→2←→8←→6 —— 1 3←→1←→56←→7←→4←→2←→8←→6 —— 1 3←→1←→56←→4←→7←→2←→8←→6 —— 1 3←→1←→56←→4←→2←→7←→8←→6 —— 1 3←→1←→56←→4←→2←→7←→8←→6 —— 1 3←→1←→56←→4←→2←→7←→6←→8 —— 结果序列 1 3 1 5 6 4 2 7 6 8 9 9 9 9 9 9 9 9 9 9 9 教学进程

  12. 冒泡排序 上次结果序列 1 3 1 5 6 4 2 7 6 8 9 第3遍 1 3←→1←→5←→6←→4←→2 7←→6——8——9 1 3←→1←→5←→6←→4←→2 7←→6——8——9 1 1←→3←→5←→6←→4←→2 7←→6——8——9 1 1←→3←→5←→4←→6←→2 7←→6——8——9 1 1←→3←→4←→5←→6←→2 7←→6——8——9 1 1←→3←→4←→5←→6←→2 7←→6——8——9 1 1←→3←→4←→5←→2←→6 7←→6——8——9 1 1←→3←→4←→5←→2←→6 7←→6——8——9 1 1←→3←→5←→4←→2←→6 6←→7——8——9 结果序列 1 1 3 5 4 2 6 6 78 9 ……………. 教学进程

  13. 冒泡排序 #include <stdio.h> void main() { int a[11]; int i,j,t; printf("input 11 numbers :\n"); for (i=0;i<11;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<10;j++)/*进行10次循环,实现10趟比较*/ for(i=0;i<10-j;i++)/*在每趟中进行10-j次比较*/ if (a[i]>a[i+1])/*相邻两个数进行比较*/ {t=a[i];a[i]=a[i+1];a[i+1]=t;}/*满足条件进行互换*/ printf("the sorted numbers :\n"); for(i=0;i<11;i++) printf("%d ",a[i]); printf("\n"); } #include <stdlib.h> a[i]=rand()%10; 教学进程

  14. #include "stdio.h" main() { int year,month,day,k,sum; static int t[]={31,0,31,30,31,30,31,31,30,31,30,31}; printf("input year,month,day:"); scanf("%d%d%d",&year,&month,&day); if ((year%4==0 && year%100!=0)||year%400==0) t[1]=29; /*判断,闰年2月29天*/ else t[1]=28; sum=day; /*最后一个月的天数*/ for (k=0;k<month-1;k=k+1) sum=sum+t[k]; /*最后几个月的天数*/ printf("Days=%d\n",sum); } 【例】 从键 盘输入年、月、 日,计算并输出 该日是该年的第 几天。 教学进程

  15. 二维数组的定义与引用 6.3 6.3.1 定义二维数组 ● 定义形式 类型说明符 数组名[常量表达式1][常量表达式2]; 例如: double a[3][4],b[5][10]; 定义了两个二维数组:一个3行4列的双精度实型数组a,共有12个元素;另一个5行10列的双精度实型数组b,共有50个元素。 在C语言中,二维数组在计算机中的存储顺序是按行进行的, 即第一维的下标变化慢,第二维的下标变化快。 教学进程

  16. a[0][0]a[0][1]a[0][2]a[0][3] a[1][0]a[1][1]a[1][2]a[1][3] a[2][0]a[2][1]a[2][2]a[2][3] 二维数组的定义与引用 6.3 【例】 由说明语句 double a[3][4];定义的数组,在计算机中存储的顺序如下: 教学进程

  17. a[0] a[0][0]a[0][1]a[0][2]a[0][3] aa[1] a[1][0]a[1][1]a[1][2]a[1][3] a[2] a[2][0]a[2][1]a[2][2]a[2][3] 二维数组的定义与引用 6.3 C语言对二维数组的定义,使得可以把二维数组看成一种特殊的一维数组:即它的元素又是一个一维数组。 例如:可把a数组看成一个一维数组,它有3个元素a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。 教学进程

  18. 二维数组的定义与引用 6.3 6.3.2 引用二维数组的元素 ● 二维数组元素的表示形式 数组名[下标1][下标2]; 例如: a[2][3],b[4][9];  下标可以是整型表达式,如:a[2-1,2*2-1]  下标可以是已经有值的变量或数组元素, 如: a[2*x-1][b[3][1]]  数组元素可以出现在表达式中, 如:b[1][2]=a[2][3]/2 注意:使用时数组元素的下标应在已定义数组的大小范围内; 应注意区别定义数组大小和引用数组元素的区别。 教学进程

  19. 二维数组的定义与引用 6.3 6.3.3 二维数组的初始化 方法: ⑴ 分行给二维数组赋初值。如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; ⑵ 可将所有数据写在一个花括号内,按排列顺序对个元素赋值。如: int a[3][4]={1,2,3,4,5,6,,7,8,9,10,11,12}; ⑶ 可对部分元素赋初值,其余自动取0值。如: int a[3][4]={{1},{5,6},{9}}; ⑷ 若对全部元素赋初值,则定义数组时可不说明第一维 的长度(一对方括号不能省),第二维的长度必须指明。如: int a[ ][4]={1,2,3,4,5,6,,7,8,9,10,11,12}; ⑸ 在分行赋初值时,也可以省略第一维的长度说明。如: int a[ ][4]={{1,2,3},{0},{0,10}}; 教学进程

  20. a= 1 2 3 4 5 6 二维数组的定义与引用 6.3 6.3.4 二维数组程序举例 【例6-4】将一个二维数组a的行和列的元素互换(即转置),存到另一个二维数组b中。例如: 分析: b[j][i]=a[i][j] 教学进程

  21. 二维数组的定义与引用 6.3 #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]; } printf("\n"); } printf("array b:\n"); for (i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } } 教学进程

  22. 二维数组的定义与引用 6.3 6.3.4 二维数组程序举例 【例6-5】有一个3×4的二维数组a,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 分析: ① 将a[0][0]作为参考赋给max,将其行列下标分别赋给r=c=0; ② 然后用双循环,将其它元素依次与max比较,遇到比max大的就将其赋给max,行列下标分别赋给r=i、c=j; ③ 全部比较完毕,则a[r][c]便是最大元素及其所在行列值。 教学进程

  23. 二维数组的定义与引用 6.3 #include <stdio.h> void main() { int i,j,r,c,max; int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; max=a[0][0]; r=0;c=0; for (i=0;i<=2;i++) for (j=0;j<=3;j++) if (a[i][j]>max) { max=a[i][j]; r=i; c=j; } printf("max=%d,row=%d,colum=%d\n",a[r][c],r,c); } 教学进程

  24. 字符数组 P124 char 数组名[常量表达式]; 一维字符数组 char 数组名[常量表达式1][常量表达式2]; 二维字符数组 例如 char c[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’; 6.4 ● 用于存放字符型数据的数组称为字符数组。 ● 在C语言中,字符数组中的一个元素只能存放一个字符。 6.4.1 定义字符数组 ● 一般形式 教学进程

  25. 字符数组 P124 6.4 6.4.2 字符数组的初始化 ● 逐个字符赋给数组中各元素 char c[10]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’}; char diamond[ ][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'}, {' ','*',' ','*'},{' ',' ','*'}}; 5 注意: ① 如果定义时不初始化,元素值不确定; ② 如果提供的字符个数大于数组长度,则按语法错误处理; 如果字符个数小于数组长度,后面的元素自动为空字符(‘\0’); ③ 如果提供的字符个数与数组长度相同时,可省略数组长度,系统会自动确定元素个数。适合字符个数较多时。 教学进程

  26. 字符数组 P124 6.4 6.4.3 引用字符数组元素 ● 引用字符数组中的一个元素,得到一个字符。 【例6.6】输出一个字符串。 运行结果为: I am a boy. #include <stdio.h> void main() {char c[11]={'I',' ','a','m',' ','a',' ','b','o','y','.'}; int i; for(i=0;i<11;i++) printf("%c",c[i]); printf("\n"); } 教学进程

  27. 字符数组 P124 6.4 6.4.3 引用字符数组元素 运行结果为: * * * * * * * * ● 引用字符数组中的一个元素,得到一个字符 【例6.7】输出用字符组成的一个菱形图案。 #include <stdio.h> void main() {char diamond[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'}, {' ','*',' ','*'},{' ',' ','*'}}; int i,j; for (i=0;i<5;i++) {for (j=0;j<5;j++) printf("%c",diamond[i][j]); printf("\n"); } } 教学进程

  28. 字符数组 P124 ● C语言规定,字符串以字符'\0'作为结束标志 ● 编译系统对字符串常量自动加一个'\0'作为结束标志 ● 程序中往往通过判断'\0'来检测字符串是否结束 ● '\0'的ASCII码为0,不是一个可显示的字符,是“空操作符”,什么都不做,不会增加有效字符,仅是一个供判别的标志 6.4 6.4.4 字符串和字符串结束标志 注意: c数组的长度为11,有结束符; 此法直观、方便,符合习惯 ∵又有字符数组初始化方法: char c[ ]={"I am happy"}; 或 char c[ ]="I am happy"; 教学进程

  29. 字符串常量(简称字符串)要用一对双引号括起来。 例如,“how do you do?”是一个长度为14的字符串常量。但因在一个字符串常量中,最后还包括一个结束符‘\0’,即在上面这个字符串常量中,实际包含15个字符,最后一个为结束符'\0'。 C语言允许用字符串常量对字符数组进行初始化。 例如,下列四个语句是等价的: static char a[15]={"how do you do?"}; static char a[15]="how do you do?"; static char a[ ]="how do you do?"; static char a[ ]={'h','o','w',' ','d','o',' ','y','o','u',' ','d','o','?','\0'}; 教学进程

  30. 字符串 特别需要指出的是,利用字符串常量可以对字符数组进行 初始化,但不能用字符串常量为字符数组赋值。 例 虽然下列初始化语句是允许的: char b[15]="China"; 但下面的用法是错误的: char b[15]; b[15]="China";× 下列两个语句不等价: static char b[15]="China"; 数组长度为15 static char b[ ]="China"; 数组长度为6 可见,字符串的长度与字符数组的长度可能是不相同的。 教学进程

  31. 格式说明符 格式符 %c用于输入输出一个字符; 格式符 %s用于输入输出一个字符串。 输入输出一个字符(格式说明符为%c) ● 在用于输入时,输入项为数组元素地址。在具体输入时,各字符之间不要分隔符,字符也不用单撇号括起来。 在用于输出时,输出项为数组元素。 字符数组 6.4 6.4.5 字符数组的输入输出 P128 对字符数组中的每一个元素逐个进行输入或输出, 将数组中的所有字符作为一个字符串进行输入或输出。 教学进程

  32. 输入输出一个字符 【例】 在下列C程序中,首先分别为字符数组元素a[1]与a[2]读 入字符,然后输出数组元素a[2]中的字符。 #include "stdio.h" main() { char a[5]; scanf("%c%c",&a[1],&a[2]); a[0]='a'; a[3]='d'; a[4]='\0'; printf("%c\n",a[2]); } 在运行上述程序时,如果从键盘输入 bcgh 则输出结果为 c 教学进程

  33. 输入输出一个字符串 输入输出一个字符串(格式说明符为 %s) ● 在用格式说明符 %s进行输入输出时,其输入输出项均为数组名。 但在输入时,相邻两个字符串之间要用空格分隔,系统将自动地在 字符串最后加结束符'\0'。在输出时,遇结束符'\0'作为输出结束标志。 【例】 下面的C程序是对数组进行输入与输出操作: #include "stdio.h" main() { char a[6],b[6]; scanf("%s%s",a,b); printf("a=%s,b=%s\n",a,b); } 教学进程

  34. 输入输出一个字符串 g a b c d x e f h k m n \0 a[0] a[1] a[2] a[3] a[4] a[5] b[0] b[1] b[2] b[3] b[4] b[5] \0 a b \0 c d n a b c d e k m f p q w s \0 f a b \0 s d g h j k l \0 ① 如果从键盘输入 abcd 输出结果为 a=ab,b=cd ② 如果键盘输入 abcdx efghkmn 输出结果为a=abcdx,b=efghkmn \0 ③ 如果键盘输入 abcdefgh kmnpqws 输出结果为a=abcdefkmnpqws,b=kmnpqws ④ 如果键盘输入 ab sdfghjkl 输出结果为a=ab,b=sdfghjkl 教学进程

  35. 输入输出一个字符串 2)在为字符型数组输入字符串时,输入字符串的长度不要大于 数组的长度,否则越界系统不提示,用户自己负责。特别要注意的是,字符串中还有一个字符串结束符,它虽然不计入字符串的长度中,但它实际需要占一个字节空间(即占一个字符元素的空间)。 #include "stdio.h" main() {char str1[13; char str2[10]; scanf(“%s",str1); scanf(“%s”,str2); printf("%s\n",str2); printf("%s\n",str1); } 说明 1)在用格式说明符%s为字符型数组输入数据时, 字符串的分隔符是空格符,因此,如果在输入的字符串中包括空格 符时,只截取空格前的部分作为赋给字符数组的字符串。【例】 若执行时从键盘输入: How are you?↲ 则str1←How str2←are 教学进程

  36. 头文件"string.h" 功能 输出一个字符串。 说明 字符串中可包含转义字符。 字符数组 6.4 字符串输出函数 6.4.6 字符串处理函数 P130 ● puts(字符数组名) 例 char str[]="China\nBeijing"; puts(str) 输出结果为 China Beijing 其中‘\n’为换行符,是转义字符。 教学进程

  37. 头文件"string.h" 字符数组 6.4 字符串输入函数 6.4.6 字符串处理函数 P130 ● gets(字符数组名) 功能 从键盘输入一个字符串到字符数组,并返回字符数组的地址。 例 char s[80]; gets(s); puts(s); 如果输入 abcdef 则输出结果为 abcdef 教学进程

  38. 字符串连接函数 例 char s1[20]= "abcd"; char s2[ ]="cdef"; printf("%s\n",strcat(s1,s2)); 则输出结果为 abcdcdef 注意 ① 字符数组1的长度必须足够大,以便能容纳被连接的字符串。 ② 连接后系统将自动取消字符串1后面的结束符'\0'。 ③ “字符串2”可以是字符数组名,也可以是字符串常量,如 strcat(s1,"cdef")。 ● strcat(字符数组1,字符串2) 功能 将字符串2连接到字符串1的后面,并返回字符串1的地址。 教学进程

  39. 字符串复制函数 例如,static char s2[]="abcde"; char s1[10]; strcpy(s1,s2); printf("%s\n",s1); 则输出结果为 abcde 注意 ① 字符数组1的长度必须足够大,以便能容纳字符串2。 ② “字符串2”可以是字符数组名,也可以是字符串常量,如 strcpy(s1,"abcde")。 ③ 字符串只能用拷贝函数,不能用赋值语句进行赋值。 ④ 可以用strncpy函数将字符串2中的前若干个字符拷贝到字符 数组1中。如:strncpy(str1,str2,3);将str2中前3个字符拷贝到str1中,取代str1前3个字符。 ● strcpy(字符数组1,字符串2) 功能 字符串2拷贝到字符数组1中。 教学进程

  40. 字符串比较函数 说明 ① 执行这个函数时,自左到右逐个比较对应字符的ASCII码 值,直到发现了不同字符或字符串结束符'\0'为止。 ② 对字符串不能用数值型比较符。 ③ “字符串1”与“字符串2”可以是字符数组名,也可以是字符 串常量。 ● strcmp(字符串1,字符串2) 功能 比较两个字符串对应位置字符ASCII的大小。 这个函数的返回值如下: 若字符串1=字符串2,则返回值为0。 若字符串1>字符串2,则返回值为正整数。 若字符串1<字符串2,则返回值为负整数。 if (str1>str2) printf(“yes”); × if (strcmp(str1,str2)>0) √ printf(“yes”); 教学进程

  41. 测字符串长度函数 例 char s[10]= "abcde"; printf("%d\n",strlen(s)); 则输出结果为 5 在使用这个函数时,“字符串”可以是字符数组名,也可以是字符串常量。 ● 大小写转换函数 strlwr(字符串) 将字符串中大写字母转换成小写字母。 strupr(字符串) 将字符串中小写字母转换成大写字母。 ● strlen(字符串) 功能 测试字符串中包含的字符的实际个数。不含‘\0’。 教学进程

  42. 字符数组 6.4 6.4.7 字符数组应用举例 P130 【例6-8】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 分析:采用通过空格统计单词的方法。具体是: ① 用连续若干个空格算一个、一行开头的空格不计的方法决定单词数目; ② 从第一个字符开始逐个检查字符串中的每一个字符。若查到某一字符非空格,而其前面的字符是空格,则表示新单词开始,让计数变量num++。否则,当前字符非空格,前面字符也非空格,则非新单词,num不变; ③ 用变量word=0或1来表示前面字符是空格或不是空格。则: 教学进程

  43. 字符数组 6.4 6.4.7 字符数组应用举例 P130 是 否 假设输入“I am a boy.”后,有关参数的状态如表6-1,P135。 教学进程

  44. 字符数组 6.4 6.4.7 字符数组应用举例 P130 流程图: 是 否 是 否 教学进程

  45. #include <stdio.h> void main() { char string[81]; int i,num=0,word=0; char c; gets(string); /*从键盘输入一个字符串*/ for (i=0;(c=string[i])!=‘\0’;i++) /*从第一个字符开始判断是否串尾*/ if(c==‘ ’) word=0; /*如不是串尾,若是空格*/ else if(word==0) /*如不是串尾、不是空格,而前一字符是空格*/ { word=1; num++; } /*是新单词,计数*/ printf("There are %d words in this line.\n",num); } 教学进程

  46. 字符数组 6.4 6.4.7 字符数组应用举例 P130 【例6-9】有三个字符串,要求找出其中最大者。 分析:设计一个二维字符数组str[3][20],即3行20列。 ① 可把str[0]、str[1]、str[2]看作3个一维字符数组,各有20个元素; ② 用gets函数分别输入3个字符串到str[0]、str[1]、str[2]中 ; ③ 用字符串函数对str[0]、str[1]、str[2]进行比较,得到最大者。 教学进程

  47. #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]); /*输入3个字符串*/ if (strcmp(str[0],str[1])>0) /*比较,若串0>串1*/ strcpy(string,str[0]); /*把串0存入string*/ else strcpy(string,str[1]); /*否则,把串1存入string*/ if (strcmp(str[2],string)>0) /*再比较,若串2>string*/ strcpy(string,str[2]); /*把串2存入string,否则string不变*/ printf(“\nthe largest string is:\n%s\n”,string); /*输出string*/ } 教学进程

  48. 本章小结 ●数组是有序数据的集合。数组中的所有元素都必须是同类型的。用一个统一的名字和下标来唯一的确定元素在数组中的位置。在程序中把循环和数组结合起来,对数组元素进行操作,可有效地处理大批量的数据,提高工作效率。 ●正确定义数组。注意:元素的下标默认从0开始、下标越...界。 ● 注意数组的定义形式和数组元素的引用形式的本质区别。 ● 二维数组元素在内存中按行存储。初始化时,按行赋值。 ●C语言中无字符串变量,字符串是以字符数组形式存放的。系统在每个串尾自动加一个串结束符‘\0’,但‘\0’不是字符串的组成部分。将含n个字符的串存入数组中时,数组长度应≥n+1。 ● 字符串的运算要用字符串函数进行,要包含“string.h”头文件。 ● 由基本类型的数据按一定规则构成的数据称为构造类型数据。 教学进程

More Related