1、数 组,教学要点,一、数组的含义与存储特点 二、数组的定义与使用 一维数组 定 义 引 用 初始化 例7-2、7-3,二维数组 定 义 引 用 初始化 例74、75,三、字符数组功 能:用来解决字符串的存储及操作。定 义初始化与赋值字符数组的输入与输出字符串处理函数例78,教学要点,数组的含义与存储特点,1、含义:数组是若干相同数据类型的数据组成的有序集合。其中的每个个体称为元素。 2、表示方法:数组具有统一的数组名,用数组名和下标来唯一地确定数组中的元素。a i (i=0,1,2,.) a0数组名 下标 a1a2 3、数组的存储特点:在内存中占用一片连续的存储单元。 an-1,一维数组的定义
2、,1、定义形式 类型说明符 数组名常量表达式 如: int a10; /定义包含10个元素的整型数组a。 2、要点: 数组名的命名规则与变量名一样(标识符). 数组名后面是,不是(). 常量表达式表示数组元素的个数,即数组的长度。 常量表达式可以是常量和符号常量,不能为变量。 数组的数据类型与其中元素的数据类型一致。 数组名代表此数组在内存中的起始地址。,1、方法:数组名下标 2、要点: 数组与其他变量一样,必须先定义后使用. C规定只能逐个引用数组元素而不能一次引用整个数组. 下标可以是整型常量或整型表达式如:a1=a2*3+3; 下标的取值范围为:0 n-1 例71:,一维数组元素的引用,
3、例7_1:一维数组的输入与输出。,将数组按逆序输出.,1、C规定只有静态数组和外部存储数组才能进行初始化 2、在数组定义时直接赋值。 static int a10=1,3,4,5,6,2,4,6,7,8; 3、可以只给部分元素赋初值.未赋值的元素值自动取0。int a10=1,2,3; 4、静态数组若不赋初值,系统自动赋值为0. 5、在对数组全部元素赋初值时,可以不指定数组长度.int a5=1,2,3,4,5; 或 int a =1,2,3,4,5; 6、赋值时数据的类型应与数组类型保持一致。,一维数组的初始化,例7_2: 用数组来处理Fibonacci数列问题.,if语句用来控制换行,每行
4、输出5个数据。,运行结果如下:1 1 2 3 58 13 21 34 5589 144 233 377 610987 1597 2584 4181 6765,例7_3:用起泡法对10个数进行排序(冒泡排序法) 算法:(从小到大)将两个相邻的数进行比较,将小的数调换到前头 .,第一趟,第二趟,二维数组的定义,1、对二维数组的理解:二维数组是一种抽象,因为计算机的存储器是一维的。由编译程序负责实现二维到一维的映射。 2、定义形式: 类型说明符 数组名常量表达式常量表达式 例如: int a34,x44; 不能写成:int a3,4;,二维数组的定义,3、要点: 可以把二维数组看成是一个特殊的一维数
5、组或数组的数组。二维数组在内存中的存储:按行存放,地址 值 数组元素,b00 b01 b02 b10 b11 b12 b20 b21 b22,3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H,例如:整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;,1 2 3,4 5 6,789,1、方法: 数组元素的引用通过两个下标来指定。 一般形式为:数组名下标下标 2、要点: 下标可以是整型表达式;如 a2-12*2-1 数组元素可以出现在表达式中,也可以被赋值;如:b12=a23/2; 注意下标值应在已定义的数组大小范围内; 如:i
6、nt a23;则a23=3的引用是不合法的。 请区分定义数组a23和引用元素a23的不同。,二维数组的引用,1.分行给二维数组赋值. int a23=1,2,3,4,5,6; 2.去掉行的界限赋初值. int a23=1,2,3,4,5,6; 3.只对部分行赋初值. int a23=1,4; int b34=1,2,1,2,3,4; 4.若对数组的全部元素赋初值可以省略第一维的长度 int a2=1,2,3,4,5,6; int b4=3,3,3,1,3;,二维数组的初始化,例7_4:将一个二维数组的行列互换存放到另一个数组中.,例7_5: 有一个34的矩阵,求出其中值为最大的元素的值以及它在
7、矩阵中的位置.,1、字符数组的定义与前面其他类型的数组的定义相同。 2、字符串:C中将字符串当作字符数组进行处理。元素的个数:为实际字符个数+1。 例如: (1)char string5=“ABCD”; (2)char c10;c0=I;c1= ;c2=a;c3=m; c4= ;c5=h;c6=a;c7=p; c8=p;c9=y;,字符数组的定义,1、字符串的结束标志: “0”:ASCII码值为0的字符。 在程序中判断字符串是否结束不再是依据字符数组的长度而是查找字符串的结束标志“0”. 2、例: char string=“abcdef” char string=a,b,c,d,e,f,字符串
8、的结束标志“0”,长度为7,长度为6,1、将字符逐一送入字符数组中,例如: static char c10=I, ,a,m, ,h,a,p,p,y; 要点: 在给字符数组赋初值时初值的个数不能超过字符数组的长度, 若初值字符的个数小于数组的长度时,字符与数组前面的元素对应,其余的元素自动赋值0(空字符)。 字符数组的大小也可以省略。如: static char c=b,o,o,k; 请区别字符数组与字符串的不同 2、对一批字符的描述 3、用字符串给字符数组赋值 4、例76、77,字符数组的初始化,对一批字符的描述,1、方法:采用二维数组来描述,数组的第一维为字符串的个数,第二维的元素个数为字符
9、串中最长字符个数+1。 2、例: char menu320+1=“1-Openfile”,“2-Closefile”,“3-Exit to DOS” static char diamond55=“ *”,” * *”,”* *”,” * *”,” *”,用字符串给字符数组赋值 1、在c语言中对字符串赋初值可以写成: static char c=“I am happy”; 或 static char c=“I am happy”;这里字符数组的长度不是10,而是11。 2、将一个字符串赋值给一个字符数组,只能用在赋初值的情况下,不能用在赋值语句中.例如: char str11; str=“I a
10、m happy”;是错误的.,例7_6:字符数组元素的引用。,输出:I am happy,例7_7:输出一个钻石图形。,运行结果:* * * *,字符串的输入与输出 一、逐个字符的输入与输出:用格式符“%c”。 static char str =“book”; for(i=0;i4;i+)printf(“%c”,stri); 二、将整个字符串一次输入或输出:用“%s”。 如:static char str =“china”;printf(“%s”,str);,输出字符不包括结束符“0”. 用“%s”时,printf中输出项是字符数组名,而不是元素名。 若数组长度大于字符串实际长度,也只输出到0
11、结束。 若一个字符数组中包含一个以上的0,则遇到第一个0时就结束输出。 利用scanf(“%s”,str);输入字符串时,输入项只写字符数组的名称不加地址符&. 当利用 “%s”格式输入多个字符串时,这些字符串以空格作为它们的分隔符.,格式符“%s”的使用,输入: how are you?,例如: static char str15,str25,str35;scanf(“%s%s%s”,str1,str2,str3);,char str13; scanf(“%s”,str);,输入: how are you?,注:空格后面的字符没有作为有效字符来接受.,则 str1=“how”str2=“ar
12、e”str3=“you?”,则 str=“how”,字符串处理函数 1、puts()功能:将一个字符串输出到终端,输出时自动将“0”转化为“n”. 2、gets()功能:从终端输入一个字符串到字符数组中.并返回字符数组的首地址. 3、strcat(str1,str2)功能:将两个字符串连接起来并把结果存放在第一个字符串中.要点: (1)字符数组1必须足够大足以存放两个字符串; (2)两个字符串连接后第一个字符串后面的“0”被自动取消.只保留最后的一个“0”.,4、strcpy(str1,str2)功能:将字符串2拷贝到字符串1中.要点: (1)字符串1必须足够大,足以存放字符串2. (2)字符
13、串2可以是字符数组名也可以是字符串常量,但第一个必须为字符数组名. (3)对于字符数组不能使用赋值语句进行整体赋值. (4)可以使用strncpy(str1,str2,3)的形式将字符数组2中的前面3个字符拷贝到字符数组1中.,5、strcmp(str1,str2)功能:比较两个字符串的大小.(逐个比较对应元素的ASCII值.)要点: (1)str1=str2.函数值为0; (2)str1str2.函数值为正数 (3)str1str2.函数值为负数 6.strlen(str)功能:测量字符数组的长度,不包括“0”. 7.strlwr(str)功能:将大写字母转换为小写字母. 8.strupr(str)功能:将小写字母转换为大写字母.,例:分析执行下面的程序且输入ABC时的结果。,运行结果: ABC,例7_8: 输入一行字符,统计其中有多少个单词,每个单词之间以空格隔开.,例:分析下面的程序,写出运行结果.,运行结果为:6,