C函數 (下)

10 隨機數的生成
● 函數rand產生一個值在0和Rand_MAX之間的整數,其中RAND_MAX是C語言標準定義的至少是32767的符號常量
● 可以通過縮放和平移函數rand產生的值來產生一個指定範圍內的值
● 使用C標準庫函數srand,可以隨機化一個程序
● srand函數爲隨機數產生器布下一個種子以便讓隨機數產生器在每次執行時產生出不同的序列,調用函數srand的語句一般只有一個程序已經完全排錯後才被插入到程序中。在調試程序時最好不要使用srand。因爲這樣可以保證程序的可重複性,這對於檢驗一個隨機數產生程序是否正確是很重要的。
● 函數 rand 和 srand 的函數原型包含在<stdio.h>頭文件中。
● 不想每次都輸入一個種子就實現隨機化,請使用srand(time(NULL));
● 縮放和平移一個隨機數的通用公式是
n=a+rand()%b;
其中,a是平移距離,(即用戶期望的連續整數區間的起始值)。b是縮放因子(即用戶期望的整數區間的寬度)
11 案例分析:運氣遊戲:引入enum
● 用關鍵字enum來定義的枚舉類型是一組用標識符表示的整型常量的集合。一個枚舉類型中的值是從零(0)開始,然後逐個增1.也可以分別給枚舉類型中的每一個標識符富裕一個特定的整數值。枚舉類型中的每一個標識符必須是唯一的,但是他們的值是可以重複的
12 存儲類型
● 在程序中出現的每個標識符都有存儲類型,存儲週期,作用域,鏈接等屬性
● C語言共有4種存儲類型,它們對應的存儲類型說明符分別是:auto,register,extern,static
● 一個標識符的存儲週期是指標識符所代表的變量存在於內存中的時間
● 在一個由多個源文件組成的程序中,標識符的鏈接是說明這個標識符是僅僅能夠被當前源文件所識別,還是可以通過適當的聲明也能被其他源文件所識別
● 具有自動存儲週期的變量在執行到定義它的執行塊時才被創建,並在執行塊的活動期間一直存在於內存中,在控制退出程序塊後就被釋放了。一個函數的局部變量通常都屬於自動存儲變量
● 關鍵字extern和static用於聲明具有靜態存儲週期的變量名和函數名的標識符
● 靜態存儲週期變量是在程序開始運行之前進行分配和初始化的,而且只分配和初始化一次
● 具有靜態存儲週期的標識符可以分爲兩類:
1.外部標識符(如全局變量和函數名)
2.用存儲類別限定符static聲明的局部變量
● 創建全局變量的方法是將其變量定義語句寫在任何一個函數體之外。全局變量在程序運行期間始終存在
● 靜態存儲變量在定義它的函數連續被調用的過程中保持它們的數值
● 如果程序中沒有顯式地對數值型靜態存儲週期變量進行初始化,則C語言會自動將它們初始化爲0
13 作用域的規定
● 一個標識符的作用域是指程序中能夠訪問到這個標識符的區域
● 標識符可以具有函數作用域,文件作用域,程序塊作用域或函數原型作用域
● 標號是唯一具有函數作用域的標識符。標號可以在定義它的函數中的任何位置被訪問到,但是在定義它的函數之外就不能再訪問到了
● 在所有函數之外定義的標識符具有文件作用域。這樣的標識符從聲明它的語句開始到整個程序結束的區間內,能被所有函數識別
● 在一個程序塊內部定義的標識符具有程序塊作用域。程序塊作用域結束於表示程序塊結束的右花括號(})
● 在函數開始時定義的局部變量以及函數的形參都是具有程序塊作用域,因爲形參也被函數視爲局部變量
● 任何程序塊都可以包含變量定義。對於嵌套出現的程序塊,如果外層程序塊中的一個標識符與內層程序塊中的一個標識符具有相同名字,那麼在執行內層程序塊的過程中,外層程序塊的標識符將一直被"隱藏"起來,直到內層程序塊執行結束爲止
● 唯一具有函數原型作用域的一類標識符是出現在函數原型的形參列表中代表形參名的那些標識符。這些標識符可以在程序的其他地方用於其他用途而不會引起混亂
14 遞歸
● 遞歸函數就是直接或間接調用自己的函數
● 如果用基線條件去調用遞歸函數,則函數就直接返回結果。如果用較複雜的情況去調用遞歸函數,則函數將問題從概念上分成兩部分:
● 一部分是函數已經知道答案的
● 一部分是原始問題的一個較小規模的版本
● 由於面臨的新問題與原始問題類似,函數就可以派出一個遞歸調用去求解那個規模較小的問題
● 爲了保證遞歸調用最終終止,遞歸函數每次都是用規模更小的原始問題去調用它自己,而這些逐漸變小的問題最終必須收斂於基線條件。當函數識別出基線條件時,基線條件的解將被返回到它的上一個主調函數。然後就是一連串地直線式地返回操作,直到最終由函數的原始調用返回到原始問題的解
● 對大多數運算符(包括+)而言,標準C沒有規定它們的操作數的定值順序。只對與運算符(&&) 或運算符(||) 逗號運算符(,)和條件運算符(?:)這4個運算符規定了它們的多個操作數的定值順序。前三個運算符屬於二元運算符,它們兩個操作數的定值順序都是從左向右的。最後一個運算符是C語言中唯一一個三元運算符,它總是首先計算最左邊操作數的值。如果最左邊的操作數的值爲非零,則計算中間那個操作數的值,而將最後那個操作數忽略掉。如果最左邊操作數的值是零,則計算第三個操作數的值,而將中間那個操作數忽略掉
16 遞歸與迭代
● 遞歸與迭代都分別以一種控制結構爲基礎:迭代基於循環語句,而遞歸基於選擇語句
● 遞歸和迭代都需要循環地執行:迭代是使用一個循環語句,而遞歸通過重複的調用函數來實現循環
● 遞歸和迭代都需要進行終止測試:當循環條件爲假時,迭代結束,而遞歸是在遇到基線條件時終止
● 遞歸和迭代都可能會出現無限執行的情況:若一個循環繼續條件永遠不會爲假,則發生無限循環,如果遞歸執行產生的新問題不是逐漸收斂於基線條件,也導致無限遞歸
● 遞歸需要不斷的執行函數調用機制,因此會產生很大的函數調用開銷,從而在處理器的時間和存儲器的空間兩方面付出很大的代價

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章