c語言程序設(shè)計第7章數(shù)組課件_第1頁
c語言程序設(shè)計第7章數(shù)組課件_第2頁
c語言程序設(shè)計第7章數(shù)組課件_第3頁
c語言程序設(shè)計第7章數(shù)組課件_第4頁
c語言程序設(shè)計第7章數(shù)組課件_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第7章數(shù)組本章要點(1)數(shù)值型數(shù)組(一維、二維)(2)一維數(shù)組與指針運算(3)數(shù)組作函數(shù)的參數(shù)。本章難點(1)一維數(shù)組、多維數(shù)組的說明、賦值、輸入輸出方法。(2)數(shù)組的有關(guān)算法,特別是排序的算法。(3)利用指針實現(xiàn)數(shù)組的相關(guān)運算。第7章數(shù)組本章要點數(shù)組是具有相同的數(shù)據(jù)類型且按一定次序排列的一組變量的集合體,構(gòu)成一個數(shù)組的這些變量稱為數(shù)組元素。數(shù)組有一個統(tǒng)一的名字叫數(shù)組名。與高中的數(shù)列類似:數(shù)列a:a1,a2,a3,a4,……,ai,……,an有一個下標數(shù)列a:a1,1,a1,2,a1,3,a1,4,……,ai,j,……

有二個下標數(shù)組a:a[1],a[2],a[3],……,a[i],……,a[n]a[0]a[1]a[2]……a[n-1]數(shù)組是具有相同的數(shù)據(jù)類型且按一定次序排列的一組變量的集合體,7.1數(shù)組說明下標7.1.1數(shù)組的說明當需要處理大量的同類型數(shù)據(jù)時,利用數(shù)組是非常方便的。C語言規(guī)定,程序中用到的數(shù)組也必須先進行說明(定義)。說明一維數(shù)組的方式如下類型說明符數(shù)組名[常量表達式];例如,inta[5],b[18];doublexy[20];共說明了3個一維數(shù)組:整型一維數(shù)組a,共包括5個元素(a[0]~a[4]),數(shù)組中的每一個元素均為整型;整型一維數(shù)組b,共包括18個元素(b[0]~b[17]),其中的每一個元素也都為整型;雙精度實型一維數(shù)組xy,共包括20個元素(xy[0]~xy[19]),其中的每一個元素均為雙精度實型。7.1數(shù)組說明下標7.1.1數(shù)組的說明關(guān)于數(shù)組的說明要注意以下幾個問題:(1)數(shù)組名的命名規(guī)則與變量名相同。(2)說明數(shù)組大小的常量表達式必須為整型,并且只能用方括號括起來。(3)說明數(shù)組大小的常量表達式可以是符號常量、常量,但不能是變量。constinti=3;inta[i];(4)數(shù)組元素的下標是從0開始的,到n-1,共含有n個元素。例如,inta[4];說明了一個長度為4的整型一維數(shù)組,在這個數(shù)組中的4個元素分別為a[0]、a[1]、a[2]、a[3],其中并不包含元素a[4]。關(guān)于數(shù)組的說明要注意以下幾個問題:(1)數(shù)組名的命名規(guī)則與變7.1.2數(shù)組引用數(shù)組必須先說明,后引用(使用),在C語言中,只能逐個引用數(shù)組元素,不能一次引用數(shù)組中的全部元素。數(shù)組元素的表示形式為數(shù)組名[下標]下標可以是整形常量或整形表達式。例如,b[0]=b[3]*2+b[1]-b[2*2]7.1.2數(shù)組引用數(shù)組必須先說明,后引用(使用),在C語【例】數(shù)組元素的引用。main(){inti,a[5];for(i=0;i<=4;i++)/*這個for循環(huán)完成對數(shù)組元素的賦值*/ a[i]=i;for(i=4;i>=0;i--)/*這個for循環(huán)完成對數(shù)組元素的輸出*/ printf("%2d",a[i]);}運行結(jié)果如下:43210【例】數(shù)組元素的引用。7.1.3數(shù)組的初始化即對數(shù)組元素的第一次賦值。(1)在說明數(shù)組時對數(shù)組元素賦以初值。例如,inta[5]={0,1,2,3,4};將數(shù)組元素的初值依次放在一對花括弧內(nèi)。經(jīng)過上面的說明和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4。對數(shù)組元素賦初值后,在程序中還可以用其他方式(如賦值語句、輸入函數(shù)等)重新賦值。a[1]=51;a[2]=62;a[3]=43;a[4]=24;(2)只給一部分數(shù)組元素賦值。例如,

