《数组》计算机课件.pptx_第1页
《数组》计算机课件.pptx_第2页
《数组》计算机课件.pptx_第3页
《数组》计算机课件.pptx_第4页
《数组》计算机课件.pptx_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 数组,本章学习内容, 对数组名特殊含义的理解 数组类型,数组的定义和初始化 排序、查找、求最大最小值等常用算法 向函数传递一维数组,为什么要使用数组,唉,有这么多不同主题的书。在哪里才能找到有关中国音乐的书呢?,为什么要使用数组,文学类,计算机类,西方音乐类,中国音乐类,为什么要使用数组,数组的元素,容器中保 存的物品,日常生活中的容器,程序中的数组,为什么要使用数组,如何处理 一个班学生的学习成绩? 一行文字怎样存储? 一个矩阵怎样存储 ?.,问题:,这些数据的特点:1.具有相同的数据类型 2.使用过程中需要保留原始数据 C语言为这些数据提供了一种构造数据类型:数组。,为什么使用数组

2、(Array)?,【例8.1】要读入5人的成绩,然后求平均成绩 需定义5个不同名整型变量,需要使用多个scanf() int score1, score2, score3, score4, score5; scanf(%d, ,保存大量同类型的相关数据,8.1一维数组的定义和初始化,一维数组的定义 存储类型 数据类型 数组名 整数 ;,a4,a3,a2,a1,a0,int a5; 定义一个有5个int型元素的数组 系统在内存分配连续的5个int空间给此数组 直接对a的访问,就是访问此数组的首地址,基类型,下标从0开始,8.1一维数组的定义和初始化,a4,a3,a2,a1,a0,int a5;

3、数组大小必须是值为正的常量,不能为变量(以c89为准,c99允许) 一旦定义,不能改变大小 数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 5 int aSIZE;,一维数组的定义 存储类型 数据类型 数组名 整数 ;,8.1一维数组的定义和初始化,数组定义后的初值仍然是随机数 一般需要进行初始化 int a5 = 12, 34, 56 ,78 ,9 ; int a = 11, 22, 33, 44, 55 ; 在上面的写法中,花括号中有5个数,系统会据此自动定义a数组的长度为5。,8.1一维数组的定义和初始化,数组的引用 数组名 下标 数组下标(index)都是从0开

4、始 使用a0、a1、a2、a3、a4这样的形式访问每个元素 下标既可是常量,也可是整型表达式,允许快速随机访问,如ai 可以像使用普通变量一样使用它们,如何使两个数组的值相等?,main() int a5 = 1,2,3,4,5, b5; b = a; ,解决方法 方法1:逐个元素赋值 b0=a0; b1=a1; b2=a2; b3=a3; b4=a4; 方法2:通过循环赋值 int i; for (i=0;i5;i+) bi = ai; ,原因: 数组名表示数组的首地址,其值不可改变!,初始化一维数组,int emp_code5 = 1299,1499,1699,1899,2099;,emp

5、_code,初始化一维数组,其他的初始化情况: int arr10 = 10,9,8,7,6,5,4,3,2,1,0; int arr =; int arr10 = 9,8,7,5; int n=10,datan;,/错误!越界了,/错误,到底是几个元素?,/正确,后面的6个元素未初始化,/错误,因为n是变量,为一维数组动态赋值,float price4; printf(“Enter prices of 4 booksn”); for (i = 0;i = 3; i+) scanf(“%f”, ,price,12.34,1002.10,17.5,11.12,只能逐个对数组元素进行操作(字符数组

6、例外),输入方法:,int a10,i;,输入第i个数组元素:,scanf(%d,输入整个数组元素:,for (i=0;i10;i+) scanf(%d,输出方法:,输出第i个数组元素:,printf(%d,ai);,输出整个数组元素:,for (i=0;i10;i+) printf(%d,ai);,一维数组的输入和输出,一维数组示例,# include int main() int i; float item_rate5,total=0; printf(n 请输入商品价格:); for(i=0;i5;i+) scanf(%f, ,循环执行 5 次,请输入商品价格:35.50 45.8 23

7、40.7 80,0,0,Item_rate,35.50,35.50,45.8,23,40.7,80,5,225.0,所有商品的合计费用:225.000000,8.1一维数组的定义和初始化,【例8.2】编程实现显示用户输入的月份(不包括闰年的月份)拥有的天数,8.1一维数组的定义和初始化,下标越界是大忌! 编译程序不检查是否越界 下标越界,将访问数组以外的空间 那里的数据是未知的,不受我们掌控,可能带来严重后果,当下标值小于0或超过数组长度时 会出现什么情况?,运行程序可以看到,变量c和a的值因数组越界而被悄悄破坏了,1,2,3,4,5,6,0,7,8,#include #include int

8、 main() int a = 1, c = 2, b5 = 0, i; printf(%p, %p, %pn, b, ,9,21,数组类型,一维数组,二维数组,三维数组,8.2二维数组的定义和初始化,一维数组 用一个下标确定各元素在数组中的顺序 可用排列成一行的元素组来表示 如 int a5; 二维数组 用两个下标确定各元素在数组中的顺序 可用排列成i行、j列的元素组来表示 如 int b23; n维数组 用n个下标来确定各元素在数组中的顺序 如 int c324; n3时,n维数组无法在平面上表示其各元素的位置,datatype arrayNamerowsizecolsize;,int n

9、um42;,num,4 X 2 = 8,8*sizeof(int) 字节,二维数组的定义和初始化,二维数组,int books42 = 11, 1294,22,450, 33,4000, 44,79;,int arr 3 = 1,2,3, 4,5,6;,int arr2 = 1,2,3, 4,5,6;,【例】以下程序的运行结果是什么? int main() int a3=1,2,3,4,5,6,0; printf(%d,%d,%dn,a11,a21,a31); return 0; ,1 2 3 4 5 0 6 0 0 0 0 0,结果:5, 0, 0,【例】若int a 3=1, 2, 3,

10、4, 5, 6, 7, 则a数组的第一维大小是多少?,1 2 3 4 5 6 7 0 0,二维数组的初始化,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),int a23,i,j;,数组的数据类型和存储类型,根据数组的数据类型,为每一元素安排相同长度的存储单元 根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区 用sizeof(a)来获得数组a所占字节数,short int a23;,a10,a11,a12,a00,a01,a02,存放顺序:按行存放 先顺序存放第0行元素,再存放第1行元素,需知道数组每行列数才能从起始地址开始正确读出数组元素

11、,二维数组的存储结构,二维数组实例,【例8.4】从键盘输入某年某月(包括闰年),编程输出该年的该月拥有的天数,数组应用,从键盘上输入一个数组(10个元素),按逆序输出。,方法一,#include #define N 10 int main() int i, j, t, aN; for (i=0; iN; i+) scanf(%d, ,for (i=0; iN; i+) printf(%d , ai); printf(n); return 0; ,#include int main() int a10,i; for(i=0;i=0;i-) printf(%d ,ai); printf(n); r

12、eturn 0; ,方法二,问题描述: 从键盘输入5个数,求这组数中的最大值和最小值 。,数组应用,max(i=0),max(i=2),max(i=3),数组应用,#include #define N 5 int main() int numN,max,min,i; for(i=0;inumi) min=numi; printf(n最大值为:%d,max); printf(n最小值为: %dn,min); return 0; ,读入5个值保存在数组中,求最大值和最小值,问题描述: 输入10个数,保存在一个数组中,在数组中查找某个数,给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置

13、;如果找不到,输出“没有找到!”。,#define N 10 for(i=0;iN;i+) scanf(%d, ,读入10个值保存在数组中,在数组中查找,一旦找到,通过break语句跳出循环,数组应用,冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即在第一趟:首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后。至此第一趟结束,将最小的数放到了最后。在第二趟:仍从第一对数开始比较,将大数放前,小数放后,一直比较到倒数第二个数(倒数第一的位置上已经是

14、最小的),第二趟结束,在倒数第二的位置上得到一个新的最小数(其实在整个数列中是第二小的数)。如此下去,重复以上过程,直至最终完成排序。 由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。,冒泡法排序(降序),问题描述: 编写C程序实现冒泡排序算法,按照降序排列一组数。,冒泡法排序,16,25,9,90,23,16,25,90,9,9,23,16,90,16,23,25,90,问题描述: 编写C程序实现冒泡排序算法,按照降序排列一组数。,冒泡法排序,#define N 5 int gradeN,temp,i,j; for(i=0;iN;i+) scanf(%d, ,

15、读入5个值保存在数组中,16,25,9,90,23,16,25,90,9,9,23,16,90,16,23,25,90,如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素依然保持有序。 定义一个数组,长度为11,初始元素为10个,按照从小到大的方式输入,然后输入一个要插入的元素,使得插入后仍然有序。,插入法排序,#define N 10 #include int main() int numN+1,in,i,j; for (i=0;iN;i+) scanf(%d,for (i=0;iin) break; for (j=N;ji;j-) numj=numj

16、-1; numi=in; for (i=0;iN+1;i+) printf( %d,numi); printf(n); return 0; ,兔子繁殖问题,打印每个月和年底时的总的兔子对数 Fibonacci数列 1 1 2 3 5 8 13 21 34 55 89 144 233 ,,f0=1 ( n=0),#include #define YEAR_MONTH 12 int main() int fYEAR_MONTH = 1,1,2; int month; for (month=3; monthYEAR_MONTH; month+) fmonth = fmonth-1 + fmonth-

17、2; for (month=0; monthYEAR_MONTH; month+) printf(%dt, fmonth); printf(nsum = %dn, fYEAR_MONTH-1); return 0; ,兔子繁殖问题,f0=1 ( n=0),求二维数组 的最大值所在的行和列,二维数组应用,#include void main() int i, j, max, x, y ; int a34 = 1, 4, 7, 2, 1, 2, 5, 0, 8, 1, 3, 1; max = a00; x=y=0; for( i=0; i3; i+) for( j=0; j4; j+) if (

18、max aij ) max = aij; x = i; y = j; printf( 最大值在第%d行第%d列, x+1, y+1 ); ,二维数组应用,定义44 的二维数组,请编写程序,给二维数组赋值,并使数组下半三角元素中的值乘以n 。 例如: 数组中的值为 假设n为10,则输出结果如下:(输出的数按照4位宽度来输出,即%4d) 注意:输出时每行最后 不能有空格,#include intmain() int i,j,n; inta44; for (i=0;i4;i+) for (j=0;j4;j+) scanf(%d,for(i=0;i4;i+) for(j=0;j=i;j+) aij*=

19、n; for(i=0;i4;i+) for(j=0;j=3;j+) if (j=3) printf(%4dn,aij); elseprintf(%4d,aij); return0; ,for (i=0;i4;i+) for(j=0;j4;j+) printf(%4d,aij); printf(n); ,50,矩阵转置,求N阶方阵A的转置方阵。如: 1 0 0 0 2 3 0 0 4 5 6 0 7 8 9 10 转置矩阵为: 1 2 4 7 0 3 5 8 0 0 6 9 0 0 0 10,矩阵转置算法:把方阵A的行和列互换得到A的转置矩阵,#include #define N 4 int m

20、ain() int aNN,t; int i,j; for (i=0;iN;i+) for (j=0;jN;j+) scanf(%d, ,for (i=0;iN;i+) for (j=0;jN;j+) printf(%2dt,aij); printf(n); return 0; ,8.3向函数传递一维数组,传递整个数组给另一个函数,可将数组的首地址作为参数传过去 用数组名作函数参数 只复制一个地址自然比复制全部数据效率高 由于首地址相同,故实参数组与形参数组占用同一段内存 在该函数内,不仅可以读这个数组的元素,还可以修改它们,简单变量和数组作函数参数的区别,计算平均分,计数控制的循环,计算平均

21、分,计数控制的循环,计算最高分,#include #define N 40 void ReadScore(int score,int n); int FindMax(int score, int n); int main() int scoreN, max, n; scanf(%d, ,max(i=0),max(i=2),max(i=3),计算最大值算法,假设其中的一个学生成绩为最高 max = score0; 对所有学生成绩进行比较,即 for (i=1; i max 则修改max值为scorei 打印最高分max,计算最高分,计算最高分,选择法排序,k=1,k=2,k=0,k=1,选择法排

22、序,k=3,k=4,k=3,k=4,选择法排序,选择法排序 for (i=0; i scorek) 记录此轮比较中最高分的元素下标 k = j; 若k中记录的最大数不在位置i,则 交换成绩scorek和scorei“; ,成绩从高到低顺序,#include #define N 40 void ReadScore(int score,int n); void PrintScore(int score,int n); void DataSort(int score, int n); int main() int scoreN, n; scanf(%d, ,void ReadScore(int score, int n) int i; for(i=0;in;i+) scanf(“%d”, ,void DataSort(int score, int n) /*选择法*/ int i, j, k, temp1; for (i=0; i scorek) k = j; /*记录最大数下标位置*/ if (k != i) /*

温馨提示

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

评论

0/150

提交评论