c语言(第六章)数组-谭.ppt

上传人:牧羊曲112 文档编号:5426210 上传时间:2023-07-05 格式:PPT 页数:85 大小:265KB
返回 下载 相关 举报
c语言(第六章)数组-谭.ppt_第1页
第1页 / 共85页
c语言(第六章)数组-谭.ppt_第2页
第2页 / 共85页
c语言(第六章)数组-谭.ppt_第3页
第3页 / 共85页
c语言(第六章)数组-谭.ppt_第4页
第4页 / 共85页
c语言(第六章)数组-谭.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《c语言(第六章)数组-谭.ppt》由会员分享,可在线阅读,更多相关《c语言(第六章)数组-谭.ppt(85页珍藏版)》请在三一办公上搜索。

1、,第六章 数组,本章目标,1.了解数组的数据结构,2.理解一维和多维数组的定义和关系,3.了解数组元素在内存的存放规则,4.了解数组元素和数组名的作用,5.掌握数组的使用方法,6.掌握基本的排序算法,一、数组具有的特征,数组名数组元素的个数数组元素的类型。,6.1 引言,二、数组的作用,数组元素的作用相当于简单变量,数组名代表的是数组在内存中的首地址,同一个数组中的元素在内存中是按顺序连续存放的,6.2 一维数组,一、一维数组的定义,形式:类型说明符 数组名常量表达式;,例:int a 20;float x 100;,代表数组元素的个数,其中 a 和 x 都是数组名。,1.数组名的确定方法同变

2、量名。,2.C语言用方括号 表示数组元数个数。,对于 int a5;,表示有5个元素,元素的下标从0开始.,数组a的元素分别为:a0,a1,a2,a3,a 4,数组 a 在内存中的存放顺序:,注意:在没有给数组元素赋值以前,没有确定的值。,二、一维数组的引用,2.引用数组元素的方式:数组名下标,1.必须象使用变量那样,先定义,后使用,则 a 05+a1 6 为正确的算术表达式,例:int a5;,a0=1;,a1=2;,:,例:一维数组的输入与输出。main()int i,a10;for(i=0;i10;i+)ai=i;for(i=0;i=9;i+)printf(“%4d”,ai);问题?将输

3、入数据按逆序输出.,例:一维数组的输入与输出。main()int i,a10;for(i=0;i0;i-)printf(“%d”,ai);,三、数组元素赋初值,对全部元素赋初值。如:,int a10=10,11,12,13,14,15,16,17,18,19,表示数组元素的值为:,a0=10;,a1=11;,:,a9=19;,对部分元素赋初值(前面的连续元素)。如:,在此,只有前5个元素初值确定。,int b10=0,1,2,3,4;,表示数组元素的值为:,b0=0;,b1=1;,b2=2;,b3=3;,b4=4;,注意:不能只对不连续部分元素或后面的连续元素赋初值。,语句:int a10=,

4、1,2,3,4,5;,int a10=1,3,5,7,9,;是错误的。,如对数组元素赋同一初值,必须一一写出:static int a10=2,2,2,2,2,2,2,2,2,2;不可写成任何其他形式。,若赋全部元素的初值,可省略常量表达式 int a=0,1,2,3;表示a4,即只有4个元素。,一、采用循环方式对数组元素赋初值,6.3 数组应用实例,二、内存与数组的关系,前面已讲过:数组元素在内存中是按顺序连续存放的;,重要特性:系统对超出数组元素的使用不查错。,例:#include,main(),int a5=0,1,2,3,4,i;,char ch5=a,b,c,d,e;,for(i=0

5、;i10;i+),printf(a%d=%d,ch%d=%cn,i,ai,i,chi);,printf(%s,ch);,a0=0,ch0=a,a1=1,ch1=b,a2=2,ch2=c,a3=3,ch3=d,a4=4,ch4=e,a5=25185,ch5=,a6=25699,ch6=,a7=23909,ch7=,a8=22,ch8=,a9=285,ch9=Abcde,三、一维数组的应用,求Fibonacci 数列的前20项。,定义数组,并赋初值,static int f 20=1,1;/*定义数组的前两个元素*/注:c规定只有静态数组static和外部存储数组extern才能进行初始化!(对于

6、构造数据类型如数组、结构体进行初始化通常定义为静态存储类别),fi=fi-1+fi-2,且f1=f2=1。,用循环for求数列的后18项:,注意:下标越界问题:i=2 且 i20,for(i=2;i20;i+),f i=f i 1+f i 2;,#include main()int i;static int f 20=1,1;for(i=2;i20;i+)f i=f i1+f i2;for(i=0;i20;i+)if(i%5=0)printf(n);printf(%12d,f i);,程序如下:,1 8 89 987,5 55 6106765,运行结果如下:,1 13 1441597,2 21

