C语言程序设计教案
编号:C程序设计 6                                           制订日期:2011-1-25
课程名称
6 数组
授课形式
讲授
授课班级
2010级软件工程
授课时数
    6学时
授课日期
2011.03.20-04.1 56
授课地点
1#512#513
教学目标与要求:
1. 了解什么是数组 
2. 掌握
3.
教学重点、难点:
1.
2.
3.
4. (c程序设计谭浩强pdf百度网盘重点)
教学准备:
1.采用多媒体教学。
2.教学材料
教材:C语言程序设计(第四版)——谭浩强著 清华大学出版社
参考资料:
C++语言程序设计与实践——张思民著 清华大学出版社
3.制作多媒体课件,讲稿。
教学过程与时间分配
备注
授课内容
(补充内容)
  随机函数
1 随机函数
随机函数是数学库函数中描述随机数的一个常用函数。随机数是一种随机产生、事先无法预测的数值。在设计程序时,有时候会需要用到随机数。C++ 在系统头文件 cstdlib中内建了一个随机数产生器――随机函数 rand( ),这是用来产生随机数的函数。
随机函数 rand( )可以产生032767之间的一个伪随机整数。之所以用“伪”字来形容它,是因为产生的随机数依赖于一个特殊的输入值,这个输入值称为“种子”。
有两个用于产生随机数种子的函数:和time( )srand( )函数在系统头文件 cstdlib中定义,由于头文件 cstdlib是系统默认的,因此可以省略。time( ) 函数在系统头文件 ctime中定义,time( )函数的返回值实际上是以秒为计数单位的计算机内部时钟的当前时间。由于每次执行的时候,时间的数值都不相同,因此产生的随机数不会重复。如果事先没有调用srand( )time( )这两个函数,将产生同一序列的随机数。
2、产生随机数
为了在运行程序时,每次都获得不同的随机数,需要rand( )srand( )time( )三个函数结合起来使用。例如:
srand(time(0));
int n = rand();
则每次产生的随机数n都是不重复的。
【补充例1】产生三个每次运行都各不相同的随机数。
源程序如下:
1  #include <stdio.h>
rand( )srand( )需要用到此头文件
2  #include <stdlib.h>
time( )需要用到此头文件
3  #include <time.h>
 
5  void main()
{
7    int a, b, c;
用于产生每次运行程序获得不重复的随机数的种子
8    srand(time(0));
9    a = rand();
产生三个随机数,若没有种子,每次会产生重复的数
10    b = rand();
11    c = rand();
12    printf( "a = %d \t" , a);
13    printf( "b = %d \t" , b);
14    printf( "c = %d \n" , c);
15  }
在本程序中,使用了产生种子的语句,每次运行程序所得到的三个随机数都不是重复的。例如,第一次运行程序所得到的三个随机数为:
a = 26921        b = 28173      c = 574
有种子,产生的随机数不重复
再运行一次程序,其运行结果为:
a = 27087        b = 19285      c = 26911
在程序中,若没有产生种子的语句“srand(time(0)); ”,则每次运行程序所得到的三个随机数都会重复。例如,第一次运行程序所得到的三个随机数为:
a = 41  b = 18467      c = 6334
没有种子,产生的随机数是重复的
再运行一次程序,其运行结果仍是:
a = 41  b = 18467      c = 6334
   
实际编程中,经常需要产生在一个指定的范围内的随机数。为了控制随机数在一个指定的范围内产生,需要用到取模运算符“%”。例如要获得一个0 N-1之间的随机整数,可以使用 rand( ) % N”来产生。
【补充例2】产生三个100以内的随机数。
    源程序如下:
1  #include <stdio.h>
rand( )srand( )需要用到此头文件
2  #include <stdlib.h>
time( )需要用到此头文件
3  #include <time.h>
5  void main()
{
7    int a, b, c;
8    int N = 100;
9    srand(time(0));
10  a = rand() % N +1;
由于产生随机数的范围是0 99,故需要再加1
11    b = rand() % N +1;
12     c = rand() % N +1;
13    printf( "a = %d \t" , a);
14    printf( "b = %d \t" , b);
15    printf( "c = %d \n" , c);
16  }
    程序运行结果为:
a = 76  b = 94  c = 5
6.1.1一维数组
数组是具有相同类型变量的集合。在数组中,各个变量称之为元素。其中,同一数组中的所有元素都有相同的名字,只是下标不同。只有一个下标的数组称之为一维数组,有多个下标的数组称之为多维数组。
1.一维数组的定义
一维数组定义的一般形式为:
数据类型  数组名 [常量表达式];
说明:
(1) 数据类型表示数组元素的类型。
(2) 数组名的命名规则跟变量名一样。
(3) 方括号中的常量表达式是数组的容量,即包含元素的个数。
例如:定义数组
int a[10];
表示定义了一个整型的数组a,含有10个元素(每个元素都是整型)。其说明如图6.1所示。
6.1 数组定义的说明
数组一旦定义,各数组元素名就确定了。数组元素的一般形式为:
数组名[下标]
数组的第一个元素的下标总是从0开始的。对于上面所定义的数组a[10],其元素依次为a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]。
其实,数组名代表的是数组的首地址,下标则是数组元素到数组开始的偏移量。系统为数组在内存分配的是一片连续的存储的单元,如定义了“int a[10];”,则它的10个元素在内存中的排列情况如图6.2所示:
6.2 一维数组元素在内存中的排列情况
2.一维数组的初始化
数组初始化是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
数组初始化赋值的一般形式为:
数据类型  数组名[常量表达式] = {值,值,……,值};
其中在{ }中的各数据值依次为各元素的初值,各值之间用逗号间隔。
例如:
    int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
相当于a[0] = 0; a[1] = 1; ...; a[9] = 9;
数组初始化赋值的几点说明:
(1)可以只给部分元素赋初值。当{ }中数据值的个数少于元素个数时,只给前面部分元素赋值。例如:
    int a[10] = {0, 1, 2, 3, 4};
表示只给a[0]~a[4]这5个元素赋值,而后5个元素将被编译器自动赋0值。如图6.3所示。
6.3 未赋值的元素自动被0填充
(2)只能给元素逐个赋值,不能给数组整体赋值。例如:给十个元素全部赋1值,只能写为:
    int a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
而不能写为:
    int a[10]=1;
(3)如在定义数组时给全部元素赋初值,则在数组定义的说明中,可以不显式的指出数组容量,系统会以给出的数值个数默认为数组容量。
例如:
    int a[5] = {1, 2, 3, 4, 5};
可写为:
    int a[] = {1, 2, 3, 4, 5};
注意,C++ 数组元素以0开头而不是以1开头,经常会有初学者搞错。
例如,声明了数组
int a[5];
这表示数组a[ ]有5个元素:a[0]、a[1]、a[2]、a[3]、a[4]。这个数组中没有a[5]这个元素。
需要指出的是,这时如果在程序中使用了a[5],运行程序时C++ 系统并不会报错。C++ 不会检查访问数组是否越界,系统会把紧接着a[4]后面的存储单元中的值取出来当作a[5],程序能够使用这个值继续运行,并得出结果,尽管这个结果是错误的。如图6.4所示。
6.4 当使用数组中并没有的元素a[5]时,其取值情况
(4)对于分布有规律、能用表达式表示元素的数组,经常采用循环结构来给数组元素进行初始化,先声明一个数组,然后在循环中使用赋值语句逐个初始化数组元素。例如:
 int a[5];
for(i = 0; i < 5; i++)
  {
    a[i] = i + 1;
  }
通过循环,数组下标 i 从 0逐个递增到4(因为当 i=5时,条件i<5为假,不能进入循环体)。
【例6-1】随机产生10个100以内的整数,并出其中的最大数。
    源程序如下:
// 随机产生10100以内的整数,并出其中的最大数。
#include <stdio.h>
#include <time.h>
void main()
{
声明数组a[ ]10个元素
int i, max, a[10];
int N = 100;
循环变量i的取值从09,与数组a[ ]的下标值相同
srand(time(0));   
for(i = 0; i < 10; i++)
每循环一次,数组a[ ]的下标值都会变化
采用循环,产生10100以内的随机整数,为数组赋值,并输出这10个数
{
a[i] = rand() % N +1;
printf("a[%d]=%d \n", i, a[i]);
}
max = a[0];
a[1]a[9]逐个与max比较,较大者就赋值给max,使max总是元素值中的最大数。
for(i = 1; i < 10; i++)
if(a[i] > max) max = a[i];
printf("最大值max = %d \n" , max );
}
 
三.总结强调重要的知识点
熟练掌握数组的赋值与运算
四.课后作业
更新、补充、删     
教学反思
1
2
                                                               
                                                                授课教师:张思民

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。