c语言程序设计第7章数组课件_第1页
c语言程序设计第7章数组课件_第2页
c语言程序设计第7章数组课件_第3页
c语言程序设计第7章数组课件_第4页
c语言程序设计第7章数组课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章数组本章要点(1)数值型数组(一维、二维)(2)一维数组与指针运算(3)数组作函数的参数。本章难点(1)一维数组、多维数组的说明、赋值、输入输出方法。(2)数组的有关算法,特别是排序的算法。(3)利用指针实现数组的相关运算。第7章数组本章要点数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,构成一个数组的这些变量称为数组元素。数组有一个统一的名字叫数组名。与高中的数列类似:数列a:a1,a2,a3,a4,……,ai,……,an有一个下标数列a:a1,1,a1,2,a1,3,a1,4,……,ai,j,……

有二个下标数组a:a[1],a[2],a[3],……,a[i],……,a[n]a[0]a[1]a[2]……a[n-1]数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,7.1数组说明下标7.1.1数组的说明当需要处理大量的同类型数据时,利用数组是非常方便的。C语言规定,程序中用到的数组也必须先进行说明(定义)。说明一维数组的方式如下类型说明符数组名[常量表达式];例如,inta[5],b[18];doublexy[20];共说明了3个一维数组:整型一维数组a,共包括5个元素(a[0]~a[4]),数组中的每一个元素均为整型;整型一维数组b,共包括18个元素(b[0]~b[17]),其中的每一个元素也都为整型;双精度实型一维数组xy,共包括20个元素(xy[0]~xy[19]),其中的每一个元素均为双精度实型。7.1数组说明下标7.1.1数组的说明关于数组的说明要注意以下几个问题:(1)数组名的命名规则与变量名相同。(2)说明数组大小的常量表达式必须为整型,并且只能用方括号括起来。(3)说明数组大小的常量表达式可以是符号常量、常量,但不能是变量。constinti=3;inta[i];(4)数组元素的下标是从0开始的,到n-1,共含有n个元素。例如,inta[4];说明了一个长度为4的整型一维数组,在这个数组中的4个元素分别为a[0]、a[1]、a[2]、a[3],其中并不包含元素a[4]。关于数组的说明要注意以下几个问题:(1)数组名的命名规则与变7.1.2数组引用数组必须先说明,后引用(使用),在C语言中,只能逐个引用数组元素,不能一次引用数组中的全部元素。数组元素的表示形式为数组名[下标]下标可以是整形常量或整形表达式。例如,b[0]=b[3]*2+b[1]-b[2*2]7.1.2数组引用数组必须先说明,后引用(使用),在C语【例】数组元素的引用。main(){inti,a[5];for(i=0;i<=4;i++)/*这个for循环完成对数组元素的赋值*/ a[i]=i;for(i=4;i>=0;i--)/*这个for循环完成对数组元素的输出*/ printf("%2d",a[i]);}运行结果如下:43210【例】数组元素的引用。7.1.3数组的初始化即对数组元素的第一次赋值。(1)在说明数组时对数组元素赋以初值。例如,inta[5]={0,1,2,3,4};将数组元素的初值依次放在一对花括弧内。经过上面的说明和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4。对数组元素赋初值后,在程序中还可以用其他方式(如赋值语句、输入函数等)重新赋值。a[1]=51;a[2]=62;a[3]=43;a[4]=24;(2)只给一部分数组元素赋值。例如,

inta[5]={0,1};说明a数组有5个元素,但花括弧内只提供2个初值,这表示只给前面2个元素赋初值,后3个元素值为0。a[0]=0、a[1]=1、a[2]=0、a[3]=0、a[4]=0。注意:如果使用inta[5];仅表示定义了一个长度为5的数组,系统不会将其初始化为0值,其值是不确定的。7.1.3数组的初始化即对数组元素的第一次赋值。(3)如果想使一个数组中全部元素值为0,可以写成,inta[5]={0,0,0,0,0};或inta[10]={0};(4)在对全部数组元素赋初值时,可以不指定数组长度。例如,inta[]={1,2,3,4,5};或者inta[5]={1,2,3,4,5};(5)静态数组

staticinta[5];若数组没有被初始化,则元素自动设置为0.(3)如果想使一个数组中全部元素值为0,可以写成,例