inta[5]={0,1};說明a數(shù)組有5個元素,但花括弧內(nèi)只提供2個初值,這表示只給前面2個元素賦初值,后3個元素值為0。a[0]=0、a[1]=1、a[2]=0、a[3]=0、a[4]=0。注意:如果使用inta[5];僅表示定義了一個長度為5的數(shù)組,系統(tǒng)不會將其初始化為0值,其值是不確定的。7.1.3數(shù)組的初始化即對數(shù)組元素的第一次賦值。(3)如果想使一個數(shù)組中全部元素值為0,可以寫成,inta[5]={0,0,0,0,0};或inta[10]={0};(4)在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。例如,inta[]={1,2,3,4,5};或者inta[5]={1,2,3,4,5};(5)靜態(tài)數(shù)組

staticinta[5];若數(shù)組沒有被初始化,則元素自動設(shè)置為0.(3)如果想使一個數(shù)組中全部元素值為0,可以寫成,例

計算并輸出全班30個學(xué)生C語言程序設(shè)計課程的平均成績以及每個人的成績與平均成績之差。#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個學(xué)生C語言程序設(shè)計課程的平均成績以練習(xí)1、利用隨機函數(shù)對一維數(shù)組賦值,之后輸出該數(shù)組。(數(shù)組長度自定)#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]);}}練習(xí)2、找出一個數(shù)組中最大的元素值。#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、找出一個數(shù)組中最大的元素值。#include<stdio3、把數(shù)組右循環(huán)移動1位。#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10main(){inti,x[N],t;srand(time(0));printf("原始數(shù)組:");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右移后數(shù)組:");for(i=0;i<N;i++)printf("%4d",x[i]);}3、把數(shù)組右循環(huán)移動1位。#include<stdio.h>4、把一個數(shù)組倒序。#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10main(){inti,x[N],k,t;srand(time(0));printf("原始數(shù)組:");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倒序后數(shù)組:");for(i=0;i<N;i++)printf("%4d",x[i]);}4、把一個數(shù)組倒序。#include<stdio.h>//倒7.1.4數(shù)組的運算(排序與查找)1.起泡法排序例4用起泡法對10個數(shù)排序(由小到大)。#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++) /*比較趟數(shù)*/ for(j=0;j<N-1-i;j++)/*每趟比較的次數(shù)*/ if(a[j]>a[j+1])/*相鄰二數(shù)相比*/ {t=a[j];a[j]=a[j+1];a[j+1]=t;}/*交換相鄰二數(shù)*/printf("thesortednmber:\n");for(i=0;i<N;i++)/*輸出所有數(shù)組元素*/ printf("%3d",a[i]);}7.1.4數(shù)組的運算(排序與查找)1.起泡法排序for(i=0;i<N-1;i++) /*比較趟數(shù):N-1趟*/ for(j=0;j<N-1-i;j++)/*每趟比較的次數(shù):N-1-i次*/ if(a[j]>a[j+1])/*相鄰二數(shù)相比*/ {t=a[j];a[j]=a[j+1];a[j+1]=t;}/*交換相鄰二數(shù)*/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(“插入數(shù)值前:\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(“插入數(shù)值后:\n");for(i=0;i<N;i++)printf("%5d",array[i]);printf("\n");return0;}2.插入排序#include<stdio.h>for(i3.順序查找(不要求數(shù)組有序)#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.順序查找(不要求數(shù)組有序)4.折半查找法(只能對有序數(shù)列進行查找)#defineN10/*N代表數(shù)據(jù)的個數(shù)*/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;/*給數(shù)組下界和上界變量賦初值*/ find=0;/*find=0代表設(shè)有找到*/ while(bot<=top) { mid=(top+bot)/2;/*計算中間要比較的元素小標*/ if(x==a[mid]) {find=1;break;/*查找成功*/ } elseif(x<a[mid]) top=mid-1;/*數(shù)據(jù)X在下半部分*/ else bot=mid+1;/*數(shù)據(jù)X在上半部分*/ }if(find==1)printf("thenumberisfoundtheno.%d!\n",mid);elseprintf("thenumberisnotfound!\n");}4.折半查找法(只能對有序數(shù)列進行查找)c語言程序設(shè)計第7章數(shù)組課件1.把兩個長度相同的數(shù)組的對應(yīng)元素相加。2.從數(shù)組a中刪除一個值為x的元素。練習(xí)1.把兩個長度相同的數(shù)組的對應(yīng)元素相加。練習(xí)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//從數(shù)組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稱為間接訪問。地址的存儲與使用補充內(nèi)容(第6章)intx,*px;地址的存儲與使用補充內(nèi)容(第6章)(1)&取地址運算符。(2)*指針運算符或間接訪問運算符。*(&x)=3*px=3x=3三者等價。指針的說明和引用(1)&取地址運算符。指針的說明和引用注意以下幾點:(1)&運算符只能作用于變量,包括基本類型的變量、數(shù)據(jù)元素、結(jié)構(gòu)變量或結(jié)構(gòu)的成員,不能作用于數(shù)組名、常量、非左值表達式或寄存器變量。例如,doubler,a[20];inti;registerintk;則&r、&a[0]、&a[i]是正確的,而&(2*r)、&a、&k是非法操作。(2)如果px指向x,則*px可以出現(xiàn)在x可以出現(xiàn)的任何位置,因為*px即表示x。注意以下幾點:(3)(*px)++相當于x++。如果沒有括號,成為*px++,即為*(px++),因為++和*為同一優(yōu)先級別,結(jié)合方向為自右向左,因此它表示先對px進行*運算,得到x的值,然后使px的值增1,這樣px就不再指向x了.(4)指針變量只能指向同一類型的變量。例如下列用法是錯誤的:int*p;floaty;p=&y;這是因為指針變量p只能指向整型變量。(5)只有當指針變量指向確定地址后才能被引用。例如下列用法是錯誤的:int*p;*p=5;(3)(*px)++相當于x++。如果沒有括號,成為*px+7.2一維數(shù)組與指針運算7.2.1一維數(shù)組的數(shù)組名一維數(shù)組的數(shù)組名表示的是該數(shù)組中第一個數(shù)組元素的存儲地址。數(shù)組名是一個指針常量,而不是指針變量,因此數(shù)組名的值是不能修改的。intnum[5];ntgrade[5];

