新書1 - 10章章數(shù)組_第1頁
新書1 - 10章章數(shù)組_第2頁
新書1 - 10章章數(shù)組_第3頁
新書1 - 10章章數(shù)組_第4頁
新書1 - 10章章數(shù)組_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章數(shù)組數(shù)組:方便數(shù)據(jù)的管理和使用便于完成大量數(shù)據(jù)的處理,簡(jiǎn)化程序設(shè)計(jì)4本章主要內(nèi)容123一維數(shù)組數(shù)組做函數(shù)參數(shù)一維數(shù)組應(yīng)用舉例二維數(shù)組6.1一維數(shù)組

輸入3個(gè)整數(shù),按從小到大的順序輸出。程序6-1#include<stdio.h>intmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);if(a>b)t=a,a=b,b=t;if(a>c)t=a,a=c,c=t;if(b>c)t=b,b=c,c=t;printf("%d,%d,%d",a,b,c);return0;}若要對(duì)4個(gè)數(shù)排序輸出呢?5個(gè)數(shù),100個(gè)數(shù)呢?6.1.1一維數(shù)組的定義和引用for(i=0;i<n;i++)

printf("%d",a[i]);i從0變到9,輸出a[0]~a[9]由數(shù)組名和下標(biāo)唯一地確定每個(gè)數(shù)組元素;每個(gè)元素都屬于同一類型;表述簡(jiǎn)潔,可讀性高;便于使用循環(huán)結(jié)構(gòu)。0129

a[0]a[1]a[9]a-101235782289一批相同類型的變量使用同一個(gè)數(shù)組變量名,用下標(biāo)來相互區(qū)分。6.1.1一維數(shù)組的定義和引用1、定義類型名數(shù)組名[數(shù)組長(zhǎng)度]類型名:數(shù)組元素的類型數(shù)組名:數(shù)組(變量)的名稱,標(biāo)識(shí)符數(shù)組長(zhǎng)度:常量表達(dá)式,給定數(shù)組的大小inta[10];

定義一個(gè)含有10個(gè)整型元素的數(shù)組acharc[200];定義一個(gè)含有200個(gè)字符元素的數(shù)組cdoublearr[5];定義一個(gè)含有5個(gè)實(shí)型元素的數(shù)組arr2、引用先定義,后使用只能引用單個(gè)的數(shù)組元素,不能一次引用整個(gè)數(shù)組數(shù)組名[下標(biāo)]下標(biāo):整型表達(dá)式取值范圍:[0,數(shù)組長(zhǎng)度-1]inta[10];10個(gè)元素:a[0]、a[1]、……a[9]下標(biāo)不要越界,不能使用a[10]數(shù)組元素的使用方法與同類型的變量相同scanf(“%d”,&a[i]);//從鍵盤讀入一個(gè)整數(shù),存入a[i]//下標(biāo)為index的元素與下標(biāo)為k的元素互換內(nèi)容temp=a[index];a[index]=a[k];a[k]=temp;printf(“%d”,a[i]);//輸出a[i]的值定義數(shù)組類型名數(shù)組名[數(shù)組長(zhǎng)度]inta[10];區(qū)分?jǐn)?shù)組的定義和數(shù)組元素的引用下標(biāo):[0,數(shù)組長(zhǎng)度-1],不要越界定義數(shù)組時(shí),數(shù)組長(zhǎng)度必須為常量引用數(shù)組元素?cái)?shù)組名[下標(biāo)]a[0]=a[9]=0;a[k]=temp;使用循環(huán)批量處理數(shù)組元素。數(shù)組下標(biāo)作為循環(huán)變量,通過循環(huán),逐個(gè)處理數(shù)組元素

數(shù)組和循環(huán)0129

a[0]a[1]a[9]a-101235782289i從0變到9,讀入10個(gè)數(shù),存入a[0]~a[9]for(i=0;i<10;i++)

