程序设计基础课件

上传人:无*** 文档编号:241599985 上传时间:2024-07-08 格式:PPTX 页数:104 大小:800.55KB
返回 下载 相关 举报
程序设计基础课件_第1页
第1页 / 共104页
程序设计基础课件_第2页
第2页 / 共104页
程序设计基础课件_第3页
第3页 / 共104页
点击查看更多>>
资源描述
Slide 1-1第第6章章 数组数组2024/7/8程序设计基础程序设计基础Programming FundamentalsSlide 1-2第第6章章 数组数组某大学举行某大学举行校园歌手校园歌手大赛大赛,邀请了,邀请了1010位评委来给选手打分。位评委来给选手打分。为保证评分的公正性,在计算每位选手的最后得分时,先去为保证评分的公正性,在计算每位选手的最后得分时,先去掉一个最高分和一个最低分,然后再计算一个平均分。请编掉一个最高分和一个最低分,然后再计算一个平均分。请编写程序,完成上述功能。写程序,完成上述功能。在这个问题中,需要记录每个评委打出的分数。如果声明在这个问题中,需要记录每个评委打出的分数。如果声明10个个浮点型变量,就很不方便。浮点型变量,就很不方便。经常经常会遇到类似的问题,数据量大,但各个数据之间存在一定会遇到类似的问题,数据量大,但各个数据之间存在一定的内在联系,有相同的数据类型,有相同的处理方式。在这种的内在联系,有相同的数据类型,有相同的处理方式。在这种情况下,情况下,C语言提供了复合数据类型:数组语言提供了复合数据类型:数组。复合数据类型是由基本数据类型按一定规则组合而成的。复合复合数据类型是由基本数据类型按一定规则组合而成的。复合数据类型变量可以存储多个数据数据类型变量可以存储多个数据。可以。可以使用使用数组数组来保存分数。来保存分数。引言引言2024/7/8Slide 1-3第第6章章 数组数组2024/7/8数组的基本数组的基本概念概念#include int main(void)int total=0;int age0,age1,age9;scanf(%d,&age0);total+=age0;scanf(%d,&age1);total+=age1;scanf(%d,&age9);total+=age9;printf(平均年龄平均年龄:%dn,total/10);return 0;【例例6.16.1】编写程序,要求用户从键盘输入编写程序,要求用户从键盘输入1010个人的年龄,计算个人的年龄,计算并输出平均年龄。并输出平均年龄。Slide 1-4第第6章章 数组数组仔细观察程序代码,可以发现这些表示年龄的变量名是有规仔细观察程序代码,可以发现这些表示年龄的变量名是有规律可循的,都由律可循的,都由ageage和一个数字组成,如果能用一个整型变和一个数字组成,如果能用一个整型变量,例如量,例如i i,来代表这些数字,则,来代表这些数字,则i i的值只需从的值只需从0 0循环到循环到9 9就可就可访问所有的年龄变量。上面的程序代码改写如下:访问所有的年龄变量。上面的程序代码改写如下:这样,原来冗长的程序代码就可以用一个简单的循环代替。这样,原来冗长的程序代码就可以用一个简单的循环代替。其中其中ageiagei实际上是一个数组变量,当实际上是一个数组变量,当i i从从0 0递增至递增至9 9,也就,也就使用了使用了age0age0age9age9这这1010个变量。个变量。数组的基本概念数组的基本概念(续续)2024/7/8for(i=0;i 10;+i)scanf(%d,&agei);total+=agei;Slide 1-5第第6章章 数组数组数组是具有相同数据类型的一组相关变量的集合,其中的每数组是具有相同数据类型的一组相关变量的集合,其中的每个变量都有相同的名字,但有不同的下标,这些变量为数组个变量都有相同的名字,但有不同的下标,这些变量为数组元素。元素。数组元素在内存中按顺序连续存放,每个数组元素按其存放顺数组元素在内存中按顺序连续存放,每个数组元素按其存放顺序对应一个从序对应一个从0开始的顺序编号,该顺序编号称为数组下标。开始的顺序编号,该顺序编号称为数组下标。只有一个下标的数组称为一维数组,有两个或以上下标的数组只有一个下标的数组称为一维数组,有两个或以上下标的数组称为多维数组。称为多维数组。通过数组名和下标实现对数组元素的访问。通过数组名和下标实现对数组元素的访问。数组有两条基本性质:数据是有序的,可以通过下标来访问某数组有两条基本性质:数据是有序的,可以通过下标来访问某个元素;数据是同质的,所有元素必须具有相同的数据类型。个元素;数据是同质的,所有元素必须具有相同的数据类型。数组的基本概念数组的基本概念(续续)2024/7/8Slide 1-6第第6章章 数组数组2024/7/8使用一使用一维数维数组编写程序组编写程序#include/*例例6.1*/#define ARRAY_SIZE 10int main(void)int ageARRAY_SIZE;/*一维整型数组一维整型数组*/int i,total=0;printf(输入输入10个人的年龄个人的年龄:);for(i=0;i ARRAY_SIZE;+i)scanf(%d,&agei);total+=agei;printf(平均年龄平均年龄:%dn,total/ARRAY_SIZE);return 0;Slide 1-7第第6章章 数组数组age是数组名,数组名遵循标识符命名规则;是数组名,数组名遵循标识符命名规则;“”是数组的标是数组的标志,志,“”用于确定数组的维数,在数组名后面有几个用于确定数组的维数,在数组名后面有几个“”就就表示这是一个几维数组;表示这是一个几维数组;“”中的命名常量中的命名常量ARRAY_SIZE表表示数组元素个数,即数组长度,数组示数组元素个数,即数组长度,数组age可以存放可以存放10个整数个整数。数组数组元素在数组中的位置称为数组下标,数组下标从元素在数组中的位置称为数组下标,数组下标从0开始,直开始,直至数组长度减至数组长度减1;数组;数组age的下标是的下标是09,而不是,而不是110。在数组。在数组age中,第一个元素是中,第一个元素是age0,第二个元素是,第二个元素是age1,以此类推,以此类推。在程序运行过程中,数组在程序运行过程中,数组age的逻辑结构的逻辑结构如下:如下:使用一维数组编写程序使用一维数组编写程序(续续)2024/7/8Slide 1-8第第6章章 数组数组【例例6.26.2】某大学举行某大学举行校园歌手校园歌手大赛大赛,邀请了,邀请了1010位专家评委来给位专家评委来给选手打分。为保证评分的公正性,在计算每位选手的最后得分选手打分。为保证评分的公正性,在计算每位选手的最后得分时,先去掉一个最高分和一个最低分,然后再计算一个时,先去掉一个最高分和一个最低分,然后再计算一个平均分。平均分。请编写程序,完成上述功能。请编写程序,完成上述功能。声明两个变量声明两个变量minScore和和maxScore保存最低分和最高分。声明保存最低分和最高分。声明数组数组score10保存评委的评分。声明变量保存评委的评分。声明变量total保存保存总分。总分。输入一个评分,保存在输入一个评分,保存在score中,判断它是否小于中,判断它是否小于minScore,若,若是,则用它来更新后者;判断它是否大于是,则用它来更新后者;判断它是否大于maxScore,若是,则,若是,则用它来更新后者。将这个评分计入总分。循环执行用它来更新后者。将这个评分计入总分。循环执行10次。次。把把10个评委的总分减去个评委的总分减去minScore和和maxScore,除以,除以8,得到最,得到最后的平均分。显示结果。后的平均分。显示结果。使用一维数组编写程序使用一维数组编写程序(续续)2024/7/8Slide 1-9第第6章章 数组数组2024/7/8使用一维数组编写程序使用一维数组编写程序(续续)#include/*例例6.2*/#define ARRAY_SIZE 10int main(void)double scoreARRAY_SIZE;double maxScore,minScore;double total=0.0,average;int i;for(i=0;i ARRAY_SIZE;+i)printf(输入第输入第%d个评委的分数个评委的分数:,i+1);scanf(%lf,&scorei);total+=scorei;maxScore=score0;minScore=score0;Slide 1-10第第6章章 数组数组2024/7/8使用一维数组编写程序使用一维数组编写程序(续续)for(i=1;i maxScore)maxScore=scorei;if(scorei minScore)minScore=scorei;average=(total-maxScore-minScore)/(ARRAY_SIZE-2);printf(去掉一个最高分去掉一个最高分%5.1f,去掉一个最低分去掉一个最低分%5.1f,最后最后得分得分%5.1fn,maxScore,minScore,average);return 0;Slide 1-11第第6章章 数组数组声明一维数组声明一维数组类型类型说明符说明符 数组名数组名常量表达式常量表达式;类型类型说明符用来指明数组元素的类型,同一说明符用来指明数组元素的类型,同一数组的元素类型数组的元素类型相相同同。数组名遵循标识符数组名遵循标识符的命名规则的命名规则。方括号方括号“”是数组的标志,方括号中的常量表达式表示数组是数组的标志,方括号中的常量表达式表示数组的元素个数,即数组的长度的元素个数,即数组的长度。数组元素的下标从数组元素的下标从0开始,至开始,至数组的长度减数组的长度减1。例如:例如:int intArray5;数组名数组名为为intArray,有有5个数组元素,每个元素均为整数。个数组元素,每个元素均为整数。数组数组intArray的数组元素下标的数组元素下标从从04。声明和处理一维数组声明和处理一维数组2024/7/8Slide 1-12第第6章章 数组数组在数组声明中,在数组声明中,数组长度必须数组长度必须是常量表达式。是常量表达式。int size=5;int intArraysize;/*错误错误*/#define ARRAY_SIZE 5int intArrayARRAY_SIZE;/*正确正确*/数组数组元素与元素与相同类型的普通变量一样使用相同类型的普通变量一样使用。通过。通过数组数组名和名和下标下标访问数组元素访问数组元素:数组名数组名 下标下标 数组数组intArray的各个元素用的各个元素用intArray0、intArray1、intArray2、intArray3、intArray4来访问来访问。访问访问数组元素时,必须确保下标不能越界。例如,访问数组元素时,必须确保下标不能越界。例如,访问intArray5,可能会导致程序产生不可预知的行为。,可能会导致程序产生不可预知的行为。声明和处理一维数声明和处理一维数组组(续续)2024/7/8Slide 1-13第第6章章 数组数组数组的初始化数组的初始化在在声明数组时,可以使用数组初始化式给数组元素赋初始值。声明数组时,可以使用数组初始化式给数组元素赋初始值。数组初始化式是一个用花括号数组初始化式是一个用花括号和和括起来的常量表达式列表,括起来的常量表达式列表,常量表达式之间用逗号进行分隔。常量表达式之间用逗号进行分隔。int intArray5=1,2,3,4,5;相当于:相当于:int intArray5;intArray0=1;intArray1=2;intArray2=3;intArray3=4;intArray4=5;可以在声明数组时,只可以在声明数组时,只给给数组前面的一部分数组前面的一部分元素设定元素设定初值。初值。int intArray5=1,2,3;那么数组中剩余的元素自动被初始化为那么数组中剩余的元素自动被初始化为0。相当于相当于:int intArray5;intArray0=1;intArray1=2;intArray2=3;intArray3=0;intArray4=0;声明和处理一维数组声明和处理一维数组(续续)2024/7/8Slide 1-14第第6章章 数组数组可以很容易把数组初始化为全可以很容易把数组初始化为全0。int intArray5=0;相当于:相当于:int intArray5;intArray0=0;intArray1=0;intArray2=0;intArray3=0;intArray4=0;当对数组当对数组的全部元素都明确设定初值时的全部元素都明确设定初值时,声明数组时可以,声明数组时可以不不指指定数组的长度。定数组的长度。由花括号内的初值个数确定数组由花括号内的初值个数确定数组的长度的长度。int intArray=1,2,3,4,5;/*数组长度为数组长度为5 */相当于:相当于:int intArray5=1,2,3,4,5;初值个数初值个数不允许超过不允许超过数组元素数组元素个数个数。数组初始化式不能为空。数组初始化式不能为空。int intArray5=0,1,2,3,4,5;/*错误错误*/int intArray5=;/*错误错误*/声明和处理一维数组声明和处理一维数组(续续)2024/7/8Slide 1-15第第6章章 数组数组数组和数组元素大小数组和数组元素大小长度长度运算符运算符sizeof可以用来确定数组和数组元素的大小。可以用来确定数组和数组元素的大小。int intArray5=1,2,3,4,5;假设假设int类型的值占类型的值占4个个字节字节数组大小数组大小sizeof(intArray)的值为的值为20数组数组元素大小元素大小sizeof(intArray0)的值为的值为4。数组长度数组长度sizeof(intArray)/sizeof(intArray0)的值为的值为5。声明和处理一维数组声明和处理一维数组(续续)2024/7/8Slide 1-16第第6章章 数组数组声明和处理一维数组声明和处理一维数组(续续)假设:假设:#define ARRAY_SIZE 5;int intArrayARRAY_SIZE,intsecondArrayARRAY_SIZE;int i,total,max,indexOfMax;数组数组长度是已知的,可以使用长度是已知的,可以使用for循环给数组元素赋值。循环给数组元素赋值。for(i=0;i ARRAY_SIZE;+i)intArrayi=i+1;使用使用099之间的随机数给数组元素赋值。之间的随机数给数组元素赋值。for(i=0;i ARRAY_SIZE;+i)intArrayi=rand()%100;使用从键盘上输入的数据给数组元素赋值。使用从键盘上输入的数据给数组元素赋值。for(i=0;i ARRAY_SIZE;+i)scanf(%d,&intArrayi);2024/7/8Slide 1-17第第6章章 数组数组声明和处理一维数组声明和处理一维数组(续续)打印数组打印数组for(i=0;i ARRAY_SIZE;+i)printf(%d,intArrayi);求所有元素的和求所有元素的和total=0;for(i=0;i ARRAY_SIZE;+i)total+=intArrayi;求最大元素求最大元素max=intArray0;for(i=1;i max)max=intArrayi;2024/7/8Slide 1-18第第6章章 数组数组声明和处理一维数组声明和处理一维数组(续续)求求最最靠靠前前的的最最大大元元素素的的下下标标。假假设设数数组组intArray为为1,5,3,4,5,5,那么最靠前的最大元素为,那么最靠前的最大元素为5,其下标为,其下标为1。max=intArray0;indexOfMax=0;for(i=1;i max)max=intArrayi;indexOfMax=i;2024/7/8Slide 1-19第第6章章 数组数组声明和处理一维数组声明和处理一维数组(续续)拷贝数组拷贝数组intSecondArray=intArray;/*错误错误,数组间不能整体,数组间不能整体赋值赋值*/for(int i=0;i ARRAY_SIZE;+i)intSecondArrayi=intArrayi;也也可可以以使使用用标标准准库库函函数数memcpy进进行行复复制制。为为了了使使用用memcpy函数,必须包含函数,必须包含string.h头文件。头文件。memcpy(intSecondArray,intArray,ARRAY_SIZE);2024/7/8Slide 1-20第第6章章 数组数组【例例6.36.3】编写程序编写程序,用户,用户从键盘输入从键盘输入1010个人的年龄,计算平均个人的年龄,计算平均年龄,统计并输出多少人在平均年龄之上、之下和恰好相等年龄,统计并输出多少人在平均年龄之上、之下和恰好相等。一维数一维数组例子组例子(续续)2024/7/8#include#define ARRAY_SIZE 10int main(void)int agesARRAY_SIZE;int i,total=0,average;int less=0,equal=0,great=0;printf(输入输入10个人的年龄个人的年龄:);for(i=0;i ARRAY_SIZE;+i)scanf(%d,&agei);total+=agei;average=total/ARRAY_SIZE;Slide 1-21第第6章章 数组数组一维数一维数组例子组例子(续续)2024/7/8 for(i=0;i average)+great;else if(agei average)+less;else +equal;printf(平均年龄平均年龄:%dn,average);printf(年龄在平均年龄之上的人数年龄在平均年龄之上的人数:%dn,great);printf(年龄在平均年龄之下的人数年龄在平均年龄之下的人数:%dn,less);printf(年龄恰好等于平均年龄的人数年龄恰好等于平均年龄的人数:%dn,equal);return 0;Slide 1-22第第6章章 数组数组【例例6.46.4】编写程序,随机生成编写程序,随机生成100100个个0 09 9之间的随机数,统计并之间的随机数,统计并输出每个数字出现的次数输出每个数字出现的次数。一维数一维数组例子组例子2024/7/8#include#include#include#define ARRAY_SIZE 10int main(void)int i,value;int countARRAY_SIZE=0;srand(time(NULL);for(i=0;i 100;+i)value=rand()%10;/*生成生成09之间的随机数,对应数组下标之间的随机数,对应数组下标*/+countvalue;for(i=0;i ARRAY_SIZE;+i)printf(%d出现次数出现次数:%dn,i,counti);return 0;Slide 1-23第第6章章 数组数组【例例6.56.5】编写程序,要求用户从键盘输入一个整数,判断该整编写程序,要求用户从键盘输入一个整数,判断该整数中是否有重复出现的数字。如果有,则输出数中是否有重复出现的数字。如果有,则输出“有重复数字有重复数字”,否则输出否则输出“没有重复数字没有重复数字”。一维数一维数组例子组例子(续续)2024/7/8#include#define ARRAY_SIZE 10int main(void)int digitARRAY_SIZE=0;int n,value;printf(输入一个整数输入一个整数:);scanf(%d,&n);if(n 0)value=n%10;/*分离数字分离数字*/Slide 1-24第第6章章 数组数组一维数一维数组例子组例子(续续)2024/7/8 if(digitvalue)/*value中的中的数字至少数字至少出现了两出现了两次次 */break;digitvalue=1;/*value中的数字是首次中的数字是首次出现出现*/n/=10;if(n 0)printf(有重复数字有重复数字);else printf(没有重复数字没有重复数字);return 0;Slide 1-25第第6章章 数组数组【例例6.66.6】编写程序,要求用户从键盘输入若干个整数存放在数编写程序,要求用户从键盘输入若干个整数存放在数组中,将数组元素值逆序重新排列,输出经过重新排列后的数组中,将数组元素值逆序重新排列,输出经过重新排列后的数组元素值。组元素值。把程序分解成三个函数:在把程序分解成三个函数:在main函数中输入数据并存放在数组函数中输入数据并存放在数组中;将数组传递给中;将数组传递给reverseArray函数,对数组元素逆序排列;函数,对数组元素逆序排列;将逆序排列后的数组传递给将逆序排列后的数组传递给printArray函数,输出逆序排列后函数,输出逆序排列后的数组元素值。的数组元素值。用户从键盘输入若干个数,因此事先并不能确定数组长度,而用户从键盘输入若干个数,因此事先并不能确定数组长度,而声明数组时又必须指定数组长度,也就是数组长度是常量,不声明数组时又必须指定数组长度,也就是数组长度是常量,不能根据实际输入的数据个数去确定数组长度能根据实际输入的数据个数去确定数组长度。一维数组和函数一维数组和函数2024/7/8Slide 1-26第第6章章 数组数组解决解决这个问题的一般方法是选择一个常量,指出数组可以容纳的这个问题的一般方法是选择一个常量,指出数组可以容纳的最大元素个数最大元素个数(数组(数组最大长度);在程序的任何应用中,实际使最大长度);在程序的任何应用中,实际使用的元素个数用的元素个数(数组(数组有效长度)都会比这个常量小;用这个常量有效长度)都会比这个常量小;用这个常量作为数组长度来声明数组,而实际只使用这个数组的一部分作为数组长度来声明数组,而实际只使用这个数组的一部分。数组可以作为函数参数。假设数组最大长度数组可以作为函数参数。假设数组最大长度是是ARRAY_SIZE,reverseArray和和printArray的函数声明如下:的函数声明如下:void reverseArray(int arrayARRAY_SIZE);void printArray(int arrayARRAY_SIZE);函数只知道数组最大长度,而不知道数组有效长度。函数在处理函数只知道数组最大长度,而不知道数组有效长度。函数在处理数组元素时,使用的是数组有效长度。例如,假设数组最大长度数组元素时,使用的是数组有效长度。例如,假设数组最大长度是是100,而实际只使用了前面,而实际只使用了前面75个数组元素,即数组有效长度是个数组元素,即数组有效长度是75;printArray函数需要知道数组有效长度,来输出前面函数需要知道数组有效长度,来输出前面75个数组个数组元素,后面元素,后面25个数组元素无需处理。个数组元素无需处理。一维数组和一维数组和函数函数(续续)2024/7/8Slide 1-27第第6章章 数组数组如果如果函数有一个数组参数,必须要有一个伴随参数,用来指定该函数有一个数组参数,必须要有一个伴随参数,用来指定该数组参数的有效长度数组参数的有效长度。修改后的。修改后的reverseArray和和printArray的函数的函数声明如下:声明如下:void reverseArray(int arrayARRAY_SIZE,int n);void printArray(int arrayARRAY_SIZE,int n);但一般把数组参数中的数组最大长度去掉,而写成:但一般把数组参数中的数组最大长度去掉,而写成:void reverseArray(int array,int n);void printArray(int array,int n);数组作为函数参数时,数组实参和数组形参之间是引用传递或共数组作为函数参数时,数组实参和数组形参之间是引用传递或共享传递,而不是值传递享传递,而不是值传递。带来的副作用是改变数组形参中某个数带来的副作用是改变数组形参中某个数组元素值也会改变数组实参中对应的数组元素值。如果不希望改组元素值也会改变数组实参中对应的数组元素值。如果不希望改变数组形参的值从而改变数组实参的值,可以在数组形参前面加变数组形参的值从而改变数组实参的值,可以在数组形参前面加上关键字上关键字const,明确告诉编译器不允许修改数组元素值。,明确告诉编译器不允许修改数组元素值。一维数组和一维数组和函数函数(续续)2024/7/8Slide 1-28第第6章章 数组数组一维数组和一维数组和函数函数(续续)2024/7/8#include/*例例6.6*/#define ARRAY_SIZE 100void reverseArray(int array,int n);void printArray(const int array,int n);int main(void)int intArrayARRAY_SIZE;int length;printf(输入若干个整数,以输入若干个整数,以Z作为结束标志作为结束标志n);length=0;while(scanf(%d,&intArraylength)=1)+length;reverseArray(intArray,length);printArray(intArray,length);return 0;Slide 1-29第第6章章 数组数组一维数组和一维数组和函数函数(续续)2024/7/8void reverseArray(int array,int n)int i,temp;for(i=0;i n/2;+i)temp=arrayi;arrayi=arrayn-i-1;arrayn-i-1=temp;void printArray(const int array,int n)int i;for(i=0;i n;+i)printf(%d,arrayi);printf(n);Slide 1-30第第6章章 数组数组【例例6.7】编写编写程序,创建一个程序,创建一个44的矩阵,矩阵的值是随机的的矩阵,矩阵的值是随机的两位正整数,输出该矩阵。找出并输出矩阵中最大值、最小值两位正整数,输出该矩阵。找出并输出矩阵中最大值、最小值以及它们所在的下标。以及它们所在的下标。矩阵可以用二维数组来表示。二维数组有两个下标,第一个下矩阵可以用二维数组来表示。二维数组有两个下标,第一个下标(行下标)表示元素所在的行,第二个下标(列下标)表示标(行下标)表示元素所在的行,第二个下标(列下标)表示元素所在的列元素所在的列。声明二维数组声明二维数组matrix44表示表示44矩阵,用矩阵,用1099范围内的随机范围内的随机数填充矩阵。数填充矩阵。声明变量声明变量max和和min用于存放最大值和最小值,用于存放最大值和最小值,它们它们初始值为初始值为matrix00。声明变量。声明变量max_row和和max_column分别存放最大分别存放最大值所在的行号和列号值所在的行号和列号。声明变量。声明变量min_row和和min_column分别存分别存放最大值所在的行号和列号。放最大值所在的行号和列号。通过二重循环确定矩阵最大值和最小值及其所在行号、列号。通过二重循环确定矩阵最大值和最小值及其所在行号、列号。使用二维数组编写程序使用二维数组编写程序2024/7/8Slide 1-31第第6章章 数组数组2024/7/8使用二维数组编写程序使用二维数组编写程序(续续)#include/*例例6.7*/#include#include#define ROW_SIZE 4#define COLUMN_SIZE 4int main(void)int matrixROW_SIZECOLUMN_SIZE;/*二维数组二维数组*/int row,column;int max,min,max_row,max_column,min_row,min_column;srand(time(NULL);for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;+column)matrixrowcolumn=10+rand()%90;printf(%2d,matrixrowcolumn);printf(n);max=matrix00;min=matrix00;max_row=max_column=0;min_row=min_column=0;Slide 1-32第第6章章 数组数组2024/7/8使用二维数组编写程序使用二维数组编写程序(续续)for(row=0;row ROW_SIZE;+row)for(column=0;column max)max=matrixrowcolumn;max_row=row;max_column=column;if(matrixrowcolumn min)min=matrixrowcolumn;min_row=row;min_column=column;printf(矩阵中最大值矩阵中最大值:%d,位于位于%d行行%d列列n,max,max_row,max_column);printf(矩阵中最小值矩阵中最小值:%d,位于位于%d行行%d列列n,min,min_row,min_column);return 0;Slide 1-33第第6章章 数组数组使用二维数组编写程序使用二维数组编写程序(续续)2024/7/8二维数组在内存中是按行顺序存放的,先第一行,接着第二维数组在内存中是按行顺序存放的,先第一行,接着第二行,以此类推;因此数组二行,以此类推;因此数组matrix的第一个元素是的第一个元素是matrix00,第二个元素是,第二个元素是matrix01,最后一,最后一个元素是个元素是matrix33。数组。数组matrix的逻辑结构的逻辑结构如如下:下:Slide 1-34第第6章章 数组数组【例例6.8】输入年、月、日,求这一天是该年的第几天。输入年、月、日,求这一天是该年的第几天。声明一个数组,存放每个月的天数。由于二月的天数因闰年和声明一个数组,存放每个月的天数。由于二月的天数因闰年和平年而有所不同,把数组声明为二维数组,把数组的第平年而有所不同,把数组声明为二维数组,把数组的第0行存放行存放平年每个月的天数,数组的第平年每个月的天数,数组的第1行存放闰年每个月的天数。行存放闰年每个月的天数。dayTable0k代表平年第代表平年第k月的天数,月的天数,dayTable1k代表闰年代表闰年第第k月的天数。因为数组下标从月的天数。因为数组下标从0开始,为了方便编程,数组增开始,为了方便编程,数组增加了加了1列,为列,为13列,第列,第0列只起到占位作用,没有其他用途列只起到占位作用,没有其他用途。int dayTable213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;数组第数组第1列(列(dayTable01或或dayTable11)对应)对应1月份,月份,第第2列(列(dayTable02或或dayTable12)对应)对应2月份,以此月份,以此类推。类推。使用二维数组编写程序使用二维数组编写程序(续续)2024/7/8Slide 1-35第第6章章 数组数组判断闰年的条件:能被判断闰年的条件:能被4整除但不能被整除但不能被100整除,或能被整除,或能被400整除,整除,leapYear=(year%4=0)&(year%100!=0)|(year%400=0)。如果。如果year是平年,是平年,leapYear值为值为0,用用leapYear作为作为行下标,行下标,dayTableleapYeark等价于等价于dayTable0k;如果;如果year是闰年,是闰年,leapYear值为值为1,用用leapYear作为行下标,作为行下标,dayTableleapYeark等价于等价于dayTable1k。首先确定输入的年是平年还是闰年,然后根据输入的月和上述首先确定输入的年是平年还是闰年,然后根据输入的月和上述二维数组,将前几个月的天数与输入的天数累加。二维数组,将前几个月的天数与输入的天数累加。使用二维数组编写程序使用二维数组编写程序(续续)2024/7/8Slide 1-36第第6章章 数组数组2024/7/8使用二维数组编写程序使用二维数组编写程序(续续)#include/*例例6.8*/int main(void)int i,year,month,day,leapYear;int dayTable213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;printf(输入日期输入日期:);scanf(%d%d%d,&year,&month,&day);leapYear=(year%4=0)&(year%100!=0)|(year%400=0);for(i=1;i month;+i)day+=dayTableleapYeari;printf(该日期是该日期是%d年第年第%d天天n,year,day);return 0;Slide 1-37第第6章章 数组数组声明声明二维数组的一般形式如下:二维数组的一般形式如下:数据类型数据类型 数组名数组名 常量表达式常量表达式11常量表达式常量表达式2;2;在在数组名后面有两个数组名后面有两个“”就表示这是一个二维数组。就表示这是一个二维数组。“”中的中的常量表达式常量表达式1表示数组行长度,表示数组行长度,“”中的常量表达式中的常量表达式2表示数组表示数组列长度,常量表达式的值必须是正整数。列长度,常量表达式的值必须是正整数。int intMatrix32;声明了一个名为声明了一个名为intMatrix、3行行2列、有列、有6个元素的二维数组,个元素的二维数组,数组每个元素的类型都是数组每个元素的类型都是int类型类型。声明二维数组时,必须指定数组行长度和列长度声明二维数组时,必须指定数组行长度和列长度。int intMatrix;/*错误错误*/声明和处理二维数组声明和处理二维数组2024/7/8Slide 1-38第第6章章 数组数组通常用通常用命名常量而不是一个具体的整数值来指定数组行长度命名常量而不是一个具体的整数值来指定数组行长度和列长度和列长度。#define ROW_SIZE 3#define COLUMN_SIZE 2int intMatrixROW_SIZECOLUMN_SIZE;二维数组中的每个元素都由对应的行、列下标。数组行下标从二维数组中的每个元素都由对应的行、列下标。数组行下标从0开始,直至数组行长度减开始,直至数组行长度减1;数组列下标从;数组列下标从0开始,直至数组列开始,直至数组列长度减长度减1。数组。数组intMatrix行下标范围是行下标范围是02,而不是,而不是13;列;列下标范围是下标范围是01,而不是,而不是12。声明和处理二维数声明和处理二维数组组(续续)2024/7/8Slide 1-39第第6章章 数组数组通过数组名和行、列下标实现通过数组名和行、列下标实现对二维数对二维数组元素的访问:数组组元素的访问:数组名名 行下标行下标列下标列下标。二二维数组在内存中是按行顺序存放的,先存放第维数组在内存中是按行顺序存放的,先存放第一行元素一行元素,接着存放第二接着存放第二行元素行元素,以此类推;而其中每,以此类推;而其中每一行元素一行元素是按列是按列顺序存放的顺序存放的。数组数组intMatrix的各个元素用的各个元素用intMatrix00、intMatrix01、intMatrix10、intMatrix11、inMatrix20、intMatrix21来访问来访问。访问访问数组元素时,必须确保下标不能越界。例如,访问数组元素时,必须确保下标不能越界。例如,访问intMatrix32,可能会导致程序产生不可预知的行为。,可能会导致程序产生不可预知的行为。声明和处理二维数组声明和处理二维数组(续续)2024/7/8Slide 1-40第第6章章 数组数组可以可以在在声明二维数声明二维数组的同时对其进行初始化。组的同时对其进行初始化。int intMatrix32=1,2,3,4,5,6;这种初始化方式比较直观,第一个内嵌数组初始化式这种初始化方式比较直观,第一个内嵌数组初始化式1,2给数给数组第一行的元素赋初始值,第二个内嵌数组初始化式组第一行的元素赋初始值,第二个内嵌数组初始化式3,4给数给数组第二行的元素赋初始值,第三个内嵌数组初始化式组第二行的元素赋初始值,第三个内嵌数组初始化式5,6给数给数组第三行的元素赋初始值组第三行的元素赋初始值。int intMatrix32=1,2,3,4,5,6;这种这种写法容易出错,不建议采用写法容易出错,不建议采用。声明二维数组时,如果给定了数组初始化式,则数组行长度声明二维数组时,如果给定了数组初始化式,则数组行长度可以省略,但列长度不能省略。可以省略,但列长度不能省略。int intMatrix2=1,2,3,4,5,6;声明和处理二维数组声明和处理二维数组(续续)2024/7/8Slide 1-41第第6章章 数组数组可以使用数组初始化式给二维数组部分元素赋初始值,剩余可以使用数组初始化式给二维数组部分元素赋初始值,剩余元素被初始化为元素被初始化为0 0。int intMatrix32=1,2,3,4;数组数组元素元素intMatrix00的值为的值为1,intMatrix01的值为的值为2,intMatrix10的值为的值为3,intMatrix11的值为的值为4,而,而intMatrix20和和intMatrix21的值均为的值均为0。二维数组元素全部初始化为二维数组元素全部初始化为0 0。int intMatrix32=0;数组元素数组元素intMatrix00的值为的值为0,剩余数组元素,剩余数组元素intMatrix01、intMatrix10、intMatrix11、inMatrix20、intMatrix21的值也被初始化为的值也被初始化为0。声明和处理二维数组声明和处理二维数组(续续)2024/7/8Slide 1-42第第6章章 数组数组数组初始化式不能为空。数组初始化式中的初始值个数也不数组初始化式不能为空。数组初始化式中的初始值个数也不能大于数组长度。下面的写法都是错误的。能大于数组长度。下面的写法都是错误的。int intMatrix32=;int intMatrix32=1,2,3,4,5,6,7,8;长度运算符长度运算符sizeof可以用来确定数组、数组行和数组元素的大可以用来确定数组、数组行和数组元素的大小。假设小。假设int类型的值占类型的值占4 4个个字节。字节。int intMatrix32=1,2,3,4,5,6;数组数组大小大小sizeof(intMatrix)的值为的值为24。数组数组行大小行大小sizeof(intMatrix0)的值为的值为8。数组数组元素大小元素大小sizeof(intMatrix00)的值为的值为4。数组数组行长行长度度sizeof(intMatrix)/sizeof(intMatrix0)的值为的值为3。数组数组列列长度长度sizeof(intMatrix0)/sizeof(intMatrix00)的值为的值为2。声明和处理二维数组声明和处理二维数组(续续)2024/7/8Slide 1-43第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)假设:假设:#define ROW_SIZE 3;#define COLUMN_SIZE 2;int intMatrixROW_SIZECOLUMN_SIZE;int intSecondMatrixROW_SIZECOLUMN_SIZE;int row,column,total,maxRow,indexOfMaxRow,totalOfCurrentRow;使使用用for循循环环给给数数组组元元素素赋赋值值。二二维维数数组组在在内内存存中中是是按按行行顺顺序序存放的,将行下标作为外循环,列下标作为内存放的,将行下标作为外循环,列下标作为内循环。循环。for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;+column)intMatrixrowcolumn=2*row+column+1;2024/7/8Slide 1-44第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)使用使用099之间的随机数给数组元素赋值。之间的随机数给数组元素赋值。for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;+column)intMatrixrowcolumn=rand()%100;使用使用从键盘上输入的数据给数组元素赋值。从键盘上输入的数据给数组元素赋值。for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;+column)scanf(%d,&intMatrixrowcolumn);2024/7/8Slide 1-45第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)打印打印数组数组for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;column+)printf(%d,intMatrixrowcolumn);printf(n);求所有元素的和。和保存在求所有元素的和。和保存在total变量中,其初始值为变量中,其初始值为0。total=0;for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;+column)total+=inytMatrixrowcolumn;2024/7/8Slide 1-46第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)求求列列元元素素的的和和。对对于于每每列列,和和保保存存在在total变变量量中中,其其初初始始值值为为0。for(column=0;column COLUMN_SIZE;+column)total=0;for(row=0;row ROW_SIZE;+row)total+=intMatrixrowcolumn;printf(第第%d列的和列的和:%dn,column,total);2024/7/8Slide 1-47第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)哪行的和哪行的和最大最大。变量变量maxRow保存行元素值的最大和,其初始值为保存行元素值的最大和,其初始值为0;求出数;求出数组第一行元素值的和并保存在组第一行元素值的和并保存在maxRow中中。变量变量indexOfMaxRow保存行元素值的最大和所在的行下标,保存行元素值的最大和所在的行下标,其初始值为其初始值为0。通过通过循环求出数组各行的元素值的和并保存在变量循环求出数组各行的元素值的和并保存在变量totalOfCurrentRow中,与中,与maxRow进行比较,若进行比较,若totalOfCurrentRow比比maxRow大,则更新大,则更新maxRow和和indexOfMaxRow。2024/7/8Slide 1-48第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)maxRow=0;indexOfMaxRow=0;for(column=0;column COLUMN_SIZE;+column)maxRow+=intMatrix0column;for(row=1;row ROW_SIZE;+row)totalOfCurrentRow=0;for(column=0;column maxRow)maxRow=totalOfCurrentRow;indexOfMaxRow=row;printf(第第%d行的和最大行的和最大:%dn,indexOfMaxRow,maxRow);2024/7/8Slide 1-49第第6章章 数组数组声明和处理二维数组声明和处理二维数组(续续)拷贝数组拷贝数组intSecondMatrix=intMatrix;/*错误错误,数组间不能整体,数组间不能整体赋值赋值*/for(row=0;row ROW_SIZE;+row)for(column=0;column COLUMN_SIZE;+column)intSecondMatrixrowcolumn=intMatrixrowcolumn;也也可可以以使使用用标标准准库库函函数数memcpy进进行行复复制制。为为了了使使用用memcpy函数,必须包含函数,必须包含string.h头文件。头文件。memcpy(intSecondMatrix,intMatrix,sizeof(intMatrix););2024/7/8Slide 1-50第第6章章 数组数组【例例6.9】创建创建一个一个nn的矩阵,的矩阵,矩阵值矩阵值是随机的两位正整数,是随机的两位正整数,显示该矩阵。然后将该矩阵显示该矩阵。然后将该矩阵转置,转置,显示转置后的矩阵。显示转置后的矩阵。矩阵矩阵可以用二维数组来表示。二维数组可以作为函数参数。把可以用二维数组来表示。二维数组可以作为函数参数。把程序分解成三个函数:在程序分解成三个函数:在main函数中用随机数填充并输出二维函数中用随机数填充并输出二维数组;将二维数组传递给数组;将二维数组传递给transposeMatrix函数,将矩阵转置;函数,将矩阵转置;将二维数组传递给将二维数组传递给printMatrix函数,输出矩阵函数,输出矩阵。事先事先并不能确定二维数组长度并不能确定二维数组长度,声明,声明数组时又必须指定数组数组时又必须指定数组长长度。选择度。选择两个常量,指出二维数组可以容纳的最大行元素个数两个常量,指出二维数组可以容纳的最大行元素个数(称为数组最大行长度)和最大列元素个数(称为数组最大列(称为数组最大行长度)和最大列元素个数(称为数组最大列长度)长度);实际;实际使用的行元素个数(称为数组有效行长度)和列使用的行元素个数(称为数组有效行长度)和列元素个数(称为数组有效列长度)都会比这两个常量小;用这元素个数(称为数组有效列长度)都会比这两个常量小;用这两个常量作为数组行长度和列长度来声明二维数组,而实际只两个常量作为数组行长度和列长度来声明二维数组,而实际只使用这个二维数组的一部分。使用这个二维数组的一部分。二维数组和函数二维数组和函数2024/7/8Slide 1-51第第6章章 数组数组如果如果函数有一个二维数组参数,必须要有两个伴随参数,用来指函数有一个二维数组参数,必须要有两个伴随参数,用来指定该二维数组参数的有效行长度和有效列长度。另外二维数组参定该二维数组参数的有效行长度和有效列长度。另外二维数组参数的最大行长度可以省略,但最大列长度不能省略。假设数组最数的最大行长度可以省略,但最大列长度不能省略。假设数组最大行长度是常量大行长度是常量ROW_SIZE,最大列长度是常量,最大列长度是常量COLUMN_SIZE,transposeMatrix和和printMatrix的函数声明如的函数声明如下:下:void transposeMatrix(int matrixCOLUMN_SIZE,int rowSize,int columnSize);void printMatrix(int matrixCOLUMN_SIZE,int rowSize,int columnSize);二维数组作为函数参数时,数组实参和数组形参之间是引用传递
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!