數組是一種重要的數據結構,用來存放同類型的若干個數據。由於在內存中這些數據連續存放,所以可以用下標進行快速訪問。靈活應用數組經常可以起到簡化程序,提高效率的作用。下面我們以教材上的一道課後題爲例來說明。
例:在海軍節開幕式上,A、B、C三條軍艦要同時開始鳴放禮炮各21響。已知A艦每隔5秒放1次,B艦每隔6秒放1次,C艦每隔7秒放1次。假設各炮手對時間的掌握非常準確,請編程計算觀衆總共聽到的禮炮聲數。
這道題目是教材第六章(循環語句)的課後題,因此很多同學在上機的時候選擇用三重循環來枚舉每一種情況並進行計數,然後再減去重複的計數。程序的大概框架如下:
for(a=0; a<5*21;a=a+5)
for(b=0; b<6*21;b=b+6)
for(c=0; c<7*21;c=c+7)
{
//計數
}
//減去重複的計數。
這種做法直觀,容易想到,但是也很容易漏掉一些情況而出錯,好幾個同學得到的結果是負數。下面我們重新分析一下這個問題:
在第0秒,A、B、C三條軍艦同時鳴放禮炮,這時觀衆聽到了1聲炮響,然後,第5秒A艦鳴放禮炮,第6秒B艦鳴放禮炮,第7秒C艦鳴放禮炮,到此觀衆一共聽到了4聲炮響,…,直到第140秒C艦鳴放最後一次禮炮。在[0-140]秒中,有些時刻三個艦同時鳴放,有些時刻兩個艦同時鳴放,有些時刻1個艦鳴放,有些時刻沒有艦鳴放。三個艦鳴放或兩個艦鳴放都只算一聲炮響。因此,該問題可以轉換爲:統計[0-140]秒中多少個時刻有炮響?
時刻是連續的,因此可以定義一個尺寸爲141的數組second,它的下標是0-140,正好對應[0-140]秒,每個數組元素的值代表該時刻幾個軍艦同時鳴炮。例如,second[0]等於3,代表第0秒有三個軍艦鳴炮,second[5]等於1,代表第5秒有1個軍艦鳴炮。初始時,把每個數組元素的值置爲0,然後用一個循環統計每個時刻鳴炮的軍艦個數。最後,統計出second數組中不爲0的元素個數,即爲聽到的禮炮聲數。具體代碼如下:
#include "stdio.h"
int main()
{
int second[141];
int i,a=0,b=0,c=0,count=0;
//將數組元素初始化爲0
for(i=0;i<141;i++)
second[i]=0;
//統計每個時刻鳴炮的軍艦個數
for(i=1;i<=21;i++)
{
second[a]++;
second[b]++;
second[c]++;
a = a+5;
b = b+6;
c = c+7;
}
//統計出second數組中不爲0的元素個數
for(i=0;i<141;i++)
if(second[i]!=0)
count++;
printf("count= %d\n",count);
return 0;
}
這個問題中,我們用數組下標來代表[0-140]秒這些時刻,用元素值代表某時刻鳴炮軍艦的個數。這是解決該問題的關鍵。初學C語言的同學不容易想到這種做法,主要是對數組下標的理解上還不夠靈活。數組下標i雖然表示這是第i個元素,但程序員完全可以根據具體應用賦予它不同的涵義。這一點還需多做練習來慢慢體會。