C语言第6章数组课件_第1页
C语言第6章数组课件_第2页
C语言第6章数组课件_第3页
C语言第6章数组课件_第4页
C语言第6章数组课件_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章数组C

语言程序设计第6章数组C语言程序设计第6章数组

本章重点介绍:6.1一维数组6.2二维数组6.3字符数组与字符串2023/1/62第6章数组本章重点介绍:2023/1/62第6章数组一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?......这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组

score[5]其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:score[0],score[1],…score[4]。下标变量也称为数组元素。2023/1/63第6章数组一个人N门课的成绩怎样存储和处理?这些数据的特6.1一维数组例如:

inta[10];

float

score[5];

“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。

6.1.1一维数组的定义数据类型

数组名[常量表达式];2023/1/646.1一维数组例如:inta[10];6.1.1以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn;floatscore[n];doubleb['a'..'d'];charstr[];6.1.1一维数组的定义(续)2023/1/65以下数组定义是正确的:以下数组定义是不正确的:6.1.1一数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0低地址高地址score数组2023/1/66数组在内存的存放数组下标从0开始。score[0]91.5低6.1.2数组元素的引用

格式:例如:输入学生成绩

for(i=0;i<5;i++)

scanf("%f",&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]2023/1/676.1.2数组元素的引用格式:例如:输入学生成绩例如:6.1.2数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:

inta[10];scanf("%d",&a[10]);/*下标越界*/

C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2023/1/686.1.2数组元素的引用(续)说明:C编译系统不6.1.2数组元素的引用(续)

[]是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。如引用score[2]:(1)计算

2000+2*4=2008(2)取出2008的内容2000H2004H2008H200CH218CHscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.02023/1/696.1.2数组元素的引用(续)②[]是下标运算符,引6.1.3一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:inta[]={0,1,2,3,4};

2.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。3.当初值的个数多于数组元素的个数时,编译出错例如:

inta[5]={0,1,2,3,4,5};

2023/1/6106.1.3一维数组的初始化初始化:在定义数组时给数组元素赋6.1.4一维数组应用举例【例】将10个人的成绩输入计算机后按逆序显示。#defineN10main(){inti;floatscore[N];for(i=0;i<N;i++)scanf("%f",&score[i]);for(i=N-1;i>=0;i--)printf("%6.1f",score[i]);}运行情况如下:

6774899234678395737878.073.095.083.067.034.092.089.074.067.02023/1/6116.1.4一维数组应用举例【例】将10个人的成绩输入计算机【例】输入5个整数,找出最大数和最小数所在位置,并把二者对调,然后输出。思路:求最大/小值采用打擂台的方法。定义一维数组a存放被比较的数。定义变量max:最大值,min:最小值,

k:最大值下标,j:最小值下标。各数依次与擂主进行比较,若a[i]>max则:max=a[i];k=i;否则判断:若a[i]<min则:min=a[i];j=i;

当所有的数都比较完之后,将a[j]=max;[k]=min;输出a数组。2023/1/612【例】输入5个整数,找出最大数和最小数所在位置,并把二者对调main(){inta[5],max,min,i,j,k;

for(i=0;i<5;i++)scanf("%d",&a[i]);min=a[0];max=a[0];j=k=0;

for(i=1;i<5;i++)if(a[i]<min){min=a[i];j=i;}elseif(a[i]>max){max=a[i];k=i;}a[j]=max;a[k]=min;

for(i=0;i<5;i++)printf("%5d",a[i]);printf("\n");}程序运行情况如下:57231512372023/1/613main()程序运行情况如下:2023/1/613【例】冒泡法排序(从小到大)。

以6个数:3、7、5、6、8、0为例。第一趟排序情况如下:

375680第一次3和7比较,不交换375680第二次7和5比较,交换357680第三次7和6比较,交换356780第四次7和8比较,不交换356780第五次8和0比较,交换356708在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。2023/1/614【例】冒泡法排序(从小到大)。以6个数:3、7、5、6、8冒泡法排序(续)第二趟排序情况如下:

356708第一次3和5比较,不交换356708第二次5和6比较,不交换356708第三次6和7比较,不交换356708第四次7和0比较,交换356078在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出78。以此类推:第三趟比较3次,排出678第四趟比较2次,排出5678第五趟比较1次,排出35678最后还剩下1个数0,不需再比较,得到排序结果:0356782023/1/615冒泡法排序(续)第二趟排序情况如下:2023/1/615冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。

冒泡法排序for(i=0;i<N;i++)输入a[i]for(j=1;j<N;j++)for(i=0;i<N-j;i++)a[i]>a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]2023/1/616冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,#defineN6main(){inta[N];inti,j,t;

for(i=0;i<N;i++)scanf("%d",&a[i]);for(j=1;j<=N-1;j++)

/*控制比较的趟数*/

for(i=0;i<N-j;i++)

/*两两比较的次数*/

if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("Thesortednumbers:\n");

……}程序运行情况如下:3756800356782023/1/617#defineN6程序运行情况如下:2023/1/6以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例】选择法排序(从小到大)。2023/1/618以6个数:3、7、5、6、8、0为例。【例】选择法排序(从小#defineN5main(){inta[N];inti,j,k,t;for(i=0;i<N;i++)scanf("%d",&a[i]);printf("\n");

for(i=0;i<N-1;i++)/*确定基准位置*/

{k=i;for(j=i+1;j<N;j++)if(a[j]<a[k])k=j;t=a[i];a[i]=a[k];a[k]=t;}printf("Thesortednumbers:\n");…}程序运行情况如下:9678658640Thesortednumbers:40657886962023/1/619#defineN5程序运行情况如下:2023/1/66.2二维数组多维数组的空间想象一维数组:一列长表或一个向量多维数组:多维空间的一个数据列阵三维数组:三维空间的一个方阵2023/1/6206.2二维数组多维数组的空间想象一维数组:一列长表或一个6.2二维数组

数据类型数组名[常量表达式1][常量表达式2];

例如:

floatx[2][3];

6.2.1二维数组的定义X[0][0]X[0][1]X[0][2]X[1][0]X[1][1]X[1][2]inta[3,4],b(3,4),c[][],d(3)(4);2023/1/6216.2二维数组数据类型数组名[常量表达式1][常量表x[0][0]x[0][1]x[0][2]x[1][0]x[1][1]x[1][2]2000H2004H2008H200cH2010H2014H地址

数组元素二维数组元素在内存中的排列顺序:按行存放2023/1/622x[0][0]2000H地址值x[0]是数组名,是元素x[0][0]的地址x[1]是数组名,

是元素x[1][0]的地址二维数组可看作是一种特殊的一维数组x[0]----x[0][0],x[0][1],x[0][2]x[1]----x[1][0],x[1][1],x[1][2]例如,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。2023/1/623x[0]是数组名,是元素x[0][0]的地址x[1]是数组名a[3][4]=3;/*下标越界*/a[1,2]=1;/*应写成a[1][2]=1;*/6.2.2二维数组元素的引用例:inta[3][4];a[0][0]=3;a[0][1]=a[0][0]+10;数组名[行下标表达式][列下标表达式]

数组元素的表示形式:2023/1/624a[3][4]=3;/*下标越界*/6.2.26.2.3二维数组的初始化例:inta[2][3]={1,

2,

3,

4,

5,

6};

1.按行赋初值例:inta[2][3]={{1,

2,

3},

{4,

5,

6}};初始化后结果:123456

2.按数组元素在内存中排列的顺序对各元素赋初值3.给部分元素赋初值例:inta[2][3]={{1},{4}};初始化后结果:1004002023/1/6256.2.3二维数组的初始化例:inta[2][3]={16.2.3二维数组的初始化(续)4.数组初始化时,行长度可省,列长度不能省

例如:inta[][3]={1,2,3,4,5,6,7};

intb[][4]={{1},{4,5}};初始化结果:

a

结果:a[0]:123a[1]:456a[2]:700b

结果:b[0]:1000b[1]:45002023/1/6266.2.3二维数组的初始化(续)4.数组初始化时,行长度可下面对二维数组的定义都是错误的:6.2.3二维数组的初始化(续)floatx[3][]={1.0,2.0,3.0,4.0,5.0,6.0};

inta[][],b[][2],c[3][];

intm[2][4]={1,2,3,4,5,6,7,8,9};

/*编译出错,初值个数多于数组元素的个数*/

2023/1/627下面对二维数组的定义都是错误的:6.2.3二维数组的初始化6.2.4二维数组应用举例【例】给一个4行3列的二维数组输入/出数据。main(){inta[4][3],i,j,k;

for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);

for(i=0;i<4;i++){printf("\n");for(j=0;j<3;j++) printf("%d\t",a[i][j]);}printf("\n");}程序运行情况如下:1234567891011121234567891011122023/1/6286.2.4二维数组应用举例【例】给一个4行3列的二维数组输6.2.4二维数组应用举例(续)【例】有一个N×M矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。max=|a[0][0]|,row=0,colum=0for(i=0;i<N;i++)for(j=0;j<M;j++)|a[i][j]|>maxTFmax=|a[i][j]|row=icolum=j输出绝对值最大的元素及行列下标2023/1/6296.2.4二维数组应用举例(续)【例】有一个N×M矩阵,编#include"math.h"#defineN4#defineM5main(){inti,j,row,colum,max,a[N][M];

……/*输入数据*/max=a[0][0];row=colum=0;for(i=0;i<N;i++)for(j=0;j<M;j++)if(abs(a[i][j])>max){max=abs(a[i][j]);row=i;colum=j;}……/*输出数据*/}程序运行情况如下:3456126723126743985465456616243783256419max=98,row=1,colum=32023/1/630#include"math.h"程序运行情况如下:20236.3字符数组与字符串字符数组:可以存放若干个字符,也可以存放字符串。6.3.1基本概念China\0字符串:字符串的末尾必须有’\0’字符,它的ASCII码值为0。China不是字符串是字符串2023/1/6316.3字符数组与字符串字符数组:6.3.1基本概念Chi再例如:chara[3][5];a数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串。6.3.2字符数组的定义

