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

下載本文檔

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

文檔簡介

引言一維數(shù)組二維數(shù)組字符數(shù)組與字符串第7章

數(shù)組7.1

引言一、數(shù)組的引入為了便于處理一批類型相同的數(shù)據(jù),引入了數(shù)組類型.

假設(shè)現(xiàn)在要保存每個(gè)學(xué)生的成績,那就需要40個(gè)變量,但這樣一來輸入、輸出、計(jì)算都會(huì)變得繁瑣,若成千上萬數(shù)據(jù),顯然不合適。在這種情況下,我們可以使用數(shù)組類型,聲明一個(gè)數(shù)組含有40個(gè)整型元素,每個(gè)數(shù)組元素存放一個(gè)成績,這樣,成績的輸入、輸出、計(jì)算就可通過循環(huán)來實(shí)現(xiàn).例:某班有40名學(xué)生,求該班成績的平均分#include<stdio.h>main(){intj,sum,s;floatave;sum=0;for(j=1;j<=40;j++){scanf(“%d”,&s);sum=sum+s;}ave=sum/40;printf(“ave=%f”,ave);}1.數(shù)組:由具有相同類型的有序數(shù)據(jù)的集合。用數(shù)組名標(biāo)識。#include<stdio.h>main(){intj,sum,s[40];floatave;sum=0;for(j=0;j<=39;j++){scanf(“%d”,&s[j]);sum=sum+s[j];}ave=sum/40;printf(“ave=%f”,ave);}3.數(shù)組元素:數(shù)組中的每一個(gè)數(shù)據(jù)稱為一個(gè)數(shù)組元素。數(shù)組元素用數(shù)組名和下標(biāo)來表示。4.下標(biāo):用來表示數(shù)組元素在數(shù)組中的排列順序。

c語言中下標(biāo)從0開始2.數(shù)組的維數(shù)(長度):一個(gè)數(shù)組中相同類型的數(shù)據(jù)個(gè)數(shù)叫做數(shù)組的維數(shù)。二、數(shù)組的概念

構(gòu)造數(shù)據(jù)類型之一7.2

一維數(shù)組表示一個(gè)數(shù)組元素需要一個(gè)下標(biāo)的數(shù)組叫作一維數(shù)組。如:每個(gè)班的學(xué)生排成一隊(duì),只需要指出某個(gè)學(xué)生在隊(duì)列中的編號,就可以確定這個(gè)學(xué)生。一、一維數(shù)組的定義

定義方式:

數(shù)據(jù)類型數(shù)組名[常量表達(dá)式]合法標(biāo)識符例:inta[10];編譯時(shí)分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=數(shù)組維數(shù)*sizeof(元素?cái)?shù)據(jù)類型)=10×2數(shù)組名表示數(shù)組所在內(nèi)存首地址也是a[0]的地址,是地址常量84:668095101010121014:1028a[0]a[1]a[2]:a[9]a數(shù)組維數(shù)(長度)定義的目的:為指定的數(shù)組分配相應(yīng)字節(jié)的存儲(chǔ)單元。定義a為一維數(shù)組,有10個(gè)元素,都是int型。7.2

一維數(shù)組數(shù)組元素地址表示:&a[i],&a[0]即a例:inta[20],b;

定義a為一維數(shù)組,可獨(dú)立存放20個(gè)整型數(shù)據(jù),系統(tǒng)要為數(shù)組a分配2*20=40個(gè)字節(jié)的連續(xù)存儲(chǔ)單元。注意b是變量而不是數(shù)組floata[10];

定義a為一維數(shù)組,可存放10個(gè)單精度型數(shù)據(jù),系統(tǒng)要為數(shù)組a分配4*10=40個(gè)字節(jié)的存儲(chǔ)單元,且這些存儲(chǔ)單元是連續(xù)的。例:

例:(不能用變量定義數(shù)組維數(shù))inti=15;intdata[i];

解決方法:

#defineN15;intdata[N];一、一維數(shù)組的定義二、一維數(shù)組的引用格式:數(shù)組名[下標(biāo)]數(shù)組元素的下標(biāo)從0開始a如有定義:inta[10];a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[0]=3;3a[1]=8;8a[2]=a[0]+a[1];11a[3]=a[0]*a[1];24a[9]=a[0]-a[1];-5引用的數(shù)組元素與其他同類變量同等使用數(shù)組元素下標(biāo)的最大值等于數(shù)組的長度減1數(shù)組必須先定義,后使用區(qū)分:數(shù)組定義:inta[10];數(shù)組元素引用:a[9]=a[0]-a[1];下標(biāo)可以是常量或整型表達(dá)式。如:a[1],a[2*3]只能逐個(gè)引用數(shù)組元素,不能一次引用整個(gè)數(shù)組下標(biāo)不要超范圍(越界)二、一維數(shù)組的引用注意點(diǎn):inti,a[5];for(i=0;i<5;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)printf(“%d”,a[i]);inta[5];scanf(“%d”,&a);×printf(“%d”,a);×注意:

