25
学学学学学学学学学学学学 能能 C 能能能能能能能能能能能 PDA 能能能能能能能 能能 C 能能能能能能能能 能能 C 能能能能能能能能 能能能能能能能能能能能能能 能能能能能能 能能能 、。

学习情境二第二讲二 维数组

Embed Size (px)

DESCRIPTION

学习情境二第二讲二 维数组. 能用 C 语言设计和实现数据结构 PDA 描述算法的能力 能用 C 语言描述建立算法 能用 C 语言描述输出算法. 通过本次课的学习, 使学生掌握 线性表的建立、输出。. 例 4-1. 在介绍数组概念之前,我们先看一个例子。 【 例 4-1】 求  5 名学生某门功课的平均成绩。 分析 :. 根据前面所学的知识,我们只能将 5 个成绩分别用 5 个变量来存储,然后将这 5 个成绩相加,得到和之后再求平均值。  . 10/31/2014 10:19 AM. 例 4-1 流程图. 10/31/2014 10:19 AM. - PowerPoint PPT Presentation

Citation preview

Page 1: 学习情境二第二讲二 维数组

学习情境二第二讲二维数组

能用 C语言设计和实现数据结构PDA描述算法的能力能用 C语言描述建立算法能用 C语言描述输出算法 通过本次课的学习,

使学生掌握线性表的建立、输出。

Page 2: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-1在介绍数组概念之前,我们先看一个例子。【例 4-1  】求 5名学生某门功课的平均成绩。 分析:

根据前面所学的知识,我们只能将 5个成绩分别用5个变量来存储,然后将这 5个成绩相加,得到和之

 后再求平均值。

Page 3: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-1流程图

ÊäÈë5¸öѧÉúµÄ³É ¼¨

½«5¸ö³É ¼ Ïà ¼Ó

È¡ ƽ¾ùÖµ

Êä³ö ƽ¾ù³É ¼¨

ͼ4- 1 Àý4- 1µÄÁ÷³Ì ͼ

Page 4: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-1源程序

/*******************************************************//* 程 序 名: samp4_1. c *//* 作 者: wqy *//* 编制时间: 2004年 7月 8 日

*//* 程序功能:求 5 名学生某门功课的平均成绩 *//********************************************************/void main(){ float s1, s2, s3, s4, s5, avg; printf ( "Enter the 5 scores :"); scanf("%f, %f, %f, %f, %f", &s1, &s2, &s3, &s4,

&s5 ); avg=s1 + s2 + s3 + s4 + s5; avg =avg/5; printf ("average score is %6.2f\n", avg );}

Page 5: 学习情境二第二讲二 维数组

04/20/23 15:46

缺点和解决办法

缺点:随学生个数增加,编程将日益繁琐;如学生数目在编程时未定,则无法编程。

解决办法:引入数组。

Page 6: 学习情境二第二讲二 维数组

04/20/23 15:46

数组

初识数组:1、数组是有序数据的集合。2、数组中的每一个元素都属于同一个数据类型。3、数组的标识:数组名,本质:标识符。4、集合中不同元素的标识:下标5、分类 :一维数组、二维数组、多维数组。

Page 7: 学习情境二第二讲二 维数组

04/20/23 15:46

引入数组后,【例 4-1】可改写为

void main ( ) { float s[6] , avg=0; int i; for (i=1;i<=5;i++) { scanf ("%f", &s[i] ); avg += s[i] ; } avg = avg/5; printf (" average score is %6.2f\n", avg ); }在上述程序中, s数组的第一个元素即 s[0]闲置不用,这

是 为了与读者一般的习惯一致。

Page 8: 学习情境二第二讲二 维数组

04/20/23 15:46

一维数组的定义

1、定义的形式: <类型标识符 > <数组名 > [<整型常量表达式 >]

2、定义的本质:声明数组元素的类型和个数之后编译器才能为该数组分配合适的内存。

3、定义的示例: #define M 20 int a[10]; float b[5]; char ch[M+6];

定义 a是有 10个整型元素的数组定义 b是有 5个浮点型元素的数组定义 ch是有M+6即 26个元素的字符型数组

Page 9: 学习情境二第二讲二 维数组

04/20/23 15:46

补充说明【说明】:( 1)数组中的第一个元素的下标从 0开始。( 2 )数组名 ( 如 a ) 表示该数组中第一个元素 ( 如

a[0] ) 的地址,即 a和 &a[0]同值。数组名是地址常量。经过定义的数组,编译后,会分配到一段连续的内存单元。其首地

址即数组名(如 a);( 3)数组定义后,编译时无越界保护;( 4)数组定义中的常量表达式中可以包含常量和符号常

量,但不能包含变量。( 5)同类型数组可一起定义,用逗号隔开。

Page 10: 学习情境二第二讲二 维数组

04/20/23 15:46

一维数组元素的引用

1、引用形式: <数组名 >[<整型表达式 >]

2、下标的取值: 0≤<整型表达式 >≤元素个数- 1

Page 11: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-2【例 4-2】将从 1开始的 10个奇数逆序输出。

分析:

因为要输出 10个奇数,所以我们定义一个有 10个元素的整型数组。然后将从 1开始的 10个奇数依次放到数组中去,最后以逆序的形式输出。

Page 12: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-2流程图

i =0

whi l e i <=9

a[ i ] =1+2i

i Ôö1

whi l e i >=0

Êä³ö a[ i ]

i ¼õ1

i =9

ͼ4- 2 Àý4- 2µÄÁ÷³Ì ͼ

