1. 數組的基本概念
count
的4個元素的
存儲空間也是相鄰的
。結構體成員可以是基本數據類型,也可以是復合數據類型,數組中的元素也是如此。根據組合規則,我們可以定義一個由4個結構體元素組成的數組:
count[-1]
或是
count[100]
這樣的訪問越界錯誤,編譯時能順利通過,所以屬于運行時錯誤。但有時候這種錯誤很隱蔽,發生訪問越界時程序可能并不會立即崩潰,而執行到后面某個正確的語句時卻有可能突然崩潰(在
第4節 “段錯誤”
我們會看到這樣的例子)。
count[-1]
這種技巧其實并不少見,不應該當作錯誤。)
a = b
這個表達式,
a
和
b
都是數組類型的變量,但是
b
做右值使用,自動轉換成指針類型,而左邊仍然是數組類型,所以編譯器報的錯是
error: incompatible types in assignment
。
{
int array1[10] = { 3, 5, 1, 2, 2, 9, 1, 3, 4, 8 };
int array2[10];
int i;
for (i = 0; i < 10; i++) {
array2[i] = array1[i];
}
for (i = 0; i < 10; i++) {
printf("%d, ", array2[i]);
}
return 0;
}
rand
函數,使用這個函數需要包含頭文件
stdlib.h
,它沒有參數,返回值是一個介于0和
RAND_MAX
之間的接近均勻分布的整數。
RAND_MAX
是該頭文件中定義的一個常量,在不同的平臺上有不同的取值,但可以肯定它是一個非常大的整數。
srand
函數指定Seed。通常我們通過別的途徑得到一個不確定的數作為Seed,例如調用
time
函數得到當前系統時間距1970年1月1日00:00:00的秒數,然后傳給
srand
:
rand
,得到的隨機數就和剛才完全不同了。調用
time
函數需要包含頭文件
time.h
,這里的
NULL
表示空指針。
rand
函數生成[10, 20]之間的隨機整數,表達式應該怎么寫?
main
函數,以可視化的形式打印直方圖。
{
gen_random(UPPER);
int i, histogram[UPPER] = {0};
for (i = 0; i < N; i++)
histogram[a[i]]++;
for (i = 0; i < UPPER; i++)
printf("%d\t", i);
printf("\n");
do {
// 實際上只可能循環N次,因此外層while循環可改為for 0-> N-1,變量breakLoop也可以省了
int breakLoop = 1;
for (i = 0; i < UPPER; i++) {
if (histogram[i] > 0) {
printf("%c\t", '*');
histogram[i]--;
breakLoop = 0;
} else {
}
printf("\n");
if (breakLoop)
break;
} while (1);
return 0;
}
N
個數中取
M
個數做組合而不是做排列,就不能用原來的遞歸過程了,想想組合的遞歸過程應該怎么描述,編程實現它。
'\0'
做結束符,這里的
\0
是ASCII碼的八進制表示,也就是ASCII碼為0的Null字符,在C語言中這種字符串也稱為以零結尾的字符串(Null-terminated String)。數組元素可以通過數組名加下標的方式訪問,而字符串字面值也可以像數組名一樣使用,可以加下標訪問其中的字符:
printf
會從數組
str
的開頭一直打印到Null字符為止,Null字符本身是Non-printable字符,不打印。
str
中沒有Null字符,那么
printf
函數就會訪問數組越界,后果可能會很詭異:有時候打印出亂碼,有時候看起來沒錯誤,有時候引起程序崩潰。
圖8.3.多維數組
圖8.4.多維字符數組
case
、
printf
和
break
,如果漏寫一個
break
就要出Bug。這個程序之所以簡潔,是因為用數據代替了代碼。具體來說,
通過下標訪問字符串組成的數組可以代替一堆
case
分支判斷,這樣就可以把每個
case
里重復的代碼(
printf
調用)提取出來
,從而又一次達到了“提取公因式”的效果。這種方法稱為數據驅動的編程(Data-driven Programming),寫代碼最重要的是選擇正確的數據結構來組織信息,設計控制流程和算法尚在其次,只要數據結構選擇得正確,其它代碼自然而然就變得容易理解和維護了,就像這里的
printf
自然而然就被提取出來了。
(man - computer + 4) % 3 - 1
這個神奇的表達式是如何比較出0、1、2這三個數字在“剪刀石頭布”意義上的大小的?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
