神一样的C课件数组

上传人:E**** 文档编号:91093448 上传时间:2019-06-21 格式:PPT 页数:68 大小:539.50KB
返回 下载 相关 举报
神一样的C课件数组_第1页
第1页 / 共68页
神一样的C课件数组_第2页
第2页 / 共68页
神一样的C课件数组_第3页
第3页 / 共68页
神一样的C课件数组_第4页
第4页 / 共68页
神一样的C课件数组_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《神一样的C课件数组》由会员分享,可在线阅读,更多相关《神一样的C课件数组(68页珍藏版)》请在金锄头文库上搜索。

1、高级语言程序设计,第五章 数组(Arrays),本章主要内容,数组(概述/定义/引用) 数组作为函数参数 与数值数组有关的常用算法 排序:起泡法/选择法/插入法 查找:顺序查找法/折半查找法 矩阵运算 字符数组和字符串 与字符数组有关的常用算法,一、概述,C的数据类型: P38 基本类(简单类)字符型/整型/实型/枚举型 构造类(组合类)数组/结构体/共用体 指针类 空类型(void),一、概述,对于变量 基本类型单个出现的变量,每个变量可以代表一个确定的数据(变量值),且具有一定属性。 如 static int x,y; 但变量间不存在确定的相互关系。 构造类型由基本类型按一定规则组成。其中