如果出現(xiàn)a[5]=72;

盡管a[5]不屬于數(shù)組元素,但編譯時(shí)不會(huì)指出錯(cuò)誤,系統(tǒng)會(huì)將a[5]理解為要訪問的是從地址a后的第5×2個(gè)單元,即訪問地址為1020存儲(chǔ)單元,將其賦值為72,這樣可能會(huì)破壞數(shù)組以外其他變量的值

例:下標(biāo)越界危害數(shù)組定義為inta[5],

數(shù)組長度為5,下標(biāo)在0----4之內(nèi),

即a[0]----a[4]847566809510101012101410161018a[0]a[1]a[2]a[3]a[4]假設(shè)這個(gè)存儲(chǔ)空間是變量x的,如果執(zhí)行了a[5]=72,會(huì)將x原有的正確數(shù)據(jù)覆蓋掉102070Xa[5]72二、一維數(shù)組的引用三、一維數(shù)組的初始化

inta[5]={1,2,3,4,5};等價(jià)于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;初始化方式2:只給一部分元素賦值

inta[10]={1,2,3,4,5};等價(jià)于:

inta[5]={1,2,3,4,5,0,0,0,0,0};初始化意義:給數(shù)組元素賦初值(在編譯階段使之得到初值),數(shù)組不初始化,其元素值為隨機(jī)數(shù)。

inta[]={1,2,3,4,5,6};編譯系統(tǒng)根據(jù)初值個(gè)數(shù)確定數(shù)組維數(shù)初始化方式1:在定義數(shù)組時(shí),為數(shù)組元素賦初值初始化方式3:對數(shù)組全部元素賦值時(shí)可不指定數(shù)組長度例1輸入10個(gè)數(shù)放入一個(gè)數(shù)組,然后逆序輸出。四、一維數(shù)組程序舉例main(){inti,a[10];

for(i=0;i<=9;i++)scanf(“%d”,&a[i]);for(i=9;i>=0;i--)printf(“%4d”,a[i]);}控制輸入10個(gè)數(shù)據(jù)控制輸出10個(gè)數(shù)據(jù)假定輸入:0123456789運(yùn)行結(jié)果如下:

9876543210程序使a[0]到a[9]的值為0~9,然后按逆序輸出。例2:如何使兩個(gè)數(shù)組的值相等/*錯(cuò)誤編程*/main(){inta[4]={1,2,3,4},b[4];b=a;}解決方法法1:逐個(gè)元素賦值

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];法2:通過循環(huán)賦值

inti;for(i=0;i<4;i++)b[i]=a[i];原因:數(shù)組名表示數(shù)組的首地址,其值不可改變!例3:用數(shù)組求fibonacci數(shù)列的前20個(gè)數(shù)即:1,1,2,3,5,8,13#include<stdio.h>main(){inti,f[20]={1,1};for(i=2;i<20;i++)

f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf(“\n”);printf(“%12d”,f[i]);}}110000:0f[0]f[1]f[2]f[3]f[4]f[5]:f[19]23586765i=2f[2]=f[0]+f[1]i=3f[3]=f[1]+f[2]i=4f[4]=f[2]+f[3]第六章P125:f1=f1+f2f2=f2+f1優(yōu)點(diǎn):占用存儲(chǔ)空間少,缺點(diǎn):算法復(fù)雜,且不可存儲(chǔ)。if語句用來控制換行,每行輸出5個(gè)數(shù)據(jù)。例4:線性查找:輸入一個(gè)數(shù)據(jù),在已知數(shù)組中查找是否有該數(shù)據(jù),有的話,打印find!5801926374x9a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]#include<stdio.h>main(){inti,x;inta[10]={5,8,0,1,9,2,6,3,7,4};scanf(“%d”,&x);for(i=0;i<10;i++)if(x==a[i]){printf(“find!”);break;}if(i==10)printf(“notfind!\n”);}改變:#include<stdio.h>main(){inti,x,flag=0;inta[5]={5,8,0,1,9};scanf(“%d”,&x);for(i=0;i<5;i++)if(x==a[i]){flag=1;

break;}if(flag==1)printf(“find!\n”);elseprintf(“notfind!\n”);}#include<stdio.h>main(){inti,x;inta[5]={5,8,0,1,9};scanf(“%d”,&x);for(i=0;i<5;i++)if(x==a[i]){printf(“find!”);

break;}if(i==5)printf(“notfind!\n”);}體會(huì)flag的作用和意義:例5讀10個(gè)整數(shù)存入數(shù)組,找出其中最大值和下標(biāo)數(shù)據(jù):定義int型數(shù)組x[10],

變量max放最大數(shù),變量n放對應(yīng)下標(biāo);步驟:1.輸入:for循環(huán)輸入10個(gè)整數(shù)

2.處理:(a)先令max=x[0],n=0;(b)依次用x[i]和max比較(循環(huán))3.輸出:max和n#include<stdio.h>main(){intx[10],i,max,n;printf("Enter10integers:\n");for(i=0;i<10;i++){ scanf("%d",&x[i]);}