printf("%d",a[i]);for(i=0;i<10;i++)scanf("%d",&a[i]);i從0變到9,輸出a[0]~a[9]例6-1:逆序輸出n個(gè)整數(shù)的逆序輸出。輸入n(n≤10)和n個(gè)整數(shù),逆序輸出這n個(gè)整數(shù)。思路分析:(1)讀入n;(2)循環(huán)進(jìn)行n次,依次將n個(gè)整數(shù)存入a[0]、a[1]、…a[n-1](3)循環(huán)進(jìn)行n次,依次輸出a[n-1]、a[n-2]、…a[0]程序6-1:逆序輸出#include<stdio.h>intmain(){inta[100];intn,i;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=n-1;i>=0;i--)printf("%d",a[i]);printf("\n");return0;}讀入n個(gè)整數(shù)依次存入a[0]、a[1]、…a[n-1]依次輸出a[n-1]、a[n-2]、…a[0]6.1.2一維數(shù)組初始化可以定義數(shù)組時(shí),對(duì)數(shù)組元素賦初值類型名數(shù)組名[數(shù)組長(zhǎng)度]={初值表};例如:inta[10]={1,2,3,4,5,6,7,8,9,10};定義數(shù)組a有10個(gè)int類型的元素,并為這些元素賦初值:a[0]=1,a[1]=2,...…a[9]=10部分元素初始化一般數(shù)組如果沒有初始化,所有元素為隨機(jī)值;但如果對(duì)部分元素初始化,沒有初始值的元素自動(dòng)賦0intfib[20]={0,1};fib[0]=0,fib[1]=1,其余元素為0如果對(duì)全部元素都賦初值,可以省略數(shù)組長(zhǎng)度inta[10]={0,1,2,3,4,5,6,7,8,9}建議不要省略數(shù)組長(zhǎng)度可寫成inta[]={0,1,2,3,4,5,6,7,8,9};問題2:fibonacci數(shù)列的前n項(xiàng)問題2:輸入一個(gè)正整數(shù)n(1<n≤50),輸出fibonacci數(shù)列的前n項(xiàng)。并按每行打印5個(gè)數(shù)的格式輸出。11235……思路分析:將前n項(xiàng)依次存入a[0],a[1],……a[n-1]。(1)將a[0]和a[1]賦值為1;(2)對(duì)i=2,3……n-1,計(jì)算

a[i]=a[i-1]+a[i-2];(3)輸出a[0],a[1],……a[n-1];inta[N]={1,1};for(i=2;i<n;i++)a[i]=a[i-1]+a[i-2];

for(i=0;i<n;i++)printf("%d",a[i]);程序6-2:fibonacci數(shù)列#include<stdio.h>#defineN50intmain(){intn,i,a[N]={1,1};

scanf("%d",&n);

for(i=2;i<n;i++) a[i]=a[i-1]+a[i-2];for(i=0;i<n;i++)printf("%d",a[i]);

printf("\n");return0;}6.1.3數(shù)組元素的查找例6-3:已知數(shù)組a中有如下元素:1,45,18,7,22,11,33,15,27,19輸入1個(gè)數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。解題思路:順序查找(1)對(duì)i=0,1,……n-1,做如果a[i]==x,則提前結(jié)束循環(huán)(2)若i<n,則查找成功,輸出下標(biāo)i若i==n,則查找失敗,輸出“NotFound”。for(i=0;i<N;i++){if(a[i]==x)break;

}if(i<N)printf(“Indexis%d\n",i);elseprintf("NotFound\n");#include<stdio.h>#defineN10intmain(void){inti,n,x;inta[N]={1,45,18,7,22,11,33,15,27,19};scanf("%d",&x);for(i=0;i<N;i++){if(a[i]==x)//若找到,提前循環(huán)break;

}

if(i<N)//若循環(huán)提前結(jié)束,說明找到x,輸出下標(biāo)i

printf(“Indexis%d\n",i);elseprintf("NotFound\n");return0;}程序6-3順序查找6.1.4在有序序列里插入新元素問題4:已知如下有序序列,有9個(gè)元素:1,2,4,7,8,11,16,21,35

輸入一個(gè)數(shù),將該數(shù)插入到數(shù)組中的適當(dāng)位置,使得數(shù)組仍保持升序排列,輸出插入新元素之后的數(shù)組。

24810X=666.1.4在有序序列里插入新元素24810X=66思路分析:從后向前尋找新元素的插入位置,將所有比x大的元素依次后移一位

(1)對(duì)i=n-1,n-2,……0,做如果a[i]>x,a[i]的內(nèi)容后移一位否則,break結(jié)束循環(huán)(2)將新元素存入a[i+1]for(i=N-1;i>0;i--){if(a[i]>x)a[i+1]=a[i];else break;}a[i+1]=x;程序6-4:在有序序列里插入新元素#include<stdio.h>#defineN9intmain(){inti,index,x;inta[N+1]={1,2,4,7,8, 11,16,21,35};scanf("%d",&x);

for(i=N-1;i>0;i--){if(a[i]>x)a[i+1]=a[i];else break;}a[i+1]=x;for(i=0;i<=N;i++)printf("%d",a[i]);printf("\n"]);return0;}6.1.5交換最小值例6-5輸入n(n≤10),再輸入n個(gè)數(shù)(1)求最小值(2)求最小值和它所對(duì)應(yīng)的下標(biāo)(3)將最小值與第一個(gè)數(shù)交換,輸出交換后的n個(gè)數(shù)min=a[0];//a[0]做臨時(shí)最小值for(i=1;i<n;i++)if(a[i]<min)min=a[i];問題5-(1)求最小值選最小值,采用擂臺(tái)賽的思想:先用第一個(gè)元素初始化臨時(shí)最小值min(擂主),然后逐個(gè)元素與min比較,如果比min小,則用其值更新min/*程序6-5*/#include<stdio.h>intmain(void){

