【文档说明】二级C语言第9章指针课件.ppt,共(31)页,273.501 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44660.html
以下为本文档部分文字说明:
1第9章数组第1部分:•一维数组的定义•一维数组在内存中的存放•一维数组元素的引用•一维数组的应用第2部分•二维数组的定义•二维数组的数组名•二维数组表达式•一维数组的应用•字符数组2排序问题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讨论:如何用简单的方法表示变量集合:a1,a2,a3,….
a100,不能用省略号!引入一维数组概念。3数组基本概念:1.数组:一组具有相同数据的有序集合。2.数组元素:构成数组的成员称为数组单元,即数组元素3.数组维数数组下标的个数数组:有序数据的表示4§9.1.1一维数组的定义1、定义一维数组例如:inta[100];包含变量:a[0],a[1],a[
2],….a[99]charc[8];floatx[20];y[4*M+1];(M是符号常量)floats1[75];类型说明数组名[exp],数组名[exp],…其中:exp为常量表达式注意:1.inta[10];不能表示为:inta(10);2.数组名定名规则和简单
变量名相同;数组名后是用方括弧括起来的常量表达式,决定了数组元素个数;3数组元素的下标从0开始,最大下标值为数组元素个数减1;59.2.2、一维数组元素的引用•数组必须先定义,后引用,C规定只能引用数组
元素,不能一次引用整个数组•数组元素的表示形式为:数组名[下标]例:inta[8];//先声明a[0]=a[5]+a[7]-a[3*2];//后引用下标可以是•整型常量或•整型表达式,61.在定义数组时对数组元素赋初值例如:inta[5]={1,2,3,4,5};cha
rc[5]={„@‟,‟\n‟,‟a‟,‟b‟,‟\0‟};2.可以只给部分元素赋初值例如:intb[5]={1,2,3};9.1.3、一维数组的初始化3.在对全部数组元素赋初值时,可省略数组长度例如:intc[]=
{1,2,3,4,5};4.静态数组元素具有自动初始值0例如:staticintd[5];7例9.1定义30个元素的整型数组,顺序存放1,3,5…奇数,先顺序输出,再逆序输出.#include<stdio.h>#
defineM30main(){ints[M],i,k=1;for(i=0;i<M;i++){s[i]=k;k+=2;}for(i=9;i<M;i++){printf("%4d",s[i]);if((i+1)%10==0)printf(“\n”);}}8
9.2一维数组和指针例:floata[10],*p,x;a表示数组的首地址:&a[0]a[0]表示第一个元素for(k=0;k<10;k++)p=a+k;p=&a[0];p=a;a=&x;a++;P109:数组名相当于地址常量,不可重新赋
值!数组名+整数首地址for(p=a,k=0;k<10;k++){scanf(“%d”,p);p++;}for(p=a,k=0;k<10;k++)scanf(“%d”,p++);for(p=a;p-a<10;p++
)scanf(“%d”,p);99.2首地址的引用,指针引用一维数组2)数组名表示首地址,a(即a+0)等价于&a[0]类似:a+1:&a[1]a+i:&a[i]for(k=0;k<10;k++)printf(“%4d”,*(a+k));等价于:for(k=0;k<10;k+
+)printf(“%4d”,a[k]);3)floata[10],*p,k;p=a;for(k=0;k<10;k++)printf(“%4d”,*(p+k));10for(p=a,k=0;k<10;k++)printf(“%4d”,*p);p++);for(p=a,k=0
;k<10;k++)printf(“%4d”,*p++);for(p=a,p-a<10;p++)printf(“%4d”,*p);4)用带下标的指针变量引用一维数组例:int*p,s[10],i;p=
s;等价的表达式:(1)s[i](2)*(s+i)(3)*(p+i)(4)p[i]非法:s++;s=p;p=&ss不可变,p可变!11§9-3函数与一维数组及元素的引用1.数组元素作实参2.数组名作实参例9-2编程,通过一个函数为主函数输入若干大于或等于0的整数,用负数作结束标志;调用另外一个函
数输出数组中数据.#include<stdio.h>#defineM100intarrin(int*);voidarrout(int*,int);main(){ints[M],k;k=arrin(s);arrout(s,k);}voidarrout(int*a,i
ntn){inti;for(i=0;i<n;i++)printf(((i+1)%5==0)?”%4d”:”%4d”,*(a+i));printf(“\n”);}intarrin(int*a){inti,x;i=0;scanf(“%d”,&x);whil
e(x>=0){*(a+i)=x;i++;scanf(“%d”,&x);}returni;}12例9-3编写函数,把具有10个元素的char类型数组元素中的除前4个外的其他元素变成*.#include<stdio.h>#defineM10#def
ineB4main(){charc[M]={„A‟,‟B‟,‟C‟,‟D‟,‟E‟,‟F‟,‟G‟,‟H‟,‟I‟,‟J‟;setstar(&c[4],M-B);arrout(c,M);}voidarrout(char*a,in
tn){inti;for(i=0;i<n;i++)printf(“%c”,a[i]);printf(“\n”);}voidsetstar(char*a,intn){inti;for(i=0;i<n;i++)*(a+i)=„*‟;}voidsetst
ar(char*,int);voidarrout(char*a,intn);139.4一维数组的应用举例p115例9-4编写函数,定义15个元素的数组,完成以下功能:1)调用C库函数的随机函数给所有元素赋以0~49的随机数2)输出数组元素值3)
按顺序对每隔3个数求一个和数,传回主函数4)最后输出所有求出的和值#include<stdio.h>#include“stdlib.h”#defineSIZE15#defineN3voidgetrand(int*,int);voidgetave(int*,int*,int
);voidpriarr(int*,int);main(){intx[SIZE],w[SIZE/N]={0};getrand(x,SIZE);printf(“Output%drandomnumbers:\n”,S
IZE);priarr(x,SIZE);getave(x,w,SIZE);priarr(w,SIZE/N);}14voidgetrand(int*a,intn){inti;for(i=0;i<n;i++)a[i
]=rand()%50;}voidgetave(int*a,int*b,intn){inti,j,sum;for(sum=0,i=0,j=0;i<=n;i++){sum+=a[i];if(i+1)%3==0){b[j]=sum;sum=0;j++;}}
}voidpriarr(int*a,intn){inti;for(i=0;i<n;i++){printf(“%5d”,a[i]);if((i+1)%5==0)printf(“\n”);}printf(“\n”);}1
5例9.5将数组中的数重新按颠倒的顺序存放p116自学例9.6已知整型数组中的值在0~9的范围内,统计每个整数的个数p117自学例9.7P118自学例9.8p119自学16985420985420895949290999854209584828088842058
9552045894402458922结果㈠㈡㈢㈣序列㈤0245899-9用选择法或冒泡法对6个数排序(由小到大)冒泡法的思路是:将相邻两个数比较,将小的调到前头共循环多少次?每次循环进行了多少次比较?什么时候结束?如果序列为5
、8、9、4、2、0,先排在最后的还是9吗?如果要求先将最大的数排在最前面,该如何操作?17输入n个数给a[1]到a[n]forj=1ton-1fori=1ton-ja[i]>a[i+1]真假a[i]a[i+1]输出a[1]到a[n]18#include<stdio.h>#d
efineN6voidmain(){inta[7];inti,j,t;printf("input%dnumbers:\n",N);for(i=1;i<N;i++)scanf("%d",&a[i]);for(j=1;j<=N-1;j++)for(i=1;i<=N-j;i+
+)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("thesortednumbers:\n");for(i=1;i<=N;i++)printf("%d",a[i]);printf("\n");}注:数组a的第一个元素a[0]没有被
使用,请修改程序以便节省内存空间19#include<stdio.h>#defineN6voidmain(){inta[N+1];inti,j,t;printf("input%dnumbers:\n",N);for(i=1;i<=N;i++)scanf("%d",&a[i]);for(j=1;j<
N;j++)for(i=j+1;i<=N;i++)if(a[j]<a[i]){t=a[j];a[j]=a[i];a[i]=t;}printf("thesortednumbers:\n");for(i=1;i<=N;i++)printf("%d",a[i]);prin
tf("\n");}20§9-5二维数组1、定义二维数组类型名数组名[exp1][exp2]其中,exp1为行数,exp2为列数如:inta[3][4],b[4][M];注:不能写成inta[3,4],b[4,M];或inta(3,4),b(4,M);21可把二维数组看作是
一种特殊的一维数组:它的元素又是一个一维数组例如,可把a[3][4]看作是一个一维数组,有3个组元素:a[0]、a[1]、a[2],每个组元素中又包含4个元素的一维数组。见下图:二维数组的存储二维数组中元素排列的顺序是按行存放试写出b[2][3]中元素?
a[0]a[1]a[2]a[0][0]a[0][1]a[0][2]a[0][3]aa[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3][4][4][4]229.5.2、二维数组的引用二维数组的元素的表示为:数组名[下标][下标]如:a[
2][3]a[2-1][2*2-1]b[1][2]=a[2][3]/2注意:1.数组定义和数组元素引用的区别例如inta[3][4];第一个元素是a[0][0],最后一个元素是下标可以是整型表达式2.下标的最
大取值a[2][3]239.5.3、二维数组的初始化2)按存放顺序例:intb[2][3]={1,2,3,4,5,6};3)只给部分元素赋初值例:intc[2][3]={{1,2},{4}};intx[2][3]={{0,0,9},{
0,6}};2行3列1)按行存放例:inta[2][3]={{1,2,3},{4,5,6}};4)省略第一维长度;例:inte[][3]={1,2,3,4,5,6};注意:不能省略第二维的长度。为什么?123456009
060结果为:x[0][0]=0,x[0][1]=0,x[0][2]=9x[1][0]=0,x[1][1]=6,x[1][2]=012040024/*例9-6输出如下形式的二维数组*/100002300045600789100#include<stdio.h>main()
{inta[5][5]={0};inti,j,k=1;for(i=0;i<5;i++)for(j=0;j<=i;j++){a[i][j]=k;k++;}for(i=0;j<5;j++){for(j=0;j<=5;j++)printf("%3d”,a[i][j]);printf(“\n”);
}getch();}9.8二维数组举例25/*例9-7输出二维数组中每行的最小值及其行、列号*/#include<stdio.h>main(){inta[5][5]={{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}};inti,j,col;for(i=0;i<5;i++){col=0;for(j=0;j<5;j++){if(a[i]
[j]<a[i][col])col=j;}printf("row:%d,min:%d,col:%d\n",i+1,a[i][col],col+1);}getch();}26/*例9-7b有一个3行4列矩阵,求出其中最
大值及所在的行号和列号*/#include<stdio.h>main(){inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};ma
x=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);}27多维数组,参考二维数组inta[2][3][4];a为整型三维数组,元素个数为2×3×4=24内存中的排列顺序为:a[0][0][0]a[0][0][1]a[0][0][2]a[0][0][3]a[0][1][0]
a[0][1][1]a[0][1][2]a[0][1][3]a[0][2][0]a[0][2][1]a[0][2][2]a[0][2][3]a[1][0][0]a[1][0][1]a[1][0][2]a
[1][0][3]a[1][1][0]a[1][1][1]a[1][1][2]a[1][1][3]a[1][2][0]a[1][2][1]a[1][2][2]a[1][2][3]最右边的下标变化最快初始化方法:1、按存储顺序:inta[2][2]
[2]={1,2,3,4,5};2、按下标顺序:inta[2][2][2]={{{1,2},{3,4}},{{5,0},{0,0}}};28补充例2:任输入一行字符,统计其中有多少个单词(以空格分隔)。算法:①
输入字符串;②找第一个非空字符;③计数;④跳过本单词,即寻找空格或‘\0‟;⑤未结束则转②;⑥否则打印个数。输入:---We-are----students.29/*9-8输入一行字,统计其中有多少个单词,单词间是空格分开*/#include
<stdio.h>voidmain(){charc;inti=0,num=0,word=0;charstr[81];gets(str);for(i=0;(c=str[i])!='\0';i++)if(c=='')word=0;elseif(word==0){wo
rd=1;num++;}printf("共%d个单词\n",num);}书例P139算法1:1.空格决定单词数目,空格不是单词word=02.如果字符为非空格,前面是空格,则一个单词出现word=1,num++3.如果word=1,c!=„„,说明还是
刚才单词的字符,num不累加30012345678/*9-8算法2:输入一行字,统计其中有多少个单词,单词间是空格分开*/#include<stdio.h>voidmain(){charc;inti=0,num=0;charstr[100]
;gets(str);do{while((c=str[i])=='')i++;if(c!='\0'){num++;i++;}while((c=str[i])!=''&&c!='\0')i++;}while(c!='
\0');printf("共%d个单词\n",num);}输入:---We-are----students.--回车-表示空格Weare31补充:找出1000以内的完数例如:6=1+2+3#include<stdio.h>main(){in
ta[100];inti,j,n,m;for(j=2;j<1000;j++){n=0;m=j;for(i=1;i<j;i++){if((j%i)==0){m=m-i;a[n]=i;n++;}}}if(m==0){printf(“%disawanshu\n”,j);for(i=0;i<n-1
;i++)printf(“%d,”,a[i]);printf(“%d\n”,a[n-1]);}}getch();}