max=x[0];/*開始時(shí)假定a[0]為最大值*/n=0;/*開始時(shí)存放a[0]的下標(biāo)*/

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

}

printf(“max=%d,n=%d\n”,max,n);}例6:用冒泡排序法對6個(gè)數(shù)進(jìn)行升序排序(從小到大)對n個(gè)數(shù)進(jìn)行冒泡排序的思路是:如果要對n個(gè)數(shù)據(jù)排序,就需要進(jìn)行n-1輪的比較,每次都對相鄰兩個(gè)數(shù)進(jìn)行比較,將較大的數(shù)交換到后一個(gè)元素中。每1輪的比較都找出未排好的數(shù)據(jù)中的最大數(shù)放在這幾個(gè)數(shù)的后面。例如,第1輪需要比較n-1次,在n個(gè)數(shù)中找出最大數(shù)放在數(shù)組的最后1個(gè)元素中;第2輪將對剩下的前n-1個(gè)數(shù)進(jìn)行比較,需要比較(n-1)-1次,將前n-1個(gè)數(shù)中的最大者放入數(shù)組的倒數(shù)第2個(gè)元素中;……以此類推,第n-1輪需要進(jìn)行1次比較,將剩下的2個(gè)數(shù)中的較大者放入a[1]中,將最小的數(shù)放入a[0]中。當(dāng)?shù)趎-1輪比較進(jìn)行完后,所有的數(shù)據(jù)都按照升序在數(shù)組中排列。例6:用冒泡排序法對6個(gè)數(shù)進(jìn)行排序(從小到大)升序冒泡排序方法:依次比較相鄰的兩個(gè)數(shù)a[j]和a[j+1],將小數(shù)放前面,大數(shù)放后面(如果前面的數(shù)大于后面的數(shù),則進(jìn)行交換,否則不做任何改變)。

經(jīng)過第1輪(共5次比較與交換)后最大的數(shù)9已“沉底”。再對余下的前面5個(gè)數(shù)進(jìn)行下1輪比較,次大的數(shù)又被安置。972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始狀態(tài)第1輪第2輪第3輪第4輪第5輪7

思考:6個(gè)數(shù)排序,共經(jīng)過5輪,每1輪都很相似,程序如何寫?隱約感覺可用循環(huán),但需分析規(guī)律。972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始狀態(tài)第1輪i=0;7例6:用冒泡排序法對6個(gè)數(shù)進(jìn)行排序(從小到大)第1輪i=0for(j=0;j<5;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}5次比較第2輪i=1;第3輪i=2;第4輪i=3;第5輪i=4;第2輪i=1for(j=0;j<4;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}4次比較第4輪i=3for(j=0;j<2;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}2次比較第5輪i=4for(j=0;j<1;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}1次比較歸納:for(i=0;i<5;i++)for(j=0;j<5-i;j++)外層循環(huán)變量i控制進(jìn)行幾輪比較內(nèi)層循環(huán)變量j控制每輪的比較次數(shù)972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始狀態(tài)第1輪i=0;7第2輪i=1;第3輪i=2;第4輪i=3;第5輪i=4;for(i=0;i<5;i++)for(j=0;j<5-i;j++)

if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}例6:用冒泡排序法對6個(gè)數(shù)進(jìn)行排序(從小到大)用嵌套的for循環(huán)實(shí)現(xiàn)排序外層循環(huán)控制進(jìn)行幾輪比較內(nèi)層循環(huán)控制每輪的比較次數(shù)#include<stdio.h>main(){inta[6],i,j,t;

for(i=0;i<6;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)for(j=0;j<5-i;j++)

if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}

for(i=0;i<6;i++)printf(“%3d”,a[i]);}輸入6個(gè)數(shù)據(jù)用嵌套的for循環(huán)實(shí)現(xiàn)排序外層循環(huán)控制進(jìn)行幾輪比較內(nèi)層循環(huán)控制每輪的比較次數(shù)如果前面的數(shù)大于后面的數(shù),則進(jìn)行交換,否則不做任何改變輸出排序后的6個(gè)數(shù)據(jù)#defineN6main(){inta[N],i,j,t;for(i=0;i<N;i++)scanf(“%d”,&a[i]);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;

}for(i=0;i<N;i++)printf(“%3d”,a[i]);}定義一個(gè)符號常量N代表要排序的數(shù)字個(gè)數(shù)如何推廣到任意個(gè)數(shù)排序?#include<stdio.h>main(){inta[6],i,j,t;for(i=0;i<6;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)for(j=0;j<5-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;

}for(i=0;i<6;i++)printf(“%3d”,a[i]);}例7:用選擇排序法對6個(gè)數(shù)進(jìn)行升序排序(從小到大)選擇法對n個(gè)數(shù)進(jìn)行排序的思路是:如果要對n個(gè)數(shù)據(jù)排序,就需要進(jìn)行n-1輪的比較,每次都從數(shù)組中未排好的子序列中找出一個(gè)最小數(shù),與子序列最前面的1個(gè)元素交換,使小數(shù)放在子序列的最前面。例如,第1輪需要比較n-1次,在n個(gè)數(shù)中找出最小數(shù)與數(shù)組中的第1個(gè)元素(即a[0])交換,使數(shù)組中的最小數(shù)放在數(shù)組的最前面;第2輪將對剩下的n-1個(gè)數(shù)進(jìn)行比較,需要比較(n-1)-1次,將n-1個(gè)數(shù)中的最小的數(shù)與子序列最前面的元素交換,也就數(shù)組中的第2個(gè)元素(即a[1])交換,使子序列中的最小數(shù)放在子序列的最前面;……以此類推,第n-1輪需要進(jìn)行1次比較,將剩下的2個(gè)數(shù)中的小數(shù)與子序列的前面即a[n-2]交換,使子序列中的最小數(shù)子序列中的前面。當(dāng)?shù)趎-1輪比較進(jìn)行完后,所有的數(shù)據(jù)都按照升序在數(shù)組中排列。例7:用選擇排序法對6個(gè)數(shù)進(jìn)行排序(從小到大)選擇排序:

