




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章多维数组数组具有的特点1、数组元素的个数必须在定义时确定2、同一数组中的数组元素的类型是相同的3、数组元素的作用相当于简单变量4、同一数组中的数组元素占连续的地址空间7.1
一维数组7.1.1一维数组的定义形式:类型说明符数组名[常量表达式];例:inta[20];floatx[100];其中a和x都是数组名。代表数组元素的个数1.数组名的确定方法同变量名。2.C语言用方括号[]表示数组元素个数。对于inta[5];表示有5个元素,元素的下标从0开始.数组a的元素分别为:a[0],a[1],a[2],a[3],a[4]数组a在内存中的存放顺序:a[0]的值a[1]的值a[2]的值a[3]的值a[4]的值注意:在没有给数组元素赋值以前,没有确定的值。3.常量表达式为常量和符号常量。不允许有变量,其表达式的值代表了元素的个数。例:inta[20];
表示有20个元素且元素从0开始编排:a[0],a[1]…,a[19]7.1.2一维数组的初始化1.对全部元素赋初值。如:inta[10]={10,11,12,13,14,15,16,17,18,19}表示数组元素的值为:a[0]=10;a[1]=11;a[9]=19;2.对部分元素赋初值(前面的连续元素)。如:在此,只有前5个元素初值确定。intb[10]={0,1,2,3,4};表示数组元素的值为:b[0]=0;b[1]=1;b[2]=2;b[3]=3;b[4]=4;注意:不能只对不连续部分元素或后面的连续元素赋初值。语句:
inta[10]={,,,,,1,2,3,4,5};inta[10]={1,,3,,5,,7,,9,,};是错误的。3.如对数组元素赋同一初值,必须一一写出:staticinta[10]={2,2,2,2,2,2,2,2,2,2};不可写成任何其他形式。如:不可写成:staticinta[{10*2}];4.若赋全部元素的初值,可省略常量表达式
inta[]={0,1,2,3};
表示a[4],即只有4个元素。2.引用方式:数组名[下标]
代表了一个元素,等价一个同类型的变量。3.一般地,一维数组各元素分配在连续的内存单元之中。1.须象使用变量那样,先定义,后使用例:a[0]5+a[1]6为正确的算术表达式7.2一维数组使用7.2.1一维数组引用方式/*exam7_1.c一维数组在程序中的使用*/#include<stdio.h>voidmain(){ inti,a[5]={1,2,3,4,5};/*初始化数组*/ printf("输出数组元素的正确值:\n"); for(i=0;i<5;i++) printf("%d\t",a[i]); printf("\n输出超出下标的元素的值:\n"); for(i=5;i<10;i++)/*使用超出下标的元素*/ printf("%d\t",a[i]); printf("\n改变数组元素的值:\n"); a[0]=(a[1]+a[2])*(a[3]+a[4]); printf("a[0]=%d\n",a[0]); getchar();}/*exam7_2.cFibonaci数列的前20项*/#include<stdio.h>#include<conio.h>main(){ inti,FBNC[20]; FBNC[0]=0; FBNC[1]=1; for(i=1;i,i<=19;i++) FBNC[i+1]=FBNC[i]+FBNC[i-1]; printf("FBNCNumberis:\n"); for(i=1;i<=20;i++) { if(i==6||i==11||i==16) printf("\n"); printf("%7d",FBNC[i]); } getch();}7.2.2数组作为函数参数分为两种情况:1.
数组元素作为实参2.
数组名同时为形、实参一、数组元素作为函数的参数使用方法:把数组元素作为函数的实参。由于数组元素的性质与相同类型的简单变量的性质完全相同,因此,把数组元素作为函数的参数也和简单变量一样。作用:传值。intx,a[10];如:
xa[5]即a[5]为一元素,与x完全一样。例:设有两个同样大小的一维数组a[10]、b[10],将相应元素比较,统计a中大于b中对应元素的个数,小于的个数,相等时的个数。#include<stdio.h>main(){ inta[10],b[10],i,n=0,m=0,k=0; printf("enterarraya(10number):\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); printf("enterarrayb(10number):\n"); for(i=0;i<10;i++) scanf("%d",&b[i]); printf("\n"); for(i=0;i<10;i++) { if(large(a[i],b[i])==1) n=n+1; elseif(large(a[i],b[i])==0) m=m+1; elsek=k+1; }
printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k); if(n>k) printf("arrayaislargerthanarrayb\n"); elseif(n<k) printf("arrayaissmallerthanarrayb\n"); elseprintf("arrayaisequaltoarrayb\n");}intlarge(x,y)intx,y;{ intflag; if(x>y) flag=1; elseif(x<y) flag=-1; elseflag=0; return(flag);}运行情况如下:enterarraya:1357986420enterarrayb:5389–1–35604a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthanarrayb二、数组名作为函数参数1.数组名的作用数组名代表的是数组的起始地址;也就是第1个元素的地址。使用数组名作为函数的参数时,形参和实参必须是同一类型的数组名,系统采用地址传送方式进行数据传递,即实参的首地址传递给形参的首地址,实参与形参共享相同的数据单元。使用方法:函数的实参和形参都必须是数组名。作用:传址。2.把数组名作为函数参数的规则(可以在函数中修改数组元素的值)#include<stdio.h>main(){ voidswap(intx[]); inta[2]={2,7}; printf("a[0]:%d,a[1]:%d\n",a[0],a[1]); swap(a); printf("a[0]:%d,a[1]:%d\n",a[0],a[1]);}voidswap(intx[2]){ intt; t=x[0]; x[0]=x[1]; x[1]=t;}运行情况如下:a[0]:2,a[1]:7a[0]:7,a[1]:27.2.3一维数组的应用例:40个学生被邀请来给餐厅的食品打分,分数为1~10的10个等级(1意味着最低分,10表示最高分)。在整数数组中设置这40个值,然后统计调查结果。
这是一个典型的数组应用问题。我们要统计每一个等级分数(1~10)的出现次数。#include<stdio.h>#defineRESPONSE_SIZE40#defineFREQUENCY_SIZE11main(){ intanswer,rating; intresponses[RESPONSE_SIZE]={1,2,6,4,8,5,9,7,8, 10,1,6,3,8,6,10,3,8,2,7,6,5,7,6,8,6,7, 5,6,6,5,6,7,5,6,4,8,6,8,10}; intfrequency[FREQUENCY_SIZE]={0}; printf("%6s%17s\n","Rating","Frequency"); for(answer=0;answer<=RESPONSE_SIZE-1;answer++) ++frequency[responses[answer]]; for(rating=1;rating<=FREQUENCY_SIZE-1;rating++) printf("%-6d%17d\n",rating,frequency[rating]);}执行结果:RatingFrequency1222324255611758791103例:
排序问题–––计算机处理数据的一个重要问题排序算法较多,一种最简单的算法–––一般排序法用得较多。基本思路:设有n个数,需将它们从小到大顺序排列。则:2.在剩下的n–1个元素中,找出第二小的元素并把它放在第二个位置上。3.对上述过程重复,直至剩下一个元素。1.从n个元素中,通过比较,找出最小元素,放在第一个位置上。例4:8,4,20,100,28,1,两次交换第2次:1,4,20,100,28,8–––一次交换第3次:1,4,8,100,28,20–––一次交换第4次:1,4,8,28,100,20,1,4,8,20,100,28两次交换第5次:1,4,8,20,28,100–––
一次交换第1次:4,8,20,100,28,11,8,20,100,28,4
从以上例子可以看到:用到两层循环,外层循环––找第i小的元素,内层循环––对其后的元素的一一比较。流程图:初始化输入n个元素a数组i1ji+1a[i]>a[j]交换a[i]
a[j]BANoYesjj+1j>nii+1i>n–1打印结果结束内循环外循环BANoYesYesNo程序:#include<stdio.h> main(){inta[11];inti,j,t;printf("pleaseinput10n~:\n");for(i=1;i<=n;i++)scanf("%d",&a[i]);printf("\n");for(i=1;i<=9;i++)for(j=i+1;j<=10;j++)if(a[i]>a[j])k=i;{t=a[i];a[i]=a[j];a[j]=t;}printf("thesorted:\n");for(i=1;i<=10;i++)printf("%d",a[i];}k=j;if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}printf("thesorted:\n");for(i=1;i<=10;i++)printf("%d",a[i];}7.3多维数组7.3.1二维数组的定义形式:例:inta[4][10];floatx[8][20];类型说明符数组名[常量表达式1][常量表达式2];2.可将二维数组的元素看成为若干个特殊的一维数组。可看成:有三个特殊的一维数组b[0],b[1],b[2],每一个又有四个元素:1.不可将定义写为inta[4,10]。注意:b[0][0],b[0][1],b[0][2],b[0][3],b[1][0],b[1][1],b[1][2],b[1][3],b[2][0],b[2][1],b[2][2],b[2][3],如:
intb[3][4];3.二维数组的存放方式为:按行优先。由此可推广至三维、n维数组的定义和存放。4.初始化:即:最右边的下标变化最快。(1)
按行给二维数组赋初值:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};或:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(2)
可以对部分元素赋初值,但需表达清楚。则相当于若:
staticinta[3][4]={1,2,3,8}则相当于如:staticinta[3][4]={{1,2},{3},{8}}。(3)可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小。staticinta[][4]={1,2,3,…,12};二、二维数组元素的引用形式:其中的下标为整型表达式,但不得越界。与一维数组元素一样,二维数组元素相当于同类型的简单变量。数组名[下标1][下标2]三、多维数组的定义形式:例:introom[3][2][3];floatvic[7][12][6][9];类型说明符数组名[表达式1][表达式2]…...[表达式n];四、程序举例a=123456b=142536例1:
将一个二维数组行和列元素互换,存到另一个二维数组中。例如:#include<stdio.h>main(){ staticinta[2][3]={{1,2,3},{4,5,6}}; staticintb[3][2],i,j; printf("arraya:\n"); for(i=0;i<=1;i++){ for(j=0;j<=2;j++){ printf("%5d",a[i][j]); b[j][i]=a[i][j]; } printf("\n"); } printf("arrayb:\n"); for(i=0;i<=2;i++){ for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); }}执行结果:arraya:123456arrayb:142536注意:(1)数组元素数据的输入必须以循环方式进行或者定义时置初值。(2)二维数组一般用二重循环对每个元素赋值。例.有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号。先用N-S流程图表示算法max=a[0][0]fori=0to2forj=0to3a[i][j]>maxmax=a[i][j]row=icolum=j输出:max和row,colum真假程序如下:#include<stdio.h>main(){inti,j,row=0,colum=0,max;staticinta[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=i;colum=j;}printf("max=%d,row=%d,colum=%d\n",max,row,colum);}输出结果为:
max=10,row=2,colum=1注意:要将二维数组作为函
数组的参数,可以把
二维数组看成一维数
组,然后进行参数传
递。注意:
二维数组的元素在内存中是按先行后列的顺序存放的,因此可以将二维数组当作是一维数组。例:
有一个34的矩阵如下:要求:(1)打印出所有元素的和;(2)打印出所有大于平均值的元素。#include<stdio.h>#include<conio.h>intadd_ave(intm,intn,intarr[]);voidprt_up(intm,intn,floataverage,intarr[]);main(){intA[3][4]={{6,4,9,13},{1,3,8,7},{3,4,10,2}};inti=3,j=4,sum;floatave;sum=add_ave(i,j,A[0]);printf("Thenumberorsum=%d\n",sum);ave=(float)((sum)/(ij));printf("Thenumberoraverage=%5.2f\n",ave);prt_up(i,j,ave,A[0]);}intadd_ave(intm,intn,intarr[]);{inti;inttotal=0;for(i=0;i<mn;i++)total=total+arr[i];return(total);}voidprt_up(intm,intn,floataverage,intarr[]){inti,j;printf("ThenumberofBiggerthenaverageare:");for(i=0;i<m;i++){for(j=0;j<n;j++)if(arr[in+j]>average)printf("arr[%d][%d]=%d\t",i,j,arr[in+j]);}}运行结果:Thenumberofsum=42Thenumberofaverage=3.00ThenumberofBiggerthenaverageare:arr[0][0]=6arr[0][1]=4arr[0][2]=9arr[1][2]=8arr[1][3]=7arr[2][1]=4arr[2][2]=10二维数组与一维数组的对应关系:6A[0][0]A[0][1]A[0][2]A[0][3]A[1][0]A[1][1]A[1][2]A[1][3]A[2][0]A[2][1]A[2][2]A[2][3]4913138734122A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]A[9]A[10]A[11]7.4字符串和字符数组一、字符数组的定义类型名数组名大小charc[10];1.初始化:
(1)直接给出字符串中的各字符
staticchara[4]={'G','o','o','d'};若字符多于元素个数,则语法错,反之,后面补"\0"存放字符数据。字符串–––用字符数组存放。(2)可以去掉定义时的大小设置,而通过自动赋值决定 长度(大小)staticcharx[]={'I','','a','m','','a','','s','t','u','d','e','n','t'};(3)前面说过,字符串常量用“”表示,且由‘\0’结尾.staticcharx[]={"Iamastudent."};
则长度为15+1=16,其中x[15]存放‘\0’,其中{}亦可省略。二、字符数组的特点用于存放字符或字符串。如:charw[7]={'s','t','u','d','e','n','t'};w是一个可以存放7个字符的数组而:charu[8]={"student"};(或写成:charu[]="student";)u是一个可存放8个字符的数组对上面两种数组定义,有:w[0]=u[0]=sw[1]=u[1]=tw[2]=u[2]=uw[3]=u[3]=dw[4]=u[4]=ew[5]=u[5]=nw[6]=u[6]=tu[7]=\0三、字符串的特点(1)字符串用双引号""括起来。(2)字符串的结束标志为'\0',由系统提供。例:charbn[]="computer";则:数组bn的长度为9bn[0]='c'bn[3]='p'bn[6]='e'bn[1]='o'bn[4]='u'bn[7]='r'bn[2]='m'bn[5]='t'bn[8]='\0'格式符:
%c–––逐个输入/输出字符。
%s–––整个串一次输入/输出。1.输出(用%s)
(2)
在printf中须直接写数组名.
staticcharc[]={"Iamastudent"};printf("%s",c);四、字符数组的输入输出(1)用%s输出时,不输出‘\0’.(3)
若数组长度大于字符串长度,则遇到‘\0’即停止输出
staticcharc[10]="china";printf("%s",c);(4)
输出时遇到第一个‘\0’即结束。2.输入(用%s)(2)输入多个字符串,可用空格隔开。
staticcharstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);(1)输入字符串时,系统自动加上‘\0’则:输入Howareyoustr1:Howstr2:arestr3:you输入:Howareyou则只会将How输入,且存为str:How\0……
但若:staticcharstr[13]scanf("%s",str);注:
scanf中须用地址量,数组名表示地址量。#include<stdio.h>
main()
{charname[13];
inti;
for(i=0;i<=12;i++)
scanf(“%c”,&name[i]);
for(i=0;i<=12;i++)
printf(“%c”,name[i]);
scanf(“%s”,name);
printf(“%s”,name);
}例:采用不同的方式输入输出字符串运行结果:
Pear&ApplePear&ApplePear&ApplePear#include<stdio.h>#include<conio.h>main(){inti;charname[7][4]={"sun","mon","tue","wed","thu","wen","sat"};printf("Resultis:\n");name[0][3]='&';name[2][3]='&';name[5][3]='&';for(i=0;i<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出租车行业劳动合同与租赁合同解析通则
- 标准劳动合同简易模板
- 吊篮采购合同参考范本
- Module 1 Unit 1 Hello!(教学设计)-2024-2025学年外研版(一起)英语一年级上册
- 企业股权转让法律合同
- 度购物中心户外广告牌制作安装合同
- 技术转让与许可合同样本
- 计划生育政策变动导致的劳动合同终止范本
- 交通建设合同转让协议书
- 9 明天要远足(教学设计)2024-2025学年-统编版语文一年级上册
- 胶带输送机司机培训
- 市政工程旁站监理方案
- 马工程-公共财政概论-课程教案
- 千年菩提路解说词
- 渗透检测报告
- DB4401-T 1-2018老年人照顾需求等级评定规范-(高清现行)
- 值班、交接班制度课件
- 领导干部道德修养1
- 房地产现金流量表
- 《ANSYS有限元基础》课程教学大纲
- 国内外创造性思维培养模式的对比研究综述
评论
0/150
提交评论