《第七章数组.ppt》由会员分享,可在线阅读,更多相关《第七章数组.ppt(41页珍藏版)》请在优知文库上搜索。
1、第七章 数组v一维数组的定义及引用v二维数组的定义及引用v字符数组构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定一维数组的定义v定义方式:数据类型 数组名常量表达式;合法标识符表示元素个数下标从0开始 :数组运算符单目运算符优先级(1)左结合不能用()7.1 一维数组a00145a1a2a3a4a523a数组名表示内存首地址,是地址常量编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)下标一定从0开始例 int a6内存表示如下:例 int a10;printf(“%d”,a);()必须 for(j=0;j10;j+)printf(
2、“%dt”,aj);()一维数组的引用v数组元素表示形式:数组名下标其中:下标可以是常量或整型表达式v数组必须先定义,后使用v只能逐个引用数组元素,不能一次引用整个数组例 int i=15;int datai;():1.在运行C语言程序过程中,系统并不 自动检验数组元素的下标是否越界。因此在编写程序时,保证数组下标不越界是十分重要的,下标取值范围是0(元素个数-1)。21个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。一维数组的初始化初始化方式:int a5=1,2,3,4,5;等价于:a0=1;a1=2;a2=3;a3=4;a4=5;:数组
3、不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值只给部分数组元素赋初值当全部数组元素赋初值时,可不指定数组长度如 int a5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;如 int a3=6,2,3,5,1;()static int a5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;int a=1,2,3,4,5,6;编译系统根据初值个数确定数组维数程序举例 例7.1 读10个整数存入数组,找出其中最大值和最小值算法:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x0(b)依次用xi和max,min
4、比较(循环)若maxxi,令min=xi3.输出:max和min#include#define N 10main()int xN,i,max,min;printf(Enter 10 integers:n);for(i=0;iN;i+)printf(%d:,i+1);scanf(%d,&xi);max=min=x0;for(i=1;iN;i+)if(maxxi)min=xi;printf(Maximum value is%dn,max);printf(Minimum value is%dn,min);输入部分处理部分输出部分例7.2用数组求Fibonacci数列前20个数)3()2(12)1(1
5、121nFFFnFnFnnn#include main()int i;int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;ia1,则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束#include main()int a11,i,j,t;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d
6、,&ai);printf(n);for(j=1;j=9;j+)for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(The sorted numbers:n);for(i=1;i11;i+)printf(%d,ai);例7.4 用简单选择法对10个数排序排序过程:排序过程:(1)首先通过)首先通过n-1次比较,从次比较,从n个数中找出最小个数中找出最小的,的,将它与第一个数交换将它与第一个数交换第一趟选择排序第一趟选择排序,结,结果果最小最小的数被安置在第一个元素位置上的数被安置在第一个元素位置上(2)再通过)再通过n-2次比较,从剩余的次比较,从剩余的n-1个数中
7、找出个数中找出关键字关键字次小次小的记录,将它与第二个数交换的记录,将它与第二个数交换第二第二趟选择排序趟选择排序(3)重复上述过程,共经过)重复上述过程,共经过n-1趟排序后,排序趟排序后,排序结束结束#include main()int a11,i,j,k,x;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d,&ai);printf(n);for(i=1;i10;i+)k=i;for(j=i+1;j=10;j+)if(ajak)k=j;if(i!=k)x=ai;ai=ak;ak=x;printf(The sorted numbers:n)
8、;for(i=1;i11;i+)printf(%d,ai);7.2 二维数组v定义方式:数据类型数组名常量表达式1常量表达式2;例 int a34;float b25;int a3,4;()1 1数组元素在内存中的排列顺序为数组元素在内存中的排列顺序为“按行存放按行存放”,即先顺序存放第一行的元素,再存放第二,即先顺序存放第一行的元素,再存放第二行,以此类推。行,以此类推。2.2.设有一个设有一个m m*n n的数组的数组x x,则第,则第i i行第行第j j列的元素列的元素x xijij在数组中的位置为:在数组中的位置为:i i*n+jn+j(注意:行号、列:行号、列号均从号均从0 0开始计
9、数开始计数行下标列下标3 3可以把可以把2 2维数组看作是一种特殊的维数组看作是一种特殊的1 1维数组:它的元维数组:它的元素又是一个素又是一个1 1维数组。维数组。例如,对例如,对a32a32,可以把,可以把a a看作是一个看作是一个1 1维数组,它有维数组,它有3 3个元素:个元素:a0a0、a1a1、a2a2,每个元素又是一个包,每个元素又是一个包含含2 2个元素的个元素的1 1维数组,如图维数组,如图6-46-4所示。即把所示。即把a0a0、a a11、a2a2看作是看作是3 3个个1 1维数组的名字维数组的名字int a32a01a10a11a20a21014523a00a00 a0
10、1a10 a11a20 a21a0a1a2引用二维数组元素:引用二维数组元素:数组名数组名 行下标表达式行下标表达式列下标表达式列下标表达式 1.“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。2“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x34,则可用的行下标范围为02,列下标范围为03。3对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。二维数组元素的初始化 分行初始化:例 int a23=1,2,3,4,5,6;按元素排列顺序初始化例 int a23=1,2,3,4,5,6;如果对全部元素都赋初值,则“行数”可以
11、省略。注注意意:只能省略“行数”。int a3=1,2,3,4,5,6;二维数组应用举例 二维数组应用举例例7.5 有M个学生,学习N门课程,已知所有学生的各科成绩,编程:分别求每个学生的平均成绩和每门课程的平均成绩#define M 5#define N 4#include stdio.hmain()int i,j;static float scoreM+1N+1=78,85,83,65,88,91,89,93,72,65,54,75,86,88,75,60,69,60,50,72;for(i=0;iM;i+)for(i=0;iM;i+)for(j=0;jN;j+)for(j=0;jN;j+
12、)scoreiN+=scoreij;scoreiN+=scoreij;scoreMj+=scoreij;scoreMj+=scoreij;scoreiN/=N;scoreiN/=N;for(j=0;jN;j+)for(j=0;jN;j+)scoreMj/=M;scoreMj/=M;clrscr();clrscr();printf(printf(学生编号学生编号 课程课程1 1 课程课程2 2 课程课程3 3 课程课程4 4 个人平均个人平均n);n);for(i=0;iM;i+)for(i=0;iM;i+)printf(printf(学生学生%dt,i+1);%dt,i+1);for(j=0;
13、jN+1;j+)for(j=0;jN+1;j+)printf(%6.1ft,scoreij);printf(%6.1ft,scoreij);printf(n);printf(n);for(j=0;j8 for(j=0;j8*(N+2);j+)(N+2);j+)printf(-);printf(-);printf(n printf(n课程平均课程平均););for(j=0;jN;j+)for(j=0;jN;j+)printf(%6.1ft,scoreMj);printf(%6.1ft,scoreMj);printf(n);printf(n);getch();getch();例7.6求二维数组中最
14、大元素值及其行列号#include main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,row=0,colum=0,max;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;row=i;colum=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);7.3 字符数组与字符串字符数组的定义 例 char c10,ch34;字符数组的初始化l逐个字符赋值 例 char ch5=H,e,l,l,o;l用字符串常量 例 char ch6=“Hello”;char ch6=“
15、Hello”;char ch=“Hello”;字符数组的引用 字符数组的逐个字符引用,与引用数值数组字符数组的逐个字符引用,与引用数值数组 元素类似元素类似。(1 1)字符数组的输入)字符数组的输入 使用使用getchar()getchar()或或scanf()scanf()函数输入字符。函数输入字符。例如:例如:char str10char str10;for(i=0;i10;i+)for(i=0;i10;i+)scanf(%c,&stri)scanf(%c,&stri);(2 2)字符数组的输出)字符数组的输出 字符数组的输出,可以用字符数组的输出,可以用putchar()putchar(
16、)或或 printf()printf()函数。函数。例如:例如:char str10=c language;char str10=c language;for(i=0;i10;i+)for(i=0;i10;i+)printf(%c,stri)printf(%c,stri);printf(n);printf(n);逐个字符输入、输出时,要指出元逐个字符输入、输出时,要指出元素的下标,而且使用素的下标,而且使用“%c”%c”格式符。格式符。另外,从键盘上输入字符时,无需输入另外,从键盘上输入字符时,无需输入字符的定界符字符的定界符单引号;输出时,系单引号;输出时,系统也不输出字符的定界符。统也不输出字符的定界符。字符串v字符串及其结束标志无字符串变量,用字符数组处理字符串字符串结束标志0:0例 “hello”共5个字符,在内存占6个字节 字符串长度5 h e l l o 0104 101 108 108 111 0内存存放字符ASCII码v字符串的输入输出l逐个字符I/O:%cl整个字符串I/O:%s 例 用%c main()char str5;int i;for(i=0;i5;i+)sc