计算并输出全班30个学生C语言程序设计课程的平均成绩以及每个人的成绩与平均成绩之差。#include<stdio.h>#defineN30main(){inti;floatx[N],sum,average;sum=0;printf("input%dscores:\n",N);for(i=0;i<N;i++){scanf("%f",&x[i]);sum+=x[i];}average=sum/N;printf("average=%.2f\n",average);for(i=0;i<N;i++)printf("x[%d]-average=%.2f\n",i,x[i]-average);}例计算并输出全班30个学生C语言程序设计课程的平均成绩以练习1、利用随机函数对一维数组赋值,之后输出该数组。(数组长度自定)#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10main(){inti,x[N];srand(time(0));for(i=0;i<N;i++){ x[i]=rand()%101; printf("%4d",x[i]);}}练习2、找出一个数组中最大的元素值。#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10main(){inti,x[N],max;srand(time(0));for(i=0;i<N;i++){ x[i]=rand()%101; printf("%4d",x[i]);}max=x[0];for(i=1;i<N;i++) if(max<x[i])max=x[i];printf("\nmax=%d",max);}2、找出一个数组中最大的元素值。#include<stdio3、把数组右循环移动1位。#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10main(){inti,x[N],t;srand(time(0));printf("原始数组:");for(i=0;i<N;i++){ x[i]=rand()%101; printf("%4d",x[i]);}//右移

t=x[N-1];for(i=N-2;i>=0;i--) x[i+1]=x[i];x[0]=t;printf("\n右移后数组:");for(i=0;i<N;i++)printf("%4d",x[i]);}3、把数组右循环移动1位。#include<stdio.h>4、把一个数组倒序。#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10main(){inti,x[N],k,t;srand(time(0));printf("原始数组:");for(i=0;i<N;i++){ x[i]=rand()%101; printf("%4d",x[i]);}//倒序

k=N/2-1;for(i=0;i<=k;i++){ t=x[i];x[i]=x[N-1-i];x[N-1-i]=t;}printf("\n倒序后数组:");for(i=0;i<N;i++)printf("%4d",x[i]);}4、把一个数组倒序。#include<stdio.h>//倒7.1.4数组的运算(排序与查找)1.起泡法排序例4用起泡法对10个数排序(由小到大)。#include<stdio.h>#include<stdlib.h>#defineN10voidmain(){ inta[N]; inti,j,t; for(i=0;i<N;i++) {a[i]=rand()%101; printf("%3d",a[i]); } printf("\n"); for(i=0;i<N-1;i++) /*比较趟数*/ for(j=0;j<N-1-i;j++)/*每趟比较的次数*/ if(a[j]>a[j+1])/*相邻二数相比*/ {t=a[j];a[j]=a[j+1];a[j+1]=t;}/*交换相邻二数*/printf("thesortednmber:\n");for(i=0;i<N;i++)/*输出所有数组元素*/ printf("%3d",a[i]);}7.1.4数组的运算(排序与查找)1.起泡法排序for(i=0;i<N-1;i++) /*比较趟数:N-1趟*/ for(j=0;j<N-1-i;j++)/*每趟比较的次数:N-1-i次*/ if(a[j]>a[j+1])/*相邻二数相比*/ {t=a[j];a[j]=a[j+1];a[j+1]=t;}/*交换相邻二数*/for(i=0;i<N-1;i++) 2.插入排序#include<stdio.h>#defineN10intmain(){intx=88,i,location;intarray[N]={-65,0,21,58,78,90,98,106,124};printf(“插入数值前:\n");for(i=0;i<N-1;i++)printf("%5d",array[i]);printf("\n");for(i=N-2;i>=0;i--){ if(array[i]>x) array[i+1]=array[i]; else break;}array[i+1]=x;printf(“插入数值后:\n");for(i=0;i<N;i++)printf("%5d",array[i]);printf("\n");return0;}2.插入排序#include<stdio.h>for(i3.顺序查找(不要求数组有序)#include<stdio.h>#defineN8voidmain(){inta[N]={6,5,3,7,1,4,9,8},x,i,find=0;scanf("%d",&x);for(i=0;i<N;i++)if(a[i]==x) {find=1;break;}if(find)printf("thepositionis:%d",i);elseprintf("notfound");}3.顺序查找(不要求数组有序)4.折半查找法(只能对有序数列进行查找)#defineN10/*N代表数据的个数*/main(){ inta[N]={1,4,7,13,16,19,28,36,49,60}; intmid,bot,top,x,find; scanf("%d",&x); bot=0;top=N-1;/*给数组下界和上界变量赋初值*/ find=0;/*find=0代表设有找到*/ while(bot<=top) { mid=(top+bot)/2;/*计算中间要比较的元素小标*/ if(x==a[mid]) {find=1;break;/*查找成功*/ } elseif(x<a[mid]) top=mid-1;/*数据X在下半部分*/ else bot=mid+1;/*数据X在上半部分*/ }if(find==1)printf("thenumberisfoundtheno.%d!\n",mid);elseprintf("thenumberisnotfound!\n");}4.折半查找法(只能对有序数列进行查找)c语言程序设计第7章数组课件1.把两个长度相同的数组的对应元素相加。2.从数组a中删除一个值为x的元素。练习1.把两个长度相同的数组的对应元素相加。练习for(i=0;i<N;i++)if(s[i]==x){if(i==N-1)for(j=N-2;j>=0;j--) s[j+1]=s[j];elsefor(j=i+1;j<N;j++)s[j-1]=s[j];break;}if(i==N)printf("noexist\n");elsefor(i=0;i<N;i++)printf("%4d",s[i]);return0;}#include<stdio.h>#defineN10//从数组a中删除一个值为x的元素。intmain(){ints[N]={3,5,4,1,9,6,10,56,34,12};intx,i,j;printf("inputx:");scanf("%d",&x);for(i=0;i<N;i++)#include<stdiintx,*px;px=&x;则表示px指向x。通过px访问x称为间接访问。地址的存储与使用补充内容(第6章)intx,*px;地址的存储与使用补充内容(第6章)(1)&取地址运算符。(2)*指针运算符或间接访问运算符。*(&x)=3*px=3x=3三者等价。指针的说明和引用(1)&取地址运算符。指针的说明和引用注意以下几点:(1)&运算符只能作用于变量,包括基本类型的变量、数据元素、结构变量或结构的成员,不能作用于数组名、常量、非左值表达式或寄存器变量。例如,doubler,a[20];inti;registerintk;则&r、&a[0]、&a[i]是正确的,而&(2*r)、&a、&k是非法操作。(2)如果px指向x,则*px可以出现在x可以出现的任何位置,因为*px即表示x。注意以下几点:(3)(*px)++相当于x++。如果没有括号,成为*px++,即为*(px++),因为++和*为同一优先级别,结合方向为自右向左,因此它表示先对px进行*运算,得到x的值,然后使px的值增1,这样px就不再指向x了.(4)指针变量只能指向同一类型的变量。例如下列用法是错误的:int*p;floaty;p=&y;这是因为指针变量p只能指向整型变量。(5)只有当指针变量指向确定地址后才能被引用。例如下列用法是错误的:int*p;*p=5;(3)(*px)++相当于x++。如果没有括号,成为*px+7.2一维数组与指针运算7.2.1一维数组的数组名一维数组的数组名表示的是该数组中第一个数组元素的存储地址。数组名是一个指针常量,而不是指针变量,因此数组名的值是不能修改的。intnum[5];ntgrade[5];