第1輪比較時(shí),用a[0]依次與a[1]到a[5]進(jìn)行比較,如果a[0]較大則進(jìn)行交換,否則不變。第1輪結(jié)束后,a[0]中為最小數(shù).

第2輪比較時(shí),用a[1]依次與a[2]到a[5]進(jìn)行比較,如果a[1]較大則進(jìn)行交換,否則不變。第2輪結(jié)束后,a[1]中為次小數(shù).

以后各輪比較過程類似.972541a[0]a[1]a[2]a[3]a[4]a[5]

19754212975479574524

124975

1245

9

7795745972541729712初始狀態(tài)第1輪第2輪第3輪第4輪第5輪795779例7:用選擇排序法對6個(gè)數(shù)進(jìn)行排序(從小到大)972541a[0]a[1]a[2]a[3]a[4]a[5]

19754212975479574524

124975

1245

9

7795745972541729712初始狀態(tài)795779第1輪i=0for(j=1;j<6;j++){if(a[0]>a[j]){(a[0]a[j]}}5次比較第2輪i=1for(j=2;j<6;j++){if(a[1]>a[j]){(a[1]a[j]}}4次比較第4輪i=3for(j=4;j<6;j++){if(a[3]>a[j]){(a[3]a[j]}}2次比較第5輪i=4for(j=5;j<6;j++){if(a[4]>a[j]){(a[4]a[j]}}1次比較歸納:for(i=0;i<5;i++)for(j=i+1;j<6;j++)外層循環(huán)變量i控制進(jìn)行幾輪比較內(nèi)層循環(huán)變量j控制每輪的比較第1輪i=0;第2輪i=1;第3輪i=2;第4輪i=3;第5輪i=4;例7:用選擇排序法對6個(gè)數(shù)進(jìn)行排序(從小到大)972541a[0]a[1]a[2]a[3]a[4]a[5]

19754212975479574524

124975

1245

9

7795745972541729712初始狀態(tài)795779第1輪i=0;第2輪i=1;第3輪i=2;第4輪i=3;第5輪i=4;for(i=0;i<5;i++)for(j=i+1;j<6;j++)

if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}用嵌套的for循環(huán)實(shí)現(xiàn)排序外層循環(huán)控制進(jìn)行幾輪比較內(nèi)層循環(huán)控制每輪的比較次數(shù)#include<stdio.h>main(){inta[6],i,j,t;

for(i=0;i<6;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)for(j=i+1;j<6;j++)

if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}

for(i=0;i<6;i++)printf(“%3d”,a[i]);}i=0時(shí),要進(jìn)行5次比較,a[0]與a[1]比,a[0]與a[2]比…a[0]與a[5]比,最后a[0]中為最小數(shù)i=1時(shí),要進(jìn)行4次比較,a[1]與a[2]比,a[1]與a[3]比…a[1]與a[5]比,最后a[1]中為第2小的數(shù)i=2時(shí),要進(jìn)行3次比較,a[2]與a[3]比,a[2]與a[4]比,a[2]與a[5]比,最后a[2]中為第3小的數(shù)……..用嵌套的for循環(huán)實(shí)現(xiàn)排序外層循環(huán)控制進(jìn)行幾輪比較內(nèi)層循環(huán)控制每輪的比較選擇排序法第二種方法(從小到大,思考)第二種方法:

兩兩比較后并不馬上交換,而是找到最小數(shù)后記下其下標(biāo)P。在一輪比較完畢后,再將最小的數(shù)一次交換到位。——比較次數(shù)不變,交換次數(shù)減少。972541a[0]a[1]a[2]a[3]a[4]a[5]12457912457997254191初始狀態(tài)第1輪第2輪第3輪第4輪第5輪p=0p=1p=2p=5

172549p=1p=227

1

27549p=247p=3p=4p=3p=4選擇排序法第二種方法(從小到大)972541a[0]a[1]a[2]a[3]a[4]a[5]12457912457997254191初始狀態(tài)第1輪第2輪第3輪第4輪第5輪p=0p=1p=2p=5

172549p=1p=227

1

27549p=247p=3p=4p=3p=4第1輪i=0{p=0;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;//比較5次,

if(p!=i){a[p]a[0]}}第2輪i=1{p=1;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;//比較4次,

if(p!=i){a[p]a[1]}}第5輪i=4{p=4;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;//比較1次

if(p!=i){a[p]a[4]}}main(){inta[6],i,j,p,temp;for(i=0;i<6;i++)scanf("%d",&a[i]);for(i=0;i<5;i++){p=i;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;if(p!=i){temp=a[p];a[p]=a[i];a[i]=temp;}}for(i=0;i<6;i++)printf("%3d",a[i]);}1、第1輪排序找到所有元素的最小值a[p],然后將a[0]與a[p]交換,則第1輪結(jié)束后,a[0]中為最小數(shù)。第1輪找最小值a[p]的方法:令p=0,掃描a[1]…a[5],有小于a[0]的即令p記錄其下標(biāo),否則p不變。之后比較a[p]與剩余元素,若有比a[p]小的,則改變p值,否則p不變。該輪比較結(jié)束時(shí),p記錄的就是最小值的下標(biāo)。2、其他幾輪與此類似,只是不要再動(dòng)已排好的元素.課后作業(yè)教材P152-153:

7.2、7.4、7.57.3

二維數(shù)組

一、二維數(shù)組的定義

1.概念:表示1個(gè)數(shù)組元素需要2個(gè)下標(biāo)的數(shù)組叫作二維數(shù)組。

如:學(xué)生年齡表

若用一維數(shù)組描述,需要兩個(gè)數(shù)組: intnum[5];/*存放學(xué)號*/ intage[5];/*存放年齡*/

若用二維數(shù)組描述: inta[2][5];

2.定義形式:

類型說明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];