例如:chars[10];s数组是一维字符数组,它可以存放10个字符或一个长度不大于9的字符串。注意:字符串只能存放在字符数组中。2023/1/632再例如:6.3.2字符数组的定义

例如:注意:字符串只能存6.3.3字符数组的初始化China1.用字符常量赋初值例如:charc[5]={'C','h','i','n','a'};再例如:charc[6]={'C','h','i','n','a','\0'};China\0是字符串不是字符串2023/1/6336.3.3字符数组的初始化China1.用字符常量赋初值再6.3.3字符数组的初始化(续)再例如:chara[3][10]={"basic","pascal","c"};astring\0\02.用字符串常量赋初值例如:charstr[10]={"astring"};或charstr[10]="astring";basic\0\0\0\0\0pascal\0\0\0\0c\0\0\0\0\0\0\0\0\0是字符串吗?2023/1/6346.3.3字符数组的初始化(续)再例如:astring\06.3.3字符数组的初始化(续)例如:chars3[7]={'s','t','r','i','n','g'};Goodmorning!\03.初始化时长度的省略例如:chars1[]="Goodmorning!";s1[0]s1[13]例如:chars2[]={'s','t','r','i','n','g'};stringstring\0思考:哪个数组存放的是字符串?2023/1/6356.3.3字符数组的初始化(续)例如:chars3[7]6.3.4字符数组的引用【例】对字符数组c1赋'0'~'9',对字符数组c2赋'A'~'Z',然后输出c1和c2数组中的数据。

1.对字符数组元素的引用可以为数组元素赋值,也可以输入/输出元素的值。2023/1/6366.3.4字符数组的引用【例】对字符数组c1赋'0'~'程序如下:main(){charc1[10],c2[26];inti;

for(i=0;i<10;i++)c1[i]=i+48;

for(i=0;i<26;i++)c2[i]=i+'A';

for(i=0;i<10;i++)printf("%c",c1[i]);printf("\n");for(i=0;i<26;i++)printf("%c",c2[i]);printf("\n");}2023/1/637程序如下:main()2023/1/6372.对字符数组的整体引用⑴输出字符串例如:charc[]="China";printf("%s",c);输出结果为:ChinaC是数组首地址输出时遇'\0'为止

