数组教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组
教学时数:2学时
教学目的与要求:通过本节课的学习,要求学生了解数组的基本概念;熟练掌握一维数组的定义,数组元素的使用,数组元素的初始化
以及一维数组的应用。
教学重点:数组的概念及应用。
教学难点:数组元素的具体使用方法。
1. 数组的概念
首先提问一个同学说出编写下面程序的思路:让学生从键盘上输入五个学生的成绩,算出最高成绩,并显示每位学生的成绩与最高成绩的差值。
把成绩改为有一百个成绩,如何处理?启发学生是不是可以用一个统一的名字表示成绩,然后用下标来区分一百个具体的成绩,从而引入数组的概念:数组是有序数据的集合。
表示一批有内在联系且有相同属性的数据整体。
要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标。
数组名和下标唯一的标识数组中的一个元素。
引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确的反映了数据间的联系。
2.
1) 定义:类型说明符数组名[常量表达式]
例如:int chengji[100]; 表示数组名为chengji,此数组为整型,有100个元素。
说明:①数组名的命名规则和变量名相同,遵循标识符命名规则。
②用方括号括起来的常量表达式表示下标值。
③常量表达式的值表示元素的个数,即数组长度。
在例子中chengji数组有100个元素,但是下标是从0开始,这100个元素分别是:chengji[0],chengji[1],chengji[2]…chengji[99]。
注意最后一个元素是chengji[99]而不是chengji[100]。
④常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。
也就是说,C++不允许对数组的大小作动态定义。
例子:int n;
cin>>n;
int a[n];
这样定义数组是不行的。
可以改为:const int n=5;
int a[n];
数组在内存中的表示:(与一般变量在内存中的表示方法作比较)
一般变量在内存中要用两项信息来描述:内存中的一个地址及变量的类型,后者指出该变量需要在内存中占用多少个字节。
数组在内存中采用与普通变量一样的方式来表示,但情况要复杂一些。
数组的各个下标变量的位置在内存中是相邻的。
例如数组:int a[6];
数组a定义后计算机会预留6个int 类型的变量所需的足够多的内存,计算机会在内存中一个接一个的存储这些变量,但是,计算机只记住变量a[0]的地址,不会记住其他下标变量的地址,程序需要其他下标变量的地址时,计算机根据a[0]的地址来推算其他下标变量的地址。
如计算a[3]的地址,计算机首先取得a[0]的地址,然后,以此地址为基础,加上容纳3个int类型变量所需的字节数,就得到了a[3]的地址。
2) 引用一维数组的元素
数组必须先定义,然后才能使用。
只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值;
数组元素的表示形式:数组名[下标]
常与循环语句结合来进行引用。
实例:#include <iostream>
using namespace std;
int main()
{
int i, a[10];
for ( i=0;i<=9;i++)
a[i]=i;
for ( i=9;i>=0;i- -)
cout<<a[i]<<””;
cout << endl;
system(“pause”);
return 0;
}
运行结果:9 8 7 6 5 4 3 2 1 0
3) 一维数组的初始化
对数组元素的初始化可以用以下方法实现:
①在定义数组时分别对数组元素赋予初值。
例如: int a[3]={3,6,1};
将数组元素的初值依次放在一对花括号内。
②可以只给一部分元素赋值。
例如: int a[5]={3,5,2};
定义a数组有5个元素,但花括号内只提供3个初值,说明只给前面3个元素赋了初值,后2个元素值默认为0。
③如果想使一个数组中全部元素值为1,可以写成
int a[5]={1,1,1,1,1};
不能写成 int a[5]={1*5};也就是说不能给数组整体赋初值。
④在对全部数组元素赋初值时,可以不指定数组长度。
例如: int a[5]={1,2,3,4,5};
可以写成: int a[]={1,2,3,4,5};
若被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。
4) 一维数组应用
例:编写程序,用起泡法对10个数排序(按由小到大顺序)
思路:将相邻两个数比较,将小的调到前头。
若有6个数(8,9,5,4,
2,0),第一次比较第一和第二个数(8和9)的大小,如果第一个数大于第二个数,就把两个数位置交换,第二次将第二和第三个数(9和5)进行比较和交换……,如此共进行5次,得到8,5,4,2,0,9的顺序。
可以看到:最大的数9已“沉底”,成为最下面一个数,而小的数“上升”。
最小的数0已向上“浮起”一个位置。
经第一趟(共5次)后,已得到最大的数(在最下面)。
然后进行第二趟比较,对余下的前面5个数按上面的方法进行比较,得到次大的数8(在五个数中最下面的位置)。
再进行第三趟比较,对余下的前面4个数进行比较……,如此进行下去。
可以看出,对六个数要比较(和交换)5趟,才能使6个数按从小到大的顺序排列好。
在第1趟中要对两个数之间的比较(和交换)进行5次,在第2趟中为4次……
第5趟为1次。
详细过程如下面图示:
8 8 8 8 8
5 5 5 5
5 4 4 4
4 4 2 2
2 2 2 0
0 0 0 0 9
第1次第2次第3次第4次第5次结果
第一趟
5 5 5 5
4 4 4
4 2 2
2 2 0
0 0 0 8 第1次第2次第3次第4次结果
第二趟
4 4 4
2 2
2 0
0 0 5
第1次第2次第3次结果
第三趟
2 2
0 4
第1次第2次结果
第四趟
2
第1次结果
第五趟
可以推知,如果有n个数,则要进行n-1趟比较(和交换)。
在第1趟中要进行n-1次两两比较,在第j趟中要进行n-j次两两比较。
根据以上思路,我们给出十个数的排序算法:
#include<iostream>
using namespace std;
int main()
{
int a[10];
int i,j,t;
cout<<"输入十个数据:"<<endl;
for(i=0;i<10;i++) cin>>a[i]; //输入a[0]~a[9]
cout<<endl;
for(j=0;j<9;j++) //共进行9趟比较
for (i=0;i<9-j;i++) /在每趟中要进行(10-j)次两两比较if(a[i]>a[i+1]) //如果前面的数大于后面的数
{t=a[i];a[i]=a[i+1];a[i+1]=t;} //交换两个数的位置,使小数上浮cout<<"排序后的数据:"<<endl;
for(i=0;i<10;i++) cout<<a[i]<<" "; //输出10个数
cout<<endl;
system("pause");
return 0;
}
3.课后练习:
用数组来求Fibonacci数列问题,要求输出前30项。
以前用别的方法已经编写过这个程序,今天要求用数组来编写,比较数组方法和以前编程方法编写的程序的区别。