第一課
本課主題: 數組的定義和引用
教學目的: 掌握數組的定義及引用方法
教學重點: 數組的初始化與數組元素的引用方法
教學痛點: 初始化,引用
授課內容:
一、為什麼使用數組?
1、使用數組的好處
便於處理批量資料。
2、何時需要使用數組?
有大量同類型資料要處理。
二、如何使用數組?
1、先定義數組
一維數組的定義方式為:
類型說明符 數組名[常量運算式]
例:int a[10];/*一個名為a的有10個整型元素的數組*/
如果我們處理一個班級42名同學的數學成績,可以定義一個有50個元素的整型數組:int maths[50];
在程式中定義了數組後,編譯器會為它在記憶體中分配儲存空間:
| 資料元素名稱 |
記憶體位址 |
| maths[0] 2000:0001 |
|
| maths[1] 2000:0002 |
| 右邊表格為記憶體儲存映像-------> |
| ... |
|
| maths[49] 2000:0099 |
|
|
|
| 89 |
| 97 |
| 0 |
| 0 |
|
|
| 0 |
| 0 |
C中的數組大小是定義時確定的,也就是說,定義時“[]”裡只能用常量運算式,不能有變數。
int a=50;
int maths[a];
上面的定義是錯誤的!
2、如何存取數組元素?(數組元素的引用)
向數組中存放資料或使用數組中的資料只能一個元素一個元素的引用,也就是說一個語句只能處理一個數組元素中的資料。數組中的元素用下面的形式來引用:數組名稱[該元素在數組中的位置編號]
例如:上面存放數學成績的數組,我們想把第一個同學的數學成績放到數組的第一位置,則用下面的標識:maths[0]
例:
main()<br />{<br /> int maths[50];/*用來儲存班級數學成績*/<br /> maths[0]=89; /*第一個同學的成績為89分,放在數組的第一個位置*/<br /> maths[1]=97; /*第二個同學*/<br />}
注意:C當中數組元素的編號是從0開始的,所以第一個元素編號為0,第二個元素編號為1,千萬不要忘記!
3、怎樣向數組元素賦初始值?
可以用指派陳述式向數組元素賦初始值,但要佔用已耗用時間。如果在定義時賦值,則在編譯時間數組元素即有了初始值,運行時可直接使用。
例:
main()<br />{<br /> static int a[10]={0,1,2,3,4,5,6,7,8,9};/*10個元素,全賦初值。*/<br /> static int b[10]={0,1,2,3}; /*數組部分元素賦初值*/<br /> static int c[10]={0,0,0,0,0,0,0,0,0,0}; /*全部賦0*/<br /> static int d[10]; /*static靜態儲存類別自動賦初值0*/<br /> static int e[]={1,2,3,4,5};/*定義時不指定數組大小,賦幾個值則為幾個元素,<br /> 這個數組的元素個數為5*/<br />}
三、看看數組能做什麼
有十個整數,分別是4,56,43,3,7,88,46,52,32,14。
請把它們按從小到大的順序排列起來。
main()<br />{<br /> int a[11];<br /> int i,j,t;<br /> printf("input 10 numbers:\n");<br /> for(i=1;i<11;i++)<br /> scanf("%d",&a[i]);<br /> printf("\n");<br /> for(j=1;j<=9;j++)<br /> for(i=1;i<=10-j;i++)<br /> if(a[i]>a[i+1])<br /> {t=a[i];a[i]=a[i+1];a[i+1]=t;}<br /> printf("the sorted numbers:\n:");<br /> for(i=1;i<11;i++)<br /> printf("%d",a[i]);<br />}<br />/*---------------<br />results:<br />input 10 numbers:<br />4 56 43 3 7 88 46 52 32 14 return!<br />the sorted numbers:</p><p>*/</p><p>
四、我來試一試
寫一程式,能計算班級某門課程的平均分,統計各分數段的人數,並輸出名次表。
五、使用數組要注意的問題
1、數組定義的一般形式
2、數組元素下標起始值為0
六、二維數組的特徵
如果把一維數組看成是一個表格的話,這個表格可以有若干行,但只有一列。如果把二維數組看成是一個表格的話,這個表格可以有若干行,每行可以有若干列。
| 一維數組a[6] |
二維數組b[6][3] |
|
|
b[0] |
| b[0][0] |
21 |
22 |
| 88 |
54 |
62 |
| 25 |
32 |
32 |
| 88 |
54 |
15 |
| 2 |
b[4][1] |
3 |
| 8 |
55 |
b[5][2] |
|
| b[1] |
| b[2] |
| b[3] |
| b[4] |
| b[5] |
可以把二維數組看成是一個一維數組,這個一維數組的每個元素又是一維數組。
二維數組中的元素在記憶體中的儲存順序是按行存放的,即先順序存放第一行的元素,再存放第二行的元素。
七、二維數組的定義
二維數組定義的一般形式為
類型說明符 數組名[常量運算式][常量運算式]
例:
int class[50][7]; /*共50行,7列,我們可以用它儲存一個班級所有學生的若干門課程的成績。*/
八、存取二維數組的元素
對二維數組的存取也是以元素為單位的,要引用某個元素,必須指明它所在的行、列序號:數組名[行下標][列下標]
例:
main()<br />{<br /> int class[50][7];/*每行放一個學產生績,第一列放數學成績*/<br /> int sum=0;<br /> class[0][0]=89;/*第一個學生的數學成績為89*/<br /> class[1][0]=98;<br /> sum=class[0][0]+class[1][0];<br /> printf("%d",sum);<br />}<br />
九、二維數組的初始化
二維數組的初始化樣本:
main()<br />{<br /> static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};</p><p> static int b[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};</p><p> static int c[3][4]={{1},{5},{9}};</p><p> static int d[3][4]={{1},{0,6},{0,0,11}};</p><p> static int e[3][4]={{1},{5,6}};</p><p> static int f[3][4]={{1},{},{9}};</p><p> static int g[][4]={1,2,3,4,5,6,7,8,9,10,11,12};</p><p> static int h[][4]={{1},{},{9}};<br />}
上面的初始化方法都是正確的。注意花括弧的使用和中括弧中行列數的定義。
十、看看使用二維數組的程式
有一個3*4的矩陣,要求編程式以求出期中值最大的那個元素的值以及其所在的行號和列號。
main()<br />{int i,j,row,colum,max;<br /> static int a[3][4]={1,2,3,4},{9,8,7,6},{-10,10,-5,2}};<br /> max=a[0][0];<br /> for(i=0;i<=2;i++)<br /> for(j=0;j<=3;j++)<br /> if(a[i][j]>max)<br /> {max=a[i][j];<br /> row=1;<br /> colum=j;<br /> }<br /> printf("max=%d,row=%d,colum=%d\n",max,row,colum);<br />}<br />/*-------<br />results:<br />max=10,row=2,colum=1<br />*/
十一、我來試一試
用二維數組儲存班級學生多門課程的成績,然後求每個同學的平均分和每門課程的平均分。
十二、注意問題
1、初始化
2、二維數組的行列的意義。
十三、特殊的數組:字元數組
專門用來存放字元資料的數組是字元數組。字元數組中的一個元素存放一個字元。字元數組通常用來存放字串。
十四、字元數組的定義與引用
定義字元數組:
char c[10];
初始化字元數組:
static char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
如果花括弧中提供的初值個數大於數組長度,則出錯。小於數組長度,則餘下的元素自動定為空白格。
同樣可以向二維字元數組賦初值,方法同整型二維數組。注意字元常量用單引號括住。
字元數組的引用樣本:
main()<br />{static char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};<br /> int i;<br /> for(i=0;i<10;i++)<br /> printf("%c",c[i]);<br /> printf("\n");<br />}<br />/*--------<br />results:<br />I am happy<br />*/
十五、什麼是字串?
字串是若干字元的有限序列。
十六、字串的基本處理:輸入、輸出
在C語言中,字串總是作為字元數組來處理。字串必須儲存在某一字元數組中,它與字元數組的區別是它總以特殊字元'\0'結束。
定義字元數組用來存放字串時,應先估計字串的長度,使數組長度始終保證大於字串的實際長度。
字串“How do you do?"實際存放時的映像如下:
字串的輸入輸出方法:
1、逐個字元輸入輸出。用"%c"格式符。
for(i=0;i<10;i++)
printf("%c",c[i]);/*這裡輸出的是字元數組的元素*/
2、整個字串一次輸入或輸出。用"%s"格式符。
printf("%s",c);/*注意這裡用的是字元數組的名稱*/
請大家判斷下面的字元數組內容按字串輸出時的結果:
如何輸入一個字串?
scanf("%s",c);/*注意字元數組c的長度定義要足夠大*/
當程式執行到上面的語句時,會停下來等待使用者從鍵盤上輸入字串,輸入時以空格作為該串的結束,或以斷行符號鍵結束。輸入後系統自動在輸入的串後加'\0'標誌字元。
請大家判斷下面的程式執行結果:
static char str[13];
scanf("%s",str);
How are you?<return> /*此為使用者輸入內容,以後都用該顏色表示*/
此時輸入str字元數組的字串是什嗎?
十七、其它字串處理函數
請看下面的樣本:
main()<br />{<br /> static char str[40];<br /> static char str2[40]={"tail"};<br /> gets(str);<br /> puts("\n");<br /> puts(str);<br /> strcat(str,str2);<br /> puts(str);<br /> strcpy(str,str2);<br /> puts(str);<br /> if(strcmp(str,"tail")==0)<br /> printf("equal\n");<br /> else<br /> printf("not equal\n");<br /> printf("%d",strlen(str));<br /> strupr(str);<br /> puts(str);<br />}
十八、看看如何使用字元數組
下面的程式用來輸入一行字元,並統計其中有多少個單詞,單詞之間用空格分隔開。
#include "stdio.h"<br />main()<br />{<br /> char string[81];<br /> int i,num=0,word=0;<br /> char c;<br /> gets(string);<br /> for(i=0;(c=string[i])!='\0';i++)<br /> if(c==' ') word=0;<br /> else if(word==0)<br /> {<br />word=1;<br />num++;<br /> }<br /> printf("There are %d words in the line\n",num);<br />}<br />/*-----<br />results:<br />I am a boy.<return><br />There are 4 words int the line<br />*/
十九、我來試一試
寫一程式,把輸入的字串中每一句話的第一個字母改為大寫。
二十、作業
回目錄