再例如:charc[]="pascal\0basic";printf("%s",c);输出结果为:pascal2023/1/6382.对字符数组的整体引用⑴输出字符串C是数组首地址输出时遇2.对字符数组的整体引用(续)⑵输入字符串例如:charc[10];scanf("%s",c);输入:beijingbeijing\0三个字符串用空格隔开,分别赋给str1、str2、str3三个数组。再例如:charstr1[10],str2[10],str3[10];scanf("%s%s%s",str1,str2,str3);输入:pascalbasicc注意:不可以为数组整体赋值,例如:

charc[10];c="beijing"

;因为c是数组首地址,是常量!注意:“%s”遇空格、Tab和回车结束输入。2023/1/6392.对字符数组的整体引用(续)⑵输入字符串beijing\6.3.5字符串处理函数说明:①程序中如果调用下面介绍的8个字符串处理函数,在程序的开始应该写:

#include"stdio.h"或

#include"string.h"

预处理命令,否则在VC++6.0中编译会出现警告信息。②在字符串处理函数中,凡是用数组名或字符串首地址作参数的地方,都可以用指针变量作参数。指针变量的概念在第8章介绍。2023/1/6406.3.5字符串处理函数说明:2023/1/6401.字符串输出函数puts()调用格式:puts(str)功能:输出一个字符串,输出后自动换行。说明:str可以是字符数组名或字符串常量。例如:charstr1[]="China";charstr2[]="Beijing";puts(str1);puts(str2);输出结果:ChinaBeijing

2023/1/6411.字符串输出函数puts()调用格式:puts(str)2.字符串输入函数gets()调用格式:gets(str)功能:从键盘读入一个字符串存入str数组中,并且得到一个函数值,该函数值是str数组的首地址。说明:str是数组名。程序运行情况如下:Howareyou?Finethankyou.

Howareyou?Finethankyou.

例如:main(){charc1[20],c2[20];gets(c1);gets(c2);puts(c1);puts(c2);}2023/1/6422.字符串输入函数gets()调用格式:gets(str)3.字符串连接函数strcat()调用格式:strcat(str1,str2)功能:把str2中的字符串连接到str1字符串的后面,结果放在str1数组中,函数值是str1的值。beijingandshanghai\0必须足够大输出结果:beijingandshanghai例如:charstr1[21]="beijingand";charstr2[]="shanghai";printf("%s",strcat(str1,str2));2023/1/6433.字符串连接函数strcat()调用格式:strcat4.字符串复制函数strcpy()调用格式:strcpy(str1,str2)功能:将str2中的字符串复制到str1数组中。Beijing\0s1必须足够大思考:这样赋值s1="Beijing";或s1=s2;可以吗?为什么?s1的结果例如:chars1[10],s2[]="Beijing";strcpy(s1,s2);或:strcpy(s1,"Beijing");2023/1/6444.字符串复制函数strcpy()调用格式:strcpy5.字符串比较函数strcmp()

调用格式:strcmp(str1,str2)abcde\0str1abcde\0str2abc\0

abcde\0abcd\0

Abcde\0str1str2str1str2strcmp(str1,str2)==0strcmp(str1,str2)>0strcmp(str1,str2)<02023/1/6455.字符串比较函数strcmp()

