350 likes | 538 Views
云南民族大学 017 胡顺仿. 第 6 章数组 一维数组. 教材 佘玉梅等著,科学出版社, C 语言程序设计 参考书 谭浩强著,清华大学出版社, C 语言程序设计 ( 第 6 版 ) 二级 C 语言考试相关书籍. 内容概述. 数组概述 一维数组 1. 数组的定义 2. 数组初始化 3. 数组引用 4. 数组输入与输出 5. 一维数组程序举例 课堂练习. 教学目标. 掌握一维数组的定义与引用 了解数组在计算机中的存储结构和输入与输出方法 掌握一维数组的应用 , 包括 : 查找、排序和插入等。. 知识点回顾. 第 1 章 C 语言概述
E N D
云南民族大学017 胡顺仿 • 第 6章数组 • 一维数组
教材 • 佘玉梅等著,科学出版社,C语言程序设计 参考书 • 谭浩强著,清华大学出版社,C语言程序设计(第6版) • 二级C语言考试相关书籍
内容概述 • 数组概述 • 一维数组 1.数组的定义 2.数组初始化 3.数组引用 4.数组输入与输出 5.一维数组程序举例 • 课堂练习
教学目标 • 掌握一维数组的定义与引用 • 了解数组在计算机中的存储结构和输入与输出方法 • 掌握一维数组的应用,包括:查找、排序和插入等。
知识点回顾 第1章 C语言概述 第2章 C语言程序设计入门 第3章 结构化程序 第4章 程序控制——选择 第5章 程序控制——循环 • 第6章 数组
低地址 程序区 知识点回顾 指令 冯氏原理:人们预先编好程序,利用输入设备把程序输入内存,计算机在控制器控制下,从内存中逐条取出程序交运算器执行。把结果回送入内存、或由输出设备输出。 • 执行步骤:取指令、分析指令、执行指令、程序计数器加1 (例:指令070740H的执行过程) 数据区 高地址 数据
内存储器 程序计数器PC(0100H) 控制器 指令寄存器 … … 操作码 地址码 程序区 译码器 …… 操作控制线路 … 数据区 …… 累加器 …… 算术、逻辑运算部件 运算器 预备知识 自动加1 程序计数器PC (0101H) 07 0740
低地址 知识点回顾 指令 • 变量 • 名称 • 内存地址 • 值 int a; float score=80.5; 80.5 a=5; score 4字节 数据 a 2字节 5
低地址 知识点回顾 指令 • 程序控制——选择 if (score>=60) printf(“通过考试\n”); else printf(“没有通过考试\n”); 80.5 score 4字节 数据 a 2字节 5
低地址 知识点回顾 指令 • 程序控制——循环 #define N 50 float score,sum=0;aver=0; for(n=1;n<=N;i++) { scanf("%f",&score); sum=sum+score; } aver=sum/N; 0 aver 0 sum score 数据
问题 • 在计算机中存储5个学生分数,便于后续处理 • 定义5个变量? 如:score1、 score2、 score3、 score4、 score5 • 存储500个学生分数 • 定义500个变量? • 问题分析 • 500个学生分数数据类型相同,可以按一定顺序存储 • 数组优点 • 便于循环处理 • 提高效率,便于书写、检查、修改(海量数据效果更明显)
第六章 数组 6.1 概述 • 数组是一组具有相同类型的有序变量的集合。 • 数组可用于存储成组的有序数据,这些按序排列的同类数据元素的集合称为数组。 • 数组中的每一个元素都属于同一个数据类型。
6.1 概述 根据数组的定义,必须明确以下几点: (1)数组的命名与简单变量的命名规则相同。 (2)数组中的元素是有序排列的。 (3)数组中的每个元素必须是相同的数据类型。 (4)数组的元素个数是有限的,数学中的无限数组不能表示。 (5)数组的元素在内存中存储时连续的。
6.1 概述 • 一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。 • 按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 • 使用不同数据类型的数组来存储不同类型的数据。 例子: float score[60]; /*浮点数数组*/ char name[30]; /*字符数组*/ int states[6]; /*整数数组*/
6.2 一维数组 6.2.1一维数组的定义: 类型说明符 数组名 [常量表达式]; 例如: int a[6]; 它表示定义了一个数组,数组名为a,数组有6个元素,即数组长度为6。 共包含a[0], a[1], a[2], a[3], a[4], sa[5] 这6个元素。
6.2.1一维数组定义 类型说明符 数组名 [常量表达式]; 类型说明符:是任一种基本数据类型或构造数据类型。 可以是int、char、float、double等。 数组名:是用户定义的数组标识符。数组的命名规则和变量的命名规则相同,书写规则要符合标识符的命名规则。
6.2.1一维数组定义 类型说明符 数组名 [常量表达式]; 常量表达式:表示数据元素的个数,也称为数组的长度。元素个数的下标从0开始。 常量表达式中可以包含常量和符号常量,不能包含变量。也就是说不能动态声明数组的长度。 int n = 6; int states[n]; 使用下面的方式是正确的: #define MAX 6 int states[MAX]; X错误
6.2.2一维数组初始化 数组初始化赋值是指在数组定义时给数组元素赋初值。 • 数组初始化赋值时可以在一对大括号中为数组元素赋初值。 • 初始化赋值的一般形式为: 类型说明符 数组名[常量表达式]={值,值……值}; 在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。
6.2.2一维数组初始化 例如:int a[5]={0,1,2,3,4}; 也可以用赋值语句对数组的每一个元素单独赋值。 例如: int a[5]; a[0]=0; a[1]=1; a[2]=2; a[3]=3; a[4]=4;
对数组的初始化赋值还有以下几点规定: (1)可以只给部分元素赋初值。 • 当{ }中值的个数少于元素个数时,只给前面部分元素赋值。 例如: int a[5]={0,1,2}; 表示只给a[0]~a[2] 3个元素赋值。 (2)只能给元素逐个赋值,不能给数组整体赋值。 例如给5个元素全部赋1值,只能写为: int a[5]={1,1,1,1,1}; 而不能写为: int a[5]=1;
对数组的初始化赋值还有以下几点规定: 6.2.2一维数组初始化 (3)给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。 例如: int a[5]={1,2,3,4,5}; 可写为: int a[]={1,2,3,4,5};
6.2.3 一维数组引用 • 数组必须先定义,才能使用。 • C语言规定只能逐个引用数组元素而不能一次引用整个数组。 • 用数组名和下标来唯一确定并访问数组中的元素。 数组元素表示形式为: 数组名[下标] • 下标可以是整型常量或整型表达式。 • 定义一个长度为n的一维数组,那么下标的范围是0到n-1。 • 对数组每个元素的使用与普通变量无异
6.2.3 一维数组引用 • 下标是整型常量 int b[5]; b[0]=2; 2 b[1]=1; 1 b[2]=b[0]+2; 4 b[3]= b[1] +b[0] ; 3
6.2.3 一维数组引用 • 下标是整型表达式 int b[5],i=2,j=0 b[j]=2; 2 b[j+1]=1; 1 b[i]=b[j]+2; 4 b[2*i]= b[1] +b[0]; 3
6.2.4 一维数组输入与输出 只能逐个对数组元素进行操作(字符数组例外) int a[10],i; 输入方法 • 输入下标为i的元素 scanf(“%d”,&a[i]); • 输入整个数组 for(i=0,i<10,i++) scanf(“%d”,&a[i]); 输出方法 • 输出下标为i的元素 printf(“%d”,a[i]); • 输处整个数组 for(i=0,i<10,i++) printf(“%d”,a[i]);
6.2.4 一维数组输入与输出 例6.1 如下程序使a[0]到a[4]的值为0到4,然后按逆序输出。 #include <stdio.h> void main(void) { int i; int a[5]; for (i=0;i<=4;i++){ a[i]=i;} for(i=4;i>=0;i--){ printf("%d",a[i]);} } 运行结果如下 : 4 3 2 1 0
6.2.5 一维数组的程序举例 例6.2找出数组中最大/小的元素,并输出。 分析程序运行 #include <stdio.h> void main( ) { int i,max,min; int a[5]={9,20,8,6,-5}; max=min=a[0]; for(i=1;i<5;i++) {if(a[i]>max) max=a[i]; if(a[i]<min) min=a[i]; } printf(“最大值是:%d,最小值是:%d ",max,min); } max=min=a[0]; max=min=9; i=1 a[i]=20 a[i]>max 成 立 max=20 a[i]<min 不成立 i=2 a[i]=8 a[i]>max 不成立 a[i]<min 成 立 min=8 i=3 a[i]=6 a[i]>max 不成立 a[i]<min 成 立 min=6 i=4 a[i]=-5 a[i]>max 不成立 a[i]<min 成 立 min=-5 i=5 循环结束 max=20, min=-5
在100个数中进行查找 6.2.5 一维数组的程序举例 例6.2找出数组中最大/小的元素,并输出。 #include <stdio.h> void main( ) int i,max,min; int a[5]={9,20,8,6,-5}; max=min=a[0]; for(i=1;i<5;i++) {if(a[i]>max) max=a[i]; if(a[i]<min) min=a[i]; } printf(“最大值是:%d,最小值是:%d ",max,min); } int a[100]={9,20,8,6,-5·······}; 或者int a[100]; for(i=0;i<100;i++) scanf(“%d”,&a[i]); for(i=0;i<100;i++)
6.2.5 一维数组的程序举例 例6.3一维数组排序。(1) 程序分析:以5个数字降序排序为例,从数据排序后的结果看,第1个数比后面4个都大,第2个比后面3个都大,以此类推。 所以,可以让第1个数和后面4个数逐个比较,若比后面的数要小,则两者交换。让第2个数和后面3个数逐个比较,若比后面的数要小,则两者交换 …… #include "stdio.h" void main() { int i,j,t,a[5]; printf(“请输入5个数:\n"); for(i=0;i<5;i++) scanf("%d",& a[i]); printf("\n");
i=0 j=1 j=4 i=0 j=2 j=3 i=0 6.2.5 一维数组的程序举例 程序分析 例6.3一维数组排序。(2) 若输入的依次是: 3 9 -2 100 14 for(i=0;i<4;i++)/*排序*/ {for(j=i+1;j<5;j++) if(a[i]<a[j]) {t= a[i]; a[i]=a[j]; a[j]=t; } } printf(“排序后数组是: \n"); for(i=0;i<5;i++) printf("%5d\n",a[i]); } a[i]<a[j] 成立 两者交换 9 3 -2 100 14 a[i]<a[j] 成立 两者交换 a[i]<a[j] 不成立 100 3 -2 9 14 a[i]<a[j] 不成立
6.2.5 一维数组的程序举例 实验预习: 1. 其余排序方法排序方法 以上程序是交换排序,每趟次比较交换只能确定一个数,效率低。常见的排序方法还有:选择排序、冒泡排序、快速排序、堆排序 等。 2.在已经排好序的数组中插入一个数,要求按原来的规律将它插入数组中 。 3.在已排序好的数组中用折半查找查找某1个数。
主要内容 • 数组概述 • 一维数组 1.数组的定义 2.数组初始化 3.数组引用 4.数组输入与输出 5.一维数组程序举例 • 课堂练习
课堂练习 一.判断 1、数组中的元素可以属于不同的数据类型。 2、数组的元素个数是有限的。 3、数组的元素在内存中存储时连续的。 4、int a[5]={0,1,2}表示分别给a[0]~a[2] 3个元素赋值为0,1,3。 5、如给全部元素赋初值,则在数组说明中可以不给出数组元素的个数。 6、数组不必先定义,就能使用。 7、引用数组,实际上是引用它的数组元素。 8、数组定义 int a[10]; 也可以写成 int a(10); 9、数组定义 int a[10]; 它的第10个元素为a[10]。 10.语句int n=6;int s[n]; 定义了一个数组s。 答案:NYYYY NNNNN
课堂练习 二.单项选择题: 1、一维数组下标的最小值是( )。 A、0 B、1 C、2 D、3 2、在执行语句: int x=1;int a[2][3]={2,4,6,8,10,12};后,printf("%d", a[x][1]);的值是( )。 A、2 B、6 C、8 D、10 3、若有说明:int d[3][4];则对d数组元素的正确引用是( )。 A、d[2][4] B、d[1,3] C、d[2][0] D、d(2)(1) 4、若有说明:int a[3][4]={1};则下面正确的叙述是( )。 A、只有元素a[0][0]可得到初值1 B、此说明语句不正确 C、数组a中各元素都可得到初值1 D、数组a中每个元素均可得到初值,元素e[0][0]得到初值1,其它元素得到初值0 答案:ADCD
谢谢! 请提出宝贵意见