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