调用格式:strcm例如:比较两个字符串的大小。main(){chars1[]="aBC",s2[]="abc";if(strcmp(s1,s2)==0)printf("s1=s2");elseif(strcmp(s1,s2)>0)printf("s1>s2");elseprintf("s1<s2");}程序输出结果:s1<s2思考:若有语句if(s1==s2)printf("s1=s2");比较的是什么?2023/1/646例如:比较两个字符串的大小。main()程序输出结果:思考6.求字符串长度函数strlen()调用格式:strlen(str)功能:测试字符串长度。函数值就是str中字符的个数。思考:字符串"China"和str数组在内存中各占几个字节?输出结果:5例如:charstr[10]="China";printf("%d",strlen(str));或printf("%d",strlen("China"));2023/1/6476.求字符串长度函数strlen()调用格式:strle6.3.6字符数组应用举例【例】从标准输入设备上输入一个字符串,分别统计其中每个数字、空格、字母及其他字符出现的次数。思路:用gets()函数读字符串,然后判断每一个字符是否是数字、空格、大小写字母或其他字符,用循环实现。注意:此题要求分别统计每个数字出现的次数,而不是统计数字出现的总次数。用一个一维整型数组存放每个数字出现的次数。2023/1/6486.3.6字符数组应用举例【例】从标准输入设备上输入一个字……{chars[80];inti,sp=0,oth=0,lett=0;intdig[10]={0};gets(s);for(i=0;s[i]!='\0';i++)if(s[i]>='0'&&s[i]<='9')dig[s[i]-'0']++;elseif(s[i]=='')sp++;elseif(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')lett++;elseoth++;for(i=0;i<10;i++)printf("%d:%d个",i,dig[i]);printf("\nspace:%dletter:%dother:%d\n",sp,lett,oth);}程序运行情况如下:China1949.10.1~2004.10.10:4个1:5个2:2个3:0个4:1个5:0个6:0个7:0个8:0个9:2个space:1letter:5other:52023/1/649……程序运行情况如下:2023/1/6496.3.6字符数组应用举例(续)【例】输入某月份的整数值1~12,输出该月份的英文名称。Illegalmonth.\0January\0…Decenmber\0思路:将12个英文月份以字符串的形式存放到month[13][15]中,一行存放一个字符串。

2023/1/6506.3.6字符数组应用举例(续)【例】输入某月份的整数值1main(){charmonth[][15]={"Illegalmonth.","January","February","March","April","May","June","July","August","September","October","Novenber","Decenmber"};intm;printf("\nInputmonth:");scanf("%d",&m);printf("%d:%s\n",m,(m<1||m>12)?month[0]:month[m]);} 程序运行情况如下:Inputmonth:1010:October2023/1/651main()程序运行情况如下:2023/1/6516.3.6字符数组应用举例(续)【例】将N个国家名按字母顺序排序后输出。思路:从键盘输入N个国家名称存放到一个二维字符数组中,然后用选择法对这N个字符串排序。程序如下:#defineN5#defineM10#include"stdio.h"main(){chars[N][M],str[M];inti,j;2023/1/6526.3.6字符数组应用举例(续)【例】将N个国家名按字母顺6.3.6字符数组应用举例(续)for(i=0;i<N;i++)gets(s[i]);

for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if(strcmp(s[i],s[j])>0){strcpy(str,s[i]);strcpy(s[i],s[j]);strcpy(s[j],str);}for(i=0;i<N;i++)puts(s[i]);}选择法排序2023/1/6536.3.6字符数组应用举例(续)for(i=0;i<N;例:输入一串字符,统计其中有多少个单词,单词之间用空格分隔开。____this_is_a_test___OK空格没有单词word=0记数num=0空格没有单词word=0记数num=0空格没有单词word=0记数num=0空格没有单词word=0记数num=0t有单词word=1记数num=1h有单词word=1记数num=1i有单词word=1记数num=1s有单词word=1记数num=1空格已有单词word=0记数num=1i有单词word=1记数num=2s有单词word=1记数num=2空格已有单词word=0记数num=2a有单词word=1记数num=3空格已有单词word=0记数num=3t有单词word=1记数num=4e有单词word=1记数num=4s有单词word=1记数num=4t有单词word=1记数num=4空格已有单词word=0记数num=4空格已有单词word=0记数num=4空格已有单词word=0记数num=4O有单词word=1记数num=5K有单词word=1记数num=5\0结束。有单词word=1记数num=5

main(){charstr[81];inti,num=0,word=0;gets(str);for(i=0;str[i]!=‘\0’;i++)if(str[i]==‘’)word=0;elseif(word==0){word=1;num++;}printf(“Thereare%dwordsintheline.\n”,num);}Str字符数组长度要足够长gets(str);for(i=0;str[i]!=‘\0’;i++)if(str[i]==‘’)word=0;elseif(word==0){word=1;num++;}2023/1/654例:输入一串字符,统计其中有多少个单词,单词之间用空格分隔开本章结束2023/1/655本章结束2023/1/655第6章数组C

语言程序设计第6章数组C语言程序设计第6章数组

本章重点介绍:6.1一维数组6.2二维数组6.3字符数组与字符串2023/1/657第6章数组本章重点介绍:2023/1/62第6章数组一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?......这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组

score[5]其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:score[0],score[1],…score[4]。下标变量也称为数组元素。2023/1/658第6章数组一个人N门课的成绩怎样存储和处理?这些数据的特6.1一维数组例如:

inta[10];

float

score[5];

“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。

6.1.1一维数组的定义数据类型

数组名[常量表达式];2023/1/6596.1一维数组例如:inta[10];6.1.1以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn;floatscore[n];doubleb['a'..'d'];charstr[];6.1.1一维数组的定义(续)2023/1/660以下数组定义是正确的:以下数组定义是不正确的:6.1.1一数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0低地址高地址score数组2023/1/661数组在内存的存放数组下标从0开始。score[0]91.5低6.1.2数组元素的引用

格式:例如:输入学生成绩

for(i=0;i<5;i++)

scanf("%f",&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]2023/1/6626.1.2数组元素的引用格式:例如:输入学生成绩例如:6.1.2数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:

inta[10];scanf("%d",&a[10]);/*下标越界*/

C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2023/1/6636.1.2数组元素的引用(续)说明:C编译系统不6.1.2数组元素的引用(续)

[]是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。如引用score[2]:(1)计算

2000+2*4=2008(2)取出2008的内容2000H2004H2008H200CH218CHscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.02023/1/6646.1.2数组元素的引用(续)②[]是下标运算符,引6.1.3一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:inta[]={0,1,2,3,4};

2.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。3.当初值的个数多于数组元素的个数时,编译出错例如:

inta[5]={0,1,2,3,4,5};

2023/1/6656.1.3一维数组的初始化初始化:在定义数组时给数组元素赋6.1.4一维数组应用举例【例】将10个人的成绩输入计算机后按逆序显示。#defineN10main(){inti;floatscore[N];for(i=0;i<N;i++)scanf("%f",&score[i]);for(i=N-1;i>=0;i--)printf("%6.1f",score[i]);}运行情况如下:

6774899234678395737878.073.095.083.067.034.092.089.074.067.02023/1/6666.1.4一维数组应用举例【例】将10个人的成绩输入计算机【例】输入5个整数,找出最大数和最小数所在位置,并把二者对调,然后输出。思路:求最大/小值采用打擂台的方法。定义一维数组a存放被比较的数。定义变量max:最大值,min:最小值,

k:最大值下标,j:最小值下标。各数依次与擂主进行比较,若a[i]>max则:max=a[i];k=i;否则判断:若a[i]<min则:min=a[i];j=i;

当所有的数都比较完之后,将a[j]=max;[k]=min;输出a数组。2023/1/667【例】输入5个整数,找出最大数和最小数所在位置,并把二者对调main(){inta[5],max,min,i,j,k;

for(i=0;i<5;i++)scanf("%d",&a[i]);min=a[0];max=a[0];j=k=0;

for(i=1;i<5;i++)if(a[i]<min){min=a[i];j=i;}elseif(a[i]>max){max=a[i];k=i;}a[j]=max;a[k]=min;

for(i=0;i<5;i++)printf("%5d",a[i]);printf("\n");}程序运行情况如下:57231512372023/1/668main()程序运行情况如下:2023/1/613【例】冒泡法排序(从小到大)。

以6个数:3、7、5、6、8、0为例。第一趟排序情况如下:

375680第一次3和7比较,不交换375680第二次7和5比较,交换357680第三次7和6比较,交换356780第四次7和8比较,不交换356780第五次8和0比较,交换356708在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。2023/1/669【例】冒泡法排序(从小到大)。以6个数:3、7、5、6、8冒泡法排序(续)第二趟排序情况如下:

356708第一次3和5比较,不交换356708第二次5和6比较,不交换356708第三次6和7比较,不交换356708第四次7和0比较,交换356078在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出78。以此类推:第三趟比较3次,排出678第四趟比较2次,排出5678第五趟比较1次,排出35678最后还剩下1个数0,不需再比较,得到排序结果:0356782023/1/670冒泡法排序(续)第二趟排序情况如下:2023/1/615冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。

冒泡法排序for(i=0;i<N;i++)输入a[i]for(j=1;j<N;j++)for(i=0;i<N-j;i++)a[i]>a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]2023/1/671冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,#defineN6main(){inta[N];inti,j,t;

for(i=0;i<N;i++)scanf("%d",&a[i]);for(j=1;j<=N-1;j++)

/*控制比较的趟数*/

for(i=0;i<N-j;i++)

/*两两比较的次数*/

if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("Thesortednumbers:\n");

……}程序运行情况如下:3756800356782023/1/672#defineN6程序运行情况如下:2023/1/6以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例】选择法排序(从小到大)。2023/1/673以6个数:3、7、5、6、8、0为例。【例】选择法排序(从小#defineN5main(){inta[N];inti,j,k,t;for(i=0;i<N;i++)scanf("%d",&a[i]);printf("\n");

