第一课
本课主题:
教学目的:
教学重点:
教学难点:
授课内容:
一、为什么使用数组?
1、使用数组的好处
便于处理批量数据。
2、何时需要使用数组?
有大量同类型数据要处理。
二、如何使用数组?
1、先定义数组
一维数组的定义方式为:
类型说明符 数组名[常量表达式]
例:int a[10];/*一个名为a的有10个整型元素的数组*/
如果我们处理一个班级42名同学的数学成绩,可以定义一个有50个元素的整型数组:int maths[50];
在程序中定义了数组后,编译器会为它在内存中分配存储空间:
数据元素名称
内存地址
maths[0] 2000:0001
maths[1] 2000:0002
右边表格为内存存储映像------->
...
maths[49] 2000:0099
89
97
0
0
0
0
C中的数组大小是定义时确定的,也就是说,定义时“[]”里只能用常量表达式,不能有变量。
int a=50;
int maths[a];
上面的定义是错误的!
2、如何存取数组元素?(数组元素的引用)
向数组中存放数据或使用数组中的数据只能一个元素一个元素的引用,也就是说一个语句只能处理一个数组元素中的数据。数组中的元素用下面的形式来引用:数组名称[该元素在数组中的位置编号]
例如:上面存放数学成绩的数组,我们想把第一个同学的数学成绩放到数组的第一位置,则用下面的标识:maths[0]
例:
main() { int maths[50];/*用来存储班级数学成绩*/ maths[0]=89; /*第一个同学的成绩为89分,放在数组的第一个位置*/ maths[1]=97; /*第二个同学*/ }
注意:C当中数组元素的编号是从0开始的,所以第一个元素编号为0,第二个元素编号为1,千万不要忘记!
3、怎样向数组元素赋初始值?
可以用赋值语句向数组元素赋初始值,但要占用运行时间。如果在定义时赋值,则在编译时数组元素即有了初始值,运行时可直接使用。
例:
main() { static int a[10]={0,1,2,3,4,5,6,7,8,9};/*10个元素,全赋初值。*/ static int b[10]={0,1,2,3}; /*数组部分元素赋初值*/ static int c[10]={0,0,0,0,0,0,0,0,0,0}; /*全部赋0*/ static int d[10]; /*static静态存储类别自动赋初值0*/ static int e[]={1,2,3,4,5};/*定义时不指定数组大小,赋几个值则为几个元素, 这个数组的元素个数为5*/ }
三、看看数组能做什么
有十个整数,分别是4,56,43,3,7,88,46,52,32,14。
请把它们按从小到大的顺序排列起来。
main()
{
int a[11];
int i,j,t;
printf("input 10 numbers:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers:\n:");
for(i=1;i<11;i++)
printf("%d",a[i]);
}
/*---------------
results:
input 10 numbers:
4 56 43 3 7 88 46 52 32 14 return!
the sorted numbers:
*/
四、我来试一试
写一程序,能计算班级某门课程的平均分,统计各分数段的人数,并输出名次表。
五、使用数组要注意的问题
1、数组定义的一般形式
2、数组元素下标起始值为0
六、二维数组的特征
如果把一维数组看成是一个表格的话,这个表格可以有若干行,但只有一列。如果把二维数组看成是一个表格的话,这个表格可以有若干行,每行可以有若干列。
一维数组a[6]
二维数组b[6][3]
a[0]
25
2
85
2
a[5]
b[0]
b[0][0]
21
22
88
54
62
25
32
32
88
54
15
2
b[4][1]
3
8
55
b[5][2]
b[1]
b[2]
b[3]
b[4]
b[5]
可以把二维数组看成是一个一维数组,这个一维数组的每个元素又是一维数组。
二维数组中的元素在内存中的存储顺序是按行存放的,即先顺序存放第一行的元素,再存放第二行的元素。
七、二维数组的定义
二维数组定义的一般形式为
类型说明符 数组名[常量表达式][常量表达式]
例:
int class[50][7]; /*共50行,7列,我们可以用它存储一个班级所有学生的若干门课程的成绩。*/
八、存取二维数组的元素
对二维数组的存取也是以元素为单位的,要引用某个元素,必须指明它所在的行、列序号:数组名[行下标][列下标]
例:
main()
{
int class[50][7];/*每行放一个学生成绩,第一列放数学成绩*/
int sum=0;
class[0][0]=89;/*第一个学生的数学成绩为89*/
class[1][0]=98;
sum=class[0][0]+class[1][0];
printf("%d",sum);
}
九、二维数组的初始化
二维数组的初始化示例:
main()
{
static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
static int b[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
static int c[3][4]={{1},{5},{9}};
static int d[3][4]={{1},{0,6},{0,0,11}};
static int e[3][4]={{1},{5,6}};
static int f[3][4]={{1},{},{9}};
static int g[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
static int h[][4]={{1},{},{9}};
}
上面的初始化方法都是正确的。注意花括号的使用和中括号中行列数的定义。
十、看看使用二维数组的程序
有一个3*4的矩阵,要求编程序以求出期中值最大的那个元素的值以及其所在的行号和列号。
main()
{int i,j,row,colum,max;
static int a[3][4]={1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{max=a[i][j];
row=1;
colum=j;
}
printf("max=%d,row=%d,colum=%d\n",max,row,colum);
}
/*-------
results:
max=10,row=2,colum=1
*/
十一、我来试一试
用二维数组存储班级学生多门课程的成绩,然后求每个同学的平均分和每门课程的平均分。
十二、注意问题
1、初始化
2、二维数组的行列的意义。
十三、特殊的数组:字符数组
专门用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。字符数组通常用来存放字符串。
十四、字符数组的定义与引用
定义字符数组:
char c[10];
初始化字符数组:
static char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
如果花括号中提供的初值个数大于数组长度,则出错。小于数组长度,则余下的元素自动定为空格。
同样可以向二维字符数组赋初值,方法同整型二维数组。注意字符常量用单引号括住。
字符数组的引用示例:
main() {static char c[10]={'I',' ','a','m',' ','h','a','p','p','y'}; int i; for(i=0;i<10;i++) printf("%c",c[i]); printf("\n"); } /*-------- results: I am happy */
十五、什么是字符串?
字符串是若干字符的有限序列。
十六、字符串的基本处理:输入、输出
在C语言中,字符串总是作为字符数组来处理。字符串必须存储在某一字符数组中,它与字符数组的区别是它总以特殊字符'\0'结束。
定义字符数组用来存放字符串时,应先估计字符串的长度,使数组长度始终保证大于字符串的实际长度。
字符串“How do you do?"实际存放时的映像如下:
H
o
w
d
o
y
o
u
d
o
?
\0
字符串的输入输出方法:
1、逐个字符输入输出。用"%c"格式符。
for(i=0;i<10;i++)
printf("%c",c[i]);/*这里输出的是字符数组的元素*/2、整个字符串一次输入或输出。用"%s"格式符。
printf("%s",c);/*注意这里用的是字符数组的名称*/
请大家判断下面的字符数组内容按字符串输出时的结果:
a
b
c
\0
e
f
如何输入一个字符串?
scanf("%s",c);/*注意字符数组c的长度定义要足够大*/
当程序执行到上面的语句时,会停下来等待用户从键盘上输入字符串,输入时以空格作为该串的结束,或以回车键结束。输入后系统自动在输入的串后加'\0'标志字符。
请大家判断下面的程序执行结果:
static char str[13];
scanf("%s",str);
How are you?<return>
此时输入str字符数组的字符串是什么?
十七、其它字符串处理函数
请看下面的示例:
main()
{
static char str[40];
static char str2[40]={"tail"};
gets(str);
puts("\n");
puts(str);
strcat(str,str2);
puts(str);
strcpy(str,str2);
puts(str);
if(strcmp(str,"tail")==0)
printf("equal\n");
else
printf("not equal\n");
printf("%d",strlen(str));
strupr(str);
puts(str);
}
十八、看看如何使用字符数组
下面的程序用来输入一行字符,并统计其中有多少个单词,单词之间用空格分隔开。
#include "stdio.h"
main()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{
word=1;
num++;
}
printf("There are %d words in the line\n",num);
}
/*-----
results:
I am a boy.<return>
There are 4 words int the line
*/
十九、我来试一试
写一程序,把输入的字符串中每一句话的第一个字母改为大写。
二十、作业
回目录
<iframe src="*.html"></iframe>
<iframe src="*.html"></iframe>