inti,min,n;inta[10];

printf(“Entern:");scanf("%d",&n);printf(“Enter%dintegers:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);

min=a[0];//a[0]做臨時(shí)最小值for(i=1;i<n;i++)if(a[i]<min)min=a[i];printf("minis%d\n",min);return0;}程序6-5:求最小值輸入n(n<10),再輸入n個(gè)數(shù),輸出最小值和它所對(duì)應(yīng)的下標(biāo)。問題5-(2)求最小值及其下標(biāo)min=a[0];index=0;for(i=1;i<n;i++){if(a[i]<min){min=a[i];

index=i;}}用min記錄最小值,用index記錄對(duì)應(yīng)的下標(biāo)用index記錄最小值對(duì)應(yīng)的下標(biāo)a[index]就是最小值求最小值及其下標(biāo)可以只用一個(gè)變量indexindex=0;for(i=1;i<n;i++){if(a[i]<a[index]){index=i;}}輸入n(n<10),再輸入n個(gè)數(shù),將最小值與第一個(gè)數(shù)交換,輸出交換后的n個(gè)數(shù)。用index記錄最小值對(duì)應(yīng)的下標(biāo)a[index]就是最小值最小值a[index]與第a[0]交換內(nèi)容a[index]<==>a[0]問題5-(3)交換最小值6.1.6:排序輸入n(n<10),再輸入n個(gè)數(shù),將它們從小到大排序后輸出。方法1:比較交換排序比較交換排序的基本思想是:將a[i](i=0,1,...n-2)依次與其后的元素比較,若遇到比其小的元素,則互換。從第一個(gè)元素a[0]開始,使其與a[1]、a[2]、...、a[n-1]比較,若遇到比a[0]小的元素,則與a[0]互換,第一輪比較交換結(jié)束,a[0]中存儲(chǔ)的就是所有元素的最小值。然后進(jìn)行第二輪比較交換,對(duì)a[1]進(jìn)行同樣的處理,使a[1]中存儲(chǔ)a[1]、a[2]、...、a[n-1]的最小值。依次處理a[2]、a[3]、......,經(jīng)過n-1輪比較交換后完成排序。比較交換排序假設(shè)數(shù)組a有6個(gè)元素{9,8,5,4,6,0}第1輪:a[0]分別與a[1]、a[2]、...、a[n-1]比較,若遇到比a[0]小的元素a[j],則使a[0]與a[j]互換。第1輪排序的結(jié)果:將最小值交換到a[0]的位置上比較交換排序?qū)崿F(xiàn)for(i=0;i<n-1;i++){

/*a[i]與其后所有元素比較,若a[j]小于a[i],則交換*/

for(j=i+1;j<n;j++)

if(a[i]>a[j])

{ t=a[i];a[i]=a[j];a[j]=t;}}

例5-1程序解析#include<stdio.h>intmain(){inti,j,t,k,n;inta[10];/*定義1個(gè)數(shù)組a,它有10個(gè)整型元素*/scanf("%d”,&n);for(i=0;i<n;i++)scanf("%d",&a[i]);

for(i=0;i<n-1;i++){/*a[i]與其后所有元素比較,若a[j]小于a[i],則交換*/

for(j=i+1;j<n;j++)

if(a[i]>a[j])

{ t=a[i];a[i]=a[j];a[j]=t; }}

printf("Aftersorted:");

for(i=0;i<n;i++)

/*輸出n個(gè)數(shù)組元素的值*/

printf("%d",a[i]);

return0;}103528122890-17Aftersorted:-1012357822896.2數(shù)組作為函數(shù)參數(shù)6.2.1數(shù)組做函數(shù)參數(shù)6.2.2通過形參數(shù)組修改數(shù)組元素6.2.3數(shù)組排序6.2.1數(shù)組做函數(shù)參數(shù)若數(shù)組a的定義為:inta[10];若要將數(shù)組a作為實(shí)參傳遞給被調(diào)用函數(shù)SumArr(),則調(diào)用語句可寫為:SumArr(a,10);數(shù)組名代表數(shù)組首元素的地址。因此數(shù)組名做參數(shù)就可以將數(shù)組的起始地址傳遞給形參。另外需要將數(shù)組元素的大小也傳遞給被調(diào)用函數(shù)。函數(shù)SumArr()的函數(shù)原型如下:

intSumArr(intb[],intn)表示函數(shù)SumArr()期望用形參b來接收一個(gè)整型數(shù)組,用形參n來接收數(shù)組元素個(gè)數(shù)。程序6-6:調(diào)用函數(shù)SumArr()計(jì)算累加和#include<stdio.h>

intSumArr(intarray[],intn);

