版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
高級語言程序設計高級語言程序設計——基于計算思維能力培養(yǎng)高級語言程序設計——基于計算思維能力培養(yǎng)第6章數組及其應用主要內容一維數組向函數傳遞一維數組基于數組的常用算法一維數組的應用二維數組主要內容字符串字符數組的初始化字符數組的輸入/輸出字符串處理函數字符串應用舉例本章思維導圖問題的提出計算機是如何存儲批量數據,并對它們進行處理的?數組具有相同數據類型的集合,特別適合存儲和處理批量數據。一維數組6.16.1.1一維數組的定義與引用一維數組的定義:數據類型
數組名[數組大小];可為基本數據類型或構造數據類型與變量命名
規(guī)則相同必須為整型常量
表達式例如:inta[5];
定義了5個int型變量,分別用a[0]..a[4]表示,它們在內存占用連續(xù)的內存單元。實際編程時通常定義常量來表示數組的大小,例如:#defineN100inta[N];數組一旦定義,在程序執(zhí)行期間其位置和大小不能再發(fā)生變化。編程時應根據需要處理的數據規(guī)模來定義合適的數組大小。
例如,一個年級共有5個班級,每個班級的人數為30~60人不等,如果需要分別對每個班級學生的成績排序,則程序中定義存儲分數的數組大小應按班級的最大人數來確定。一維數組的引用:C語言采用“數組名[下標]”的方式來引用每個數組元素,對長度為N的數組元素,其下標范圍是從0至N-1。C語言的數組名記錄了數組在內存中的起始地址,因此數組名為一個常量,即a==&a[0]。
&a[i]可等價地表示為a+i,操作系統(tǒng)是通過計算a+i得到a[i]的地址來訪問a[i]的。一維數組的引用:
下標可以是常量或變量或整型表達式,但要保證在有效的數組下標范圍內。例如:#defineN10inta[N],i=0;a[2+3]=6; //將a[5]賦值為6a[i++]=10; //將a[0]賦值為10后,i自增1(1)將數組的每個元素清0的代碼為:for(i=0;i<N;i++)
a[i]=0;(2)從鍵盤輸入每個數組元素值的代碼為:for(i=0;i<N;i++)
scanf("%d",&a[i]) //或寫成scanf("%d",a+i);(3)求數組的所有元素之和的代碼為:sum=0;for(i=0;i<N;i++) sum=sum+a[i];(4)從后向前依次輸出數組元素的代碼為:for(i=N-1;i>=0;i--) printf("%5d",a[i]); 【例6.1】編寫程序,輸入10個學生的考試分數,求學生的平均分和超過平均分的學生人數?!痉治觥靠梢远x大小為10的數組來存放學生的分數,計算學生的平均分,再通過循環(huán)統(tǒng)計成績超過平均分的學生人數。#include<stdio.h>#defineN10intmain(){doublea[N],sum=0,ave;inti,counter=0;printf("請輸入%d個學生分數:\n",N);
for(i=0;i<N;i++) //輸入分數scanf("%lf",&a[i]);for(i=0;i<N;i++) //求和 sum+=a[i];
ave=sum/N; //求平均分printf("平均分為:%.2f\n",ave);for(i=0;i<N;i++) //統(tǒng)計超過平均分的學生人數if(a[i]>ave) counter++;printf("超過平均分的學生人數為:%d人.\n",counter);return0;}請輸入10個學生分數:98786790877687568845↙平均分為:77.20超過平均分的學生人數為:6人.數組下標越界錯inta[10],i;該地址與&a[10]相同for(i=0;i<=10;i++) a[i]=0;將使程序出現死循環(huán)非法訪問內存單元錯誤將scanf("%d",&a[i]);寫成scanf("%d",a[i]);6.1.2一維數組的初始化未指定存儲類型的數組默認為auto型數組,與普通的auto變量一樣,分配給數組的內存里的數據是不確定的??赏ㄟ^單步調試觀察數組初始值。6.1.2一維數組的初始化inta[10]={1,2,3,4,5,6,7,8,9,10};將a[0]~a[9]依次初始化為1~10。inta[10]={1,2,3,4,5}; 將a[0]~a[4]被初始化為1~5,而a[5]~a[9]均被初始化為0。6.1.2一維數組的初始化如果初始化列表超出了數組的大小,則將產生編譯錯誤。例如:inta[3]={1,2,3,4};將產生編譯錯誤。6.1.2一維數組的初始化如果在定義數組時進行初始化且省略數組的長度,則編譯器將根據初始化列表的元素個數自動確定數組的長度。例如:inta[]={2,4,6,8,10};此時,數組a的長度為5。6.1.2一維數組的初始化1.以下能定義長度為10的一維數組a且能正確進行初始化的語句是()。inta[10]=(0,0,0,0,0);inta[10]={};inta[]={0};inta[10]={10*1};ABCD提交單選題5分【例6.2】利用數組求斐波那契數列前20項的值。f(0)=1 n=0f(1)=1 n=1f(n)=f(n-1)+f(n-2) n≥210112345619f2358#include<stdio.h>#defineN20intmain(){longlongintfib[N]={1,1};inti;for(i=2;i<N;i++)fib[i]=fib[i-1]+fib[i-2];for(i=0;i<N;i++){if(i%10==0)printf("\n");//每行輸出10個元素printf("%8ld",fib[i]);}return0;}2.寫出下面程序的運行結果。
[填空1]
作答#include<stdio.h>intmain(){inta[]={1,2,3,4},i,j,s=0;j=1;for(i=3;i>=0;i--){s=s+a[i]*j;j=j*10;}printf("s=%d\n",s);return0;}填空題10分主要內容一維數組向函數傳遞一維數組基于數組的常用算法一維數組的應用練習題向函數傳遞
一維數組6.26.2向函數傳遞一維數組1、數組元素作為函數參數與普通變量作函數參數一樣,為
單向值傳遞【例6.3】數組元素作為函數實參示例。#include<stdio.h>#defineN5voidswap(intx,inty){inttemp;temp=x; x=y;y=temp;}intmain(){inta[N]={1,2};printf("%d\t%d\n",a[0],a[1]);swap(a[0],a[1]); printf("%d\t%d\n",a[0],a[1]);return0;} 12122、數組名作為函數實參函數類型函數名(數據類型
數組名[],intn);
或函數類型函數名(數據類型數組名[長度]);當函數參數為數組時,可將數組名作為函數實參。voidfun1(inta[],intn){ inti; for(i=0;i<n;i++) … }可訪問長度為n的數組元素,n可由參數傳入。調用形式:fun1(b,10);voidfun2(inta[10]){ inti; for(i=0;i<10;i++) … }函數中只對數組的前10個元素進行處理。調用形式:fun2(b);【例6.4】數組名作函數參數示例。#include<stdio.h>#defineM5#defineN10voidfun(inta[],intn){inti;for(i=0;i<n;i++)a[i]=i+1;}【例6.4】數組名作函數參數示例。intmain(){inta[M]={0},b[N]={0},i;fun(a,M);fun(b,N-2);for(i=0;i<M;i++)printf("%4d",a[i]);printf("\n");for(i=0;i<N;i++)printf("%4d",b[i]);return0;}函數調用fun(a,M);數組名代表數組首地址函數調用fun(a,M);函數調用fun(b,N-2);函數調用fun(b,N-2);3、定義數組輸入、輸出頭文件#include<stdio.h>#include<stdlib.h>#include<time.h>voidinput(inta[],intn) {inti;printf("請輸入%d個整數(整數間用空格分隔):\n",n);for(i=0;i<n;i++)scanf("%d",a+i);}數組輸入函數voidprint(inta[],intn){inti;printf("\n數組的內容是:\n");for(i=0;i<n;i++){if(i%10==0)printf("\n"); printf("%6d",a[i]);}printf("\n");}數組輸出函數voidinit(inta[],intn){inti;srand(time(0));for(i=0;i<n;i++)a[i]=rand()%1000+1;//用1~1000的數賦值給數組元素}應用隨機函數填充數組將三函數存入Array.h中。在編寫程序時可以通過#include“Array.h”指令來使用以上三個函數。#include"Array.h"#defineN10intmain(){inta[N];input(a,N);print(a,N);return0;}該程序文件應與Array.h文件存于同一文件夾下4.若用數組名作為函數調用時的實參,則實際上傳遞給形參的是()。數組的第一個元素值數組元素的個數數組中全部元素的值數組首地址ABCD提交單選題5分主要內容一維數組向函數傳遞一維數組基于數組的常用算法一維數組的應用練習題基于數組的常用算法及其應用6.36.3基于數組的常用算法及其應用順序查找1數據刪除2數據插入3簡單選擇排序5冒泡排序6數據倒置7尋找最大值4二分查找86.3.1順序查找表的查找順序檢索序號班級名稱姓名學號022級網絡工程聶加望2208066047122級網絡工程潘杰2208066048222級網絡工程秦彪2208066049322級網絡工程邱強22080660514
522級網絡工程唐重喜2208066054012查詢姓名為譚青的同學22級網絡工程譚青2208066053
34422級網絡工程譚青2208066053
順序檢索序號班級名稱姓名學號022級網絡工程聶加望2208066047122級網絡工程潘杰2208066048222級網絡工程秦彪2208066049322級網絡工程邱強2208066051
522級網絡工程唐重喜2208066054012422級網絡工程譚青2208066053
3456查詢姓名為鄒婕的同學【例6.5】編寫一個函數:intseqSearch(inta[],intn,intkey),在數組中查找值為key的數組元素,若查找成功,則返回其在數組中的下標,否則返回檢索失敗的信息?!痉治觥坑捎跀到M在內存中的下標為0~n-1,因此,當查找失敗時可以用-1作為函數的返回值。據此,可以寫出基于數組的順序查找算法。#include"Array.h"#defineN100intseqSearch(inta[],intn,intkey){inti=0;while(i<n&&a[i]!=key)//由前向后依次查找i++;if(i<n) returni;else return-1;}intmain(){inta[N],x,pos;init(a,N); //構造測試數組print(a,N);printf("請輸入要查找的數:\n");scanf("%d",&x);pos=seqSearch(a,N,x);
if(pos!=-1)printf("a[%d]=%d\n",pos,a[pos]);elseprintf("查找失敗!");return0;}如果要從后向前查找,如何實現?22級網絡工程秦彪220806604922級網絡工程邱強220806605122級網絡工程譚青2208066053
22級網絡工程秦彪220806604922級網絡工程邱強220806605122級網絡工程譚青2208066053
表的刪除序號班級名稱姓名學號22級網絡工程聶加望220806604701234122級網絡工程潘杰2208066048
刪除48號學生(潘杰)信息6.3.2數據刪除【例6.6】編寫一個函數intdelData(inta[],intn,intpos),在數組中刪除a[pos]的元素值。30511021631742253364376687743N-1刪除數組元素刪除第pos個位置的元素intdelData(inta[],intn,intpos){}pos6677109…ni9#include"Array.h"#defineN10intdelData(inta[],intn,intpos){inti;if(pos>=0&&pos<n){ for(i=pos+1;i<n;i++) a[i-1]=a[i]; returnn-1; }elsereturnn; }判斷刪除位置是否合法后續(xù)元素依次前移刪除成功,元素減少1個刪除失敗,元素仍為n個intmain(){ inta[N],n,pos;
init(a,N); //構造測試數組 print(a,N); printf("請輸入要刪除的位置:\n"); scanf("%d",&pos);
n=delData(a,N,pos); //在數組中刪除a[pos] print(a,n); return0;}數組的內容是:34870350931655514543756246480請輸入要刪除的位置:2↙數組的內容是:34870931655514543756246480如果要根據輸入的數據值來刪除與其相等的元素,該如何實現?如果數組中存在多個相同的待刪除數據,如何將其全部刪除?22級網絡工程秦彪220806604922級網絡工程邱強220806605122級網絡工程譚青2208066053
表的插入序號班級名稱姓名學號22級網絡工程聶加望220806604722級網絡工程秦彪220806604922級網絡工程邱強220806605122級網絡工程譚青2208066053
01234122級網絡工程潘杰2208066048
插入48號學生(潘杰)信息6.3.2數據插入數組元素的插入算法305110216317422543653766877961196x43536677iN-1數組元素的插入算法在第pos個位置插入值為x的結點intinsertData(inta[],intn,intpos,intx){}pos9101112305110216317422543653…66…7796963343536677100N-1intinsertData(inta[],intn,intpos,intx){}pos空間已滿怎么辦?插入位置不合法怎么辦?pos數組元素的插入算法【例6.7】編寫一個函數insertData(inta[],intn,intpos,intx),在具有n個元素的數組中的pos位置插入一個值為x的元素。intinsertData(inta[],intn,intpos,intx){inti;if(pos>=0&&pos<=n) //判斷位置是否合法 { for(i=n-1;i>=pos;i--)//元素后移
a[i+1]=a[i]; a[pos]=x; //數據插入n++; //元素個數加1 }returnn;}intmain(){ inta[N],n,pos,x; init(a,10); //構造測試數組 print(a,10); printf("請輸入要插入的位置和數據:\n"); scanf("%d%d",&pos,&x); n=insertData(a,10,pos,x);//在數組的pos處插入x print(a,n); return0;}為什么舊款手機短信容量受限?若采用順序表實現,則電話薄、短信容量受限!戶口簿住址變動登記序號發(fā)送方發(fā)送時間短信內容1138791000012013.7.810:22親,………
數組存儲短信息某商場搞促銷,當日購物金額最多者,可返10%購物款。6.3.3尋找最大數若當日客戶購物金額存儲在數組中,任務的關鍵就是在數組中找出最大數?【例6.8】編寫一個函數intfindMax(inta[],intn),在具有n個元素的數組中查找最大數作為函數的返回值。intfindMax(inta[],intn){inti,maxData=a[0];for(i=1;i<n;i++)if(a[i]>maxData)
maxData=a[i];returnmaxData;}假設初始時a[0]為最大數搜索剩余的n-1個元素發(fā)現更大數,則替換intmain(){ inta[N],maxData; init(a,N); //構造測試數組 print(a,N);
maxData=findMax(a,N);//在數組中找最大數 printf("maxData=%d\n",maxData); return0;}若要求返回數組中最大值的位置(下標),查找函數如何修改?intfindMax(inta[],intn){inti,maxIndex=
; //記錄初始位置for(i=1;i<n;i++)if(a[i]>
)
//記錄新位置return
//返回最大數位置
}若要找最小數位置如何修改?0a[maxIndex]maxIndex=i;maxIndex;學號姓名成績2208066001聶加望902208066002潘杰882208066003秦彪922208066004邱強78…6.3.5數據排序排序方法排序方法簡單選擇排序274924160822簡單選擇排序0 1 2 3 4 52222274949找第1個最大數274924160822簡單選擇排序0 1 2 3 4 5找第2個最大數16272727274924160822簡單選擇排序0 1 2 3 4 5找第3個最大數162224274924160822簡單選擇排序0 1 2 3 4 5找第4個最大數274924160822簡單選擇排序0 1 2 3 4 5找第5個最大數274924160822簡單選擇排序0 1 2 3 4 5n個數,共需重復n-1次。若每次找出的是最小數,則可實現升序排列。簡單選擇排序簡單選擇排序簡單選擇排序【例6.9】編寫一個函數voidselectSort(inta[],intn),采用簡單選擇排序法對具有n個元素的數組按升序排序。voidselectSort(inta[],intn){inti,j,minIndex,temp;for(i=0;i<n-1;i++) {minIndex=i; //初始最小值位置for(j=i+1;j<n;j++)//在a[i..n-1]中找最小數if(a[j]<a[minIndex])minIndex=j;【例6.9】編寫一個函數voidselectSort(inta[],intn),采用簡單選擇排序法對具有n個元素的數組按升序排序。if(minIndex!=i)//若最小數不在第i個位置,則交換{ temp=a[i];a[i]=a[minIndex];a[minIndex]=temp;}}}intmain(){inta[N];input(a,N); //輸入待排序數據selectSort(a,N); //排序print(a,N); //輸出排序后數組return0;}請輸入10個整數(整數間用空格分隔):201080706050100304090↙數組的內容是:
102030405060708090100IntelCorei502450MCPU2.5GHZ
4G內存Win7實驗
采用選擇法對不同規(guī)模數據進行升序排列。數據量時間(秒)2100.0472110.0522120.1272130.1532140.4362151.7242166.56721724.992218100.3110.0470.05224.992100.316.3基于數組的常用算法及其應用順序查找1數據刪除2數據插入3簡單選擇排序5冒泡排序6數據倒置7尋找最大值4二分查找8274924160822觀察現象觀察現象272416082249一趟冒泡a[0]<a[1],無須交換一趟冒泡a[1]>a[2],交換a[1]與a[2]一趟冒泡a[2]>a[3],交換a[2]與a[3]一趟冒泡a[3]>a[4],交換a[3]與a[4]一趟冒泡a[4]<a[5],無須交換一趟冒泡a[5]>a[6],交換a[5]與a[6]一趟冒泡a[6]>a[7],交換a[6]與a[7]一趟冒泡最大數在a[7]一趟冒泡算法實現for(i=0;i<n-1;i++) //共需兩兩比較n-1次if(a[i]>a[i+1]) //發(fā)現逆序,則交換{ temp=a[i];a[i]=a[i+1];a[i+1]=temp;}一趟冒泡一趟冒泡的過程可用下面的代碼實現:冒泡排序272416082249冒泡排序272416082249冒泡排序n>1一趟冒泡n--truefalsevoidbubbleSort(inta[],intn){inti,temp;while(n>1)
//參與冒泡的元素個數大于1{for(i=0;i<n-1;i++)//一趟冒泡if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}
n--;
//參與冒泡的數據個數減1}}IntelCorei502450MCPU2.5GHZ
4G內存Win7實驗
采用冒泡法對不同規(guī)模數據進行升序排列。數據量時間(秒)2100.0472110.0592120.0902130.3222140.9212153.68321614.67721758.781218233.120.0470.05958.781233.12改進冒泡排序算法數據已有序改進冒泡排序算法當數據已有序時,如何提前結束冒泡過程?voidbubbleSort(inta[],intn){inti,temp;boolflag=true; //flag==true表示未排好序while(n>1&&flag) {flag=false;for(i=0;i<n-1;i++) //一趟冒泡if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;
flag=true;}
n--;//參與冒泡的數據個數減1}}單擊倒置6.3.6數據倒置案例1:火車時刻表發(fā)車時間查詢?!纠?.11】設計一個函數voidreverse(inta[],intn),將數組進行首尾倒置。9995算法演示:1002013024035046057068090n-1ai…j1095算法演示:9902013024035046057068090n-1ai…j1095算法演示:9902013024035046057068090n-1ai…j【例6.11】設計一個函數voidreverse(inta[],intn),將數組進行首尾倒置。循環(huán)終止條件:i>=j10209909519028037046055064030n-1ai…jvoidreverse(inta[],intn){inti=0,j=n-1,temp;while(i<j){temp=a[i]; //交換a[i]與a[j]a[i++]=a[j];a[j--]=temp;}}【例6.11】設計一個函數voidreverse(inta[],intn),將數組進行首尾倒置。如何用遞歸算法實現?課后習題:編寫函數,采用遞歸法實現數組首尾倒置。voidreverse(inta[],intleft,intright)9995算法演示:1002013024035046057068090n-1aleft…right1095算法演示:9902013024035046057068090n-1aleft…rightaleftright遞歸出口請大家課后實現!順序查找“瞎子”找真幣假幣假幣假幣假幣假幣假幣順序查找效率分析對于具有n個元素的順序表查找成功情況下:
最好情況1次;最壞情況n次。等概率情況的平均查找次數:查找失敗情況下:
n次。順序查找
超市若有10000種不同貨品,每掃描一個條碼時需要在10000種不商品中尋找這件商品的名稱和價格。若1秒內查詢1000次,查完全部貨物耗時10秒。怎樣提高檢索效率?順序查找幸運52——猜價格123456….4096查詢關鍵字150020486.3.7二分查找查詢關鍵字150010246.3.7二分查找查詢關鍵字150015366.3.7二分查找二分檢索序號班級名稱姓名學號022級網絡工程聶加望2208066047122級網絡工程潘杰2208066048222級網絡工程秦彪2208066049322級網絡工程邱強22080660514
522級網絡工程唐重喜2208066054l=0查詢學號為2208066053的同學22級網絡工程譚青2208066053
422級網絡工程譚青2208066053
r=5midl=3mid序號班級名稱姓名學號022級網絡工程聶加望2208066047122級網絡工程潘杰2208066048222級網絡工程秦彪2208066049322級網絡工程邱強22080660514
522級網絡工程唐重喜2208066054l=0查詢學號為2208066052的同學422級網絡工程譚青2208066053
r=5midl=3mid二分檢索序號班級名稱姓名學號022級網絡工程聶加望2208066047122級網絡工程潘杰2208066048222級網絡工程秦彪2208066049322級網絡工程邱強22080660514
522級網絡工程唐重喜2208066054查詢學號為2208066052的同學422級網絡工程譚青2208066053
r=3l=3mid二分檢索序號班級名稱姓名學號022級網絡工程聶加望2208066047122級網絡工程潘杰2208066048222級網絡工程秦彪2208066049322級網絡工程邱強22080660514
522級網絡工程唐重喜2208066054查詢學號為2208066052的同學422級網絡工程譚青2208066053
r=3l=4mid查找失敗二分檢索【例6.12】設計函數intbinSearch(inta[],intn,intkey),采用二分查找算法在升序排列的數組a中查找值為key的元素所在的位置。intbinSearch(inta[],intn,intkey){intleft=,right=
,mid;while(left<=right) { mid=;//二分 if(a[mid]==key)
//查找成功 return; elseif(key<a[mid])right=;elseleft=; } return; //查找失敗}0n-1(left+right)/2midmid-1mid+1-1二分檢索遞歸程序如何實現?主要內容一維數組向函數傳遞一維數組基于數組的常用算法一維數組的應用練習題6.3.8一維數組應用實例1.進位制轉換算法演示:222826838072376543210算法演示:215826838076543210723算法演示:215826838076543210723編程提示:按照先進后出,后進先出來組織數據的結構等為“?!??!纠?.13】編寫一個程序,實現無符號十進制數m到R進制數的轉換功能(一般R取16,8或2)。voiddtoR(unsignedintm,intr){intstack[32]; inttop=0;printf("%d=(",m);while(m) //進位制轉換{stack[top++]=m%r;m=m/r;}【例6.13】編寫一個程序,實現無符號十進制數m到R進制數的轉換功能(一般R取16,8或2)。top--;while(top>=0)//從后向前輸出數組內容{ //轉換為對應的ASCII字符形式輸出printf("%c",stack[top]>9?stack[top]+'A'-10:stack[top]+'0');top--;}printf(")%d\n",r);}intmain(){unsignedintm;printf("請輸入要轉換的十進制正整數:");scanf("%u",&m);dtoR(m,2); //轉換成二進制數dtoR(m,8); //轉換成八進制數dtoR(m,16); //轉換成十六進制數return0;}請輸入要轉換的十進制正整數:215↙215=(11010111)2215=(327)8215=(D7)162.
篩法求素數基本思想:
把從1開始的、某一范圍內的正整數從小到大順序排列,1不是素數,首先把它篩掉。
剩下的數中選擇最小的數是素數,然后去掉它的倍數。依次類推,直到篩子為空時結束。以求1~30以內的素數為例:123456789101112131415161718192021
2223242526272829301不是素數,去掉。剩下的數中2最小,是素數,去掉2的倍數。下一個最小的數是3,是素數,去掉3的倍數?!蟪龅乃財禐椋?357111317192329【例6.14】編寫一個程序用篩法輸出1~N之內的所有素數?!痉治觥烤唧w實現時,可以定義一個大小為N+1的數組,利用下標1~N來表示N個整數,而用a[i]=1來表示i是素數,a[i]=0來表示i不是素數。#include<stdio.h>#defineN200intmain(){intprime[N+1]={0};inti,j,counter=0; //counter為素數計數器for(i=2;i<=N;i++)prime[i]=1; //初始時,將2~N設為素數for(i=2;i<=N;i++)if(prime[i]==1) //i是素數{printf("%5d",i);counter++;if(counter%10==0)printf("\n");for(j=i;j<=N;j+=i)//將i的倍數全部設為非素數prime[j]=0;}return0;}二維數組6.46.4二維數組序號數學C語言英語08090781928867288928039988904991009057989876.4.1二維數組的定義、引用及初始化1.二維數組的定義數據類型
數組名[常量表達式1][常量表達式2];行數列數例如:
inta[3][4];2.二維數組的引用二維數組可通過行下標與列下標來引用,與一維數組相同,行列下標可以是常量、變量或表達式,但要保證其在有效的范圍內。inta[2][4];a[0][1]=1;for(j=0;j<4;j++) a[0][j]=j;printf("%d",a[2][4]);實際編程中,常通過雙重循環(huán)結構來實現對整個二維數組的訪問。for(i=0;i<3;i++){for(j=0;j<4;j++)scanf("%d",&a[i][j]);}二維數組的輸入for(i=0;i<3;i++){for(j=0;j<4;j++) printf("%5d",a[i][j]);printf("\n"); }二維數組的輸出3.二維數組的初始化(1)采用分行賦值。3.二維數組的初始化(2)若在初始化列表中省略每一行的{},按初始化列表從前向后按行優(yōu)先的順序對數組進行賦值,不足部分自動賦值為0。3.二維數組的初始化(3)在對二維數組進行初始化時,可省略數組的行數,編譯器會根據初始化列表的項數自動確定數組的行數。inta[][4]={1,2,3,4,5,6,7,8,9};3.二維數組的初始化將使數組共有4行。inta[][4]={{1,2,3},{4,5,6},{7,8,9,10},{11}};123045607891011000注意:在定義二維數組時不能省略列的定義。10.下列選項中正確的二維數組定義與初始化語句是()。inta[][]={1,2,3,4,5,6};inta[2][]={1,2,3,4,5,6};inta[][3]={1,2,3,4,5,6};inta[2,3]={1,2,3,4,5,6};ABCD提交單選題5分11.已知inti,x[3][3]={1,2,3,4,5,6,7,8,9};,則下面語句
for(i=0;i<3;i++)
printf("%d",x[i][2-i]);的輸出結果是()。147159357369ABCD提交單選題5分12.若定義了intb[][3]={1,2,3,4,5,6,7};,則b數組的行數是()。234無確定值ABCD提交單選題5分6.4.2二維數組應用實例【例6.15】編寫一個程序,定義一個二維數組,從鍵盤輸入該數組的值,然后查找該數組中最大數和其所在的位置并輸出?!痉治觥坎捎秒p重循環(huán)對二維數組進行搜索。#include<stdio.h>#defineM4#defineN5intmain(){inta[M][N],i,j;intmaxData,row,col;printf("請輸入%d行%d列的矩陣:\n",M,N);for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);
maxData=a[0][0]; //maxData用于記錄最大值row=col=0;//row,col分別記錄最大值所在的行與列for(i=0;i<M;i++)for(j=0;j<N;j++)
if(a[i][j]>maxData){maxData=a[i][j]; row=i;col=j;}printf("maxData=a[%d][%d]=%d\n",row,col,maxData);return0;}【例6.16】編程在屏幕上輸出n行楊輝三角形,n由鍵盤輸入。(1)每行的第1個與最后一個數均為1;(2)其它各數等于它上一行左邊列和上一行上一列的兩數之和。#include<stdio.h>#defineN15intmain(){inta[N][N],n;inti,j;printf("請輸入需輸出的楊輝三角行數(小于等于15):");scanf("%d",&n);for(i=0;i<n;i++){a[i][0]=a[i][i]=1;//兩端為1
for(j=1;j<i;j++) 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("%-5d",a[i][j]); printf("\n"); //換行}return0;}【例6.17】有M名學生,學習N門課程,已知所有學生的各科成績,編程實現,分別求每位學生的總分和每門課程的平均成績。如何存儲,如何計算?請輸入1號學生的3門課程成績:7086.590↙請輸入2號學生的3門課程成績:778267↙請輸入3號學生的3門課程成績:567092↙請輸入4號學生的3門課程成績:969088↙-------------------------------------------------------學號總分成績1成績2成績3-------------------------------------------------------1246.5070.0086.5090.002226.0077.0082.0067.003218.0056.0070.0092.004274.0096.0090.0088.00-------------------------------------------------------成績1平均分:74.75成績2平均分:82.13成績3平均分:84.25行數和列數比學生數、課程數多1第0行存放課程的平均分,第0列存放學生的總分。#include<stdio.h>#defineM4#defineN3intmain(){floatscore[M+1][N+1];inti,j;for(i=1;i<=M;i++)//鍵盤輸入學生成績{printf("請輸入%d號學生的%d門課程成績:",i,N);for(j=1;j<=N;j++)scanf("%f",&score[i][j]);}輸入學生成績信息for(i=1;i<=M;i++){score[i][0]=0;//第i位學生的總分存到第i行第0列for(j=1;j<=N;j++) score[i][0]+=score[i][j];}
求每位學生的總分for(j=1;j<=N;j++){score[0][j]=0;for(i=1;i<=M;i++)score[0][j]+=score[i][j];score[0][j]/=M;}
每門課程的平均成績存到所在列的第0行。求每門課程的平均成績printf("------------------------------------------\n");printf("學號\t總分\t成績1\t成績2\t成績3\n");printf("------------------------------------------\n");for(i=1;i<=M;i++){printf("%d\t",i);for(j=0;j<=N;j++)printf("%.2f\t",score[i][j]);printf("\n");}輸出學生成績表printf("------------------------------------------\n");for(j=1;j<=N;j++)printf("成績%d平均分:%.2f:\n",j,score[0][j]);return0;}輸出各門課程的平均成績向函數傳遞
二維數組6.56.5向函數傳遞二維數組當二維數組作為函數的形參時,對應的實參應該是二維數組名。此時,實參向形參傳遞的是二維數組的首地址,函數中對形參數組的訪問實際上是對實參數組的訪問。1234567815263748【例6.17】設計函數transpose,將M行N列的矩陣a轉置為N行M列的矩陣b。矩陣B矩陣A#include<stdio.h>#defineM2#defineN4/*@函數名稱:transpose入口參數:inta[M][N]@函數功能:將M行N列的矩陣a轉置為N行M列的矩陣b@出口參數:數組b*/voidtranspose(inta[M][N],intb[N][M]){inti,j;for(i=0;i<M;i++)for(j=0;j<N;j++) b[j][i]=a[i][j];}intmain(){inta[M][N]={1,2,3,4,5,6,7,8};intb[N][M]={0};inti,j;for(i=0;i<M;i++) //輸出矩陣a{for(j=0;j<N;j++) printf("%4d",a[i][j]);printf("\n");}
transpose(a,b);
//矩陣轉置for(i=0;i<N;i++) //輸出矩陣b{for(j=0;j<M;j++) printf("%4d",b[i][j]);printf("\n");}}可否設計一個通用的二維數組輸出函數,來分別輸出數組a與數組b的內容?print(a,M,N); print(b,N,M); 方案1:將print函數定義為:結論:二組數組形參不能省略列!voidprint(inta[][],intm,intn){inti,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%-4d",a[i][j]);printf("\n");}}編譯時出現“error:arraytypehasincompleteelementtype”的錯誤提示,指示函數的數組形參定義存在問題。方案2:
把函數首部改為:voidprint(inta[][N],intm,intn),函數體不變,再次編譯,編譯錯誤消失。print(a,M,N)print(b,N,M)ArrayA:12345678ArrayB:
15371256方案3:
把函數首部改為voidprint(inta[][M],intm,intn),函數體不變。print(a,M,N)print(b,N,M)ArrayA:12343456ArrayB:15263748C語言規(guī)定,在定義二維數組為形參時,形參數組的行可以省略,但不能省略二維數組的列。調用該函數時實參數組要求與形參數組具有相同的列(行可以不同)。voidprint(inta[][N],intm) {inti,j;for(i=0;i<m;i++){for(j=0;j<N;j++)printf("%-4d",a[i][j]);printf("\n");}}該函數只能用于輸出列為N的二維數組。行參數【例6.18】設計print(inta[][N],intm)函數,輸出行為m列為N的二維數組。#defineN3voidprint(inta[][N],intm) {inti,j;for(i=0;i<m;i++){for(j=0;j<N;j++)printf("%-4d",a[i][j]);printf("\n");}}行參數intmain(){inta[2][N]={{1,2,3},{4,5,6}};intb[3][N]={1,2,3,4,5,6,7,8,9};printf("Arraya:\n");print(a,2);printf("Arrayb:\n");print(b,3);return0;}要設計能處理任意行、任意列的二維數組的
函數,需要用到指針相關知識。主要內容字符串字符數組的初始化字符數組的輸入/輸出字符串處理函數字符串應用舉例字符串及
字符數組6.66.6.1字符串字符串(常量)是用雙引號括起來的若干字符序列。"MynameisTony.""Iamfine\nThankyou."C語言用'\0'('\0'是ASCII為0的字符,注意它與'0'的區(qū)別)來作為字符串結束標識。結束標識結束標識“China”占用6個字節(jié)該串占用17個字節(jié)6.6.1字符串6.6.2字符數組的初始化用字符初始化列表初始化部分單元charb[10]={'C','h','i','n','a'};6.6.2字符數組的初始化若省略數組大小,則自動根據字符初始化列表的項數決定數組大小。chara[]={'C','h','i','n','a'};6.6.2字符數組的初始化C語言沒有提供專門的字符串類型,而是采用字符數組存儲字符串,因此,字符數組有時也稱為字符串變量。用字符初始化列表初始化所有單元chara[5]={'C','h','i','n','a'};6.6.2字符數組的初始化用字符串常量給字符數組初始化時,字符串結束符需要占用一個字節(jié)單元,同時可以省略{}chara[]={"Hello"};與chara[]="Hello";等價具有'\0'結束的字符數組可視為字符串變量。6.6.3字符數組的輸入/輸出chara[10];scanf("%s",a); //輸入字符串printf("%s",a); //輸出字符串(2)用格式控制符%s,按字符串方式進行輸入或輸出。數組名scanf視空格、Tab和回車等字符為字符串的輸入結束符。例如,當輸入Howareyou?時,僅"How"被存入數組a,遇空格結束輸入,并自動在w后面放上'\0',如下所示。How\0
printf("%s",a);從數組a的首地址開始輸出字符串,遇'\0'結束輸出('\0'本身不輸出),輸出完成后光標不換行。6.6.3字符數組的輸入/輸出字符數組的輸入/輸出有三種方式:(1)通過循環(huán)語句用逐個輸入或輸出數組元素。chara[10];inti;for(i=0;i<10;i++) scanf("%c",&a[i]); //或a[i]=getchar();for(i=0;i<10;i++) printf("%c",a[i]); //或 putchar(a[i]);6.6.3字符數組的輸入/輸出(3)用字符串輸入函數gets、字符串輸出函數puts進行字符串輸入與輸出,兩個函數均在stdio.h中定義。chara[10];gets(a); puts(a);輸入字符串存入a數組,遇回車符結束輸入,并在字符串的最后存入'\0'。輸出字符串a,遇'\0'結束輸出并換行。6.6.3字符數組的輸入/輸出【例6.19】從鍵盤輸入一個英文字符串,將其中的小寫字母轉換成大寫字母后輸出。#include<stdio.h>intmain(){chars[80];inti=0;printf("Pleaseinputastring:\n");gets(s);while(s[i]!='\0'){if(s[i]>='a'&&s[i]<='z')s[i]=s[i]-32; //小寫字母轉大寫字母i++; }puts(s);}15.字符數組s不能作為字符串使用的是()。chars[]="happy";chars[]={"happy"};chars[6]={'h','a','p','p','y'};chars[4]={'h','a','p','p','y'};ABCD提交單選題5分【例6.20】從鍵盤輸入三個字符串,分別計算三個字符串的長度后輸出(含首尾空格)?!痉治觥靠梢杂靡粋€3行的二維字符數組來存放三個字符串,每行存放一個字符串。每行字符串'\0'前面的字符個數就是該字符串的長度。#include<stdio.h>intmain(){chars[3][80]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上教版八年級歷史上冊月考試卷含答案
- 2025年滬教版選擇性必修1生物上冊月考試卷含答案
- 2025年滬教版高三歷史上冊階段測試試卷含答案
- 2025年浙教新版選修6歷史下冊月考試卷含答案
- 2025年滬教版八年級地理上冊月考試卷
- 2025年人教A版七年級物理上冊月考試卷含答案
- 2025年滬科版八年級地理上冊月考試卷含答案
- 2025年農行個人貸款合同范本3篇
- 2025年南京琴行教師知識產權保護與使用合同4篇
- 二零二五年度農藥生產許可證申請代理合同范本3篇
- 經濟學基礎試題及答案 (二)
- 售后工程師述職報告
- 綠化養(yǎng)護難點要點分析及技術措施
- 2024年河北省高考歷史試卷(含答案解析)
- 車位款抵扣工程款合同
- 小學六年級數學奧數題100題附答案(完整版)
- 湖南高速鐵路職業(yè)技術學院單招職業(yè)技能測試參考試題庫(含答案)
- 英漢互譯單詞練習打印紙
- 2023湖北武漢華中科技大學招聘實驗技術人員24人筆試參考題庫(共500題)答案詳解版
- 一氯二氟甲烷安全技術說明書MSDS
- 母嬰護理員題庫
評論
0/150
提交評論