C语言课件 第4章 数组

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第4章数组C语言程序设计2020/1/212第4章数组本章内容提要:4.1一维数组4.2二维数组4.3字符数组与字符串4.4指针与数组4.5指向指针的指针2020/1/213第4章数组一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?......这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组score[5]其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:score[0],score[1],…score[4]。下标变量也称为数组元素。2020/1/2144.1一维数组例如:inta[10];floatscore[5];“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型变量、整型表达式或返回值为整型的函数调用。表示元素个数。4.1.1一维数组的定义数据类型数组名[整型常量表达式];2020/1/215以下数组定义是正确的:#defineN10floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);数组名后要为方扩号,而不能为圆括号intn;floatscore[n];方扩号内必须是整型常量而不能是整型变量。charstr[];数组名后的方扩号内容不能为空4.1.1一维数组的定义(续)2020/1/216数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0低地址高地址score数组2020/1/2174.1.2数组元素的引用格式:例如:输入学生成绩for(i=0;i5;i++)scanf(%f,&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]2020/1/2184.1.2数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta[10];scanf(%d,&a[10]);/*下标越界*/C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2020/1/2194.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.02020/1/21104.1.3数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};2.省略数组长度,例如:inta[]={0,1,2,3,4};3.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。4.当初值的个数多于数组元素的个数时,编译出错例如:inta[5]={0,1,2,3,4,5};2020/1/21124.1.4一维数组应用举例【例4.1】将10个人的成绩输入计算机后按逆序显示。#defineN10main(){inti;floatscore[N];for(i=0;iN;i++)scanf(%f,&score[i]);for(i=N-1;i=0;i--)printf(%6.1f,score[i]);}运行情况如下:6774899234678395737878.073.095.083.067.034.092.089.074.067.02020/1/2113【例4.2】冒泡法排序(从小到大)。以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排在最后。2020/1/2114冒泡法排序(续)第二趟排序情况如下: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,不需再比较,得到排序结果:0356782020/1/2115冒泡法排序(续)以上数组元素的排序,用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复N-1次,内循环依次重复N-1,N-2,...,1次。每次进行比较的两个元素,第一个元素与内循环j有关的,用a[j]标识,第二个元素是与也内循环j有关的,用a[j+1]标识,i的值依次为1,2,...,N-1,对于每一个i,j的值依次为0,1,...N-i。2020/1/2116冒泡法排序(续)从上述过程可以看到:N个数要比较N-1趟,而在第i趟比较中,要进行N-i次两两比较。冒泡法排序for(i=0;iN;i++)输入a[i]for(i=1;iN;i++)for(j=0;jN-i;j++)a[j]a[j+1]TFa[j]与a[j+1]交换输出a[0]~a[N-1]2020/1/2117#defineN6main(){inta[N];inti,j,t;for(i=0;iN;i++)scanf(%d,&a[i]);for(i=1;i=N-1;i++)/*控制比较的趟数*/for(j=0;jN-i;j++)/*两两比较的次数*/if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf(Thesortednumbers:\n);……//输出语句}程序运行情况如下:3756800356782020/1/21234.2二维数组数据类型数组名[常量表达式1][常量表达式2];例如:floatx[2][3];4.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);2020/1/2124x[0][0]x[0][1]x[0][2]x[1][0]x[1][1]x[1][2]2000H2004H2008H200cH2010H2014H地址值数组元素二维数组元素在内存中的排列顺序:按行存放2020/1/2125x[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数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。floatx[2][3]2020/1/2126a[3][4]=3;/*下标越界*/a[1,2]=1;/*应写成a[1][2]=1;*/4.2.2二维数组元素的引用例:inta[3][4];a[0][0]=3;a[0][1]=a[0][0]+10;数组名[行下标表达式][列下标表达式]数组元素的表示形式:2020/1/21274.2.3二维数组的初始化例:inta[2][3]={1,2,3,4,5,6};1.按行赋初值例:inta[2][3]={{1,2,3},{4,5,6}};初始化后结果:1234562.按数组元素在内存中排列的顺序对各元素赋初值3.给部分元素赋初值例:inta[2][3]={{1},{4}};初始化后结果:1004002020/1/21284.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]:45002020/1/2129下面对二维数组的定义都是错误的:4.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};/*编译出错,初值个数多于数组元素的个数*/2020/1/21314.2.4二维数组应用举例【例4.4】给一个4行3列的二维数组输入/出数据。main(){inta[4][3],i,j,k;for(i=0;i4;i++)for(j=0;j3;j++)scanf(%d,&a[i][j]);for(i=0;i4;i++){printf(\n);for(j=0;j3;j++)printf(%d\t,a[i][j]);}printf(\n);}程序运行情况如下:1234567891011121234567891011122020/1/21324.2.4二维数组应用举例(续)【例4.5】有一个N×M矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。图4.4查找最大元素max=|a[0][0]|,row=0,colum=0for(i=0;iN;i++)for(j=0;jM;j++)|a[i][j]|maxTFmax=|a[i][j]|row=icolum=j输出绝对值最大的元素及行列下标2020/1/2133#includemath.h#defineN4#defineM5main(){inti,j,row,colum,max,a[N][M];……/*输入数据*/max=abs(a[0][0]);row=colum=0;for(i=0;iN;i++)for(j=0;jM;j++)if(abs(a[i][j])max){max=abs(a[i][j]);row=i;colum=j;}……/*输出数据*/}程序运行情况如下:3456126723126743985465456616243783256419max=98,row=1,colum=32020/1/21344.3字符数组与字符串字符数组:可以存放若干个字符,也可以存放字符串。4.3.1基本概念China\0字符串:字符串的末尾必须有’\0’字符,它的ASCII码值为0。China不是字符串是字符串2020/1/2135再例如:chara[3][5];a数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串。4.3.2字符数组的定义例如:chars[10];s数组是一维字符数组,它可以存放10个字符或一个长度不大于9的字符串。注意:字符串只能存放在字符数组中。2020/1/21364.3.3字符数组的初始化China1.用字符常量赋初值例如:charc[5]={'C','h','i','n','a'};再例如:charc[6]={'C','h','i','n','a','\0'};China\0是字符串不是字符串2020/1/21374.3.3字符数组的初始化(续)再例如:chara[3][10]={basic,pascal,c};astring\0\02.用字符串常量赋初值例如:charstr[10]={

1 / 70
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功