int*ptr;

ptr=num;則表示ptr指向數(shù)組num的起始位置。grade=num;是非法的。

7.2一維數(shù)組與指針運算7.2.1一維數(shù)組的數(shù)組名7.2.2一維數(shù)組的下標與指針若有:inta[10],*p;p=a;則:a[i]*(a+i)*(p+i)p[i]是等價的。p可以++,而a不能++。7.2.2一維數(shù)組的下標與指針若有:[例子]編程實現(xiàn)一維數(shù)組array[10]={98,124,58,78,90,587,21,0,-65,106}的求和,要求使用間接訪問表達式表示數(shù)組元素。#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;[例子]編程實現(xiàn)一維數(shù)組array[10]={98,[例子]編程實現(xiàn)一維數(shù)組array[10]={98,124,58,78,90,587,21,0,-65,106}的求和,要求使用間接訪問表達式表示數(shù)組元素。#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;}[例子]編程實現(xiàn)一維數(shù)組array[10]={98,[例子]使用指針實現(xiàn)冒泡排序法,將具有10個數(shù)組元素的一維整型數(shù)組array[10]=

{98,124,58,78,90,587,21,0,-65,106}按照由大到小的排序進行排序,輸出排序前后的數(shù)組。#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;}[例子]使用指針實現(xiàn)冒泡排序法,將具有10個數(shù)組元素的一維[例子]編寫程序,實現(xiàn)一維數(shù)組A[10]元素值循環(huán)左移3位(要求用指針實現(xiàn))。#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;}[例子]編寫程序,實現(xiàn)一維數(shù)組A[10]元素值循環(huán)左移3位7.2.3數(shù)組作函數(shù)的參數(shù)1.數(shù)組元素作函數(shù)的參數(shù)數(shù)組元素作函數(shù)的參數(shù)與普通變量作函數(shù)的參數(shù)本質(zhì)相同。數(shù)組元素作函數(shù)實參時,僅僅是將其代表的值作為實參處理。數(shù)組中元素作為函數(shù)的實參,與簡單變量作為實參一樣,結(jié)合的方式是單向的值傳遞。7.2.3數(shù)組作函數(shù)的參數(shù)1.數(shù)組元素作函數(shù)的參【例】數(shù)組元素作函數(shù)的參數(shù)。#include"stdio.h"floatmax(floatn,floatz)/*函數(shù)有二個形參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++)/*循環(huán)9次*/ m=max(m,a[k]);/*調(diào)用9次函數(shù),實參m和a[k]給形參n,z*/ printf("%.2f\n",m);/*輸出m和值*/}特別注意:數(shù)組元素只能作為函數(shù)的實參,不能作為函數(shù)的形參?!纠繑?shù)組元素作函數(shù)的參數(shù)。#include"stdio.2.數(shù)組名作函數(shù)參數(shù)數(shù)組名代表數(shù)組的首地址,在數(shù)組名作為函數(shù)的參數(shù)時,形參和實參都應(yīng)該是數(shù)組名(或是指針)。在函數(shù)調(diào)用時,實參給形參傳遞的數(shù)據(jù)是實參數(shù)組的首地址,即實參數(shù)組和形參數(shù)組完全等同,是存放在同一存儲空間的同一個數(shù)組,形參數(shù)組和實參數(shù)組共享存儲單元。如果在函數(shù)調(diào)用過程中形參數(shù)組的內(nèi)容被修改了,實際上也是修改了實參數(shù)組的內(nèi)容。2.數(shù)組名作函數(shù)參數(shù)數(shù)組名代表數(shù)組的首地址,在數(shù)組名作為有四種形式:(1)實參與形參都用數(shù)組名。(2)實參用數(shù)組名,形參用指針變量。(3)實參與形參都用指針變量。(4)實參用指針變量,形參用數(shù)組名。例:編寫一個輸出一維數(shù)組的函數(shù),在主程序中調(diào)用該函數(shù)。

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