如:inta[100][3];

/*定義一個(gè)100行3列的整型數(shù)組*/ floatf[20][5];/*定義一個(gè)20行5列的浮點(diǎn)型數(shù)組*/ inta[10+20][6+2];/*定義一個(gè)30行8列的整型數(shù)組*/

學(xué)號12345年齡15161714153.二維數(shù)組的理解:特殊的一維數(shù)組,該一維數(shù)組的每個(gè)數(shù)據(jù)元素也是一個(gè)一維數(shù)組。例inta[3][4];a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]每個(gè)元素a[i]由包含4個(gè)元素的一維數(shù)組組成二維數(shù)組a是由3個(gè)元素組成a[0]a[1]a[2]4.存儲(chǔ)形式:二維數(shù)組的元素在內(nèi)存中按行連續(xù)存放

如:inta[3][3];它的存放形式如下:012345678a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]a[0][0]a[0][1]a[0][2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]100010021004100610081010101210141016

二、二維數(shù)組的引用:

數(shù)組名[下標(biāo)][下標(biāo)]

注意:(1)每個(gè)下標(biāo)都要用[]括起來

如a[2][1]不能寫成a[2,1](2)下標(biāo)從0開始,且不要超過定義的范圍

(3)通過引用,二維數(shù)組元素就可以象普通數(shù)據(jù)

一樣進(jìn)行賦值、算術(shù)運(yùn)算及輸入輸出操作。

三、二維數(shù)組的初始化——定義同時(shí)賦初值

1.分行初始化(看作是特殊的一維數(shù)組)

如:inta[3][4]={

{1,2,3,4},{5,6,7,8},{9,10,11,12}};

此方法較直觀,第1對{}內(nèi)的數(shù)據(jù)賦給第1行數(shù)組元素,依

次類推2.將所有數(shù)據(jù)寫在一個(gè)花括號內(nèi),按數(shù)據(jù)的排列順序?qū)?shù)組

元素賦初值

如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

將數(shù)據(jù)依次賦給元素a[0][0],a[0][1]……a[2][3]123456789101112注意:此方法數(shù)據(jù)無明顯的界限,當(dāng)數(shù)據(jù)較多時(shí)容易出錯(cuò)3.對數(shù)組的部分元素賦初值,未賦值元素自動(dòng)取0

如:inta[3][4]={{1,2},{3},{4,5,6}};

inta[3][4]={1,2,3,4,5,6};1200300045601234560000004.對數(shù)組的全部元素賦初值時(shí)可以省略第一維的長度(行下標(biāo)),

系統(tǒng)會(huì)根據(jù)數(shù)據(jù)的個(gè)數(shù)和第二維的長度自動(dòng)求出第一維長度,

但第二維下標(biāo)不可省。

如:intb[][2]={1,2,3,4,5,6,7,8};數(shù)組a第一維長度為3

數(shù)組b第一維長度為4

如僅對部分元素賦初值,要想省略數(shù)組的行數(shù),則必須分行賦值。