int*ptr;

ptr=num;则表示ptr指向数组num的起始位置。grade=num;是非法的。

7.2一维数组与指针运算7.2.1一维数组的数组名7.2.2一维数组的下标与指针若有:inta[10],*p;p=a;则:a[i]*(a+i)*(p+i)p[i]是等价的。p可以++,而a不能++。7.2.2一维数组的下标与指针若有:[例子]编程实现一维数组array[10]={98,124,58,78,90,587,21,0,-65,106}的求和,要求使用间接访问表达式表示数组元素。#include<stdio.h>#defineN10intmain(){ intarray[N]={98,124,58,78,90,587,21,0,-65,106}; intsum=0; for(inti=0;i<N;i++) sum+=*(array+i); printf("sum=%5d\n",sum); return0;}sum+=*(p+i);//也可以换成*p++

int*p=array;[例子]编程实现一维数组array[10]={98,[例子]编程实现一维数组array[10]={98,124,58,78,90,587,21,0,-65,106}的求和,要求使用间接访问表达式表示数组元素。#include<stdio.h>#defineN10intmain(){ intarray[N]={98,124,58,78,90,587,21,0,-65,106}; intsum=0; for(int*p=array;p<array+N;p++) sum+=*p; printf("sum=%5d\n",sum); return0;}[例子]编程实现一维数组array[10]={98,[例子]使用指针实现冒泡排序法,将具有10个数组元素的一维整型数组array[10]=

{98,124,58,78,90,587,21,0,-65,106}按照由大到小的排序进行排序,输出排序前后的数组。#include<stdio.h>#defineN10intmain(){ intarray[N]={98,124,58,78,90,587,21,0,-65,106}; inti,t,*p=array; for(i=0;i<N-1;i++) for(p=array;p<array+N-1-i;p++) if(*p<*(p+1)) {t=*p;*p=*(p+1);*(p+1)=t;} for(p=array;p<array+N;p++) printf("%5d",*p); return0;}[例子]使用指针实现冒泡排序法,将具有10个数组元素的一维[例子]编写程序,实现一维数组A[10]元素值循环左移3位(要求用指针实现)。#include<stdio.h>#defineN10intmain(){intarray[N]={98,124,58,78,90,587,21,0,-65,106}; inti,t,*p=array; for(i=1;i<=3;i++) { t=*array; for(p=array+1;p<=array+N-1;p++) *(p-1)=*p; *(p-1)=t; } for(p=array;p<array+N;p++) printf("%5d",*p); return0;}[例子]编写程序,实现一维数组A[10]元素值循环左移3位7.2.3数组作函数的参数1.数组元素作函数的参数数组元素作函数的参数与普通变量作函数的参数本质相同。数组元素作函数实参时,仅仅是将其代表的值作为实参处理。数组中元素作为函数的实参,与简单变量作为实参一样,结合的方式是单向的值传递。7.2.3数组作函数的参数1.数组元素作函数的参【例】数组元素作函数的参数。#include"stdio.h"floatmax(floatn,floatz)/*函数有二个形参n,z*/{ if(n>z)returnn;elsereturnz;}voidmain(){ floatm,a[]={3.2,180,2.3,35,56,67,68,45,-34,10};intk; m=a[0]; for(k=1;k<10;k++)/*循环9次*/ m=max(m,a[k]);/*调用9次函数,实参m和a[k]给形参n,z*/ printf("%.2f\n",m);/*输出m和值*/}特别注意:数组元素只能作为函数的实参,不能作为函数的形参。【例】数组元素作函数的参数。#include"stdio.2.数组名作函数参数数组名代表数组的首地址,在数组名作为函数的参数时,形参和实参都应该是数组名(或是指针)。在函数调用时,实参给形参传递的数据是实参数组的首地址,即实参数组和形参数组完全等同,是存放在同一存储空间的同一个数组,形参数组和实参数组共享存储单元。如果在函数调用过程中形参数组的内容被修改了,实际上也是修改了实参数组的内容。2.数组名作函数参数数组名代表数组的首地址,在数组名作为有四种形式:(1)实参与形参都用数组名。(2)实参用数组名,形参用指针变量。(3)实参与形参都用指针变量。(4)实参用指针变量,形参用数组名。例:编写一个输出一维数组的函数,在主程序中调用该函数。

形参:voidpntarray(intb[],intN)/(int*b,intN)实参:pntarray(array,N)/(p,N)

其中:array为数组名,p为指向数组array的指针有四种形式:例:编写一个输出一维数组的函数,在主程序中调用该voidoutput(intb[],intn){int*ptr;for(ptr=b;ptr<b+n;ptr++)printf("%5d",*ptr);printf("\n");}voidmaopao(intb[],intn){inti,temp,*px;for(i=0;i<n-1;i++)for(px=b;px<b+n-1-i;px++)if(*px<*(px+1)){temp=*px;*px=*(px+1);*(px+1)=temp;}}intfind(intb[],intn,intx){intflag=0,bot,top,mid;bot=0;top=n-1;while(bot<=top){mid=(bot+top)/2;if(*(b+mid)==x){flag=1;break;}elseif(x<*(b+mid))bot=mid+1;elsetop=mid-1;}returnflag;}voidmain(){intarray[N]={96,35,12,58,78,90,587,21,0,-65};intx;output(array,N);//调用output函数输出排序前数组maopao(array,N);//调用maopao函数对数组排序output(array,N);//调用output函数输出排序后数组printf("inputdata:");scanf("%d",&x);//输入要找的数xif(find(array,N,x))//调用find函数查找x在数组中是否存在printf("%d在数组中存在\n",x);elseprintf("%d不在数组array中!\n",x);}#include<stdio.h>#defineN10voidoutput(intb[],intn)void7.3多维数组为了表示具有两个下标的元素组成的二维数据队列,如距阵或需要两个以上的下标的元素,则使用多维数组,维即元素的下标具有的下标个数,称为数组的维数。7.3多维数组为了表示具有两个下标的元素组成的二维数据队7.3.1多维数组的说明、引用和存储结构1.多维数组的说明说明二维数组的一般形式如下:类型说明符数组名[常量表达式1][常量表达式2];例如,说明语句inta[2][3],b[4][3]; 注意不能写成:inta[2,3],b[4,3];7.3.1多维数组的说明、引用和存储结构1.多维数组的例:inta[5]a[0]a[1]a[2]a[3]a[4]逻辑结构物理结构地址内存元素100101102103104105106107108109110111112113114115116117118119a[0]a[1]a[2]a[3]a[4]例:inta[5]a[0]a[1]a[2]a[3]a[4]例:inta[5][5]a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]a[2][0]a[2][1]a[2][2]a[2][3]a[2][4]a[3][0]a[3][1]a[3][2]a[3][3]a[3][4]a[4][0]a[4][1]a[4][2]a[4][3]a[4][4]逻辑结构物理结构地址内存元素在C语言中,两维数组是按行的顺序存放的。100,101102,103104,105106,107108,109110,111112,113114,115116,117118,119120,121122,123124,125126,127196,197198,199a[0]a[1]a[2]a[3]a[4]例:inta[5][5]a[0][0]a[0][1]a[a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]a[2][0]a[2][1]a[2][2]a[2][3]a[2][4]a[3][0]a[3][1]a[3][2]a[3][3]a[3][4]a[4][0]a[4][1]a[4][2]a[4][3]a[4][4]上三角找出数组下标的关系。a[0][0]a[0][1]a[0][2]a[0][3]a[2.多维数组的引用二维数组元素的表示形式为:数组名[下标][下标]例如:a[2][3]。下标可以是整型表达式,例如a[2-1][2*2-1],不要写成a[2,3]、a[2-1,2*2-1]形式。例如:b[1][2]=a[2][3]/2使用数组元素时,应该注意下标值应在已定义的数组大小的范围内(下标都是从0开始的)。下列用法是错误的。inta[3][4];……a[3][4]=3;注意:只能逐个引用二维数组中的元素;不能一次引用二维数组中的全部元素。2.多维数组的引用7.3.2多维数组的初始化二维数组与一维数组一样,也可以对二维数组进行初始化。在对二维数组进行初始化时要注意以下几点。(1)在分行给二维数组赋初值inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inta[3][4]={{1},{2,3},{4,5,6}};(2)在给全部元素赋初值时,说明语句中可以省略第一维的长度说明(但一对方括号不能省略)。例如下列三个语句是等价的:inta[3][4]={{11,22,33,44},{55,66,77,88},{99,10,11,12}};inta[3][4]={11,22,33,44,55,66,77,88,99,10,11,12};inta[][4]={11,22,33,44,55,66,77,88,99,10,11,12};(3)在分行赋初值时也可以省略第一维的长度说明。例如下列两个语句是等价的:staticinta[3][4]={{11,22},{},{44,55}};staticinta[][4]={{11,22},{},{44,55}};并且,下列两个语句也等价:staticinta[3][4]={{11,22,33},{44,55}};staticinta[][4]={{11,22,33},{44,55},{}};7.3.2多维数组的初始化二维数组与一维数组一样,也可以例.利用随机函数给数组赋值,然后按行输出。#include"stdio.h"#include"stdlib.h"#include"time.h"main(){inta[5][5];inti,j;srand(time(0));for(i=0;i<5;i++)for(j=0;j<5;j++) a[i][j]=rand();for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%6d",a[i][j]);printf("\n");}}例.利用随机函数给数组赋值,然后按行输出。#include例求下列两个矩阵的和矩阵C=A+B#include"stdio.h"#include"stdlib.h"#include"time.h“main(){inta[5][5],b[5][5],c[5][5];;inti,j;srand(time(0));for(i=0;i<5;i++)for(j=0;j<5;j++) {a[i][j]=rand();b[i][j]=rand();}for(i=0;i<5;i++){for(j=0;j<5;j++){c[i][j]=a[i][j]+b[i][j];printf("%6d",c[i][j]);}printf("\n");}}例求下列两个矩阵的和矩阵C=A+B#include"s例求下列两个矩阵的乘积矩阵C=AB。#include"stdio.h"voidmain(){ inti,j,k,c[2][3]; inta[2][4]={1,2,3,4,5,6,7,8}; intb[4][3]={1,5,9,2,6,10,3,7,11,4,8,12}; for(i=0;i<2;i=i+1)/*矩阵相乘,外for循环2次表示行*/ for(j=0;j<3;j=j+1)/*内循环3次表示每行几列*/ { c[i][j]=0; for(k=0;k<4;k=k+1) c[i][j]=c[i][j]+a[i][k]*b[k][j];/*求某一项的值*/ } for(i=0;i<2;i=i+1)/*输出每个新的数组元素*/ { for(j=0;j<3;j=j+1) printf("%6d",c[i][j]); printf("\n\n\n"); }}例求下列两个矩阵的乘积矩阵C=AB。#include"s【例】有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。#include"stdio.h"voidmain(){ inti,j,row=0,colum=0,max; inta[3][4]={{1,2,3,4},{5,6,7,8},{9,13,14,12}}; max=a[0][0];/*把第一个元素的值给max*/ for(i=0;i<=2;i++)/*for循环次数控制行*/ for(j=0;j<=3;j++)/*for循环次数控制列*/ if(a[i][j]>max)/*循环一次,数组元素的值与max比较*/ { max=a[i][j];/*比较后的大数给max*/ row=i;/*把当时比较后大的元素的行给row*/ colum=j;/*把当时比较后大的元素列给colum*/ } printf("max=%d,row=%d,colum=%d\n",max,row,colum);}【例】有一个3×4的矩阵,要求编程序求出其中值最大的那个元素【例】编程实现将从1开始的36个自然数按行赋给二维数组a【6,6】,之后求该数组以主对角线为分割的上三角形元素的平方根之和。想一想:如何按列赋值,如何求下三角形,如何求以次对角线分割的上、下三角形?#include<stdio.h>#include<math.h>voidmain(){inta[6][6],i,j,k=1;doubles=0;for(i=0;i<6;i++){for(j=0;j<6;j++){a[i][j]=k;k++;printf("%4d",a[i][j]);}printf("\n");}for(i=0;i<6;i++)for(j=i;j<6;j++)s=s+sqrt(a[i][j]);printf("%.3f",s);}【例】编程实现将从1开始的36个自然数按行赋给二维数组a【6【例】编程求二维数组a【6,6】各行元素值之和。#include<stdio.h>#include<math.h>voidmain(){inta[6][6],i,j,b[6];for(i=0;i<6;i++){for(j=0;j<6;j++){a[i][j]=i+j;printf("%4d",a[i][j]);}printf("\n");}for(i=0;i<6;i++){b[i]=0;for(j=0;j<6;j++)b[i]=b[i]+a[i][j];printf("%4d",b[i]);}}想一想:如何求各列元素值之和,如何求每行、每列元素的最大值?【例】编程求二维数组a【6,6】各行元素值之和。#inclu二维数组的数组名(1)1.一维数组的数组名例:inta[10];

则a表示整个数组的首地址,也就是a[0]的地址,即&a[0]。a+i:表示第i个元素的地址。*(a+i):表示第i个元素的值(即a[i])。二维数组的数组名(1)1.一维数组的数组名二维数组的数组名(2)2.二维数组的数组名例:inta[4][5];

则表示a有元素4个,即a[4]。每个a[i]又含有5个元素,这又是一个一维数组。可以把a[i]看成是一个一维数组b。即b[5]a+i:二维数组a的第i个元素的地址,即第i行的地址。是一个整体。*(a+i):是第i行第0个元素的地址,即数组b的首地址。

二维数组的数组名(2)2.二维数组的数组名【例】输出以下的杨辉三角形(要求输出10行)。#include"stdio.h"#defineN10voidmain(){ inti,j,a[N][N]; for(i=0;i<N;i++) {for(j=0;j<=i;j++)if(j==0||i==j) a[i][j]=1; else a[i][j]=a[i-1][j-1]+a[i-1][j]; } for(i=0;i<N;i++){ for(j=0;j<=i;j++) printf("%6d",a[i][j]); printf("\n");} printf("\n");}计算公式:a[i][j]=a[i-1][j-1]+a[i-1][j]除第一列和对角线元素【例】输出以下的杨辉三角形(要求输出10行)。#includ7.5使用内存动态分配实现动态数组

通常情况下,运行中的很多存储要求在编写程序时无法确定,因此需要一种机制,可以根据运行时的实际存储需要分配适当的存储空间,用于存放那些在程序运行中才能确定存储大小的数据。C提供了动态存储管理机制,允许程序动态申请和释放存储空间。7.5使用内存动态分配实现动态数组通常情况下,运7.5.1动态内存分配的步骤1.了解需要多少内存空间;2.利用C提供的动态分配函数来分配所需要的内存空间;3.使指针指向获得的存储空间,以便用指针在该空间内实施运算或操作;4.使用完毕所分配的内存空间后,释放这一空间。7.5.1动态内存分配的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论