其中:array為數(shù)組名,p為指向數(shù)組array的指針有四種形式:例:編寫一個輸出一維數(shù)組的函數(shù),在主程序中調(diào)用該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);//調(diào)用output函數(shù)輸出排序前數(shù)組maopao(array,N);//調(diào)用maopao函數(shù)對數(shù)組排序output(array,N);//調(diào)用output函數(shù)輸出排序后數(shù)組printf("inputdata:");scanf("%d",&x);//輸入要找的數(shù)xif(find(array,N,x))//調(diào)用find函數(shù)查找x在數(shù)組中是否存在printf("%d在數(shù)組中存在\n",x);elseprintf("%d不在數(shù)組array中!\n",x);}#include<stdio.h>#defineN10voidoutput(intb[],intn)void7.3多維數(shù)組為了表示具有兩個下標的元素組成的二維數(shù)據(jù)隊列,如距陣或需要兩個以上的下標的元素,則使用多維數(shù)組,維即元素的下標具有的下標個數(shù),稱為數(shù)組的維數(shù)。7.3多維數(shù)組為了表示具有兩個下標的元素組成的二維數(shù)據(jù)隊7.3.1多維數(shù)組的說明、引用和存儲結(jié)構(gòu)1.多維數(shù)組的說明說明二維數(shù)組的一般形式如下:類型說明符數(shù)組名[常量表達式1][常量表達式2];例如,說明語句inta[2][3],b[4][3]; 注意不能寫成:inta[2,3],b[4,3];7.3.1多維數(shù)組的說明、引用和存儲結(jié)構(gòu)1.多維數(shù)組的例:inta[5]a[0]a[1]a[2]a[3]a[4]邏輯結(jié)構(gòu)物理結(jié)構(gòu)地址內(nèi)存元素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]邏輯結(jié)構(gòu)物理結(jié)構(gòu)地址內(nèi)存元素在C語言中,兩維數(shù)組是按行的順序存放的。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]上三角找出數(shù)組下標的關(guān)系。a[0][0]a[0][1]a[0][2]a[0][3]a[2.多維數(shù)組的引用二維數(shù)組元素的表示形式為:數(shù)組名[下標][下標]例如: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使用數(shù)組元素時,應(yīng)該注意下標值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)(下標都是從0開始的)。下列用法是錯誤的。inta[3][4];……a[3][4]=3;注意:只能逐個引用二維數(shù)組中的元素;不能一次引用二維數(shù)組中的全部元素。2.多維數(shù)組的引用7.3.2多維數(shù)組的初始化二維數(shù)組與一維數(shù)組一樣,也可以對二維數(shù)組進行初始化。在對二維數(shù)組進行初始化時要注意以下幾點。(1)在分行給二維數(shù)組賦初值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多維數(shù)組的初始化二維數(shù)組與一維數(shù)組一樣,也可以例.利用隨機函數(shù)給數(shù)組賦值,然后按行輸出。#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");}}例.利用隨機函數(shù)給數(shù)組賦值,然后按行輸出。#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循環(huán)2次表示行*/ for(j=0;j<3;j=j+1)/*內(nèi)循環(huán)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)/*輸出每個新的數(shù)組元素*/ { 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循環(huán)次數(shù)控制行*/ for(j=0;j<=3;j++)/*for循環(huán)次數(shù)控制列*/ if(a[i][j]>max)/*循環(huán)一次,數(shù)組元素的值與max比較*/ { max=a[i][j];/*比較后的大數(shù)給max*/ row=i;/*把當時比較后大的元素的行給row*/ colum=j;/*把當時比較后大的元素列給colum*/ } printf("max=%d,row=%d,colum=%d\n",max,row,colum);}【例】有一個3×4的矩陣,要求編程序求出其中值最大的那個元素【例】編程實現(xiàn)將從1開始的36個自然數(shù)按行賦給二維數(shù)組a【6,6】,之后求該數(shù)組以主對角線為分割的上三角形元素的平方根之和。想一想:如何按列賦值,如何求下三角形,如何求以次對角線分割的上、下三角形?#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);}【例】編程實現(xiàn)將從1開始的36個自然數(shù)按行賦給二維數(shù)組a【6【例】編程求二維數(shù)組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]);}}想一想:如何求各列元素值之和,如何求每行、每列元素的最大值?【例】編程求二維數(shù)組a【6,6】各行元素值之和。#inclu二維數(shù)組的數(shù)組名(1)1.一維數(shù)組的數(shù)組名例:inta[10];