7、 1331584,3 34 3774181,例:歌手比赛,10位评委打分,去掉最高分,最低分,得成绩。,main()int score10,i,max=-1,min=101,sum=0;float mark;for(i=0;imax)max=scorei;if(scoreimin)min=scorei;mark=(sum-max-min)/8.0;printf(“The mark of this singer is%fn”,mark);,排序过程:(1)比较第一个数与第二个数,若为逆序a0a1,则交换;然后比较第二个数与第三个数;依次 类推,直至第n-1个数和第n个数比较为止 第一趟冒泡排序,

8、结果最大的数被安置在最 后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大 的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束,例 用冒泡法对10个数排序,985420,例:用冒泡法对10个数进行排序(冒泡排序法)算法:(从小到大)将两个相邻的数进行比较,将小的数调换到前头.,895420,859420,854920,854290,854209,第一趟,结果,第5次,第4次,第3次,第2次,第1次,58420,54820,54280,54208,85420,第二趟,main()int a11,i,j,t;printf(“input 10 num

9、ber:n”);for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(“the sorted numbers:n”);for(i=1;i11;i+)printf(“%4d”,ai);,排序过程:(1)首先通过n-1次比较,从n个数中找出最小的,将它与 第一个数交换第一趟选择排序,结果最小的数被安 置在第一个元素位置上(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小 的记录,将它与第二个数交换第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束,例 用简单选择法对10个数排序,例:用选择法对10个数进行排序。(记录下标),main()int a

10、10,i,j,t,k;for(i=0;ik*/for(j=i+1;j10;j+)if(ajak)k=j;t=ak;ak=ai;ai=t;printf(“the sorted numbers:n”);for(i=0;i10;i+)printf(“%4d”,ai);printf(“n”);,6.4 二维数组,一、二维数组的定义,形式:,例:int a4 10;float x8 20;,类型说明符 数组名常量表达式1 常量表达式2,2.可将二维数组的元素看成为若干个特殊的一维数组。,可看成:有三个特殊的一维数组b0,b1,b2,每一个又有四个元素:,1.不可将定义写为int a4,10。,注意:,b

11、00,b01,b02,b03,b10,b11,b12,b13,b20,b21,b22,b23,如:int b3 4;,3.二维数组的存放方式为:按行优先。由此可推广 至三维、n维数组的定义和存放。,4.初始化:,即:最右边的下标变化最快。,按行给二维数组赋初值:,static int a34=1,2,3,4,5,6,7,8,9,10,11,12;,或:,static int a34=1,2,3,4,5,6,7,8,9,10,11,12;,可以对部分元素赋初值,但需表达清楚。,则相当于,若:static int a34=1,2,3,8,则相当于,如:static int a34=1,2,3,8。

12、,可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小。,static int a 4=1,2,3,12;,二、二维数组元素的引用,形式:,其中的下标为整型表达式,但不得越界。与一维数组元素一样,二维数组元素相当于同类型的简单变量。注意下标值应在已定义的数组大小范围内;如:int a23;则a23=3的引用是不合法的。请区分定义数组a23和引用元素a23的不同。,数组名下标1下标2,三、程序举例,例:将一个二维数组行和列元素互换,存到另一个二维数组中。例如:,例:将一个二维数组的行列互换存放到另一个数组中.即:1 23 4 56main()static int a23=1,2,3,4,5

13、,6;static int b32,i,j;printf(“array a:n”);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(“%5d”,aij);bji=aij;printf(“n”);printf(“array b:n”);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(“%5d”,bij);printf(“n”);,a=,例:有一个34的矩阵,求出其中值为最大的元素的值以及它在矩阵中的位置.,max=a00,for(i=0 to 2),for(j=0 to 3),aijmax,f,t,max=aijrow=icolum=j,输出m

14、ax,row,colum,#include main()int i,j,row=0,colum=0,max;static int a34=1,2,3,4,9,8,7,6,-10,-10,-5,2;max=a00;for(i=0;imax)max=aij;row=i;colum=j;printf(“max=%d,row=%d,colum=%dn”,max,row,colum);,注意:,数组元素数据的输入必须以循环方式进行或者定义时置初值。,二维数组一般用二重循环对每个元素赋值。,二维数组与一维数组的对应关系:,字符数组的定义字符数组的初始化与赋值字符数组的输入与输出字符串处理函数字符数组的应用

15、举例,字符数组,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;c0 c1 c2 c3 c4 c5 c6 c7 c8 c92、要点:数组类型:必须是char型。元素个数:为实际字符个数+1,放结束标志,字符数组的定义,A B C D 0,字符串的结束标志“0”1、字符串的结束标志:“0”:ASCII码值为0的字符。在程序中判断字符串是否结束不再是依据字符数组的长度而是查找字符串的结束标志“0”.

16、2、例:char string=“abcdef”char string=a,b,c,d,e,f,字符数组的初始化1、将字符逐一送入字符数组中,例如:static char c10=I,a,m,h,a,p,p,y;要点:在给字符数组赋初值时初值的个数不能超过字符数的长度,若初值字符的个数小于数组的长度时,字符与数组前面的元素对应,其余的元素自动赋值0(空字符)。字符数组的大小也可以省略。如:static char c=b,o,o,k;请区别字符数组与字符串的不同2、对一批字符的描述3、字符数组的赋值4、例,对一批字符的描述,1、方法:采用二维数组来描述,数组的第一维为字符串的个数,第二维的元素个

17、数为字符串中最长字符个数+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 am happy”;是错误的.,字符串及其

18、结束标志无字符串变量,用字符数组处理字符串字符串结束标志:0,字符串,例:字符数组元素的引用。main()static char c10=I,a,m,h,a,p,p,y;int i;for(i=0;i10;i+)printf(“%c”,ci);printf(“n”);运行结果:I am happy试 char c10=“I am happy”,例:输出一个钻石图形。main()static char diamond55=,*,*,*,*,*,*,*,*;int i,j;for(i=0;i5;i+)for(j=0;j5;j+)printf(“%c”,diamondij);printf(“n”);

19、运行结果:*,字符串的输入与输出一、逐个字符的输入与输出用格式符“%c”输入或输出一个字符。二、将整个字符串一次输入或输出,用“%s”。如:static char c=“china”;printf(“%s”,c);三、要点:输出字符不包括结束符“0”.用“%s”时,printf中输出项是字符数组名,而不是元素名。printf(“%s”,c0)错若数组长度大于字符串实际长度,也只输出到0结束。char c10=“China”;printf(“%s”,c);结果:China若一个字符数组中包含一个以上的0,则遇到第一个0时就结束输出。,字符串的输入与输出1.用“%c”格式输出单个字符.例如:sta

20、tic char str=“book”;for(i=0;i4;i+)printf(“%c”,stri);2.用“%s”格式输出字符串.例如:static char str=“book”;printf(“%s”,str);3.利用scanf(“%s”,str);输入字符串时,输入项只写字符数组的名称不加地址.(C语言规定:数组名代表数组的起始地址)当利用“%s”格式输入多个字符串时,这些字符串应以空格作为它们的分割符.在空格的位置上放上0。,static char str15,str25,str35;scanf(“%s%s%s”,str1,str2,str3):输入数据:how are you?

21、在内存中数据的存储情况为:str1=“how”str2=“are”str3=“you?”如果有:char str13;scanf(“%s”,str);输入数据为:how are you?在内存中数据的存储情况为:str=“how”空格后面的字符没有作为有效字符来接受.所以C语言提供了丰富的字符串处理函数解决编程负担。,字符串处理函数(包含在头文件“string.h”中)1.puts()功能:将一个字符串输出到终端,输出时自动将“0”转化为“n”.char str=“ChinanBeijing”;puts(str);2.gets()功能:从终端输入一个字符串到字符数组中.回车结束 并返回字符数组

22、的首地址.其中可以包含空格字符。3.strcat(str1,str2)功能:将两个字符串连接起来并把结果存放在第一个字符串中.要点:(1)字符数组1必须足够大足以存放两个字符串;(2)两个字符串连接后第一个字符串后面的“0”被自动取消.只保留最后的一个“0”.Char str130=“I am”;char str2=“teacher”;printf(“%s”,strcat(str1,str2);,4.strcpy(str1,str2)功能:将字符串2拷贝到字符串1中.要点:(1)字符串1必须足够大,足以存放字符串2.(2)字符串2可以是字符数组名也可以是字符串常量,但第一个必须为字符数组名.(

23、3)对于字符数组不能使用赋值语句进行整体赋值.(4)可以使用strcpy(str1,str2,3)的形式将字符数组2中的前面3个字符拷贝到字符数组1中.5.strcmp(str1,str2)功能:比较两个字符串的大小.(逐个比较两个字符串的ASCII的值.)要点:(1)str1=str2.函数值为0;(2)str1str2.函数值为正数(3)str1str2.函数值为负数,6.strlen(str)功能:测量字符数组的长度,不包括“0”.7.strwr(str)功能:将大写字母转换为小写字母.8.strupr(str)功能:将小写字母转换为大写字母.例:当执行下面的程序且输入ABC时,输出结果

24、为:#include main()char ss10=“12345”;strcat(ss,”6789”);运行结果:ABC gets(ss);printf(“%s”,ss);,例 gets函数和strcmp函数的应用。#include main()char pass_str80;/*定义字符数组passstr*/int i=0;/*检验密码*/while(1)clrscr();printf(请输入密码n);gets(pass_str);/*输入密码*/if(strcmp(pass_str,“password”)!=0)/*口令错*/printf(口令错误,按任意键继续);else break;

25、/*输入正确的密码,中止循环*/getch();i+;if(i=3)exit(0);/*输入三次错误的密码,退出程序*/*输入正确密码所进入的程序段*/,例:程序main()char ch10;scanf(“%s”,ch);printf(“%s”,ch);执行时,若从键盘输入Good Morning,则输出为:A.Good Morning B.Good C.Good Morni D.Good Morn b,#include main()char a15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);scanf(%s,a);pri

26、ntf(a=%sn,a);,运行情况:输入:How are you?输出:a=How b=are c=you?输入:How are you?输出:a=How,scanf中%s输入时,遇空格或回车结束,运行情况:输入:How are you?,例 字符串输入举例,例:程序main()char ch10;gets(ch);printf(“%s”,ch);执行时,若从键盘输入Good Morning,则输出为:A.Good Morning B.Good C.Good Morni D.Good Morn a,main()int i;char a5;scanf(%s,a);for(i=0;i5;i+)p

27、rintf(%d,ai);,运行情况:(1)若输入 hel,正常(2)若输入 hell,正常(3)若输入 hello,用%s 输出时,会出现问题,输入字符串长度数组维数,例子,包含在头文件 string.h,字符串输出函数puts格式:puts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以0结束,字符串输入函数gets格式:gets(字符数组)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加0说明:输入串长度应小于字符数组维数,常用的字符串处理函数,包含在头文件 string.h,例#include main()char string80;printf(“

28、Input a string:”);gets(string);puts(string);输入:How are you?输出:How are you?,常用的字符串处理函数,字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消,新串最后加0,字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符

29、数组赋值,例 char str120,str220;str1=“Hello!”;()str2=str1;(),常用的字符串处理函数(1),字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止返值:返回int型整数,a.若字符串1 字符串2,返回正整数 c.若字符串1=字符串2,返回零说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括0在内,例 对于以下字符串,strlen(s)

30、的值为:(1)char s10=A,0,B,C,0,D;(2)char s=“tv0willn”;(3)char s=“x69082n”;,答案:1 3 1,常用的字符串处理函数(2),How are you?Hello!Len1=6,Len2=12,Len3=18,例 strcmp与strlen举例,例题,例:有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。float max=0,min=0;main()float average(array,n)float ave,score10;float array;int n;int i;int i;for(i=0;ima

31、x)max=arrayi;max,min,ave);else if(arrayimin)min=arrayi;sum=sum+arrayi;aver=sum/n;return(aver);,二维数组应用举例,【例】给矩阵a赋值,并输出该矩阵的值。main()int a33=1,2,3,4,5,6,7,8,9,i,j;for(i=0;i3;i+)for(j=0;j3;j+)printf(%5d,aij);printf(n);该程序的运行结果如下:1 2 3 4 5 6 7 8 9,字符串应用举例,【例】下面程序的功能是:将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。#include

32、#includemain()char a=”clanguage”,t;int i,j,k;k=strlen(a);,for(i=0;iaj)t=ai;ai=aj;aj=t;puts(a);printf(“n”);运行结果为:alancuegg。,作业:,例:汽车固定速度前进,里程表为一对称数95859,两小时后里程表又为一新对称数。求车速及新对称数,main()int t,j,a5;long int i,temp,k;for(i=95859+1;i+)temp=i;k=10000;for(t=0;t5;t+)at=temp/k;temp=temp%k;k=k/10;if(a0=a4),作业:有

33、4个学生,每人3门课。已知各课成绩,求每门课的平均成绩和每个学生的平均成绩。Cour1 cour2 cour3 stud1 78 86 92 stud2 62 73 65 stud3 90 93 95 stud4 82 73 85,作业:将一个数组中的值按逆序重新存放。例:原序:8,6,5,4,1 改为:1,4,5,6,8,Main()int i,j;float sum,stud_ave4,cour_ave3;static float score43=78,86,92,62,73,65,90,93,95,82,73,86;for(i=0;i=3;i+)sum=0.0;for(j=0;j=2;j

34、+)sum=sum+scoreij;stud_avei=sum/3;printf(“average%d is:%6.2fn”,i+1,stud_avei);for(j=0;j=2;j+)sum=0.0;for(i=0;i=3;i+)sum=sum+scoreij;cour_avej=sum/4;printf(“acerage course%d is:%6.2fn”,j+1,cour_avej);,作业:有4个学生,每人3门课。已知各课成绩,求每门课的平均成绩和每个学生的平均成绩。,作业:将一个数组中的值按逆序重新存放。例:原序:8,6,5,4,1 改为:1,4,5,6,8,main()int

35、n=5,I,temp;static int a5=8,6,5,4,1 for(i=0;in/2;i+)temp=ai;ai=an-i-1;an-i-1=temp;for(I=0;in;i+)printf(“%4d”,ai);,例:分析下面的程序,写出结果.main()int n33,i,j;for(i=0;i3;i+)for(j=0;j3;j+)nij=i+j;for(i=0;i2;i+)for(j=0;j2;j+)ni+1j+1+=nij;printf(“%dn”,nij);运行结果为:6,例:分析下面的程序,写出结果.main()int i=0;char s110=“abc”,s210=“

36、efg”;strcat(s1,s2);while(s1i+!=0)s2i=s1i;puts(s2);运行结果为:,作业:,由键盘输入三个英文单词,将其按从小到大的顺序排列输出。,#include“string.h”#include“stdio.h”void main()char s320,t20;int i,j;for(j=0;j0)strcpy(t,sj);strcpy(sj,sj+1);strcpy(sj+1,t);for(j=0;j3;j+)puts(sj);,输入一行字符,要求删去其中某个字符,要删的字符由 键盘输入.假设输入的一行字符为 afddjharyuauy,如输入a,则删去所

37、有的a;如输入d,则删去所有的d,2.输入一行字符,删去其中某个字符,要删字符由键盘输入,#include void main()char str20,c;int i;gets(str);c=getchar();for(i=0;stri!=0;i+)if(stri=c)stri=;puts(str);,str0str1str2str3str4str5str6str7str8str9:str19,abcafgham0,#include void main()char str20,c;int i;gets(str);c=getchar();for(i=0;stri!=0;i+)if(stri=c)

38、for(j=i;strj!=0;j+)strj=strj+1;puts(str);,str0str1str2str3str4str5str6str7str8str9:str19,abcafgham0,0,m,a,h,g,f,a,c,b,0,m,a,h,g,f,0,m,i=0,j=0,18(9时结束循环),i=1(不需要进行删除),i=2,j=2,37(8时结束循环),i=5,j=5,6(7时结束循环),i=3,4(不需要进行删除),#include void main()char s120,s220,c;int i,j;gets(s1);c=getchar();j=0;for(i=0;s1i!

39、=0;i+)if(s1i!=c)s2j=s1i;j+;s2j=0;puts(s1);puts(s2);,s10s11s12s13s14s15s16s17s18s19:s119,s20s21s22s23s24s25s26s27s28s29:s219,abcafgham0,b,c,f,g,h,m,0,1,1,2,2,3,4,3,5,4,6,5,7,8,6,9,作业:,由键盘输入一个英文句子,统计其中有多少个单词,单词之间用空格分割。,#include main()char string81;int i,num=0,word=0;char c;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);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号