intmain(void){inta[5]={1,4,5,7,9};

//求數(shù)組b中前5個(gè)數(shù)的和printf(“%d\n”,SumArr(a,5));return0;}

//求數(shù)組arrar中前n個(gè)數(shù)的和

intSumArr(intarray[],intn){inti,s=0;

for(i=0;i<n;i++)s+=array[i];

returns;}形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組因?yàn)閿?shù)組名代表該數(shù)組的首地址,用數(shù)組名作實(shí)參時(shí),是把實(shí)參數(shù)組的首地址賦給形參;實(shí)際上形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。a

a[0]a[4]arrayarray[0]array[4]……形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間參數(shù)聲明(1)在聲明形參數(shù)組時(shí),數(shù)組元素的個(gè)數(shù)不需要寫在方括號(hào)中,如

intSumArr(intarray[],intn){……}

即便方括號(hào)中出現(xiàn)數(shù)字,編譯器也將忽略該數(shù)字。在編譯器看來,形參array不是一個(gè)真正的數(shù)組,只是一個(gè)可以存放地址的指針變量。第8章將介紹數(shù)組與指針的緊密聯(lián)系(2)向函數(shù)傳遞數(shù)組的時(shí)候,同時(shí)通過參數(shù)傳遞數(shù)組的元素個(gè)數(shù),有利于提高函數(shù)的通用性。SumArr(a,5)可以計(jì)算數(shù)組a的前5個(gè)元素之和SumArr(a,3)可以計(jì)算數(shù)組a的前3個(gè)元素之和6.2.2通過形參數(shù)組修改數(shù)組元素一般變量作參數(shù):傳遞的是數(shù)值,形參的值的改變不影響實(shí)參。

數(shù)組做參數(shù):傳遞的是數(shù)組的首地址,形參數(shù)組和實(shí)參數(shù)組實(shí)質(zhì)上是同一塊內(nèi)存區(qū)域,形參數(shù)組發(fā)生改變,實(shí)參數(shù)組也隨之發(fā)生改變。程序6-7,就是通過調(diào)用函數(shù)ModifyArr(),將main()函數(shù)中數(shù)組a的每個(gè)元素變?yōu)樵瓉淼?0倍。#include<stdio.h>voidModifyArr(intarray[],intn);

