1、第六章 数 组,2010年4月21日星期三,1,教师:赵军富,6.1 一维数组 6.2 二维数组 6.3 字符数组 6.4 本章小结,本章内容,2010年4月21日星期三,2,教师:赵军富,2010年4月21日星期三,3,教师:赵军富,当变量个数少,且彼此独立时,采用变量先定义,后赋值,再使用。如:int a,b,c ; a = 5; b=10;c=23; printf(“%d,%d,%d”,a,b,c);,当变量个数比较多,并且有内在的关系时,例如 :全班有30个人,每人一个成绩 如:int c1,c2,,c30 (可以利用数组),数组是怎么构成的? 一组有序数据的集合,各个元素属于同一个类
2、型,用统一的名称标识这一组数,用下标唯一地确定这组数中的每一个值,这就构成了“数组”。,数组的基本概念,数组,:有限个相同数据类型的数据分量的有序集合。,2010年4月21日星期三,4,教师:赵军富,一 、一维数组的定义,格式:,类型 标识符 长度 ,所有元素为 同一类型,变量名, 即数组名,数组中所含 元素的个数,int a10;由10个整数组成的数组,共同拥有数组名,a,2、数组长度必须是整型量,int a2*3,说明:,1、用方括号将数组的长度括起来,3、数组长度也可以用常量表达式,4、不能对长度做动态定义,或者不定义长度,如:int n;n=10;int an;,6.1 一维数组的定义
3、和使用,例如:int a5;,2010年4月21日星期三,5,教师:赵军富,数组的三要素:,(1)相同的数据类型(定义数组时规定),(2)有限的成员个数 (定义数组时规定),(3)彼此有序的排列 (引用数组元素时的下标),int a5,int a5; a0=1;a1=2;a2=3;a3=4;a4=5;,6.1 一维数组的定义和使用,2010年4月21日星期三,6,教师:赵军富,数据类型 数组名 常量表达式初始化数据;,格式:,1.定义数组时,对全部元素赋值int a5=1,2,3,4,5;,2. 对部分元素赋值,float x5 = 1.9 ,2.0 ;,x0=1.9;x1=2.0;,3.若要
4、对数组的全部元素初始化,则可省略数组的长度int a = 1,2,3,4;,二、 一维数组的初始化,6.1 一维数组的定义和使用,用 包括所有初值, 用逗号分隔各数值,且初值的个数不能大于数组长度。,按顺序给前2个元素赋值,其余元素为均为 0,数组长度=元素的个数,2010年4月21日星期三,7,教师:赵军富,三 、一维数组元素的引用,1、数组必须先定义,后赋值,再使用,2、数组中的元素必须逐一引用,3、通过数组名及其元素的下标引用,定义: 类型 数组名长度 如: int a10,引用: 数组名下标,a0,a1,a9为数组a10中的所有元素,(1)下标表示了元素在数组中的位置 (2)下标可以用
5、表达式 a2*3相当于a6,说明,6.1 一维数组的定义和使用,下标范围从 0 到长度-1,2010年4月21日星期三,8,教师:赵军富,例1:main() int i;int a10 = 1,2,3,4,5,6,7,8,9,10;for(i=0;i10;i+)printf(“%3d“,ai); ,运行结果:1 2 3 4 5 6 7 8 9 10,6.1 一维数组的定义和使用,int a10;for(i=0;i10;i+)scanf(“%d“,通过数组名和下标, 引用数组中的每一个元素,2010年4月21日星期三,9,教师:赵军富,例:有一个数组,内有10个元素,求出最小的元素和它的下标。,
6、int a10,a0,a i ,a9,i=?,1.定义两个临时变量 min和 k,2.假定第一个元素就是最小的,min=a0,k=0,3.用min与数组中的每一个元素ai比较, 若ai比min小, 将ai赋给min, 同时将下标i赋给k, 否则,继续比较。,6.1 一维数组的定义和使用,分析:,2010年4月21日星期三,10,教师:赵军富,26,min=a0,i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9,1326 min=a1 k=1,循 环,313 min=a2 k=2,683 min和k的值不变,13,3,203 min和k的值不变,13 min=a5,k=5,
7、71 min和k的值不变,1,&min,531 min和k的值不变,121 min和k的值不变,651 min和k的值不变,min=1 k=5,6.1 一维数组的定义和使用,2010年4月21日星期三,11,教师:赵军富,main( ) int i,a10,min,k;for(i=0;iai ) min=ai ;k=i ; printf(“%d,%d”,k,min); ,循环输入10个数,循环找出最小的,输出最小值和原始下标,2010年4月21日星期三,12,教师:赵军富,例 1. 将6个实数由小到大排序。 ,5 8 9 4 7 2,第一轮结束:,2 8 9 5 7 4,结 果:,2 4 5
8、7 8 9,算法一:选择排序法,选择排序思路:将数组中的每一个元素和其后面所有的元素进行比较,如果某一个元素小于该数,将互换位置。,第一轮开始:,2010年4月21日星期三,13,教师:赵军富,#include main() int a6=5,8,9,4,7,2;int i,j,t;for(i=0;iaj)t=ai;ai=aj;aj=t; for(i=0;i6;i+) /将比较后的记过输出来printf(“%5d“,ai); ,程序代码一:,2010年4月21日星期三,14,教师:赵军富,#include main() int a6=5,8,9,4,7,2,i,j,t,k; /*k为数组的下标
9、 */for(i=0;iaj) k=j; /* 记下较小的元素的下标*/t=ai; ai=ak; ak=t; /*每轮结束后交换*/for (i=0;i6;i+)printf(“a%d=%dn“,i,ai); ,程序代码二:,2010年4月21日星期三,15,教师:赵军富,算法二: 冒泡排序,冒泡法的思路:将相邻两个数比较,如果相邻的两个值是升序排列的,就保持原样,如果是降序排列的,就交换它们的值。(实质:大的沉下去,小的浮上来),start: a0 a1 a2 a3 a4 a5 a6 a72 57 29 89 42 34 16 11 times:2 29 57 42 34 16 1 89 2
10、 times: 2 29 42 34 16 1 57 89 3 times: 2 29 34 16 1 42 57 89 4 times: 2 29 16 1 34 42 57 89 5 times: 2 16 1 29 34 42 57 89 6 times: 2 1 16 29 34 42 57 89 7 times: 1 2 16 29 34 42 57 89,2010年4月21日星期三,16,教师:赵军富,main() int a10=2,57,29,89,42,34,16,1;int pass , time , temp,xb;for( pass =1; pass atime+1)/
11、* 判断每相邻两个元素下标*/temp =atime; atime=atime +1;atime +1=temp;for (xb=0; xb10; xb+) printf( “a%d=%d n”, xb, axb ); ,程序代码一:,2010年4月21日星期三,17,教师:赵军富,#include #define SIZE 8 main( ) int aSIZE=2,57,29,89,42,34,16,1;int i, pass, hold; clrscr(); for(i=0;iai+1)hold=ai; ai=ai+1; ai+1=hold; for(i=0;i=SIZE-1;i+)pr
12、intf(“%4d“,ai); ,程序代码二:,2010年4月21日星期三,18,教师:赵军富,6.2 二维数组的定义和引用,当一个一维数组中的每个元素本身又是一个一维数组时,该数组构成“二维数组” 。,一、二维数组的定义,格式:类型 标识符长度1长度2,如:int a44,行,列,a0 a1 a2 a3,一维数组a4,二维数组a44,2010年4月21日星期三,19,教师:赵军富,说明:1. 二维数组元素需要两个下标表示例:int a44表示数组a中有4行4列共16个数据,2.二维数组在存储空间中是按行优先存储,第一行,6.2 二维数组的定义和引用,2010年4月21日星期三,20,教师:赵
13、军富,二、二维数组的初始化,形式:1、 对全部元素赋初值,分行,各用一个 。int a23=1,2,3,4,5,6;,2 整体赋值,系统自动分行,int a23=1,2,3,4,5,6;,1,2,3,3 对部分元素赋初值,注意区别:,(1)int a23=1,2,3;,(2) int a23=1,2,3;,(3) int a23=0,1,2,3;,说明:当为全部元素赋值时,一维长度可省略,如:int a 3=1,2,3,4,5,6;,6.2 二维数组的定义和引用,2010年4月21日星期三,21,教师:赵军富,三 、二维数组的引用,原则:,逐一引用,说明:1.数组名下标1下标2下标1从0到长度
14、-1下标2从0到长度-1,方法:,数组名 N1N2,6.2 二维数组的定义和引用,2010年4月21日星期三,22,教师:赵军富,2、若定义int a34,则对a的正确引用是: A) a 2 4 B) a 1,3 C) a 1+1 0 D) a (2)(1),1、以下二维数组说明方式中正确的是: A) int a3 ; B) float a(3,4); C) double a14; D) float a(3)(4);,举例:,6.2 二维数组的定义和引用,2010年4月21日星期三,23,教师:赵军富,例1:已知5名学生的四门课程成绩,求每位学生的总成绩, 并按二维表格式输出。,程序代码见下页
15、,2010年4月21日星期三,24,教师:赵军富,main() int a54=91,72,63,44,51,62,73,54,91,82,93,84,91,92,100,84,61,72,53,44;int i,j,s5;for(i=0;i=4;i+) /* 给每个学生求总成绩*/ si=0; for(j=0;j=3;j+) si=si+aij;for(i=0;i=4;i+) /* 输出各学生成绩二维表,并附带总成绩*/for(j=0;j=3;j+) printf(“%4d “,aij);printf(“%dn“,si); ,2010年4月21日星期三,25,教师:赵军富,例2、计算两个矩阵
16、的乘积。,main() int i,j,k; int a23=1,2,3,4,5,6, b34=1,2,3,4,5,6,7,8,9,10,11,12,c24=0;for(i=0;i2;i+) for(j=0;j4;j+) for(k=0;k3;k+)cij+=aik*bkj;for(i=0;i2;i+) for(j=0;j4;j+)printf(“%4d“,cij); printf(“n“); ,Chengji.c,2010年4月21日星期三,26,教师:赵军富,例3. 不用输入,自动生成下列矩阵,1 2 3 4 5 1 1 6 7 8 1 1 1 9 10 1 1 1 1 11 1 1 1
17、1 1,元素值为 1,按行递增,main( )int i,j,a55;int k=2;for(i=0;i=j) aij=1; /*下三角 */else aij=k+; /*上三角 */for(i=0;i5;i+) for(j=0;j5;j+)printf(“%4d”,aij);printf(“n”); /* 输出一行后换行 */ ,2010年4月21日星期三,27,教师:赵军富,1、用来存放字符数据的数组是字符数组。 2、字符数组中的每个元素存放一个字符。,字符数组:,一、字符数组的定义,定义方式与一、二维介绍的类似。 例:char c10,d23; 由于字符型与整型是互相通用的,因此也可定义
18、 int c10;,二、字符数组的初始化,与一、二维介绍的类似,只是数组的每一个元素对应一个字符。 char c10=I, , a, m, , h,a , p, p, y; char c32= , *, *, , , * ;,6.3 字符数组的定义和引用,2010年4月21日星期三,28,教师:赵军富,三、字符数组的引用,原则:,逐一引用,char a42,方法:,数组名下标1下标2 下标1从0到长度-1 下标2从0到长度-1,a00a31 共8个数据,例1输出一个字符串,main( ),char c10=I, ,a,m, ,a, ,b,o,y ;, int i;,printf(“n“);,6
19、.3 字符数组的定义和引用,for(i=0;i10;i+) printf(“%c“,ci);,printf(“%s“,c);,2010年4月21日星期三,29,教师:赵军富,例2输出对角线和第一列为“*”的一个图形。main( ) char a55;int i,j; *for(i=0;i5;i+) *for(j=0;j5;j+) * *if(j= =0|i= =j) * *aij=*; * *else aij= ;for(i=0;i5;i+)for(j=0;j5;j+)printf(“%c“,aij);printf(“n“); ,6.3 字符数组的定义和引用,2010年4月21日星期三,30,
20、教师:赵军富,在C语言中,字符串是作为字符数组来处理的。同时,为了测定字符串的实际长度,在C语言规定了一个“字符串结束标志”(在字符串的最后放有字符0 ),如一个字符串第10个字符为0,则此字符串的有效字符为9个,即在遇到第一个字符0时,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量也自动加一个0 作为结束符,当然在定义字符数组时应估计实际字符串长度。对字符数组初始化,可以用字符串常量来使字符数组初始化。如: char c =“I am happy”;或 char c =“I am happy”;此时系统自动在串尾加 0。,四、字符串和字符串结束标志,6.3 字符数组的定义和引用,
21、2010年4月21日星期三,31,教师:赵军富,1、输入输出有两种方式: 逐个字符输入输出。用“%c”将整个字符串一次输入输出。用“%s” 2、输出应注意的问题:char c=“china”;printf(“%s”,c);输出字符不包括结束符0用“%s”格式输出字符时,printf函数中的输出项是字符数组名, 而不是数组元素名。如果数组长度大于字符串实际长度,也只输出到0结束如果一个字符数组中包含一个以上0,则遇到第一个0时输出就结束。输入时应注意:在使用scanf函数时,若输入字符串,用“%s”格式,则后面跟数组名,且不带“&”符号,数组名指向该数组的起始地址。,五、字符数组的输入输出,6.
22、3 字符数组的定义和引用,2010年4月21日星期三,32,教师:赵军富,1、gets(字符数组)作用:从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址。 2、puts(字符数组)作用:将以0结束的字符序列输出到终端,使用puts函数输出的字符串中可以包含转义字符。,main() char str13;gets(str); puts(str); Computer & C Computer & C,3、strcat(concatenation)(字符数组1,字符数组2)作用:连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放到字符数组1中,函数调用后
23、得到一个函数值-字符数组1的地址。 说明: 字符数组1必须足够大,以便容纳连接后的新字符串。连接时,自动取消数组1后的0,只在新串最后保留一个0。,例题:Zfhs.c,六、字符串处理函数,6.3 字符数组的定义和引用,2010年4月21日星期三,33,教师:赵军富,4、strcpy(字符数组1,字符串2)作用:是将字符串2拷贝到数组1中去。说明:字符数组1必须足够大,以便容纳被拷贝的字符串。“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名,也可以是一个字符串常量。如:strcpy(str1,str); 和 strcpy(str1,“China“) ;拷贝时连同字符串后面的0一起拷
24、贝到字符数组1中;不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组 如:str1=“China”为非法;可以用strcpy函数将字符串2中前面若干个字符拷贝到字符数组1中去;,6.3 字符数组的定义和引用,2010年4月21日星期三,34,教师:赵军富,5、strcmp(字符串1,字符串2)作用: 比较字符串1和字符串2方法: 对两个字符串自左至右逐个相比,直到出现不同的字符或遇到0为止,如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准,比较的结果由函数值带回。字符串1=字符串2, 函数值为0字符串1字符串2, 函数值为一正整数字符串1字符串2,
25、 函数值为一负整(记忆方法:绝对值) 6、strlen(字符数组)作用:测试字符串长度的函数,函数的值为字符串中的实际长度,不包括0在内。 7、strlwr(字符串)将字符串中大写字母换成小写字母。 8、strupr(字符串)将字符串中小写字母换成大写字母。,6.3 字符数组的定义和引用,2010年4月21日星期三,35,教师:赵军富,例2: 输入一行字符,统计有多少个单词,单词用空格分隔。 如:I am a student.#include “stdio.h“main( )char string81, c;int i,num=0,word=0;gets(string);for(i=0;(c=
26、stringi)!=0;i+)if(c= = ) word=0;else if (word= =0) word=1; num+; printf(“There are %d words in the linen“,num); ,6.4 应用实例,2010年4月21日星期三,36,教师:赵军富,例3任输入十个国家的名字,按由小到大排序。 #include “stdio.h“ main( )char a1020, b20; int i, j;/* a数组定义为二位,列是代表每一个的名字*/for(i=0;i0) strcpy(b,ai);strcpy(ai,aj);strcpy(aj,b); for
27、(i=0;i10;i+)printf(“%sn“,ai); ,6.4 应用实例,2010年4月21日星期三,37,教师:赵军富,第6章 习题,1. 下面不能把字符串:Hello! 赋给数组的语句是 A)char b110=H,e,l,l,o,!; B)char b210;b2=“Hello!“; C)char b310;strcpy(b3,“Hello!“); D)char b410=“Hello!“;,2、若二维数组a 有m列,则aIj前的元素个数为:A) j*m+I B) I*m+j C) I*m+j-1 D)I*m+j+1,3、下面程序段运行结果是:char c5=a,b,0,c,d,0
28、 ; printf(“%s”,c);A) ab B)ab C) ab c D)ab0,2010年4月21日星期三,38,教师:赵军富,4、以下对S的初始化,不正确的是:A) char s5=“abc” B) char s5=a, b, c;C) char s5=“ “; D) char s5=“abcdef”;,5、有下面程序段: char a3,b =“china”; a=b; printf(“%s”,a); 则 A)运行后输出china B)运行后输出ch C)运行后输出chi D)编译出错,第6章 习题,2010年4月21日星期三,39,教师:赵军富,6、若定义二维数组 int a33=
29、1,2,3,4,5,6,7,8,9;int k; 则下列语句的输出结果是:for (k=0;k3;k+) printf (“%d”, ak,2-k);A) 3 5 7 B) 3 6 9 C) 1 5 9 D) 1 4 7,7、判断字符串a 和 b 是否相等,应当使用:A) if (a= = b) B) if (a=b) C) if (strcpy(a,b) D) if (strcmp(a,b),第6章 习题,2010年4月21日星期三,40,教师:赵军富,8、读程序,写出正确结果:main()char a5=*,*,*,*,*int i, j, k; char space= ;for (i=0
30、;i5;i+) printf(“n”); printf(“ ”);for (j=1;j=i;j+) printf(“%c”,space);for (k=0;k5;k+)printf (“%c”,ak); ,*,第6章 习题,2010年4月21日星期三,41,教师:赵军富,9、读程序,写出正确结果:#include main()char a80=“AB” ,b80=“LMNP”int I =0;strcat (a,b);while (aI+ !=0 ) bI=aI;puts(b);,答案: LBLMNP 注意:当b 赋值时,I的值已递增 即 b1=a1,而b0仍保持原来的值L,第6章 习题,20
31、10年4月21日星期三,42,教师:赵军富,10、 用“筛法”求1100以内的素数。#include “math.h“main() int i, j, count=0, a101;for (i=1;i=100;i+) ai=i; /*赋值*/for (i=2;isqrt(100);i+)for (j=i+1;j=100;j+) if (ai!=0 ,第6章 习题,2010年4月21日星期三,43,教师:赵军富,11、 编一程序,将两字符串连接起来,不用strcat函数。main( ) static char s180,s280;int i=0,j=0;scanf(“%s“,s1);scanf(
32、“%s“,s2);while(s1i!=0)i+;while(s2j!=0)s1i+=s2j+;s1i=0;printf(“%sn“,s1); ,第6章 习题,2010年4月21日星期三,44,教师:赵军富,1、输入N个数到数组中(N最多为100),选出所有大于N个数的平均值的那些数。 2、编写一个从键盘输入10个学生的成绩,统计最高分、最低分及平均分。 3、任输入n个正整数, 将n个数按由小到大顺序排序。 4、 任输入20个正整数,找出其中素数,并按由小到大排好序。 5、输入一个二维矩阵,求两条对角线元素及周边元素之和及该二维数组元素的最小值。,第6章 习题,2010年4月21日星期三,45,教师:赵军富,6、编程输出入下数组:0 1 1 1 1 1 0-1 0 1 1 1 0 -1 -1 -1 0 1 0 -1 -1 -1 -1 -1 0 -1 -1 -1 -1 -1 0 1 0 -1 -1 -1 0 1 1 1 0 -10 1 1 1 1 1 0,提示: 矩阵分四部分考虑,第6章 习题,2010年4月21日星期三,46,教师:赵军富,