您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 谭浩强版C语言课件第7章数组
1第七章数组本章要点:1.建立数组的概念;2.掌握一维数组和多维数组的定义;3.掌握数组的初始化和引用;4.掌握字符串与字符数组.5.掌握用数组进行编程的技术。加油啊!2数组的概念1.问题的提出假设我们将26个数分别存放在26个变量中,要计算26个变量的和,如何做?将26个变量逐个加起来?能否使用循环语句?for(sum=0,i=0;i26;i++)sum=sum+ai;正确吗?32.使用数组解决问题定义一个变量,包含26个数据,称为数组变量。main(){inti,sum=0,a[26];for(i=0;i26;i++)scanf(“%d”,&a[i]);for(i=0;i26;i++)sum=sum+a[i];printf(%d,sum);}4数组是一组有序的、类型相同的数据的集合,这些数据被称为数组的元素。数组及其相关概念5·数组是同类型变量的集合,共用一个名字,用下标区分;·每个变量称作数组元素;·按下标递增顺序在内存中存放;·使用几个下标区分变量,就称是几维数组。·一维数组与数学中的数列对应,二维数组与矩阵对应。很少使用三维及三维以上的数组。67.1一维数组的定义和引用7.1.1一维数组的定义定义一维数组的一般方式:类型说明符数组名[常量表达式];例如:intscore[10];floatclass1[30];指明数组元素的数据类型指明数组所含的元素个数7说明:(1)数组名同变量名命名规则相同。(2)数组名后是用方括号而不是圆括号。(3)常量表达式说明数组元素的个数,必须是大于0的整型常量表达式。不允许是变量,不能进行动态定义。数组下标规定从0开始。n个元素的数组,下标最大值是n-1。例如:inta(10);intn;inta[n]charname[0];floatweight[10.3];floatarray[-100];87.1.2一维数组的引用数组元素的使用与单个变量相同,可以自由地存取。数组元素的表示形式:数组名[下标]如a[3]其中,下标可以是整型常量、整型变量或整型表达式。如:a[3]=a[0]+a[i+1];下标指出在数组中第几个元素例:main(){inti,sum=0,a[26];for(i=0;i26;i++){scanf(“%d”,&a[i]);sum=sum+a[i];}printf(%d,sum);}97.1.3一维数组的初始化1.定义时初始化方法:将初值依次写在花括号{}内。如:inta[5]={2,4,6,8,10};存储形式:存储单元10说明:(1)只给数组中部分元素赋初值,其他元素按零处理。如:inta[9]={1,2};则a[0]=1,a[1]=2,a[2]~a[8]值全为0。注意:定义成static数组,不赋初值,系统会自动将全部元素赋以0值。(2)对数组元素全部置0。inta[5]={0,0,0,0,0};或:staticinta[5];11(3)若对全部数组元素赋值时,可以不指定数组长度。如:floatarray1[3]={1.2,1.4,2.5};等价于floatarray1[]={1.2,1.4,2.5};若定义的数组长度与赋值的个数不符,则不能省略。122.使用其它方法初始化(赋值)⑵利用输入语句初始化main(){charas[26];inti;for(i=0;i26;i++)scanf(%c,&as[i]);…...}⑴利用赋值语句初始化main(){charas[26],ch;for(ch='A';ch='Z';ch++)as[ch-'A']=ch;…...}137.1.4一维数组应用举例[例1]从键盘上输入10个实型数存入数组,然后按输入顺序的逆序输出这10个数。main(){floata[10];inti;for(i=0;i10;i++)scanf(“%f”,&a[i]);for(i=9;i=0;i--)printf(“%10.2f”,a[i]);}14例2用冒泡法对10个数排序(由小到大)。方法:将两个相邻数比较,小的调到前头。988888895555559444444922222290000009由以上可推知:6个数要比较5趟第一趟中要进行两两比较5次第二趟中比较4次······若有n个数,则要进行n-1趟比较第i趟比较中要进行n-i次两两比较。15main(){inta[10],i,j,n,t;scanf(“%d”,&n);printf(“inputnumbers:\n”);for(i=0;in;i++)scanf(“%d”,&a[i]);for(i=0;in-1;i++)for(j=1;jn-i;j++)if(a[j-1]a[j]){t=a[j-1];a[j-1]=a[j];a[j]=t;}printf(“%Thesortednumbers:\n”);for(i=0;in;i++)printf(“%d”,a[i]);}n个数比较n-1趟第i趟比较n-i次16[例3]用数组来处理求Fibonacci数列问题。数学表示:f(0)=f(1)=1,f(n)=f(n-2)+f(n-1)程序为:main(){inti;intf[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){if(i%5==0)printf(“\n”);printf(“%12d”,f[i]);}}运行结果如下:1123581321345589144233377610987159725844181676517•定义二维数组的一般方式:类型说明符数组名[常量表达式1][常量表达式2];[例如]inta[3][3]•存储形式:二维数组在内存中是按行的顺序存放的,即先存放第一行的元素,再存放第二行的元素。[例如]floata[3][4];7.2二维数组的定义和引用7.2.1二维数组的定义222120121110020100aaaaaaaaaa18说明:二维数组除了维数比一维数组多一维外,其它性质与一维数组是全部类似的。看看下面写法是否正确?①inta[0][3];用于定义数组长度的常量表达式的值必须是大于0的正整数。②inti=3,j=4;inta[i][j];定义数组元素的个数必须使用常量表达式,而不能使用变量。197.2.2二维数组的引用与引用一维数组元素一样,也用下标法引用二维数组元素。二维数组元素表示形式:数组名[下标1][下标2]其中,下标1和下标2是整型常量、整型变量或整型表达式。其编号是从0开始的。例如:若有inta[2*5][3*4],i=15;则使用a[3*3][0],a[1][i-5]都是合法的。说明:数组名a代表的是数组a在内存中的首地址,因此,可以用数组名a来代表数组元素a[0][0]的地址。207.2.3二维数组的初始化数组定义时初始化采用方法如下:(1)分行给二维数组赋初值。如:inta[2][3]={{2,3,1},{1,2,3}};⑵省略掉内层的花括号即按数组元素在内存中排列的顺序赋初值。inta[2][3]={2,3,1,1,2,3};21说明:·可以对部分元素赋值。如:inta[3][3]={{1},{0,1},{0,0,1}};相当矩阵:100010001100000001•如果对全部元素赋初值,第一维元素可省,但第二维元素不可省。如:a[3][4]={{0,1,3,1},{2,1,0,2},{1,1,2,0}};可写成a[][4]={0,1,3,1,2,1,0,2,1,1,2,0};inta[3][3]={{1},{},{0,0,1}};相当矩阵:inta[2][3]={{5,6},{7,8}};inta[2][3]={5,6,7,8};[例]得到的数组为:560780得到的数组为:567800227.2.4二维数组程序举例例1将一个二维数组a2×3转置存到另一个二维数组b3×2中。635241654321ba,分析:a矩阵的行数必须要等于b矩阵的列数。执行:b[j][i]=a[i][j];即可完成转换。涉及到两个下标的,一般用两重循环。求矩阵转置问题也可以在矩阵本身进行,但应是方阵。23main(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf(“arraya:\n”);for(i=0;i2;i++){for(j=0;j3;j++){printf(“%5d”,a[i][j]);b[j][i]=a[i][j];}printf(“\n”);}printf(“arrayb:\n”);for(i=0;i3;i++){for(j=0;j2;j++)printf(“%5d”,b[i][j]);printf(“\n”);}}24运行结果如下:arraya:123456arrayb:142536[例2]求3*4矩阵中最大元素的值及其所在行和列号。802164794321a25程序:main(){inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,7,4,6},{-1,2,0,8}};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=9,row=1,colum=026[例3]求3*3矩阵A的转置矩阵。main(){inti,j,t,a[3][3];for(i=0;i3;i++)for(j=0;j3;j++)scanf(%d,&a[i][j]);for(i=0;i3;i++){for(j=0;j3;j++)printf(%d,a[i][j]);printf(\n);}for(i=0;i3;i++)for(j=0;j=i;j++){if(ji){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}}for(i=0;i3;i++){for(j=0;j3;j++)printf(%d,a[i][j]);printf(\n);}}277.3字符数组7.3.1字符数组的定义当数组的元素类型为字符型时,被称为字符数组。如:字符数组的定义、初始化和元素的引用与一般的数组相同。charc[10];则c为字符数组。例:main(){charch[5]={‘c’,‘h’,‘i’,‘n’,‘a’};for(i=0;i5;i++)printf(“%c”,ch[i]);}287.3.2字符数组的初始化字符数组的初始化与数值型数组的初始化类似.如:charc[7]={‘p’,’r’,’o’,’g’,’r’,’a’,’m’};c[0]c[1]c[2]c[3]c[4]c[5]c[6]program注意:大括号提供的初值不能超过字符数组的长度,可以小于字符数组的长度,最后为空字串‘\0’。如:charc[6]={‘g’,’r’,’e’,’e’,’n’};内存分配为:c[0]c[1]c[2]c[3]c[4]c[5]green\0297.3.3字符数组的引用例1输出一个字符串。程序:main(){charc[10]={‘I’,‘’,‘a’,‘m’,‘’,‘a’,‘’,‘b’,‘o’,‘y’};inti;for(i=0;i10;i++)printf(“%c”,c[i]);printf(“\n”);}运行结果:Iamaboy30例2输出一个钻石图形。main(){chardiamond[][5]={{‘’,‘’,‘*’},{‘’,‘*’,‘’,‘*’},{‘*’,‘’,‘’,‘’,‘*’},{‘’,‘*’,‘’,‘*’},{‘’,‘’,‘*’}};inti,j;for(i=0;i5
本文标题:谭浩强版C语言课件第7章数组
链接地址:https://www.777doc.com/doc-3493315 .html