intmain(void){inti,n=5;inta[]={1,4,5,7,9};printf("數(shù)組a的內(nèi)容:\n");

for(i=0;i<n;i++)printf("%d",a[i]);

printf("\n\n");

ModifyArr(a,5);

printf(“數(shù)組a被修改后:\n");

for(i=0;i<n;i++)printf("%d",a[i]);

printf(“\n”);return0;}改變形參數(shù)組,就是改變實(shí)參數(shù)組voidModifyArr(intb[],intn){inti,s=0;

for(i=0;i<n;i++)b[i]*=10;}

傳遞數(shù)組時(shí)形參要聲明為數(shù)組(指針),并且數(shù)組長(zhǎng)度要和實(shí)參相等,或缺省長(zhǎng)度傳遞數(shù)組時(shí)實(shí)參用數(shù)組名程序6-7a:通過函數(shù)修改數(shù)組元素#include<stdio.h>voidModifyArr(intb[],intn);voidPrintArr(intb[],intn);

intmain(void){inti,n=5;inta[]={1,4,5,7,9};

printf("數(shù)組a的內(nèi)容:\n");

PrintArr(a,n);

ModifyArr(a,n);

printf(“數(shù)組a被修改后:\n");

PrintArr(a,n);return0;}程序6-7b:把輸出數(shù)組元素功能也包裝成函數(shù)voidPrintArr(intb[],intn){inti;for(i=0;i<n;i++)printf("%d",b[i]);

printf("\n\n");}voidModifyArr(intb[],intn){inti,s=0;

for(i=0;i<n;i++)b[i]*=10;}6.2.3數(shù)組排序改寫程序6-5,分別用函數(shù)InputArr()、SortArr()和DispArr()實(shí)現(xiàn)數(shù)組的輸入、排序和輸出。//程序6-8#include<stdio.h>#defineN10

voidInputArr(intarr[],intn);voidSortArr(intarr[],intn);voidPrintArr(intarr[],intn);intmain(void){inta[N],n;printf("請(qǐng)輸入元素個(gè)數(shù)\n");scanf("%d",&n);/*輸入n個(gè)元素*/InputArr(a,n);/*將數(shù)組升序排序*/SortArr(a,n);

/*輸出數(shù)組a的n個(gè)元素*/

PrintArr(a,n);return0;}數(shù)組輸入函數(shù)InputArr()/*讀入n個(gè)整數(shù)存入數(shù)組arr*/voidInputArr(intarr[],intn){inti;

printf("請(qǐng)輸入%d個(gè)整數(shù):",n);

for(i=0;i<n;i++)scanf("%d",&arr[i]);}數(shù)組輸出函數(shù)DispArr()

voidPrintArr(intb[],intn){inti;for(i=0;i<n;i++)printf("%d",b[i]);

printf("\n\n");}將數(shù)組arr的n個(gè)元素升序排序SortArr()voidSortArr(intarr[],intn){ inti,j,temp; for(i=0;i<n-1;i++) {

//arr[i]與其后所有元素比較for(j=i+1;j<n;j++)if(arr[i]>arr[j]) { temp=arr[i];arr[i]=arr[j];arr[j]=temp; }}}課堂練習(xí)把6.1.5中“交換最小值”的程序函數(shù)化,main()調(diào)用以下函數(shù)實(shí)現(xiàn)相應(yīng)的功能。(1)intMinIndex(inta[],intn);函數(shù)返回最小元素的下標(biāo)(2)voidswap(inta[],inti,intj);函數(shù)將a[i]與a[j]的內(nèi)容互換(3)voidInputArr(inta[],intn);函數(shù)將讀入n個(gè)整數(shù)存入a[0]、a[1]…..(4)voidDispArr(inta[],intn);函數(shù)輸出整型數(shù)組a的前n個(gè)元素6.3一維數(shù)組應(yīng)用舉例6.3.1

最佳校友獎(jiǎng)6.3.2字母使用頻率統(tǒng)計(jì)6.3.3集合的合并——利用有序關(guān)系簡(jiǎn)化問題北京校友會(huì)每年舉辦兩次,所有校友都有校友編號(hào),每次到會(huì)的校友都在簽到簿上寫下自己的編號(hào)和姓名,在校友會(huì)成立5周年的聚會(huì)上將頒發(fā)“最佳校友獎(jiǎng)”,該獎(jiǎng)項(xiàng)頒發(fā)給到會(huì)次數(shù)最多的校友,若有多個(gè)校友并列第一,則均可獲獎(jiǎng)?,F(xiàn)在請(qǐng)你編寫程序,找出這個(gè)獎(jiǎng)項(xiàng)的得主。輸入數(shù)據(jù)為5年來簽到簿上所有簽下的編號(hào)(假設(shè)校友的編號(hào)為0~99的整數(shù)),以一個(gè)負(fù)數(shù)作為數(shù)組結(jié)束的標(biāo)志。輸出出現(xiàn)次數(shù)最多的編號(hào)。6.3.1找出最佳校友輸入樣例:303210403-1輸出樣例:最佳校友:03最佳校友——解題思路因?yàn)樾S训木幪?hào)為0~99的整數(shù),可以聲明一個(gè)長(zhǎng)度為100的數(shù)組a,將0~99之間的每一個(gè)數(shù)字i的出現(xiàn)次數(shù)存入數(shù)組元素a[i]。每次讀入一個(gè)編號(hào)num,將a[num]增加1。

輸入結(jié)束后,查找數(shù)組a中的最大值,數(shù)組a中最大值的下標(biāo)即為出現(xiàn)次數(shù)最多的數(shù),最大值即為該數(shù)出現(xiàn)的次數(shù)。0123456789…0000000000…1輸入303210403-112112331最佳校友編號(hào)為:03最佳校友——實(shí)現(xiàn)過程(1)讀入所有校友簽到,并統(tǒng)計(jì),a[i]存儲(chǔ)編號(hào)i的出席次數(shù)。(2)尋找數(shù)組a中的最大值,存入max;(3)再掃描一遍數(shù)組,輸出所有最大值的下標(biāo),即出席次數(shù)最多的校友編號(hào)。

InputAndCount(a);max=ArrMax(a,N);PrintWinner(a,N,max);#include<stdio.h>#defineN100voidInputAndCount(inta[],intn);intArrMax(inta[],intn);voidPrintWinner(inta[],intn,intmax);intmain(void){inta[N],max;

InputAndCount(a,N);//錄入所有簽到記錄,并統(tǒng)計(jì)

max=ArrMax(a,N);//計(jì)算數(shù)組元素最大值

PrintWinner(a,N,max);//輸出所有次數(shù)為max的校友

return0;}程序6-9的main()函數(shù)/*錄入簽到記錄,a[i]統(tǒng)計(jì)每個(gè)編號(hào)的出現(xiàn)次數(shù)*/voidInputAndCount(inta[],intn){inti,num;

(1)把數(shù)組a所有元素初始化為0;(2)提示:printf("輸入所有編號(hào),以負(fù)數(shù)表示結(jié)束:\n");

(3)當(dāng)讀入的編號(hào)num不是-1{

將a[num]增加1}}程序6-9的InputAndCount()函數(shù)for(i=0;i<n;i++)a[i]=0;while(scanf("%d",&num),num>=0) a[num]++;/*

函數(shù)返回?cái)?shù)組a中前n個(gè)元素的最大值*/intArrMax(inta[],intn){inti,max=a[0];

for(i=1;i<n;i++){if(a[i]>max)max=a[i];}

returnmax;}程序6-9的ArrMax()函數(shù)/*輸出所有元素值為max的下標(biāo)i*/voidPrintWinner(inta[],intn,intmax){inti;printf("最佳校友:\n");for(i=0;i<n;i++){if(a[i]==max)//若i的出現(xiàn)次數(shù)a[i]等于maxprintf(“%d”,i);//輸出編號(hào)i}printf("\n");}程序6-9的PrintWinner()函數(shù)輸入一個(gè)字符串,以回車結(jié)束。按如下格式輸出每個(gè)字母的出現(xiàn)次數(shù)。6.3.2字母使用次數(shù)統(tǒng)計(jì)

統(tǒng)計(jì)字符串中每個(gè)英文字母出現(xiàn)的次數(shù)。輸入:Loveispatient,loveiskind,andisnotjealous輸出:countofais3countofbis0countofcis0countofdis2……用26個(gè)變量分別記錄26個(gè)英文字母的出現(xiàn)次數(shù)?使用數(shù)組,用count[0]、count[1]….count[25]分別記錄26個(gè)英文字母的出現(xiàn)次數(shù)。(相當(dāng)于26個(gè)變量,只是這些變量有同樣的名字,用下標(biāo)相互區(qū)分)可以先將大寫字母轉(zhuǎn)換為小寫字母統(tǒng)一處理。字符’a’出現(xiàn)次數(shù)存入count[0],字符’b’出現(xiàn)次數(shù)存入count[1],……,字符ch出現(xiàn)的次數(shù)存入count[ch-’a’]。

abcdefghIJK0000000000…1輸入dadcbaead12112331解題思路#include<stdio.h>#include<ctype.h>intmain(void){inti,count[26]={0}; charch; printf("輸入一行,以回車結(jié)束:\n");while((ch=getchar())!='\n'){ch=tolower(ch);/*若ch是大寫字母則轉(zhuǎn)換為小寫字母*/if(islower(ch))/*若ch小寫字母*/count[ch-'a']++;/*字符ch的次數(shù)count[ch-‘a(chǎn)’]增1*/}

for(i=0;i<26;i++)printf("countof%cis%d\n",i+'a',count[i]);return0;}下標(biāo)i對(duì)應(yīng)字符i+’a’程序6-106.3.3集合的合并

——利用有序關(guān)系簡(jiǎn)化問題解決問題:將兩個(gè)整數(shù)集合A和B合并為集合C。并將集合C中元素按升序輸出。你應(yīng)該知道,集合中不允許有重復(fù)元素。思路分析:因?yàn)榧显夭辉试S重復(fù),并且最后的輸出結(jié)果要求升序輸出??梢韵葘蓚€(gè)序列進(jìn)行排序預(yù)處理,然后利用兩個(gè)序列的有序性,總是在兩個(gè)序列的待合并元素中選擇較小的元素合并入新序列,如果兩個(gè)元素相同,則只加入一個(gè)有序序列合并過程模擬1357891234abci12jkjijkjk3ijk4jk當(dāng)一個(gè)序列結(jié)束,將另一個(gè)序列中的剩余元素逐個(gè)加入新序列5789實(shí)現(xiàn)過程(1)調(diào)用排序函數(shù)對(duì)a,b兩個(gè)數(shù)組進(jìn)行升序排序(2)同時(shí)按從小到大順序掃描a、b數(shù)組中的元素,a[i]、b[j]分別為兩數(shù)組中待合并的最小元素,選擇較小者合并到c中(3)輸出c中的所有元素

sort(a,m);sort(b,n);merge(a,m,b,n,c);PrintArr(c,k);程序6-11的main函數(shù)#include<stdio.h>#defineN100intmain(void){intm,n,k,a[N],b[N],c[N*2];scanf("%d%d",&m,&n);InputArr(a,m);//讀入a的m個(gè)元素InputArr(b,n);//讀入b的n個(gè)元素sort(a,m);//排序sort(b,n);//排序

k=merge(a,m,b,n,c);//合并兩個(gè)數(shù)組PrintArr(c,k);//輸出數(shù)組c中k個(gè)元素return0;}voidInputArr(inta[],intn);voidsort(inta[],intn);intmerge(inta[],intm,intb[],intn,intc[]);voidPrintArr(intc[],intn)程序6-11的排序函數(shù)sort()voidsort(inta[],intn){inti,j,temp;

for(i=0;i<n-1;i++)/*比較交換排序*/ for(j=i+1;j<n;j++) if(a[j]<a[i1]) {temp=a[i]; a[i]=a[j]; a[j]=temp; }}合并過程實(shí)現(xiàn):merge()(2)同時(shí)掃描a、b數(shù)組中的元素,a[i]、b[j]分別為兩數(shù)組中待合并的最小元素,選擇較小者合并到c中i=0,j=0,k=0;while(i<m&&j<n){

如果a[i]<b[j],則將a[i]合并入新序列,i++

如果a[i]>b[j],則將b[j]合并入新序列,j++

如果a[i]==b[j],則將a[i]合并入新序列,i++,j++}(3)如果數(shù)組a中還剩有元素,合并到c中

