1、第第9 9章章 数组数组第第1部分:部分:一维数组的定义一维数组的定义一维数组在内存中的存放一维数组在内存中的存放一维数组元素的引用一维数组元素的引用一维数组的应用一维数组的应用第第2部分部分二维数组的定义二维数组的定义二维数组的数组名二维数组的数组名二维数组表达式二维数组表达式一维数组的应用一维数组的应用字符数组字符数组1排序问题1.两个数排序?a,bif(a b)t=a;a=b;b=t;2.三个数排序?a,b,cif(a b)t=a;a=b;b=t;if(a c)t=a;a=c;c=t;if(b c)t=b;b=c;c=t;问题导入3.100个数排序?a1,a2,a3,.a100讨论:如何
2、用简单的方法表示变量集合:a1,a2,a3,.a100,不能用省略号!引入一维数组概念。2 数组基本概念:数组基本概念:1.数组:一组具有相同数据的有序集合。2.数组元素:构成数组的成员称为数组单元,即数组元素3.数组维数 数组下标的个数数组数组:有序数据的表示39.1.1 一维数组的定义1、定义一维数组、定义一维数组例如:int a100;包含变量:a0,a1,a2,.a99 char c8;float x20;y4*M+1;(M是符号常量)float s175;类型说明类型说明 数组名数组名exp,数组名数组名exp,其中:exp为常量表达式注意:1.int a10;不能表示为:int a
3、(10);2.数组名定名规则和简单变量名相同;数组名后是用方括弧括起来的常量表达式,决定了数组元素个数;3.3 数组元素的下标从0开始,最大下标值为数组元素个数减1;49.2.2、一维数组元素的引用一维数组元素的引用 数组必须先定义,后引用,C规定只能引用数组 元素,不能一次引用整个数组 数组元素的表示形式为:数组名数组名下标下标 例:int a8;/先声明 a0=a5+a7-a3*2;/后引用下标可以是整型常量或整型表达式,51.在定义数组时对数组元素赋初值例如:int a5=1,2,3,4,5;char c5=,n,a,b,0;2可以只给部分元素赋初值例如:int b5=1,2,3;9.1
4、.3、一维数组的初始化、一维数组的初始化3在对全部数组元素赋初值时,可省略数组长度例如:int c =1,2,3,4,5;4静态数组元素具有自动初始值0例如:static int d5;6例9.1定义30个元素的整型数组,顺序存放1,3,5奇数,先顺序输出,再逆序输出.#include#define M 30main()int sM,i,k=1;for(i=0;i M;i+)si=k;k+=2;for(i=9;iM;i+)printf(%4d,si);if(i+1)%10=0)printf(“n”);79.2 一维数组和指针例:float a10,*p,x;a表示数组的首地址:&a0 a0表示
5、第一个元素 for(k=0;k10;k+)p=a+k;p=&a0;p=a;a=&x;a+;P109:数组名相当于地数组名相当于地址常量址常量,不可重新赋值不可重新赋值!数组名+整数首地址for(p=a,k=0;k10;k+)scanf(“%d”,p);p+;for(p=a,k=0;k10;k+)scanf(“%d”,p+);for(p=a;p-a10;p+)scanf(“%d”,p);89.2 首地址的引用,指针引用一维数组2)数组名表示首地址,a(即a+0)等价于&a0 类似:a+1:&a1 a+i:&aifor(k=0;k10;k+)printf(“%4d”,*(a+k);等价于:for(
6、k=0;k10;k+)printf(“%4d”,ak);3)float a10,*p,k;p=a;for(k=0;k10;k+)printf(“%4d”,*(p+k);9for(p=a,k=0;k10;k+)printf(“%4d”,*p);p+);for(p=a,k=0;k10;k+)printf(“%4d”,*p+);for(p=a,p-a10;p+)printf(“%4d”,*p);4)用带下标的指针变量引用一维数组例:int*p,s10,i;p=s;等价的表达式:(1)si (2)*(s+i)(3)*(p+i)(4)pi 非法:s+;s=p;p=&s s不可变,p可变!109-3 函数
7、与一维数组及元素的引用1.数组元素作实参 2.数组名作实参例9-2 编程,通过一个函数为主函数输入若干大于或等于0的整数,用负数作结束标志;调用另外一个函数输出数组中数据.#include#define M 100int arrin(int*);void arrout(int*,int);main()int sM,k;k=arrin(s);arrout(s,k);void arrout(int*a,int n)int i;for(i=0;i=0)*(a+i)=x;i+;scanf(“%d”,&x);return i;11例9-3 编写函数,把具有10个元素的char类型数组元素中的除前4个外的
8、其他元素变成*.#include#define M 10#define B 4main()char cM=A,B,C,D,E,F,G,H,I,J;setstar(&c4,M-B);arrout(c,M);void arrout(char*a,int n)int i;for(i=0;in;i+)printf(“%c”,ai);printf(“n”);void setstar(char*a,int n)int i;for(i=0;in;i+)*(a+i)=*;void setstar(char*,int);void arrout(char*a,int n);129.4 一维数组的应用举例 p115
9、例9-4 编写函数,定义15个元素的数组,完成以下功能:1)调用C库函数的随机函数给所有元素赋以049的随机数2)输出数组元素值3)按顺序对每隔3个数求一个和数,传回主函数4)最后输出所有求出的和值#include#include“stdlib.h”#define SIZE 15#define N 3void getrand(int*,int);void getave(int*,int*,int);void priarr(int*,int);main()int xSIZE,wSIZE/N=0;getrand(x,SIZE);printf(“Output%d random numbers:n”,
10、SIZE);priarr(x,SIZE);getave(x,w,SIZE);priarr(w,SIZE/N);13void getrand(int*a,int n)int i;for(i=0;in;i+)ai=rand()%50;void getave(int*a,int*b,int n)int i,j,sum;for(sum=0,i=0,j=0;i=n;i+)sum+=ai;if(i+1)%3=0)bj=sum;sum=0;j+;void priarr(int*a,int n)int i;for(i=0;iai+1真假 aiai+1输出 a1到an17#include#define N 6v
11、oid main()int a7;int i,j,t;printf(input%d numbers:n,N);for (i=1;i N;i+)scanf(%d,&ai);for(j=1;j=N-1;j+)for(i=1;i ai+1)t=ai;ai=ai+1;ai+1=t;printf(the sorted numbers:n);for(i=1;i=N;i+)printf(%d,ai);printf(n);注:数组a的第一个元素a0没有被使用,请修改程序以便节省内存空间18#include#define N 6void main()int aN+1;int i,j,t;printf(input
12、%d numbers:n,N);for (i=1;i=N;i+)scanf(%d,&ai);for(j=1;j N;j+)for(i=j+1;i=N;i+)if(aj ai)t=aj;aj=ai;ai=t;printf(the sorted numbers:n);for(i=1;i=N;i+)printf(%d,ai);printf(n);199-5 二维数组1、定义二维数组类型名 数组名exp1exp2其中,exp1为行数,exp2为列数如:int a34,b4M;注:不能写成int a3,4,b4,M;或 int a(3,4),b(4,M);20可把二维数组看作是一种特殊的一维数组:它的元
13、素又是一个一维数组例如,可把 a34 看作是一个一维数组,有3个组元素:a0、a1、a2,每个组元素中又包含 4 个元素的一维数组。见下图:二维数组的存储二维数组中元素排列的顺序是按行行存放试写出b23中元素?a0a1a2a00 a01 a02 a03aa10 a11 a12 a13a20 a21 a22 a23444219.5.2、二维数组的引用二维数组的元素的表示为:数组名数组名 下标下标下标下标 如:a23a2-12*2-1b12=a23/2注意:1.数组定义和数组元素引用的区别例如int a34;第一个元素是a00,最后一个元素是下标可以是整型表达式2.下标的最大取值a23229.5.
14、3、二维数组的初始化2)按存放顺序 例:int b23=1,2,3,4,5,6;3)只给部分元素赋初值例:int c23=1,2,4;int x23=0,0,9,0,6;2行3列1)按行存放 例:int a23=1,2,3,4,5,6;4)省略第一维长度;例:int e3=1,2,3,4,5,6;注意:不能省略第二维的长度。为什么?1 2 34 5 60 0 90 6 0结果为:x00=0,x01=0,x02=9 x10=0,x11=6,x12=01 2 04 0 023/*例9-6 输出如下形式的二维数组*/1 0 0 0 02 3 0 0 04 5 6 0 07 8 9 10 0#incl
15、ude main()int a55=0;int i,j,k=1;for (i=0;i5;i+)for(j=0;j=i;j+)aij=k;k+;for(i=0;j5;j+)for(j=0;j=5;j+)printf(%3d”,aij);printf(“n”);getch();9.8 二维数组举例24/*例9-7 输出二维数组中每行的最小值 及其行、列号*/#include main()int a55=22,11,32,42,53,51,41,31,21,11,44,54,24,34,74,93,59,17,64,74,96,45,39,65,58;int i,j,col;for(i=0;i5;i
16、+)col=0;for(j=0;j 5;j+)if(aij aicol)col=j;printf(row:%d,min:%d,col:%dn,i+1,aicol,col+1);getch();25/*例9-7b 有一个3行4列矩阵,求出其中最大值 及所在的行号和列号*/#include main()int i,j,row=0,colum=0,max;int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for (i=0;i=2;i+)for(j=0;j max)max=aij;row=i;colum=j;printf(max=%d,row=%d,colum=%
17、dn,max,row,colum);26多维数组,参考二维数组int a234;a为整型三维数组,元素个数为23424内存中的排列顺序为:a000 a001 a002 a003a010 a011 a012 a013a020 a021 a022 a023a100 a101 a102 a103a110 a111 a112 a113a120 a121 a122 a123最右边的下标变化最快初始化方法:1、按存储顺序:int a222=1,2,3,4,5;2、按下标顺序:int a222=1,2,3,4,5,0,0,0;27补充例2:任输入一行字符,统计其中有多少个单词(以空格分隔)。算法:输入字符串
18、;找第一个非空字符;计数;跳过本单词,即寻找空格或0;未结束则转;否则打印个数。输入:输入:-We-are-students.28/*9-8 输入一行字,统计其中有多少个单词,单词间是空格分开*/#include void main()char c;int i=0,num=0,word=0;char str81;gets(str);for(i=0;(c=stri)!=0;i+)if(c=)word=0;else if(word=0)word=1;num+;printf(共%d 个单词n,num);书例P139 算法1:1.空格决定单词数目,空格不 是单词word=02.如果字符为非空格,前面
19、是空格,则一个单词出现 word=1,num+3.如果word=1,c!=,说明还是 刚才单词的字符,num不累加290 1 2 3 4 5 6 7 8 /*9-8 算法2:输入一行字,统计其中有多少个单词,单词间是空格分开*/#include void main()char c;int i=0,num=0;char str100;gets(str);do while(c=stri)=)i+;if(c!=0)num+;i+;while(c=stri)!=&c!=0)i+;while(c!=0);printf(共%d 个单词n,num);输入:输入:-We-are-students.-回回车车-表示 空格 W e a r e 30 补充:找出1000以内的完数 例如:6=1+2+3#include main()int a100;int i,j,n,m;for(j=2;j1000;j+)n=0;m=j;for(i=1;ij;i+)if(j%i)=0)m=m-i;an=i;n+;if(m=0)printf(“%d is a wanshun”,j);for(i=0;in-1;i+)printf(“%d,”,ai);printf(“%dn”,an-1);getch();31练习:P133页 32
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。