C语言-数组-课件.ppt
2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,当变量个数少,且彼此独立时,采用变量先定义,后赋值,再使用。如:int a,b,c;a=5;b=10;c=23;printf(“%d,%d,%d”,a,b,c);,当变量个数比较多,并且有内在的关系时,例如:全班有30个人,每人一个成绩 如:int c1,c2,,c30(可以利用数组),数组是怎么构成的?一组有序数据的集合,各个元素属于同一个类型,用统一的名称标识这一组数,用下标唯一地确定这组数中的每一个值,这就构成了“数组”。,数组的基本概念,数组,:有限个相同数据类型的数据分量的有序集合。,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,一、一维数组的定义,格式:,类型 标识符 长度,所有元素为同一类型,变量名,即数组名,数组中所含元素的个数,int a10;由10个整数组成的数组,共同拥有数组名,a,2、数组长度必须是整型量,int a2*3,说明:,1、用方括号将数组的长度括起来,3、数组长度也可以用常量表达式,4、不能对长度做动态定义,或者不定义长度,如:int n;n=10;int an;,6.1 一维数组的定义和使用,例如:int a5;,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,数组的三要素:,(1)相同的数据类型(定义数组时规定),(2)有限的成员个数(定义数组时规定),(3)彼此有序的排列(引用数组元素时的下标),int a5,int a5;a0=1;a1=2;a2=3;a3=4;a4=5;,6.1 一维数组的定义和使用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,数据类型 数组名 常量表达式初始化数据;,格式:,1.定义数组时,对全部元素赋值 int a5=1,2,3,4,5;,2.对部分元素赋值,float x5=1.9,2.0;,x0=1.9;x1=2.0;,3.若要对数组的全部元素初始化,则可省略数组的长度 int a=1,2,3,4;,二、一维数组的初始化,6.1 一维数组的定义和使用,用 包括所有初值,用逗号分隔各数值,且初值的个数不能大于数组长度。,按顺序给前2个元素赋值,其余元素为均为 0,数组长度=元素的个数,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,三、一维数组元素的引用,1、数组必须先定义,后赋值,再使用,2、数组中的元素必须逐一引用,3、通过数组名及其元素的下标引用,定义:类型 数组名长度 如:int a10,引用:数组名下标,a0,a1,a9为数组a10中的所有元素,(1)下标表示了元素在数组中的位置(2)下标可以用表达式 a2*3相当于a6,说明,6.1 一维数组的定义和使用,下标范围从 0 到长度-1,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例:有一个数组,内有10个元素,求出最小的元素和它的 下标。,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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,26,min=a0,i=1i=2i=3i=4i=5i=6i=7i=8i=9,1326 min=a1 k=1,循环,313 min=a2 k=2,683 min和k的值不变,13,3,203 min和k的值不变,13 min=a5,k=5,71 min和k的值不变,1,&min,531 min和k的值不变,121 min和k的值不变,651 min和k的值不变,min=1k=5,6.1 一维数组的定义和使用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,main()int i,a10,min,k;for(i=0;iai)min=ai;k=i;printf(“%d,%d”,k,min);,循环输入10个数,循环找出最小的,输出最小值和原始下标,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例 1.将6个实数由小到大排序。,5 8 9 4 7 2,第一轮结束:,2 8 9 5 7 4,结 果:,2 4 5 7 8 9,算法一:选择排序法,选择排序思路:将数组中的每一个元素和其后面所有的元素进行比较,如果某一个元素小于该数,将互换位置。,第一轮开始:,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,#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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,#include main()int a6=5,8,9,4,7,2,i,j,t,k;/*k为数组的下标*/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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,算法二:冒泡排序,冒泡法的思路:将相邻两个数比较,如果相邻的两个值是升序排列的,就保持原样,如果是降序排列的,就交换它们的值。(实质:大的沉下去,小的浮上来),start:a0 a1 a2 a3 a4 a5 a6 a7 2 57 29 89 42 34 16 1 1 times:2 29 57 42 34 16 1 89 2 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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,main()int a10=2,57,29,89,42,34,16,1;int pass,time,temp,xb;for(pass=1;pass atime+1)/*判断每相邻两个元素下标*/temp=atime;atime=atime+1;atime+1=temp;for(xb=0;xb10;xb+)printf(“a%d=%d n”,xb,axb);,程序代码一:,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,#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+)printf(%4d,ai);,程序代码二:,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,6.2 二维数组的定义和引用,当一个一维数组中的每个元素本身又是一个一维数组时,该数组构成“二维数组”。,一、二维数组的定义,格式:类型 标识符长度1长度2,如:int a44,行,列,a0a1a2a3,一维数组a4,二维数组a44,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,说明:1.二维数组元素需要两个下标表示 例:int a44表示数组a中有4行4列共16个数据,2.二维数组在存储空间中是按行优先存储,第一行,6.2 二维数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,二、二维数组的初始化,形式: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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,三、二维数组的引用,原则:,逐一引用,说明:1.数组名下标1下标2 下标1从0到长度-1 下标2从0到长度-1,方法:,数组名 N1N2,6.2 二维数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例1:已知5名学生的四门课程成绩,求每位学生的总成绩,并按二维表格式输出。,程序代码见下页,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例2、计算两个矩阵的乘积。,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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例3.不用输入,自动生成下列矩阵,1 2 3 4 51 1 6 7 81 1 1 9 101 1 1 1 111 1 1 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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,1、用来存放字符数据的数组是字符数组。2、字符数组中的每个元素存放一个字符。,字符数组:,一、字符数组的定义,定义方式与一、二维介绍的类似。例:char c10,d23;由于字符型与整型是互相通用的,因此也可定义 int c10;,二、字符数组的初始化,与一、二维介绍的类似,只是数组的每一个元素对应一个字符。char c10=I,a,m,h,a,p,p,y;char c32=,*,*,*;,6.3 字符数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,三、字符数组的引用,原则:,逐一引用,char a42,方法:,数组名下标1下标2下标1从0到长度-1下标2从0到长度-1,a00.a31共8个数据,例1输出一个字符串,main(),char c10=I,a,m,a,b,o,y;,int i;,printf(n);,6.3 字符数组的定义和引用,for(i=0;i10;i+)printf(%c,ci);,printf(%s,c);,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,在C语言中,字符串是作为字符数组来处理的。同时,为了测定字符串的实际长度,在C语言规定了一个“字符串结束标志”(在字符串的最后放有字符0),如一个字符串第10个字符为0,则此字符串的有效字符为9个,即在遇到第一个字符0时,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量也自动加一个0 作为结束符,当然在定义字符数组时应估计实际字符串长度。对字符数组初始化,可以用字符串常量来使字符数组初始化。如:char c=“I am happy”;或char c=“I am happy”;此时系统自动在串尾加 0。,四、字符串和字符串结束标志,6.3 字符数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,1、输入输出有两种方式:逐个字符输入输出。用“%c”将整个字符串一次输入输出。用“%s”2、输出应注意的问题:char c=“china”;printf(“%s”,c);输出字符不包括结束符0用“%s”格式输出字符时,printf函数中的输出项是字符数组名,而不是数组元素名。如果数组长度大于字符串实际长度,也只输出到0结束如果一个字符数组中包含一个以上0,则遇到第一个0时输出 就结束。输入时应注意:在使用scanf函数时,若输入字符串,用“%s”格式,则后面跟数组 名,且不带“&”符号,数组名指向该数组的起始地址。,五、字符数组的输入输出,6.3 字符数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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中,函数调用后得到一个函数值-字符数组1的地址。说明:字符数组1必须足够大,以便容纳连接后的新字符串。连接时,自动取消数组1后的0,只在新串最后保留一个0。,例题:Zfhs.c,六、字符串处理函数,6.3 字符数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,4、strcpy(字符数组1,字符串2)作用:是将字符串2拷贝到数组1中去。说明:字符数组1必须足够大,以便容纳被拷贝的字符串。“字符数组1”必须写成数组名形式,“字符串2”可以是 字符数组名,也可以是一个字符串常量。如:strcpy(str1,str);和 strcpy(str1,China);拷贝时连同字符串后面的0一起拷贝到字符数组1中;不能用赋值语句将一个字符串常量或字符数组直接赋 给一个字符数组 如:str1=“China”为非法;可以用strcpy函数将字符串2中前面若干个字符拷贝到 字符数组1中去;,6.3 字符数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,5、strcmp(字符串1,字符串2)作用:比较字符串1和字符串2 方法:对两个字符串自左至右逐个相比,直到出现不同的字符或 遇到0为止,如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准,比较的结果由函数值带回。字符串1=字符串2,函数值为0字符串1字符串2,函数值为一正整数字符串1字符串2,函数值为一负整(记忆方法:绝对值)6、strlen(字符数组)作用:测试字符串长度的函数,函数的值为字符串中的实际长度,不包括0在内。7、strlwr(字符串)将字符串中大写字母换成小写字母。8、strupr(字符串)将字符串中小写字母换成大写字母。,6.3 字符数组的定义和引用,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例2:输入一行字符,统计有多少个单词,单词用空格分隔。如:I am a student.#include stdio.hmain()char string81,c;int i,num=0,word=0;gets(string);for(i=0;(c=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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,例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(i=0;i10;i+)printf(%sn,ai);,6.4 应用实例,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,第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;printf(“%s”,c);A)ab B)ab C)ab c D)ab0,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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)运行后输出chC)运行后输出chi D)编译出错,第6章 习题,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,6、若定义二维数组 int a33=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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,8、读程序,写出正确结果:main()char a5=*,*,*,*,*int i,j,k;char space=;for(i=0;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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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章 习题,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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日星期三4月21日星期三,教师:赵军富,C 语言程序设计,11、编一程序,将两字符串连接起来,不用strcat函数。main()static char s180,s280;int i=0,j=0;scanf(%s,s1);scanf(%s,s2);while(s1i!=0)i+;while(s2j!=0)s1i+=s2j+;s1i=0;printf(%sn,s1);,第6章 习题,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,1、输入N个数到数组中(N最多为100),选出所有大 于N个数的平均值的那些数。2、编写一个从键盘输入10个学生的成绩,统计最高分、最低分及平均分。3、任输入n个正整数,将n个数按由小到大顺序排序。4、任输入20个正整数,找出其中素数,并按由小到大 排好序。5、输入一个二维矩阵,求两条对角线元素及周边元素之 和及该二维数组元素的最小值。,第6章 习题,2010年4月21日星期三4月21日星期三,教师:赵军富,C 语言程序设计,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-1 0 1 1 1 1 1 0,提示:矩阵分四部分考虑,第6章 习题,