則a表示整個數(shù)組的首地址,也就是a[0]的地址,即&a[0]。a+i:表示第i個元素的地址。*(a+i):表示第i個元素的值(即a[i])。二維數(shù)組的數(shù)組名(1)1.一維數(shù)組的數(shù)組名二維數(shù)組的數(shù)組名(2)2.二維數(shù)組的數(shù)組名例:inta[4][5];

則表示a有元素4個,即a[4]。每個a[i]又含有5個元素,這又是一個一維數(shù)組??梢园補[i]看成是一個一維數(shù)組b。即b[5]a+i:二維數(shù)組a的第i個元素的地址,即第i行的地址。是一個整體。*(a+i):是第i行第0個元素的地址,即數(shù)組b的首地址。

二維數(shù)組的數(shù)組名(2)2.二維數(shù)組的數(shù)組名【例】輸出以下的楊輝三角形(要求輸出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使用內(nèi)存動態(tài)分配實現(xiàn)動態(tài)數(shù)組

通常情況下,運行中的很多存儲要求在編寫程序時無法確定,因此需要一種機制,可以根據(jù)運行時的實際存儲需要分配適當?shù)拇鎯臻g,用于存放那些在程序運行中才能確定存儲大小的數(shù)據(jù)。C提供了動態(tài)存儲管理機制,允許程序動態(tài)申請和釋放存儲空間。7.5使用內(nèi)存動態(tài)分配實現(xiàn)動態(tài)數(shù)組通常情況下,運7.5.1動態(tài)內(nèi)存分配的步驟1.了解需要多少內(nèi)存空間;2.利用C提供的動態(tài)分配函數(shù)來分配所需要的內(nèi)存空間;3.使指針指向獲得的存儲空間,以便用指針在該空間內(nèi)實施運算或操作;4.使用完畢所分配的內(nèi)存空間后,釋放這一空間。7.5.1動態(tài)內(nèi)存分配的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論