如:inta[][4]={{1,2},{0,3,4},{5}};120003405000例9:找出3×4矩陣中最大的數(shù),并輸出其行號和列號N-S流程圖表示算法52093712610418max0row0col59301212輸出:max=12max=a[1][2]for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max){max=a[i][j];row=i;col=j;}例9:找出3×4矩陣中最大的數(shù),并輸出其行號和列號#include<stdio.h>main(){inti,j,row=0,col=0,max;inta[3][4]={{5,2,0,9},{3,7,12,6},{10,4,1,8}};max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)

if(a[i][j]>max){max=a[i][j];row=i;col=j;}printf(“max=%d\n”,max);printf(“max=a[%d][%d]\n”,row,col);}例10:將一個(gè)矩陣進(jìn)行轉(zhuǎn)置(即原來的行變?yōu)榱校├纾?7126104185209b[1][0]b[1][2]52093712610418a[0][1]a[2][1]算法:for(i=0;i<3;i++)for(j=0;j<4;j++)b[j][i]=a[i][j];轉(zhuǎn)置前轉(zhuǎn)置后3712610418520952093712610418#include<stdio.h>main(){inta[3][4],b[4][3],i,j;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++)

b[j][i]=a[i][j];

for(i=0;i<4

;i++)

{for(j=0;j<3;j++)printf(“%5d”,b[i][j]);printf(“\n”);

}}a[0][1]b[1][0]a[2][1]b[1][2]輸入數(shù)組a進(jìn)行矩陣轉(zhuǎn)置輸出數(shù)組b例11:求一個(gè)4×4矩陣對角線元素之和。#include<stdio.h>main(){inta[4][4]={{12,76,4,1},{-19,28,55,-6},{2,10,13,-2},{3,-9,112,-100}};inti,sum;/*sum:用于求和*/sum=0;for(i=0;i<4;i++)sum+=a[i][i];printf(”對角線和為%d\n”,sum);}定義數(shù)組a并初始化遍歷所有的對角線元素,并求和例12讀入下表中值到數(shù)組,分別求各行、各列及表中所有數(shù)之和(思考題)124615798233251712462215793182333425172437

39

35

111main(){intx[5][4],i,j;

for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&x[i][j]);

for(i=0;i<3;i++)x[4][i]=0;for(j=0;j<5;j++)x[j][3]=0;

for(i=0;i<4;i++)for(j=0;j<3;j++){x[i][3]+=x[i][j];

x[4][j]+=x[i][j];x[4][3]+=x[i][j];}for(i=0;i<5;i++){for(j=0;j<4;j++)printf("%5d\t",x[i][j]);printf("\n");}}7.4

字符數(shù)組和字符串

字符數(shù)組:每個(gè)元素都是字符類型的數(shù)組。charstring[80];字符串:一串以‘\0’結(jié)尾的字符在C語言中被看作字符串。

字符串的末尾必須有’\0’字符,它的ASCII碼值為0。

C語言中沒有字符串變量,而是將字符串存入字符數(shù)組來處理。China\0China不是字符串是字符串字符串常量:用雙引號括起的一串字符是字符串常量,C語言自動(dòng)為其添加‘\0’結(jié)束符。如:"China"一、字符數(shù)組1.定義:

char數(shù)組名[常量表達(dá)式]

例:charc[10],ch[3][4];2.字符數(shù)組的初始化1).逐個(gè)字符賦值2).用字符串常量7.4

字符數(shù)組和字符串

例charch[5];ch[0]=‘H’;ch[1]=‘e’;ch[2]=‘l’;ch[3]=‘l’;ch[4]=‘o’;ch[0]Hello逐個(gè)字符賦值ch[1]ch[2]ch[3]ch[4]注意{}

例charch[5]={‘H’,’e’,’l’,’l’,’o’};ch[0]Hello逐個(gè)字符賦值ch[1]ch[2]ch[3]ch[4]

例charch[5]={‘B’,’o’,’y’};ch[0]Boy\0\0逐個(gè)字符賦值ch[1]ch[2]ch[3]ch[4]

例charch[5]=“Boy”;ch[0]Boy\0\0用字符串常量ch[1]ch[2]ch[3]ch[4]

例charch[6]={“Hello”};charch[6]=“Hello”;charch[]=“Hello”;用字符串常量ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]3、字符數(shù)組元素的引用#include<stdio.h>main(){charc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++)printf("%c",c[i]);printf("\n");}Iamaboy0123456789可以為字符數(shù)組元素賦值,也可以引用字符數(shù)組中的一個(gè)元素,用來運(yùn)算或輸入/輸出元素的值。字符串存放及其結(jié)束標(biāo)志無字符串變量,用字符數(shù)組處理字符串字符串結(jié)束標(biāo)志:‘\0’例“hello”共5個(gè)字符,在內(nèi)存占6個(gè)字節(jié),字符串長度5

'h'

'e'

'l'

'l'

'o'

'\0'