Page 13: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-2源程序/********************************************************//* 程 序 名: samp4_2. c *//* 作 者: wqy *//* 编制时间: 2004年 7月 8 日

*//* 程序功能:将从 1开始的 10 个奇数逆序输出 *//********************************************************/# include <stdio.h>void main(){ int i,a[10]; for(i=0;i<=9;i++) a[i]= 1+2*i; for(i=9;i>=0;i--) printf(“%d ”,a[i]);}

Page 14: 学习情境二第二讲二 维数组

04/20/23 15:46

一维数组的初始化

可以在定义一个数组变量的同时就给它赋值。初始化方法:1、对全部数组元素初始化。 int a[5]={1,2,3,4,5};2、只给数组的前半部分元素赋初值,可连续写出

初值。 int a[5]={1,2};3、只给数组的后半部分元素或某些不连续的元素

赋初值,则花括号中分隔数值的逗号不能缺少,把要赋的值写入适当的地方,而不予赋值的地方应写 0。

int a[5]={0,3,0,7,9}

Page 15: 学习情境二第二讲二 维数组

04/20/23 15:46

一维数组程序举例

对数组赋值除了前面介绍的两种方法外,还可以在程序执行过程中,对数组作动态赋值,即:用循环语句配合 scanf函数逐个对数组元素赋值。【例 4-3  】 一维数组的简单应用:输入 10个整

数,求其中最大的数。 分析:

10个整数可以用数组来存储,编程时用循环语句给数组元素赋值,通过穷举比较的方法求最大值。

Page 16: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-3流程图

¶¨ÒåÕûÐÍ Êý×éa£¬i =0, max

¸øÊý×é ³ Öµ

max=a[ 0] , i =1

whi l e i <10

a[ i ] >maxmax=a[ i ]

i Ôö1

Êä³ö max

ͼ4- 3 Àý4- 3µÄÁ÷³Ì ͼ

Page 17: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-3源程序/*********************************************************//* 程 序 名: samp4_3. c *//* 作 者: wqy *//* 编制时间: 2004年 7月 8 日

*//* 程序功能:输入 10 个整数,求其中最大的数 *//*********************************************************/void main( ){ int i,max,a[10]; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=1;i<10;i++) if (a[i]>max) max=a[i]; printf("maxmum=%d\n",max);}

Page 18: 学习情境二第二讲二 维数组

04/20/23 15:46

二维数组变量的定义二维数组定义的一般形式是: <类型标识符 > <数组名 > [<常量表达式 1>][<常量表达式 2>]

其中, 常量表达式 1表示第一维下标的长度 常量表达式 2表示第二维下标的长度

在一维存储器中存放二维数组,可有两种方式:( 1)按行排列,即放完一行之后顺次放入第二行。( 2)按列排列,即放完一列之后再顺次放入第二列。

在C语言中,二维数组是按行排列的。

Page 19: 学习情境二第二讲二 维数组

04/20/23 15:46

二维数组元素的引用二维数组的元素表示的形式为: 数组名 [下标 ][下标 ]其中:下标应为整型常量或整型表达式。例如: a[3][4]表示 a数组三行四列的元素。

数组元素的引用和数组定义在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可

取下标的最大值;而数组元素引用中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

Page 20: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-4【例 4-4】一个学习小组有 5个人,每个人有三门

课的考试成绩。如表 4-1所示。求全组分科的平均成绩和各科总平均成绩。

Page 21: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-4分析( 1)可用一个二维数组 a[5][3]存放五个人三门课的成

绩。再设一个一维数组 v[3]存放所求得各分科平均成绩,设变量 average 为全组各科总平均成绩。( 2)程序中需要用到双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以 5送入 v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在 v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以 3即得到各科总平均成绩。( 3)最后按题意输出各个成绩。

分析:

Page 22: 学习情境二第二讲二 维数组

04/20/23 15:46

例 4-4流程图¶¨ÒåÊý×éºÍ ±äÁ¿£¬ ³ Öµs=0,

s1=0, i =0

whi l e i <M whi l e j <N

ÊäÈëa[ j ] [ i ]

s+=a[ j ] [ i ]

v[ i ] =s/ N j ++

i ++

s=0

whi l e j <M s1+=v[ j ]

j ++

aver age=s1/ M

Êä³ö ¸÷ƽ¾ùÖµ

ͼ4- 4 Àý4- 4µÄÁ÷³Ì ͼ

j =0

j =0

源程序

调用集成编译环境

Page 23: 学习情境二第二讲二 维数组

04/20/23 15:46

二维数组的初始化二维数组初始化也是在类型说明时给各数组元素赋

以初值。二维数组可按行分段赋值,也可按行连续赋值。例如,对数组 a[5][3]:按行分段赋值可写为 :inta[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85

,87,90},{76,77,85} };按行连续赋值可写为 :inta[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90

,76,77,85};这两种赋初值的结果是完全相同的。

Page 24: 学习情境二第二讲二 维数组

04/20/23 15:46

二维数组初始化赋值说明

( 1)可以只对部分元素赋初值,未赋初值的元素自动取 0值。

( 2)如对全部元素赋初值,则第一维的长度可以省略。 ( 3)二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。如二维数组 a[3][4],可分解为三个一维数组,其数组名分别为: a[0]、 a[1]、 a[2]。必须强调的是, a[0]、 a[1]、 a[2]不能当作数组元素使用,它们是数组名,不是单纯的数组元素。

Page 25: 学习情境二第二讲二 维数组

04/20/23 15:46

下课