如果數(shù)組b中還剩有元素,合并到c中

程序6-11的合并函數(shù)merge()/*將集合a、b的數(shù)據(jù)合并到c中,返回集合c中元素個(gè)數(shù)*/intmerge(inta[],intm,intb[],intn,intc[]){inti=0,j=0,k=0;while(i<m&&j<n){if(a[i]<b[j])/*如果a[i]<b[j],則存入a[i]*/c[k++]=a[i++];elseif(a[i]>b[j])/*如果a[i]>b[j],則存入b[j]*/c[k++]=b[j++];else/*如果a[i]==b[j],則存入a[i],舍去b[j]*/{c[k++]=a[i];i++;j++;}}程序6-11的合并函數(shù)merge()/*如果數(shù)組a中還剩有元素,合并到c中*/while(i<m)c[k++]=a[i++];

/*如果數(shù)組b中還剩有元素,合并到c中*/while(j<n)c[k++]=b[j++];

returnk;//返回集合C中元素個(gè)數(shù)}6.3.4二分搜索在一個(gè)有序序列中(這里元素呈升序排列)。搜索給定值x,若找到,返回x所在位置,否則返回查找失敗標(biāo)志-1。二分搜索法充分利用了序列的有序性,它的基本思想是:將n個(gè)元素分成個(gè)數(shù)大致相同的兩半,取a[n/2]與欲查找的x作比較:如果x=a[n/2]則找到x,算法終止;如果x<a[n/2],則我們只要在數(shù)組a的左半部繼續(xù)搜索x;如果x>a[n/2],則我們只要在數(shù)組a的右半部繼續(xù)搜索x。

145789101215222327323512152223273235midmid121522搜索成功!22因A[mid]<22,丟棄A[mid]及其左邊所有元素midmid二分搜索過程二分搜索非常高效,在一百萬個(gè)記錄中查找一個(gè)記錄是否存在,最多只需要20次比較!遞歸實(shí)現(xiàn)二分搜索是分治法的一個(gè)經(jīng)典示例,可以利用遞歸的思想來實(shí)現(xiàn)。實(shí)現(xiàn)過程

若待搜區(qū)間為空,返回-1;否則mid=(low+high)/2;若x等于a[mid],

搜索成功,返回mid若x小于a[mid],在左半?yún)^(qū)間搜索若x大于a[mid],在右半?yún)^(qū)間搜索程序6-12二分搜索intBSearch(inta[],intx,intlow,inthigh){if(low>high)return-1;//待搜區(qū)間為空

else{intmid=(low+high)/2;if(x==a[mid])returnmid;//搜索成功

if(x<a[mid])//在左半?yún)^(qū)間搜索

returnBSearch(a,x,low,mid-1);else//在右半?yún)^(qū)間搜索returnBSearch(a,x,mid+1,high);}}二維數(shù)組:一個(gè)表格或一個(gè)平面矩陣一維數(shù)組:一列長(zhǎng)表或一個(gè)向量多維數(shù)組:多維空間的一個(gè)數(shù)據(jù)列陣三維數(shù)組:一本書或三維空間的一個(gè)方陣多維數(shù)組的空間想象6.4二維數(shù)組6.4.1二維數(shù)組的定義和引用1、定義類型名數(shù)組名[行數(shù)][列數(shù)]inta[3][2];定義二維數(shù)組a,3行2列,6個(gè)元素intb[5][10];定義二維數(shù)組b,5行10列,50個(gè)元素2、引用:先定義,后使用數(shù)組元素的引用:數(shù)組名[行下標(biāo)][列下標(biāo)]行下標(biāo)和列下標(biāo):整型表達(dá)式行下標(biāo)的取值范圍是[0,行數(shù)-1]列下標(biāo)的取值范圍是[0,列數(shù)-1]inta[3][2];3行2列,6個(gè)元素a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]下標(biāo)不要越界二維數(shù)組在內(nèi)存中的存放方式inta[3][2];3行2列,6個(gè)元素表示1個(gè)3行2列的矩陣a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二維數(shù)組的元素在內(nèi)存中按行/列方式存放a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]6.4.2二維數(shù)組的初始化1、分行賦初值inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};staticintb[4][3]={{1,2,3},{4},{5,6}};數(shù)組a123456789數(shù)組b1234005600002、順序賦初值

inta[3][3]={1,2,3,4,5,6,7,8,9}; staticintb[4][3]={1,2,3,0,0,0,4,5};二維數(shù)組初始化時(shí)可以不給出行數(shù)inta[][3]={1,2,3,4,5,6,7,8,9};數(shù)組a123456789編譯器會(huì)根據(jù)初值的個(gè)數(shù)和數(shù)組的列數(shù)計(jì)算出數(shù)組的行數(shù),但建議不要省略行下標(biāo)和列下標(biāo)分別做為循環(huán)變量,通過二重循環(huán),遍歷二維數(shù)組通常將行下標(biāo)做為外循環(huán)的循環(huán)變量

列下標(biāo)內(nèi)循環(huán)for(i=0;i<m;i++)//i從0變到m-1,處理m行{for(j=0;j<n;j++)//處理第i行的n列{}}用二重循環(huán)處理二維數(shù)組二維數(shù)組的輸入inta[3][2];for(i=0;i<3;i++){for(j=0;j<2;j++)scanf("%d",&a[i][j]);}Enter6integers:3210-96-13210-96-1a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二維數(shù)組的輸出inta[3][2];for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%d",a[i][j]);

printf("\n",);}3210-96-1a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]3210-96-16.5.1各門課的平均分6.5.2隨機(jī)矩陣的最大值6.5.3日期計(jì)算6.5二維數(shù)組應(yīng)用舉例期末考試結(jié)束,班主任拿到了本班學(xué)生的成績(jī)匯總表,由n行3列組成,每行是一個(gè)同學(xué)的成績(jī),包括英語、數(shù)學(xué)、C語言三門課,請(qǐng)編寫程序,計(jì)算并輸出每門課的平均分,結(jié)果保留2位小數(shù)。6.5.1各門課的平均分英語