1041011081081110內(nèi)存存放字符ASCII碼4、字符串在字符數(shù)組中存放的注意點(diǎn)等價(jià)于:chars1[]={'C','h','i','n','a','\0'};chars2[10]={'C','h','i','n','a','\0',

'\0','\0','\0','\0'};chars1[]=“China”

;

chars2[10]="China"

;4、字符串在字符數(shù)組中存放的注意點(diǎn)s2[4]s2[5]s2[7]s2[6]s2[8]s2s2[0]s2[2]s2[1]s2[3]10個(gè)字節(jié)'C''i''n''a''h''\0's2[9]'\0'

'\0'

'\0'

'\0''\0's1[5]s1s1[0]s1[2]s1[1]s1[3]6個(gè)字節(jié)s1[4]'C''i''n''a''h'

數(shù)組名:字符數(shù)組(字符串)在內(nèi)存的首地址。

作為字符串進(jìn)行存儲(chǔ)時(shí),字符串與字符數(shù)組的長度可以不等,系統(tǒng)自動(dòng)加‘\0’為結(jié)束標(biāo)志。ss1[0]s1[2]s1[1]s1[3]5個(gè)字節(jié)s1[4]'C''i''n''a''h''\0's3[5]s1s3[0]s3[2]s3[1]s3[3]6個(gè)字節(jié)s3[4]'C''i''n''a''h'不等價(jià)于:chars[5]={'C','h','i','n','a'};chars1[]=“China”

;

不能寫成:chars1[5]="China"

;

用字符串作初值時(shí),數(shù)組的長度應(yīng)足夠大以便能容納全部字符和‘\0’。4、字符串在字符數(shù)組中存放的注意點(diǎn)不是字符串二、字符數(shù)組的輸入輸出1、逐個(gè)字符I/O:%c,輸入或輸出一個(gè)字符;2、整個(gè)字符串I/O:%s,將整個(gè)字符串一次輸入或輸出。例用%cmain(){charstr[5];inti;for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=0;i<5;i++)printf(“%c”,str[i]);}例用%smain(){charstr[5];scanf(“%s”,str);printf(“%s”,str);}用字符數(shù)組名,不要加&輸入串長度<數(shù)組維數(shù)遇空格或回車結(jié)束自動(dòng)加‘\0’用字符數(shù)組名,一次輸出整個(gè)字符串,遇‘\0’結(jié)束main(){chara[]=“Hello”;printf(“%s”,a);}結(jié)果:Helloprintf的%s輸出字符串main(){chara[]={'h','e','l','\0','l','o','\0'};printf("%s",a);}輸出:hel

hel\0lo\0數(shù)組中有多個(gè)‘\0’時(shí),遇第一個(gè)結(jié)束用“%s”輸出時(shí),遇‘\0’結(jié)束hello02314\05main(){inti;chara[5];scanf("%s",a);for(i=0;i<5;i++)printf("%d,",a[i]);}運(yùn)行情況:(1)若輸入hel,正常(2)若輸入hell,正常(3)若輸入hello,用%s輸出時(shí)會(huì)出錯(cuò)輸入字符串長度<數(shù)組維數(shù)scanf的%s輸入字符串

hel\0

hell\0

helloscanf的%s輸入字符串#include<stdio.h>main(){chara[15],b[5],c[5];

scanf("%s%s%s",a,b,c);printf("a=%s\nb=%s\nc=%s\n",a,b,c);

scanf("%s",a);printf("a=%s\n",a);}運(yùn)行情況:輸入:Howareyou?輸出:a=Howb=arec=you?輸入:Howareyou?輸出:a=Howscanf中%s輸入時(shí),遇空格或回車結(jié)束

How\0

are\0

you?\0

三個(gè)字符串用空格隔開,分別賦給a、b、c三個(gè)數(shù)組。三、常用的字符串處理函數(shù)包含在頭文件string.h(1)字符串輸出函數(shù)puts格式:puts(字符數(shù)組)功能:向顯示器輸出字符串(輸出完,換行)說明:字符數(shù)組必須以‘\0’結(jié)束(2)字符串輸入函數(shù)gets格式:gets(字符數(shù)組)功能:從鍵盤輸入一以回車結(jié)束的字符串放入字符數(shù)組中,并自動(dòng)加‘\0’說明:輸入串長度應(yīng)小于字符數(shù)組維數(shù)例#include<stdio.h>#include<string.h>main(){charstring[80];printf(“Inputastring:”);gets(string);puts(string);}輸入:Howareyou?輸出:Howareyou?

#include<stdio.h>main(){chars1[80]=“CLanguage”;

chars2[80]="Program";

printf("%s",s1);

printf("%s",s2);}運(yùn)行結(jié)果為:CLanguageProgram討論1:printf()和puts()函數(shù)一次輸出整個(gè)字符串區(qū)別?#include<stdio.h>main(){chars1[80]=“CLanguage”;

chars2[80]="Program";

puts(s1);