for(i=0;i<N-1;i++)/*确定基准位置*/

{k=i;for(j=i+1;j<N;j++)if(a[j]<a[k])k=j;t=a[i];a[i]=a[k];a[k]=t;}printf("Thesortednumbers:\n");…}程序运行情况如下:9678658640Thesortednumbers:40657886962023/1/674#defineN5程序运行情况如下:2023/1/66.2二维数组多维数组的空间想象一维数组:一列长表或一个向量多维数组:多维空间的一个数据列阵三维数组:三维空间的一个方阵2023/1/6756.2二维数组多维数组的空间想象一维数组:一列长表或一个6.2二维数组

数据类型数组名[常量表达式1][常量表达式2];

例如:

floatx[2][3];

6.2.1二维数组的定义X[0][0]X[0][1]X[0][2]X[1][0]X[1][1]X[1][2]inta[3,4],b(3,4),c[][],d(3)(4);2023/1/6766.2二维数组数据类型数组名[常量表达式1][常量表x[0][0]x[0][1]x[0][2]x[1][0]x[1][1]x[1][2]2000H2004H2008H200cH2010H2014H地址

数组元素二维数组元素在内存中的排列顺序:按行存放2023/1/677x[0][0]2000H地址值x[0]是数组名,是元素x[0][0]的地址x[1]是数组名,

是元素x[1][0]的地址二维数组可看作是一种特殊的一维数组x[0]----x[0][0],x[0][1],x[0][2]x[1]----x[1][0],x[1][1],x[1][2]例如,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。2023/1/678x[0]是数组名,是元素x[0][0]的地址x[1]是数组名a[3][4]=3;/*下标越界*/a[1,2]=1;/*应写成a[1][2]=1;*/6.2.2二维数组元素的引用例:inta[3][4];a[0][0]=3;a[0][1]=a[0][0]+10;数组名[行下标表达式][列下标表达式]

数组元素的表示形式:2023/1/679a[3][4]=3;/*下标越界*/6.2.26.2.3二维数组的初始化例:inta[2][3]={1,

2,

3,

4,

5,

6};

1.按行赋初值例:inta[2][3]={{1,

2,

3},

{4,

5,

6}};初始化后结果:123456

2.按数组元素在内存中排列的顺序对各元素赋初值3.给部分元素赋初值例:inta[2][3]={{1},{4}};初始化后结果:1004002023/1/6806.2.3二维数组的初始化例:inta[2][3]={16.2.3二维数组的初始化(续)4.数组初始化时,行长度可省,列长度不能省

例如:inta[][3]={1,2,3,4,5,6,7};

intb[][4]={{1},{4,5}};初始化结果:

a

结果:a[0]:123a[1]:456a[2]:700b

结果:b[0]:1000b[1]:45002023/1/6816.2.3二维数组的初始化(续)4.数组初始化时,行长度可下面对二维数组的定义都是错误的:6.2.3二维数组的初始化(续)floatx[3][]={1.0,2.0,3.0,4.0,5.0,6.0};

inta[][],b[][2],c[3][];

intm[2][4]={1,2,3,4,5,6,7,8,9};

/*编译出错,初值个数多于数组元素的个数*/

2023/1/682下面对二维数组的定义都是错误的:6.2.3二维数组的初始化6.2.4二维数组应用举例【例】给一个4行3列的二维数组输入/出数据。main(){inta[4][3],i,j,k;

for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);

for(i=0;i<4;i++){printf("\n");for(j=0;j<3;j++) printf("%d\t",a[i][j]);}printf("\n");}程序运行情况如下:1234567891011121234567891011122023/1/6836.2.4二维数组应用举例【例】给一个4行3列的二维数组输6.2.4二维数组应用举例(续)【例】有一个N×M矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。max=|a[0][0]|,row=0,colum=0for(i=0;i<N;i++)for(j=0;j<M;j++)|a[i][j]|>maxTFmax=|a[i][j]|row=icolum=j输出绝对值最大的元素及行列下标2023/1/6846.2.4二维数组应用举例(续)【例】有一个N×M矩阵,编#include"math.h"#defineN4#defineM5main(){inti,j,row,colum,max,a[N][M];

……/*输入数据*/max=a[0][0];row=colum=0;for(i=0;i<N;i++)for(j=0;j<M;j++)if(abs(a[i][j])>max){max=abs(a[i][j]);row=i;colum=j;}……/*输出数据*/}程序运行情况如下:3456126723126743985465456616243783256419max=98,row=1,colum=32023/1/685#include"math.h"程序运行情况如下:20236.3字符数组与字符串字符数组:可以存放若干个字符,也可以存放字符串。6.3.1基本概念China\0字符串:字符串的末尾必须有’\0’字符,它的ASCII码值为0。China不是字符串是字符串2023/1/6866.3字符数组与字符串字符数组:6.3.1基本概念Chi再例如:chara[3][5];a数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串。6.3.2字符数组的定义

