《C程式語言》 第三章 控制流

2021-08-26 11:43:46 字數 3434 閱讀 3492

3.1 語句與程式塊

在表示式之後加上乙個分號(;),它們就變成了語句。

用一對花括號「」把一組宣告和語句括在一起就構成了程式塊,在語法上等價於單條語句。

3.2 if-else語句

每個else與最近的前乙個沒有else配對的if進行匹配。

if (n > 0)

if (a > b)

z = a;

else

z = b;

程式的縮排結構明確表明了設計意圖,但編譯器無法獲得這一資訊,它會將else部分與內層的if配對。

3.3 else-if語句

/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */

int binsearch(int x, int v, int n)

return -1; }

練習3-1 上面折半查詢的例子中,while迴圈語句內執行了兩次測試。重寫該函式,

使迴圈內部只執行一次測試。比較兩種版本函式的執行時間。 答:

while (low <= high)

if (x == v[mid])

return mid;

else

return -1;

3.4 switch語句

case的作用只是乙個標號,從某個分支中的**執行完後,程式將進入下一分支繼續執行。

跳出switch語句最常用的方法是使用break和return語句。

作為一種良好的程式設計風格,在switch語句最後的default分支後面也加上乙個break語句。

這樣做在邏輯上沒有必要,但當我們需要向該switch語句後新增其他分支時,這樣會降低犯

錯誤的可能性。

練習3-2 編寫乙個函式escape(s, t),將字串t複製到字串s中,並在複製過程中將換行符、

製表符等不可見字元分別轉換為\n、\t等相應可見的轉義字元。再編寫乙個相反功能的函式。 答:

#include

void escape(char s, char t)

}t[j] = '\0';

}void escape2(char s, char t)

else if (s[i+1] == 't')

else

default:

t[j] = s[i++];

break;}}

}main()

3.5 while迴圈與for迴圈

for (表示式1; 表示式2; 表示式3) 語句

等價於=>

表示式1;

while (表示式2)

逗號運算子「,」在for語句中經常用到。被逗號分隔的一對表示式將按照從左到右的順序進行求值,

分隔函式引數的逗號,分隔宣告中變數的逗號等不是逗號運算子,不保證從左至右順序求值。

/* reverse: reverse string s in place */

void reverse(char s)

練習3-3 編寫函式expand(s1, s2),將字串s1中類似於a-z一類的速記符號在字串s2中

擴充套件為等價的完整列表abc...xyz。該函式可以處理大小寫字母和數字,並可以處理a-b-c、

a-z0-9與-a-z等類似的情況。作為前導和尾隨的-字元原樣排印。 答:

#include

void expand(char s1, char s2)

else

}s2[j] = '\0';

}main()

3.6 do-while迴圈

/* itoa: convert n to characters in s */

void itoa(int n, char s)

while ((n /= 10) > 0);

if (sign < 0)

s[i++] = '-';

s[i] = '\0';

reverse(s); }

這裡使用do-while語句會方便一些,因為即使n為0,也至少要把乙個字元放到陣列s中。

do-while中只有一條語句,(沒有必要)但扔用花括號括起來,因為可以避免將while誤認為

是另個while迴圈的開始。

練習3-4 在數的對二的補碼表示中,上面的itoa函式不能處理最大的負數-2的(字長-1)次方

的情況。解釋其原因,並修改函式使它在任何機器上執行時都能列印出正確的值。 答:

例如char字長為8位,則對二補碼範圍為-128~127。值為-128的char,n=-n;後值仍為-128。

128的二進位制原始碼為01111111,通過補碼的負數轉換規則得到10000000,即-128二進位製碼為80(可用prinf("%hhx);驗證)。

修改函式,不將n轉為正數,而是將每次取模運算的結果轉為正數。從而避開無法將最大負數轉為正數的問題。

#include

#define abs(x) ((x) < 0 ? -(x) : (x))

void itoa(int n, char s)

while ((n /= 10) != 0);

if (sign < 0)

s[i++] = '-';

s[i] = '\0';

//reverse(s);

}main()

練習3-5 編寫函式itob(n, s, b),將整數n轉換為以b為底的數,並將轉換結果以字元的形式

儲存到字串s中。例如,itob(n, s, 16)把整數n格式化為十六進製制整數儲存在s中。 答:

#include

#include "reverse.c"

#define abs(x) (x) < 0 ? -(x) : (x)

void itob(int n, char s, int b)

while ((n /= b) != 0);

if (sign < 0)

s[i++] = '-';

s[i] = '\0';

reverse(s);

}main()

練習 3-6 修改itoa函式,使得該函式可以接收三個引數。第三個引數為最小字段寬度。

為了保證轉換後結果至少具有第三個引數指定的最小寬度,必要時在結果左邊填充一定的空格。 答:

...if (sign < 0)

s[i++] = '-';

while (i <= w-1) // fill space

s[i++] = ' ';

...

3.7 break和continue語句

3.8 goto語句與標號

C 語言程式設計 第三章

函式呼叫 呼叫函式前要宣告函式原型 型別識別符號 被呼叫函式名 含型別說明的形參表 呼叫形式 函式名 實參列表 函式的遞迴呼叫 函式直接或間接呼叫自身 函式的引數傳遞 1.在函式被呼叫時才分配形參的儲存單元 2.實參可以是常量 變數或表示式 3.實參型別必須與形參相符 如果不相符,編譯器會先進行型別...

C語言程式設計(第三章例題)

例3.1 把用華氏法表示的溫度 如64 f 轉換成用攝氏法表示的溫度。編寫 includeint main 執行結果 例3.2 計算存款利息。有1000元,想存一年。有三種方法可選 1 活期,年利率為r1。2 一年期定期,年利率為r2。3 存兩次半年定期存款,年利率為r3。請分別計算出一年後按三種方...

C語言第三章

main.c project1 created by sihan guo on 2019 06 13.include int main int argc,const char ar else 迴圈結構 當型 int icount 5 while icount 0 直到型迴圈結構 這個迴圈結構至少執行...