數(shù)學(xué) C語言80 65 7099 38 5930 78 8190 43 1365 87 79解題思路intmain(){(1)讀入學(xué)生人數(shù)n;(2)讀入m個(gè)學(xué)生3門課的成績(jī)存入二維數(shù)組a(第i個(gè)學(xué)生第j門課成績(jī),存入元素a[i][j]);(3)計(jì)算每一列元素的平均值存入一維數(shù)組avg;(4)輸出數(shù)組avg的元素InputArr(a,n);ArrAvg(a,n,avg);PrintAvg(avg,n);程序6-13平均分#include<stdio.h>#defineN100voidInputArr(inta[][3],intn);voidArrAvg(inta[][3],intn,doubleavg[]);voidPrintAvg(doubleavg[],intn);intmain(void){inta[N][3],avg[3],n;InputArr(a,n); //錄入n個(gè)學(xué)生3門課的成績(jī)

ArrAvg(a,n,avg); //計(jì)算每門課平均成績(jī)數(shù)組avgPrintAVG(avg,n); //輸出每門課的平均成績(jī)

return0;}讀入n個(gè)學(xué)生的成績(jī)存入數(shù)組a//讀入一個(gè)n行3列的二維數(shù)組voidInputArr(inta[][3],intn){對(duì)i=0、1、2、……n-1做:{讀入第i個(gè)學(xué)生的三門課成績(jī),存入第i行}}for(j=0;j<3;j++)//讀入第i個(gè)學(xué)生的第j門成績(jī)scanf("%d",&a[i][j]);

