




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Chapter5数组Arrays概述一维数组多维数组字符数组NextchapterIntroduction例给出10个儿童的体重,求平均体重并输出低于平均体重的数值#include<stdio.h>main(){intw1,w2,w3,w4,w5,w6,w7,w8,w9,w10;/*declaration*/intt=0;
scanf(“%d”,&w1);/*input*/scanf(“%d”,&w2); ………..scanf(“%d”,&w10);t=w1+w2+w3+w4+w5+w6+w7+w8+w9+w10;t=t/10;/*calculate*/
if(w1<t)printf(“%d\n”,w1);/*output*/if(w2<t)printf(“%d\n”,w2); …………if(w10<t)printf(“%d\n”,w10);}#include<stdio.h>#defineSIZE10main(){intw[SIZE];intt=0,i;
for(i=0;i<SIZE;i++)scanf(“%d”,&w[i]);
for(i=0;i<SIZE;i++)t+=w[i];t=t/10;
for(i=0;i<SIZE;i++)if(w[i]<t)printf(“%d\n”,w[i]);}构造数据类型之一数组:一组有序的,类型相同的数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定IntroductionOne-dimensionalarrays一维数组定义
数据类型
数组名[常量表达式];
[]:数组运算符单目运算符优先级:(1)左结合不能用()合法标识符表示元素个数元素下标从0开始Eg.inta[6];a[0]a[1]a[2]a[3]a[4]a[5]014523aEg.intdata[5];
data[5]=10;
//数组不作越界检查,使用时注意Eg.inti=15;intdata[i];(不能用变量定义数组维数)编译时分配连续内存内存字节数=数组维数*
sizeof(元素类型)数组名表示内存首地址是地址常量&a[0]数组必须先定义,后使用只能单独引用数组元素,不能一次引用整个数组数组元素表示形式:
数组名[下标]Eg.inta[10];printf(“%d”,a);()Eg.inta[10];printf(“%d”,a);()修改:for(i=0;i<10;i++)printf(“%d\t”,a[i]);
C语言不对数组作越界检查,使用时注意数组元素在功能上等价于一个一般的变量One-dimensionalarrays一维数组引用数组不初始化,其元素值为随机数static数组若不初始化,系统自动赋0值当全部数组元素赋初值时,可不指定数组长度部分数组元素初始化超过:非法不足:后续元素初始化成0在定义数组时,为数组元素赋初值inta[5]={1,2,3,4,5};a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;staticinta[5];a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;inta[5]={6,2,3};a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;inta[3]={6,2,3,5,1};()inta[]={1,2,3,4,5,6};编译系统据初值个数确定数组维数One-dimensionalarrays一维数组初始化Eg.inta[5];
a={2,4,6,8,10};Eg.charname[0];floatweight[10.3];intarray[-100];数组定义中数组维数必须是大于0的正整数Eg.#defineN6inta[N],b[‘B’-60],c[]={1,2,3,4,5,6};不能给数组整体赋值ExamplesEg.找10个整数的最大值和最小值Step:1.Input:forloop2.Process:(a)initial:max=min=x[0](b)Comparex[i]andmax,min
(loop)
ifmax<x[i],then
max=x[i]ifmin>x[i],
thenmin=x[i]3.Output:maxandmin
Address#include<stdio.h>#defineSIZE10max=min=x[0];for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];
if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);printf("Enter10integers:\n");for(i=0;i<SIZE;i++){printf("%d:",i+1);scanf("%d",&x[i]);}intx[SIZE],i,max,min;main(){
}FileinclusionDeclarationFunctionmainSymbolicconstantInputSearchmax,minInitialOutputEg.ComputetheNthFibonaccif[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235#include<stdio.h>main(){inti;}intf[20]={1,1};for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf("\n");printf("%6d",f[i]);}DeclarationComputeOutputLinearsearch312-5614221-1745a0N-1Search21FounditLinearsearch312-5614221-1745a0N-1Search20Runofftheend!NotfoundLinearsearch#include<stdio.h>#defineN8main(){ inta[N]={3,12,-5,6,142,21,-17,45}; inti=0,x=21;
while()
if(i<N)printf(“Foundit!”); elseprintf(“Notfound!”);}a[i]!=xi++;LoopconditionCanwedobetter?&&i
<N312-5614221-1745a0N-1Binarysearch适用条件:采用数组存储的有序表查找过程:每次将待查记录所在区间缩小一半(1)设数组r维数长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值(2)初始时,令low=1,high=n,mid=(low+high)/2(3)让k与mid指向的元素比较A、若k==r[mid],查找成功B、若k<r[mid],则high=mid-1C、若k>r[mid],则low=mid+1(3)重复上述操作,直至low>high时,查找失败Binarysearch01234567891011121314513192137566475808892100111120125找37lowhighmidFounditBinarysearch01234567891011121314513192137566475808892100111120125找90lowhighmidNotfound!BinarysearchFileinclusionDeclarationFunctionmainInputSearch#include<stdio.h>intr[N],low,high,mid,k;while(){}if(low>high)printf(“SearchFailure.\n");main(){
}low<=highmid=(low+high)/2;Macrodefinition#defineN10…….Initialvaluelow=0;high=N-1;CalculatemidComparekandr[mid]if(k>r[mid])
elseif(k<r[mid])elselow=mid+1;high=mid-1;{printf(“%d\n”,mid);break;}printf("Input10sortednumbers:\n");for(k=0;k<N;k++)scanf("%d",&r[k]);printf("Inputnumberk:\n");scanf("%d",&k);BubbleSort排序过程:(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,最多经过n-1趟冒泡排序后,排序结束BubbleSort1234567第一趟起泡排序第一趟起泡结束1234567第二趟起泡排序第二趟起泡结束123456第三趟起泡排序第三趟起泡结束12345第四趟起泡排序第四趟起泡排序结束第五趟起泡排序第五趟起泡排序结束第六趟起泡排序第六趟起泡排序结束步骤:两两比较相邻元素,如果
a[i]>a[i+1]交换小的元素象气泡一样上浮最多N-1趟0N-2N-11234567InputNintegerstoa[0]~a[N-1]fork=1to
N-1fori=0toN-k-1a[i]>a[i+1]Ta[i]a[i+1]Outputa[0]to
a[N-1]FInputSortingOutput#include<stdio.h>inta[N],i,k,t;printf("Input%dnumbers:\n”,N);for(i=0;i<N;i++)scanf("%d",&a[i]);for()for()
if()
{}for(i=0;i<N;i++)printf("%d",a[i]);main(){
}k=1;k<=N-1
;k++i=0;i<=N-k-1;i++t=a[i];a[i]=a[i+1];a[i+1]=t;a[i]>a[i+1]#defineN7BubbleSort1234567第一趟起泡排序第一趟起泡结束1234567第二趟起泡排序第二趟起泡结束123456第三趟起泡排序第三趟起泡结束12345第四趟起泡排序起泡排序结束结束条件:某一趟排序过程中没有进行"交换记录"操作,则整个排序结束Canwedobetter?FOutput#include<stdio.h>inta[N],i,k,t;printf("Input%dnumbers:\n”,N);for(i=0;i<N;i++)scanf("%d",&a[i]);for()for()
if()
{}for(i=0;i<N;i++)printf("%d",a[i]);main(){
}k=1;k<=N-1;k++i=0;i<=N-k-1;i++
t=a[i];a[i]=a[i+1];a[i+1]=t;
a[i]>a[i+1]#defineN7intflag=1;(k=1;k<=N-1&&
flag==1;k++)flag=1;flag=0;{}SelectionSortunsortedunsorted0N-1aunsortedunsorted0N-1aismallestkikiunsortedunsorted0N-1akunsortedunsorted0N-1a排序过程:(1)首先通过N-1次比较,从N个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上(2)再通过N-2次比较,从剩余的N-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序(3)重复上述过程,共经过N-1趟排序后,排序结束共N-1趟简单选择排序过程示例第一趟初始关键字序列34492831525112第二趟第三趟第四趟第五趟第六趟第七趟n-1趟i=0kjjjjjjjki=11234k012345675149*28345249*i=2kk3149i=334i=449i=5kkki=65152算法描述InputNintegrstoa[0]~
a[N-1]fori=0toN-2forj=i+1toN-1a[j]<a[k]FTk=jOutputa[0]~
a[N-1]k=ii!=ka[i]a[k]TFFileinclusionDeclarationInputOutput#include<stdio.h>#defineN7inta[N],i,j,k,t;printf("Inputnumbers:\n");for(i=0;i<N;i++)scanf("%d",&a[i]);printf("\n");printf("Thesortednumbers:\n");for(i=0;i<N;i++)printf("%d",a[i]);main(){
}Functionmaini=0;i<N-1
;i++t=a[i];a[i]=a[k];a[k]=t;for(){}k=i;for(
)j=i+1;j<N;j++if(
)a[j]<a[k]
k=j;if(i!=k){}Multi-dimensionalArrays学生1学生2学生3单科总成绩单科总平均分英语高数物理体育总分平均分807592657882599093846789二维数组定义
数据类型数组名[常量表达式][常量表达式];列数行数元素个数=行数*列数Eg.inta[3][4];floatb[2][5];intc[2][3][4];inta[3,4];()数组元素的存放顺序原因:内存是一维的二维数组:按行序优先多维数组:最右下标变化最快inta[3][2]014523a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][0]01234567………...20212223intc[2][3][4]c[0][0][0]c[0][0][1]c[0][0][2]c[0][0][3]c[0][1][0]c[0][1][1]c[0][1][2]c[0][1][3]c[0][2][0]c[0][2][1]c[0][2][2]c[0][2][3]c[1][0][0]c[1][0][1]c[1][0][2]c[1][0][3]c[1][1][0]c[1][1][1]c[1][1][2]c[1][1][3]c[1][2][0]c[1][2][1]c[1][2][2]c[1][2][3]20161720181920202120222320089201011201213201415200012002320045200067a[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]Eg.inta[3][4];a[0]a[1]a[2]行名01452367101189a[0]a[1]a[2]二维数组a是由3个一维数组组成Multi-dimensionalArrays二维数组理解a[0][1]a[0][2]a[0][3]a[0][0]a[2][0]a[2][1]a[2][2]a[2][3]a[1][0]a[1][1]a[1][3]a[1][2]intc[2][3][4]:consistof22-Darrays形式:
数组名[下标][下标]Eg.inta[2][3]={{1,2,3},{4,5,6}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化按元素存储顺序初始化Eg.inta[2][3]={{1,2},{4}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]120400部分初始化Eg.inta[2][3]={1,2,3,4,5,6};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化Eg.inta[2][3]={1,2,4};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]124000部分初始化Eg.inta[][3]={1,2,3,4,5};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123450第一维长度省略初始化intc[2][3][4]={{{1,2,3,4},{2,3,4,5},{3,4,5,6}},
{{4,5,6,7},{5,6,7,8},{6,7,8,9}}
};Multi-dimensionalArrays二维数组元素的引用二维数组元素的初始化分行初始化:Eg.inta[][3]={{1},{4,5}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]100450第一维长度省略初始化Eg.inta[2][3]={{5,6},{7,8}};vs.
inta[2][3]={5,6,7,8};560780567800Eg.inta[][10];doublef[2][]={1.2,2.2};数组初始化时,第一维长度可缺省014523607805014523678005Eg.Searchthemaximumelementofa2-Darray12349876-1010-52max=a[0][0]row=0colum=0fori=0to2forj=0to3a[i][j]>maxTFmax=a[i][j]row=icolum=jOutput:max,row,colum#include<stdio.h>main(){inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};inti,j,row=0,colum=0,max;
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);}例.统计三个学生四门课程的总分和平均分学生1学生2学生3单科总成绩单科总平均分英语高数物理体育总分平均分807592657882599093846789FileinclusionMacrodefinitionFunctionmainInputForeachstudent#defineS3#defineC4#include<stdio.h>inta[S+2][C+2],i,j;for(
){
}main(){}Declaration…….ForeachsubjectOutput…….i=0;
i<S
;
i++a[i][C]=0;j=0;j<C;j++a[i][C]+=a[i][j];a[i][C+1]=a[i][C]/C;for()清零SumAveragefor(){
}
j=0;j<C+2;j++a[S][j]=0;for()i=0;i<S;i++a[S][j]+=a[i][j];a[S+1][j]=a[S][j]/S;清零SumAveragefor(i=0;i<S;i++)for(j=0;j<C;j++)scanf(“%d”,&a[i][j]);for(i=0;i<S+2;i++){for(j=0;j<C+2;j++)print(“%5d”,a[i][j]);printf(“\n”);}8075926578825990938467890003123093337877830000002512412182449542388380728131879CharacterArrays字符数组定义Eg.charc[10],ch[3][4];逐个字符赋值用字符串常量字符数组初始化字符数组的引用Eg.charch[6]={“Hello”};charch[6]=“Hello”;charch[]=“Hello”;Stringconstantsch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]Eg.charch[5]={‘B’,’o’,’y’};ch[0]Boy\0\0Onebyonech[1]ch[2]ch[3]ch[4]Eg.charch[5]=“Boy”;ch[0]Boy\0\0Stringconstantsch[1]ch[2]ch[3]ch[4]Eg.charch[5]={‘H’,’e’,’l’,’l’,’o’};ch[0]Helloonebyonech[1]ch[2]ch[3]ch[4]Problem!Eg.charch[5]={‘H’,’e’,’l’,’l’,’o’};ch[0]Helloonebyonech[1]ch[2]ch[3]ch[4]Eg.charstr[]=“Hello”;
charstr[]={‘H’,‘e’,‘l’,‘l’,‘o’};
hello02314
hello\0023145Different!Eg.charcolor[][5]={{'R','e','d'},{'B','l','u','e'},
{'G','r','e','e','n'},{'C','y','a','n'},{'B','l','a','c','k'}};二维字符数组初始化Red\0\0Blue\0GreenCyan\0Blackcolor[0]color[1]color[2]color[3]color4]Eg.charfruit[][7]={“Apple”,”Orange”,”Grape”,”Pear”,”Peach”};二维字符数组初始化fruit[0]fruit[1]fruit[2]fruit[3]fruit[4]Apple\0\0Orange\0Grape\0\0Pear\0\0\0Peach\0\0字符串无字符串变量用字符数组处理字符串字符串结束标志:‘\0’Eg.String“hello”
hello\01041011081081110
ASCIIcodeCharacterArraysCharacterArrays例用%cmain(){charstr[10];inti;for(i=0;i<10;i++)scanf(“%c”,&str[i]);for(i=0;i<10;i++)printf(“%c”,str[i]);}Iamaboy0123456789字符串输入输出逐个字符I/O:%c整个字符串I/O:%s例用%smain(){charstr[15];scanf(“%s”,str);printf(“%s”,str);}要求用字符数组的起始地址用字符数组名,不要加&输入串长度<数组维数遇空格或回车结束自动加‘\0’用字符数组名,遇‘\0’结束&str[0]<=>
str#include<stdio.h>main(){chara[5]={‘H’,’e’,’l’,’l’,’o’};printf(“%s\n”,a);}#include<stdio.h>main(){chara[]=“Hello”;printf(“%s\n”,a);}Output:Hello#-=*
hello02314Output:Hello用“%s”输出时,遇‘\0’结束
hello\002314#include<stdio.h>main(){chara[]={'h','e','l','\0','l','o','\0'};printf("%s\n",a);}Eg.Output:helhel\0lo\0
数组中有多个‘\0’时,遇第一个结束#include<stdio.h>main(){charc,a[8];scanf("%s",a);c=‘X’;printf("%s\n%c\n,",a,c);}Running:(1)ifinput“hello”,correct(2)ifinput“helloboy”,error!输入字符串长度<数组维数
hel\0
hell\0
hello\0XXXOutput:HelloX#-=*
How\0
are\0
you?\0
#include<stdio.h>main(){chara[15],b[5],c[5];
scanf("%s",a);printf("a=%s\n",a);scanf("%s%s%s",a,b,c);printf("a=%s\nb=%s\nc=%s\n",a,b,c);}Running:Input:Howareyou?Output:a=How
Input:
Howareyou?Output:a=are b=you?c=Howscanf中%s输入时,遇空格或回车结束Running:Input:Howareyou?Buffergarbagefflush(stdin);Eg.要输入字符串“Thisisastring.”,哪个不能实现?(A)scanf(“%17s”,s);(B)for(k=0;k<17;k++)
s[k]=getchar();
s[k]=‘\0’;(C)while((c=getchar())!=‘\n’)
s[k++]=c;字符数组特殊性Initialization:I/O:inta[]={1,2,3,4,5};charstr[]={‘H’,‘e’,‘l’,‘l’,‘o’};charstr[]=“Hello”;printf(“%d”,a);for(i=0;i<5;i++)printf(“%d”,a[i]);for(i=0;i<5;i++)printf(“%c”,str[i]);printf(“%s”,str);scanf(“%d”,a);for(i=0;i<5;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)scanf(“%c”,&str[i]);
scanf(“%s”,str);#include<string.h>字符串输出函数:puts格式:puts(字符数组名)
或puts(字符串常量)
功能:向显示器输出字符串(输出完,自动换行)说明:字符数组必须以‘\0’结束字符串输入函数:gets格式:gets(字符数组名)功能:从键盘输入以回车结束的字符串放入字符数组中,并自动加‘\0’说明:输入串长度应小于字符数组维数#include<string.h>main(){charstring[80];printf(“Inputastring:”);
gets(string);
puts(string);}printf(“%s\n”,string);Input:Howareyou?Output:Howareyou?Libraryfunctionsforstringstr1hellogirl\0字符串连接函数:strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串最后加‘\0’helloboys\0str2oboys\0ellhstrcat(str1,str2);Libraryfunctionsforstringstr1hellogirls\0字符串拷贝函数:strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大拷贝时‘\0’一同拷贝string1=string2()helloboys\0str2oboys\0ellhstrcpy(str1,str2);LibraryfunctionsforstringEg.charstr1[20],str2[20];str1={“Hello!”};()str2=str1;()strcmp(str1,str2);Return‘g’-‘b’Libraryfunctionsforstring字符串比较函数:strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止返值:返回int型整数,a.若字符串1<字符串2,返回负整数
b.若字符串1>字符串2,返回正整数
c.若字符串1==字符串2,返回零说明:字符串比较不能用“==”,必须用strcmphellogirls\0helloboys\0str2str1字符串长度函数:strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括‘\0’在内Eg.Whatarethevaluesofstrlen(s)?(1)chars[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};(2)chars[]=“\t\v\\\0will\n”;(3)chars[]=“\x69\082\n”;(4)chars[]=“ab\n\\012/\\\””;Libraryfunctionsforstring13110例字符串反向:在字符串中将首尾字符进行对调\0abcdefghijk\0strk=0i=10ak1j9b28cik=0,1,2,3,i=10,9,8,7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童恐龙巡展活动方案
- 儿童户外义卖活动方案
- 儿童抽奖活动策划方案
- 儿童暑假洗碗活动方案
- 儿童水果手艺活动方案
- 儿童游戏邀约活动方案
- 儿童理发活动方案
- 儿童种植园活动方案
- 儿童羽毛球娱乐活动方案
- 儿童节庆祝活动方案
- 围术期感染防控与医疗安全管理培训课程
- 内科护理学肺结核护理
- 外科总论考试题+答案
- 2023年山东省青岛市中考数学真题【含答案、解析】
- 青马工程考试试题及答案
- 2025-2030中国尼龙纱行业市场发展趋势与前景展望战略研究报告
- 无人机适航标准与检查试题及答案
- T-CCFA 01029-2017 循环再利用对苯二甲酸二甲酯
- 细胞培养技术考核试题及答案
- 英美社会文化试题及答案
- 苏州考保安证试题及答案
评论
0/150
提交评论