注:讀《程序員面試筆記》筆記總結
1.知識點
1.1條件語句
(1)if……;(2)if……else……;(3)if……else if……;(4)switch(){case ():break;case():break;default:}。
關於switch的兩點說明,第一是case后面結束后必須加break,否則將在執行某個case之后的所有case語句都會執行,第二是default可以省略。
1.2循環語句
(1)for(init;condition of continue circular;variables update);(2)while(condition)。
關於while的一點說明:當while(1)時一般在內部會有break來終止程序結束,否則進入死循環。
2.面試題
2.1.不使用break的switch語句
公司年底給員工發一條關於年終獎的短信,獎品根據員工年度績效考評結果而定,具體見下表,請編寫一個函數,輸入為員工年度考評的結果,輸出為短信的內容,短信中需要羅列員工所獲得的所有獎品。
考評結果 | 年終獎品 |
優秀 A | 美國 或英國十日游,五千元超市卡,兩千元亞馬遜卡,一個月獎金 |
良好B | 五千元超市卡,兩千元亞馬遜卡,一個月獎金 |
及格C | 兩千元亞馬遜卡,一個月獎金 |
未達標D | 一個月獎金 |
1 string getMessage(char mark) { 2 string message = ""; 3 switch (mark) { 4 case 'A'://注意此處使用單引號表示字符,雙引號表示字符串 5 message.append("美國或英國十日游,"); 6 case 'B': 7 message.append("五千元超市卡,"); 8 case 'C': 9 message.append("兩千元亞馬遜卡,"); 10 case 'D': 11 message.append("一個月獎金"); 12 default: 13 break; 14 } 15 return message; 16 } 17 //注意#include<string>來重載cout,才能夠輸出string類型的數據
2.2.for循環的三要素
寫出下面程序的輸出結果:
1 bool foo(char c) { 2 cout << c; 3 return true; 4 } 5 int main(int argc, char *argv[]) { 6 int i = 0; 7 for (foo('A'); foo('B') && (i++ < 2); foo('C')) { 8 foo('D'); 9 } 10 getchar(); 11 return 0; 12 }
答案:ABDCBDCB
2.3巧打乘法口訣表
編寫一個函數,接受一個整形參數n表示輸出的規模。要求只用一重循環輸出乘法口訣表的全部內容,並且程序中不能使用任何條件語句。
1 void print(int n) { 2 int row = 1, column = 1; 3 char flag[] = " \n";//當列數等於行數時為flag[1]換行 4 while (row<=n) 5 { 6 cout << row << " * " << column << " = " << row * column << flag[column / row]; 7 int tem = column % row + 1;//當列數等於行數時,tem跳回1 8 row = column / row + row;//當列數等於行數時,行數加一 9 column = tem; 10 } 11 }
總結:(1)列號的變化規律符合取模運算,這種不斷回到起點的數字排列特征符合取模運算的性質;
下一項列號=當前列號%當前行號+1
(2)對於行號來說,當列號等於行號時,行號加1,當列號等於行號時,行號不變。行號的變化規律符合整數除法的性質,當被除數小於除數時結果為零,當二者相等時結果為1。
下一項行號=當前列號/當前行號+1