數(shù)組
本節(jié)我們將用C寫一個(gè)小程序隨機(jī)生成10個(gè)數(shù),并對(duì)其進(jìn)行排序。我們將使用一種新的變量結(jié)構(gòu):數(shù)組。
借助數(shù)組可以聲明并使用一組同類型的數(shù)據(jù)。比如您現(xiàn)在需要?jiǎng)?chuàng)建五個(gè)整數(shù)。一種辦法是直接進(jìn)行聲明:
int a, b, c, d, e;
這當(dāng)然可以,但如果您需要一千個(gè)整數(shù)呢?一種更好的辦法是聲明一個(gè)包含五個(gè)整數(shù)的數(shù)組:
int a[5];
這個(gè)數(shù)組中的五個(gè)整數(shù)可以分別使用下標(biāo)進(jìn)行訪問。C中所有數(shù)組的下標(biāo)都是從零到n-1。所以int a[5];包含了五個(gè)元素。例如:
int a[5];
a[0] = 12;
a[1] = 9;
a[2] = 14;
a[3] = 5;
a[4] = 1;
使用下標(biāo)訪問數(shù)組帶來的一個(gè)好處是可以用循環(huán)來遍歷下標(biāo)。例如,下面的代碼把數(shù)組的所有元素初始化為零:
int a[5];
int i;
for (i=0; i<5; i++)
a[i] = 0;
下面的代碼將數(shù)組元素按順序初始化,然后打印輸出:
#include
int main()
{int a[5];int i;for (i=0; i<5; i++)
a[i] = i;for (i=0; i<5; i++)
printf("a[%d] = %dn", i, a[i]);}
在C中到處都會(huì)用到數(shù)組。下面的代碼是一種使用數(shù)組的常見情形。請(qǐng)打開編輯器并錄入以下代碼:
#include#define MAX 10 int a[MAX]; int rand_seed=10; /* 摘自 K&R - 返回0-32767之間一個(gè)隨機(jī)數(shù)字。*/ int rand() {rand_seed = rand_seed * 1103515245 +12345;return (unsigned int)(rand_seed / 65536) % 32768;} int main() {int i,t,x,y;/* fill array */ for (i=0; i < MAX; i++){a[i]=rand();printf("%dn",a[i]);}
return 0;}
這段代碼引入了幾個(gè)新概念。#define聲明了一個(gè)名為MAX的常量并讓它等于10。為在代碼中醒目起見,常量名習(xí)慣上全用大寫字母。int a[MAX];這行告訴我們?cè)贑中如何聲明整型數(shù)組。注意,數(shù)組聲明出現(xiàn)的位置決定了它是整個(gè)程序的全局變量。
下面的一行int rand_seed=10也聲明了一個(gè)全局變量,名為rand_seed。它在每次程序開始時(shí)被初始化為10,作為下面隨機(jī)數(shù)生成代碼的初始種子。實(shí)際中隨機(jī)數(shù)發(fā)生器的種子應(yīng)該以一個(gè)隨機(jī)數(shù)作為初值,如系統(tǒng)時(shí)間。本例中的rand函數(shù),在每次程序運(yùn)行時(shí)都會(huì)給出相同的隨機(jī)數(shù)序列。
int rand()這行代碼是一個(gè)函數(shù)聲明:rand函數(shù)沒有參數(shù)且返回一個(gè)整數(shù)。后面我們會(huì)學(xué)習(xí)更多關(guān)于函數(shù)的知識(shí)。下面的四行是rand函數(shù)的實(shí)現(xiàn),我們可以暫時(shí)忽略。
主函數(shù)沒什么特別的。先聲明了四個(gè)整型變量,接下來的for循環(huán)用10個(gè)隨機(jī)數(shù)填充數(shù)組。注意數(shù)組a包含了10個(gè)獨(dú)立的整數(shù)。您可以用方括號(hào)指明具體元素。例如a[0]代表數(shù)組中的第一個(gè)整數(shù),a[1]代表第二個(gè),以此類推。用/*開始并用*/結(jié)束的行稱為注釋。編譯器完全忽略注釋行。您可以把程序說明(自己看或供其他程序員閱讀)放在注釋中。
現(xiàn)在請(qǐng)用下面的代碼替換這里很快會(huì)加入新內(nèi)容那行注釋:
/* 將數(shù)組用冒泡法排序 */ for (x=0; x < MAX-1; x++) for (y=0; y < MAX-x-1; y++) if (a[y] > a[y+1]) {t=a[y];a[y]=a[y+1];a[y+1]=t;} /* 打印排序后的數(shù)組 */ printf("--------------------n"); for (i=0; i < MAX; i++) printf("%dn",a[i]);
以上代碼將隨機(jī)數(shù)排序,并按順序打印。每次運(yùn)行程序您都會(huì)得到同樣的結(jié)果。要想改變參加排序的值,在每次運(yùn)行程序前請(qǐng)改變r(jià)and_seed的值。
要真正讀懂這段代碼的簡(jiǎn)單辦法只有一個(gè),就是“手動(dòng)”執(zhí)行一下程序。為簡(jiǎn)單起見令MAX等于4。準(zhǔn)備一張紙并假設(shè)您自己就是計(jì)算機(jī)。在紙上畫出數(shù)組,然后填入四個(gè)隨機(jī)、無序的數(shù)字。現(xiàn)在按照代碼中的排序部分一邊逐行執(zhí)行,一邊在紙上記錄執(zhí)行過程。您會(huì)發(fā)現(xiàn)每次執(zhí)行完內(nèi)層循環(huán)后,較大的那些數(shù)被推向數(shù)組尾部,而較小的那些數(shù)則向數(shù)組首部靠攏。
動(dòng)手一試
在代碼前一部分,試將填充數(shù)組的for循環(huán)縮減為一行代碼。請(qǐng)確保結(jié)果和原來的程序相同。
將冒泡排序的代碼提出來建立它自己的函數(shù)。函數(shù)頭是void bubble_sort()。然后將冒泡排序使用的變量也移入函數(shù)變成局部變量。因?yàn)閿?shù)組是全局的,所以不需要傳遞參數(shù)。
改變隨機(jī)數(shù)種子的初始值。?
?
C 常見錯(cuò)誤
C不提供邊界檢查。所以如果您的數(shù)組指標(biāo)越界了,C不會(huì)有任何提示。程序會(huì)最后崩潰或輸出無意義的數(shù)據(jù)。
即使不傳遞參數(shù),函數(shù)調(diào)用也要包含()。例如,C接受x=rand;,但這不能完成函數(shù)調(diào)用,而是把rand函數(shù)的內(nèi)存地址賦值給了x。必須寫成x=rand();才行。
評(píng)論
查看更多