例如:chars[10];s数组是一维字符数组,它可以存放10个字符或一个长度不大于9的字符串。注意:字符串只能存放在字符数组中。2023/1/687再例如:6.3.2字符数组的定义

例如:注意:字符串只能存6.3.3字符数组的初始化China1.用字符常量赋初值例如:charc[5]={'C','h','i','n','a'};再例如:charc[6]={'C','h','i','n','a','\0'};China\0是字符串不是字符串2023/1/6886.3.3字符数组的初始化China1.用字符常量赋初值再6.3.3字符数组的初始化(续)再例如:chara[3][10]={"basic","pascal","c"};astring\0\02.用字符串常量赋初值例如:charstr[10]={"astring"};或charstr[10]="astring";basic\0\0\0\0\0pascal\0\0\0\0c\0\0\0\0\0\0\0\0\0是字符串吗?2023/1/6896.3.3字符数组的初始化(续)再例如:astring\06.3.3字符数组的初始化(续)例如:chars3[7]={'s','t','r','i','n','g'};Goodmorning!\03.初始化时长度的省略例如:chars1[]="Goodmorning!";s1[0]s1[13]例如:chars2[]={'s','t','r','i','n','g'};stringstring\0思考:哪个数组存放的是字符串?2023/1/6906.3.3字符数组的初始化(续)例如:chars3[7]6.3.4字符数组的引用【例】对字符数组c1赋'0'~'9',对字符数组c2赋'A'~'Z',然后输出c1和c2数组中的数据。

1.对字符数组元素的引用可以为数组元素赋值,也可以输入/输出元素的值。2023/1/6916.3.4字符数组的引用【例】对字符数组c1赋'0'~'程序如下:main(){charc1[10],c2[26];inti;

for(i=0;i<10;i++)c1[i]=i+48;

for(i=0;i<26;i++)c2[i]=i+'A';

for(i=0;i<10;i++)printf("%c",c1[i]);printf("\n");for(i=0;i<26;i++)printf("%c",c2[i]);printf("\n");}2023/1/692程序如下:main()2023/1/6372.对字符数组的整体引用⑴输出字符串例如:charc[]="China";printf("%s",c);输出结果为:ChinaC是数组首地址输出时遇'\0'为止

再例如:charc[]="pascal\0basic";printf("%s",c);输出结果为:pascal2023/1/6932.对字符数组的整体引用⑴输出字符串C是数组首地址输出时遇2.对字符数组的整体引用(续)⑵输入字符串例如:charc[10];scanf("%s",c);输入:beijingbeijing\0三个字符串

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论