《C++PrimerPlus 6th Edition》第6章 分支語句和邏輯運算符 要點記錄
-
用
cin.get(ch);
逐字符計數時,字符總數中包括按回車鍵生成的換行符 -
對於
char ch;
注意cout<<++ch;
與cout<<ch+1;
的區別(前者類型char、後者類型int) -
C++規定,
||
運算符是個順序點(sequence point),即先修改左側的值,再對右側的值進行判定。例如:i++ < 6 || i == j
,若i原來的值爲10,則i與j比較時已是11;&&
也如此 -
||
第一項爲true時結束對後面的判定,因爲此時表達式必爲true;&&
的第一項爲false結束對後面的判定,因爲此時表達式必爲false -
if(17 < age < 35)
合法,但並非判斷age介於[17,35]之間,且表達式總爲true -
and、or、not
分別對應&&、||、!
,都是C++保留字,使用它們無需使用頭文件,但對於C語言則需要頭文件iso646.h
-
【函數庫cctype】(or ctype.h)
函 數 名 稱 返 回 值 isalnum() 如果參數是字母或數字,返回true isalpha() 如果參數是字母,返回true iscntrl() 如果參數是控制字符,返回true isdigit() 如果參數是數字(0-9),返回true isgraph() 如果參數是除空格外的打印字符,返回true islower() 如果參數是小寫字母,返回true isprint() 如果參數是打印字符,返回true ispunct() 如果參數是標點符號,返回true isspace() 如果參數是標準空白字符,如空格、進紙、換行符、回車、水平製表符或垂直製表符,返回true isupper() 如果參數是大寫字母,返回true isxdigit() 如果參數是十六進制數字,即0-9、a-f或A-F,返回true tolower() 如果參數是大寫字母,則返回其小寫,否則返回該參數 toupper() 如果參數是小寫字母,則返回其大寫,否則返回該參數 -
條件運算符
?:
是C++中唯一的三元運算符,即需要三個操作數的運算符 -
如果既可以使用
if else if
語句,也可以使用switch
語句,則當選項不少於3個時,應使用switch
語句,但switch的標籤只能是整數常量(char、枚舉量也行) -
對於
for循環
來說,continue
語句雖然會導致程序跳過循環體的剩餘部分,但不會跳過循環的更新表達式(如果有的話) -
程序發現用戶輸入錯誤內容時,應採取3個步驟:①重置cin以接受新的輸入;②刪除錯誤輸入;③提示用戶再輸入。 一個處理錯誤輸入的示例:
for (int i=0; i<Max;++i){ cout<<"round #"<<i+1<<": "; while (!(cin>>golf[i])){ cin.clear(); //reset input while (cin.get() != '\n') // 濾去錯誤輸入的字符 continue; cout<<"Please enter a number: "; } }
說明:如果省略
cin.clear()
,程序將拒絕繼續讀取輸入;內置的while循環中cin.get()
用於讀取行尾之前的所有輸入,從而刪除這一行中的錯誤輸入 -
所有可用於cout的操作和方法(如<<、endl和setf())都可用於ofstream對象,所有可以用於cin的操作和方法都可以用於ifstream對象
cout<<fixed; cout.setprecision(2); cout.setf(ios_base:: showpoint); //... ofstream outFile; //打開等操作 outFile << fixed; outFile.setprecision(2); outFile.setf(ios_base:: showpoint); //...
-
打開已有的文件,以接受輸出時,默認將它長度截短爲0,因此原來的內容將丟失
-
open()方法接受一個C-風格字符串作爲參數
-
函數exit()的原型是在頭文件cstdlib中定義的;方法is_open()用於檢查文件是否成功打開,如果編譯器不支持它,可以使用較老的方法good()來代替,但方法good()在檢查可能存在的問題方面,沒有is_open()那麼廣泛
-
檢查文件是否被成功打開非常重要,下面是一些可能出現問題的地方:①制定的文件可能不存在;②文件可能位於另一個目錄;③訪問可能被拒絕;④用戶可能輸錯了文件名或省略了擴展名
-
讀取文件時,有幾點需要檢查:①程序讀取文件時不應超過EOF。如果最後一次讀取數據時遇到EOF,方法eof()將返回true;②程序可能遇到類型不匹配的情況,此時方法fail()返回true(如果遇到EOF該方法也會返回true);③可能出現意外的問題,如文件受損或硬件故障,此時方法bad()返回true。
然而不用分別檢查這些情況,一種更簡單的方法是使用good()方法,該方法在沒有發生任何錯誤時返回true -
表達式
inFile >> value
一般情況下的結果爲inFile,而在需要一個bool值的情況下,inFile的結果爲inFile.good()
,即true或false
【部分習題】
-
請認真考慮下面程序:
#include<iostream> using namespace std; int main(){ char ch; int ct1,ct2; ct1=ct2=0; while((ch=cin.get()) != '$'){ cout<<ch; ct1++; if(ch='$') ct2++; cout<<ch; } cout<<"ct1= "<<ct1<<", ct2= "<<ct2<<"\n"; return 0; }
假設輸入如下(請在每行末尾按回車鍵):
Hi! Send $10 or $20 now!
則輸出將是什麼?
-
與使用數字相比,使用字符(a或c)表示菜單選項和case標籤有何優點?
【習題參考答案】
- 輸入和輸出結果
Hi! H$i$!$ $Send $10 or $20 now! S$e$n$d$ $ct1= 9, ct2= 9
- 如果使用整數標籤,且用戶輸入了非整數(如q),則程序將因爲整數輸入不能處理字符而掛起。但是,如果使用字符標籤,而用戶輸入了整數(如5),則字符輸入將5作爲字符處理。然後,switch語句的default部分將提示輸入另一個字符。