2、: 数组:由一组有序数据(数组元素)组成。 每个元素:有相同类型,统一数组名; 用下标(index)确定其顺序;但可以取各自值。 如 static int a5; 其中: 表示a是个数组,而不是一个简单变量a。 5表示该数组共有5个元素,元素编号从0开始,a0表示第1个元素,a4表示第5个元素(最后一个),一、概述,数组的用处很多。简单例子:要读入某班全体50位同学某科学习成绩,然后进行简单处理(求平均成绩、最高分、最低分) 若用简单变量,需50个不同变量名,要用很多个scanf命令。如 int score1,score2,score50; scanf(“%d,%d,%d”,示例程序如下:,#

3、define NUM 50 main() int i,scoreNUM,highest; float sum=0,average; clrscr(); /*依次读入全班同学分数*/ for (i=0;iNUM;i+) printf(“请输入第%d位同学的成绩:“,i+1); scanf(“%d“, ,/*求平均成绩并显示出来*/ for (i=0;ihighest) highest=scorei; printf(“n最高分是:%dn“,highest); ,二、数组的定义,同变量一样,数组也必须“先定义,后使用”。 定义内容: 数组名(同变量名:字母、下划线、数字;字母或下划线开头;长度32)

4、 类型(存储属性/数据类型) 大小(维数/元素个数) 定义的一般形式: 存储属性 数据类型 数组名常量表达式常量表达式 注意:数组长度必须是常量表达式 常量或符号常量,其值必须为正,不能为变量。,数组长度 (数组元素最大个数),二、数组的定义,错误: int n=5; int an;,正确: #define N 5 int aN;,正确: int a10,b54; char name8,ch23; static float x8*2+1,table234; #define NUM 40; int aNUM,bNUM+2;,一维数组和多维数组,一维数组 用一个下标来确定各元素在数组中的顺序。可用

5、排列成一行的元素组来表示。 如 int a5; (右上图) 二维数组 用两个下标来确定各元素在数组中的顺序。可用排列成ij列的元素组来表示。 如 int b23; (右下图) n维数组 用n个下标来确定各元素在数组中的顺序。 如 int c324; n3时,维数组无法在平面上表示其各元素的位置。,n维数组的元素总数等于各维长度之积。,特别注意 数组名表示每个数组的首地址,即: a 表示 &a0 b 表示 &b00,more about multidimensional arrays,为了便于理解,可以把多维数组看成一维数组的扩展: 二维数组(nm)可以看成n行m个元素的一维数组; 三维数组(p

6、nm)可以看成p页n行m个元素的一维数组,即p页二维数组(nm); 四维数组(vpnm)可以看成v册p页n行m个元素的一维数组,即v册三维数组(pnm) 以此类推。,三、数组的存储结构,根据数组的数据类型,为每一元素安排相同长度的存储单元。 根据数组的存储属性,将其安排在内存动态、静态存储区或寄存器区。,四、数组的初始化(赋初值),旧版标准:只允许对外部或静态的数组初始化 新版标准:也允许对auto数组初始化(只能用常量表达式)。 一般形式: int a5=1,2,3,4,5; int b23=1,2,3,4,5,6; 或 int b23=1,2,3,4,5,6; 【演示】设置watch,观看

7、下列数组初值情况: int a23; static b23; int c23=1,2;,四、数组的初始化(赋初值),简略形式: 1、省略第一维数组大小。如: int a =,b3=; 2、省略元素值。如: int x6=1,2,3,4; (x4、x5自动用0补足) int a5=0; int b32=0; (全部元素初始 化为0),四、数组的初始化(赋初值),【例一】以下程序的运行结果是什么? main() int a3=1,2,3,4,5,6,0; printf(“%d,%d,%dn“,a11,a21,a31); ,1 2 3 4 5 0 6 0 0 0 0 0,结果:5, 0, 0,【例二

8、】若int a 3=1,2,3,4,5,6,7,则a数组的第一维大小是多少?,1 2 3 4 5 6 7 0 0,说明:静态/外部数组未初始化,默认初值是0(数值)或空格(字符) auto数组未初始化,初值为某个随机数。,五、数组的引用(使用数组元素),原则:先定义后引用 引用形式: 数组名下标 只能逐个引用数组元素,不能一次引用整个数组。 引用数组元素要注意下标不要出界(编译程序不检查是否“出界”)。 每个数组元素均可按一个简单变量的方式进行处理(如参加运算、赋值等)。,五、数组的引用(使用数组元素),(设已有定义int a36,x,y ,i=0,j=0;) a23=4; /*下标为常量*/

9、 scanf(“%d”, /*下标为一个复杂的整型表达式*/ 错误: a2,3=1,调试时,可将数组名或数组元素名设置为watch进行跟踪.,讨论: 如果下标值小于0或超过数组长度时会出现什么情况?,例: main() int a=1,b5,c=2,i; for (i=0;i=5;i+) bi=i+1; ,运行程序或单步执行观察变量变化情况可以看到,变量c的值因数组越界而被悄悄破坏了(可能产生严重的错误后果!),1,2,3,4,5,6,0,1,2,3,4,5,6,数组常用的循环形式,法一 int i,a100; for(i=0;i100;i+) ai=i;,法二 int i,a100; for

10、(i=0;i=99;i+) ai=i;,C程序中常用的是第一种方法。注意在此法中,循环变量的终值是“小于”而非“等于”数组长度!否则将导致“越界”的发生。,如何使两个数组的值相等:,/*错误编程*/ main() int a4=1,2,3,4,b4; b=a; ,解决方法 法1:逐个元素赋值 b0=a0; b1=a1; b2=a2; b3=a3; 法2:通过循环赋值 int i; for (i=0;i4;i+) bi=ai;,原因: 数组名表示数组的首地址,其值不可改变!,应用示例: 下列程序的功能是显示如下图形,请填空。,1 0 0 0 0 2 1 0 0 0 3 2 1 0 0 4 3 2

11、 1 0 5 4 3 2 1,main() int a55,i,j; clrscr(); for (i=0;i5;i+) for (j=0;j5;j+) if ( 【1】 ) aij=0; else aij=【2】; printf(“%3d“,aij); printf(“n“); ,a55分析: a00 a01 a02 a03 a04 a10 a11 a12 a13 a14 a20 a21 a22 a23 a24 a30 a31 a32 a33 a34 a40 a41 a42 a43 a44,ij,i+1-j,【分析】这类题的元素值排列很有规律,所以一般要从分析行数 i、列数 j与元素值的关系

12、着手。分析下图可知,当 i=j时,元素值随行数 i 增加而增加,随列数 j 增加而减小,这样就很容易得出其元素值与 i,j 的关系是 i+1-j。,六、数组作为函数参数,1、用数组元素作函数实参 P164 此时可把数组元素看作普通变量(单向的值传送)。 特点: 主调函数中的实参数组元素 (带下标) 被调函数中的形参普通变量 调用结果:形参值的变化对实参值无影响 (二者分占不同内存)。,【例一】以下程序的功能是什么?,#include main() int i; float sum=0,x10; float mean(float,int); clrscr(); for(i=0;i10;i+) p

13、rintf(“请输入x%d=“,i); scanf(“%f“, ,float mean(float a, int i) if (a0) printf(“%f的平方根是:%fn“,a,sqrt(a); return sqrt(a); else printf(“x%d=%fn“,i,a); return 0.0; ,在主函数中输入10个数值,并调用功能函数求其正数的算术平方根之和。,什么是单向“值传送”方式?,六、数组作为函数参数,2、用数组名作函数实参 P165 若 int a6; 则数组名a表示数组的起始地址。 所以用数组名,实际上是把实参数组的起始地址“传给”形参数组。 本质:对应的数组元素

14、(不是形参与实参)共享同一段内存单元(所谓“双向的地址传送”)。 特点: 主调函数中的实参数组名(不带下标) 被调函数中的形参数组名或数组定义式 调用结果:两数组同下标者为同值。,【例二】以下程序的运行结果是什么?,f(int b ,int n) int i,t; t=0; for (i=1;i=n;i+) t=t+bi; return t; main() int x,a =1,2,3,4,6; x=f(a,a3); printf(“%dn“,x); ,注意 1、形参数组和实参数组应分别在各自函数中定义; 2、形参数组可不定义大小(用空方格); 3、二者大小可一致或不一致(C编译程序不检查形参

15、), 但注意引用形参时不要超过实参界。,结果:15,什么是双向的“地址传送”方式?,f(int b ,int n) int i,t; t=0; for (i=1;i=n;i+) t=t+bi; return t; main() int x,a =1,2,3,4,6; x=f(a,a3); printf(“%dn“,x); ,实质是共享同一段内存单元,【例三】分析以下程序功能,完善程序。,#include #define NUM 10 int i,s=0; void sum(int b) for (i=0;iNUM;i+) s+=bi; printf(“Sum=%dn“,s); void aver(int b) printf(“Aver=%f“,(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号