




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第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.了解需要多少內存空間;7.5.2動態內存分配函數需要的頭文件:stdlib.h(1)動態存儲分配函數malloc()void*malloc(unsignedsize)功能:在內存的動態存儲區中分配一個連續空間,其長度為size。如果申請才成功返回一個指向所分配內存空間的起始地址的指針,否則返回NULL(值為0)。調用形式:(類型說明符*)malloc(size)7.5.2動態內存分配函數需要的頭文件:stdlib.h例:intsize=50;int*p=(int*)malloc(size*sizeof(int));if(p==NULL){printf("Notenoughspacetoallocate!\n");exit(-1);}在調用函數malloc()時,最好利用函數sizeof()來計算存儲塊的大小,不要直接寫整數,因為不同平臺的數據類型所占存儲空間大小可能不相同。雖然這里存儲空間是動態分配的,但它的大小在分配后也是確定的,請注意不要越界使用。例:(2)分配調整函數realloc()函數原型是:void*realloc(void*ptr,unsignedsize)功能:更改以前的存儲分配空間。ptr必須是以前通過動態存儲分配得到的指針,參數size為現在需要的存儲空間的大小。如果調整失敗,返回NULL,同時原來ptr指向存儲空間的內容不變。如果調整成功,返回一片能存儲大小為size的存儲空間,并保證該空間的內容與原存儲空間一致。如果size小于原存儲空間的大小,則內容為原存儲空間前size范圍內的數據;如果新存儲空間更大,則原有數據存儲在新存儲空間的前一部分。如果分配成功,原存儲空間的內容就可能改變,因此不允許再通過ptr使用它。(2)分配調整函數realloc()(3)動態存儲釋放函數free()函數原型是:voidfree(void*ptr)功能:釋放ptr所指向的一塊內存空間,ptr是一個任意類型的指針變量,它指向被釋放區域的首地址。被釋放區應是由malloc函數所分配的區域。調用形式為:free(ptr);(3)動態存儲釋放函數free()(4)計數動態存儲分配函數calloc()函數原型是:void*calloc(unsignedn,unsignedsize)功能:在內存的動態存儲空間中分配n個連續空間,每個存儲空間的長度為size,并且在分配后還把存儲空間里全部初始化為0值。如果申請成功,則返回一個指向被分配存儲空間的起始地址的指針,否則返回NULL(值為0)。(4)計數動態存儲分配函數calloc()例7-26集合array1={12,45,69,7,10},先要將數據100追加在該集合中,請編程實現該
過程。輸出追加前后集合中的數據。#include<stdio.h>#include<stdlib.h>#defineN5intmain(){ int*array1=(int*)malloc(N*sizeof(int)); inti; *(array1)=12; *(array1+1)=45; *(array1+2)=69; *(array1+3)=7; *(array1+4)=10; printf("追加前的集合array1:\n"); for(i=0;i<N;i++) printf("%5d",*(array1+i)); printf("\n"); int*p=(int*)realloc(array1,(N+1)*sizeof(int)); if(p==NULL) { printf("Notenoughspacetoallocate!\n"); exit(-1); } *(p+N)=100; printf("追加后的集合array1:\n"); for(i=0;i<=N;i++) printf("%5d",*(p+i)); printf("\n"); //free(array1); free(p); return0;}例7-26集合array1={12,45,69,7,10}第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}的求和,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師資格證學習方法的多樣性試題及答案
- 2024年農藝師考試準備內容試題及答案
- 福建事業單位考試教育標準探討試題及答案
- 2024年食品安全員考試應對方案試題及答案
- 2024年物理知識競賽試題及答案收集
- 園藝師溫室環境調控技術試題及答案
- 賣炭翁題及答案中考試題
- 農村數字經濟的前景與發展試題及答案
- 園藝師植物資源與生態系統服務考核試題及答案
- 2024秋七年級數學上冊 第三章 一元一次方程3.2 解一元一次方程(一)合并同類項 2用移項法解一元一次方程教學設計(新版)新人教版
- Starter Unit2 單詞英漢互譯 2024-2025學年人教版英語七年級上冊
- 投資資金合同協議書
- 股權轉讓確認函
- YDT 4492-2023工業互聯網 時間敏感網絡技術要求
- 徐州2024年江蘇徐州睢寧縣招聘教師306人筆試歷年典型考題及考點附答案解析
- 設計和開發控制程序-國軍標
- 紀念中國第一顆原子彈爆炸50周年
- 江西省南昌二十八中教育集團2023-2024學年八年級下學期期中考試數學試卷
- 中考數學專題復習《代數推理題》知識點梳理及典例講解課件
- 第十六章-中國文化的基本精神
- 小學語文六年級下冊第三單元作業設計
評論
0/150
提交評論