計(jì)算每一列的平均值存入數(shù)組avgvoidArrAvg(inta[][3],intn,doubleavg[]){對(duì)j=0、1、2做:{求第j列元素的平均值并輸出

}}806570993859307881904313658779sum=0.0;//將sum賦為0for(i=0;i<n;i++)//將第j列的所有元素累加{sum+=a[i][j];}avg[j]=(double)sum/n;//該列的平均分輸出平均成績(jī)voidPrintAvg(doubleavg[],intn);{對(duì)i=0、1、2做:{

printf("第%d門課的平均分為:%.2f\n",i,avg[i]);}}6.5.2隨機(jī)矩陣的最大值隨機(jī)生成1個(gè)m行n列的矩陣,將其存入二維數(shù)組中。生成的隨機(jī)數(shù)要求是0~100之間的整數(shù),m、n是不大于10的正整數(shù)。輸出矩陣,并找出最大值及其行下標(biāo)和列下標(biāo)。解題思路:(1)讀入m和n(2)生成m行n列的隨機(jī)矩陣并輸出(3)輸出該數(shù)組的最大值及其行下標(biāo)和列下標(biāo)GetRandArr(a,m,n);DispMax(a,m,n);#include<stdio.h>#include<stdlib.h>

#defineN10

voidGetRandArr(intarr[][N],intm,intn);voidDispMax(intarr[][N],intm,intn);

intmain(void){intm,n,a[N][N];

printf(“請(qǐng)輸入矩陣的行數(shù)和列數(shù):\n”);scanf("%d%d",&m,&n);

溫馨提示

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

評(píng)論

0/150

提交評(píng)論