puts(s2);

}運(yùn)行結(jié)果為:CLanguagePrograme注意:puts()函數(shù)輸出字符串后會(huì)自動(dòng)換行#include<stdio.h>main(){chara[15],b[5],c[5];scanf("%s",a);printf("a=%s\n",a);}運(yùn)行情況:輸入:Howareyou?輸出:a=How#include<stdio.h>main(){chara[15],b[5],c[5];gets(a);printf("a=%s\n",a);}

使用scanf()的%s整體輸入,空格或回車結(jié)束使用gets()函數(shù),只以回車鍵結(jié)束輸入運(yùn)行情況:輸入:Howareyou?輸出:a=Howareyou?討論2:scanf()的%s與gets()函數(shù)的區(qū)別?scanf不能讀入帶空格的字符串,gets()可以(3)字符串連接函數(shù)strcat格式:strcat(字符數(shù)組1,字符數(shù)組2)功能:把字符數(shù)組2連到字符數(shù)組1后面返值:返回字符數(shù)組1的首地址說明:字符數(shù)組1必須足夠大連接前,兩串均以‘\0’結(jié)束;連接后,串1的‘\0’取消,新串最后加‘\0’main(){charc1[20]="abcde",c2[10]="12345";

strcat(c1,c2);12345\0\0\0\0\0abcde\0\0\0\0\0\0……\012345\0

puts(c1);puts(c2);}abcde1234512345c1:c2:(4)字符串拷貝函數(shù)strcpy格式:strcpy(字符數(shù)組1,字符串2)功能:將字符串2,拷貝到字符數(shù)組1中去返值:返回字符數(shù)組1的首地址說明:字符數(shù)組1必須足夠大拷貝時(shí)‘\0’一同拷貝

不能使用賦值語句為一個(gè)字符數(shù)組賦值例charstr1[20],str2[20];str1={“Hello!”};(

)str2=str1;(

)abcde\0\0\0\0\0\0……\0strcpy()函數(shù)的使用1main(){charc1[20]="abcde",c2[10]="123";

strcpy(c1,c2);123\0\0\0\0\0\0\0123\0puts(c1);puts(c2);}123123c1:c2:abcde\0\0\0\0\0\0……\0strcpy()函數(shù)的使用2main(){charc1[20]="abcde",c2[10]="123456789";

strcpy(c1,c2);123456789\0123\0

puts(c1);puts(c2);}123456789123456789456789c1:c2:(5)字符串比較函數(shù)strcmp格式:strcmp(字符串1,字符串2)功能:比較兩個(gè)字符串比較規(guī)則:對兩串從左向右逐個(gè)字符比較(ASCII碼),直到遇到不同字符或‘\0’為止返值:返回兩個(gè)字符串中第一個(gè)不同字符的ASCII碼值之差。說明:字符串比較不能用“==”,必須用strcmpstrcmp()函數(shù)的使用1——遇到不同的字符main(){charc1[10]="abcde",c2[10]="abbde";intn;

n=strcmp(c1,c2);abbde\0abcde\0print("n=%d\n",n);}n=1c1:c2:strcmp()函數(shù)的使用2——遇到不同的字符main(){charc1[10]="aaa",c2[10]="abcde";intn;

n=strcmp(c1,c2);abcde\0aaa\0

print("n=%d\n",n);}n=-1c1:c2:strcmp()函數(shù)的使用3——字符串2結(jié)束main(){charc1[10]="abcde",c2[10]="abcd";intn;

n=strcmp(c1,c2);abcd\0abcde\0print("n=%d\n",n);}n=101c1:c2:strcmp()函數(shù)的使用4——兩個(gè)字符串相等main(){charc1[10]="abcde",c2[10]="abcde";intn;

n=strcmp(c1,c2);abcde\0abcde\0

print("n=%d\n",n);}n=0c1:c2:strcmp()函數(shù)的使用5——字符數(shù)組與字符串比較main(){charc1[10]="abcde";intn;

n=strcmp(c1,"ad");ad\0abcde\0\0\0\0\0

print("n=%d\n",n);}n=-2c1:(6)字符串長度函數(shù)strlen格式:strlen(字符數(shù)組)功能:計(jì)算字符串長度返值:返回字符串實(shí)際長度,不包括‘\0’在內(nèi)例:對于以下字符串,strlen(s)的值為:思考)(1)chars[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};(2)chars[]=“\t\v\\\0will\n”;(3)chars[]=“\x69\082\n”;答案:131#include"string.h"main(){intm,n;charstr[80]="Clanguage";m=strlen(str);n=sizeof(str);printf("mis%d\nnis%d\n",m,n);程序的運(yùn)行結(jié)果:mis10nis80#include<string.h>#include<stdio.h>main(){charstr1[]=”Hello!",str2[]=”Howareyou?”,str[20];intlen1,len2,len3;

len1=strlen(str1);len2=strlen(str2);

if(strcmp(str1,str2)>0){strcpy(str,str1);strcat(str,str2);}

elseif(strcmp(str1,str2)<0){strcpy(str,str2);strcat(str,str1);}

elsestrcpy(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論