1. 程式人生 > >迴圈 與 分支語句 和 字元函式庫cctype 檔案簡單處理

迴圈 與 分支語句 和 字元函式庫cctype 檔案簡單處理

迴圈
  1. for迴圈
  2. while迴圈
  3. do  while迴圈
通常,入口條件迴圈比出口條件迴圈好,因為迴圈開始前對條件進行檢查 c++11基於範圍的for迴圈    對陣列(或容器類,如:vector和array)的每個元素執行相同操作
  • int a[5]={1,3,4,5,6};
           for (int i :a)                  cout<<i<<endl;   //////不斷迴圈把依次打印出來
  • int a[5]={1,3,4,5,6};
           for (int & i :a)                 { i=i+5;                     cout<<i<<endl;                       } //////修改陣列的值,符號&表明i是一個引用變數
  • for (int i :{1,3,4,5,6})
                 cout<<i<<endl; 設計迴圈時的指導規則
  • 指定迴圈終止條件
  • 在首次測試前初始化條件
  • 在條件再次測試前更新條件
  • 語句塊是由花括號,而不是縮排定義的
延時迴圈
  • ANSI和c++庫中存在clock函式返回程式開始執行後所用的系統時間,單位不一定是秒
  • 新增標頭檔案#include<ctime>
  • CLOCKS_PER_SEC,該常量等於每秒鐘包含的系統時間,所以系統時間除於這個值等於秒數
  • ctime把clock_t作為clock()返回型別的別名,這意味著可以把變數宣告為clock_k型別
c++設定類型別名的方式
  1. 使用前處理器:#define aliasname  typename
  • 當宣告多個一系列別名時不能使用
  • 使用關鍵字typedef建立:typedef typename  aliasname
    • 能處理define處理不了的複雜別名,與define相比,typedif是更好的選擇,有時也是唯一的選擇
    • 注意,typedif不是建立新型別,而是在已有的型別建立一個新名稱
    資料輸入
    1. 使用原始的cin進行輸入
    • cin讀取char值時與讀取其他基本型別一樣,忽略了空格和換行符,所以輸入的空格沒有顯示也沒有包括在計數內
    • 用cin輸入時被緩衝,意味著當用戶按下回車才發給程式,當快取區還有資料時,會賦予下一條cin語句
    • int n;cin>>n;如果輸入的型別不匹配時將出現4種情況
      • n的值不變
      • 不匹配的輸入將留在輸入佇列的緩衝區中
      • cin中一個錯誤的標記被設定  (當錯誤被標記時,可以使用cin.clear()重置標記,同時也清除檔案尾的eof)
      • 對cin方法的呼叫返回false或0
  • 使用cin.get()
    • cin.get(ch)讀取輸入中的下一個字元(即使是空格),並將其賦給變數ch
    • 在c語言中要修改變數的值,必須將變數的地址傳遞給函式,但在c++中只要將引數宣告為引用即可,標頭檔案iostream將cin.get(ch)的引數宣告為引用型別
    • cin.get()函式接受不同數量引數的原因是函式過載
  • 當cin及cin.get()等輸入作為迴圈條件時,則轉換成bool型別,正確輸入則返回true錯誤則返回false
  • 當程式使用者輸入了錯誤內容時應採取3個步驟
    1. 用clear()函式重置cin以接收新的輸入        
    2. 用cin.get()讀取行尾之前的所有輸入,也就是刪除錯誤輸入
    3. 提示使用者重新輸入
    檔案尾檢測:EOF
    • windo命令提示符模式下在任意位置按下Ctr+z和Enter
    • 檢測到EOF後cin將兩位(eofbit和failbit)都設定為1;通過成員函式cin.eof()和cin.fail()來檢視eofbit是否被設定,返回true和false
    • cin.clear()可以用來重置輸入流,即清空緩衝區,
    邏輯運算細節
    • !運算子高於所有關係運算符和算術運算子
    • 邏輯 | | 運算子高於&&運算子
    • C語言用邏輯運算子的另一種表達方式需要包含標頭檔案iso646.h,c++不需要使用標頭檔案,即&&    and,||    or,!  not
    字元函式庫cctype
    函式名稱 返回值
    isalnum() 如果引數是數字或字母,則返回true
    isalpha() 如果引數是字母,則返回true
    islower() 如果是小寫字母,則返回true
    isupper() 如果是大寫字母,則返回true
    isdigit() 如果是數字(0-9),則返回true
    isctrl() 如果是控制字元,則返回ture
    isgraph() 如果是空格以外的列印字元,則返回true
    ispunct() 如果是標點符號該字元返回true
    isprint() 如果引數是列印字元(包括字元),則返回true
    isspace() 如果引數是標準空白字元,包括空格換行回車製表符,則返回true
    isxdigit() 如果引數是16進位制數字,則返回true
    toupper() 如果是小寫字母則返回大寫字母,否則返回原引數
    tolower() 如果是大寫字母則返回小寫字母,否則返回原引數
    條件運算子(?:)
    • c++種唯一一個需要3個運算元的運算子
    • 表示式1 ? 表示式2 :表示式3    //當表示式1為true時,則執行表示式2,為false時則執行表示式3
    • 而且可以在條件表示式中巢狀另一個表示式(一個被譴責的任務,隱藏程式碼)
    switch語句: switch(integer-expreession) {         case    label 1    :    statement(s)         case    label 2    :    statement(s) ……         default              :  statement(s) }
    • integer-expreession必須是結果為整數的表示式
    • 標籤必須是一個整數常量表達式,如:int,char,也可以是列舉量
    • 如果integer-expreession找不到匹配的標籤,則執行default標籤
    • 為了應對不按指令辦事的使用者,最好用字元輸入
    • 要讓程式執行一組特定語句後停止,必須使用break
    • switch語句中將int值和列舉量標籤進行比較時,將列舉提升為int,在while迴圈測試條件中,也會將列舉量提升為int型別
    • 當選項多餘3個時,最好用switch分支語句
    break:當迴圈遇到break,則跳出迴圈 continue:跳過迴圈體下面的語句,開始新一輪的迴圈 簡單檔案操作
    1. 寫入到文字檔案
    • 必須包含標頭檔案fstream
    • 必須指明名稱空間std,可以使用using或std::
    • 標頭檔案ftream定義一個處理輸出的ofstream類
    • 需要建立多個ofstream變數(物件),要遵守變數的命名規則
    • ofstream物件與檔案關聯起來,可以使用open()方法
    • 使用完應使用close()將其關閉
    • 可以像使用cout那樣使用ofstream的物件,如<<,endl以及各種cout格式化函式
    1. 方法open()接受一個字面字串做引數,或存在陣列的字串。
    2. 將在當前目錄新建檔案,open引數將會是檔名,如果檔名存在則預設清空再開啟
    3. 如果沒有使用close(),系統將在程式正常終止時關閉
  • 讀取文字檔案
    • 必須包含標頭檔案fstream
    • 必須指明名稱空間std,可以使用using或std::
    • 標頭檔案ftream定義一個處理輸入的ifstream類
      • 需要建立多個ifstream變數(物件),要遵守變數的命名規則
      • 將ifstream物件與檔案關聯起來,可以使用open()方法
      • 使用完應使用close()將其關閉
      • 可以像使用cin那樣使用ifstream的物件,cin適用的操作和方法都適用ifstream的物件,如>>
      • 可以使用ifstream物件和get()方法讀取一個字元,使用getline()方法讀取一行字元
      • 可以結合ifstream和eof()、fail()等方法判斷輸入是否成功
      • 當ifstream的物件被作為測試條件時,最後一個讀取操作成功時轉化成true,否則false
    1. 檢查檔案是否成功開啟可以使用方法is_open(),成功返回true
    • 讀取檔案時不應該超過EOF
    • 最後讀取資料遇到EOF,eof()返回true
    • 最後資料出現型別不匹配時,fail()將返回ture
    • 當檔案受損,或硬體故障時,bad()將返回true
    • 當沒有出現任何錯誤時,good()將返回true
    附錄
    1. 通常cout顯示bool值之前把他們轉化成int,但cout.self(ios::boolalpha)函式呼叫設定了一個標記,該標記命令cout顯示true和false,而不是1和0
    2. 標頭檔案cstdlib定義下,exit(EXIT_FAILURE)實現程式終止
    3. window文字檔案的每行都以回車字元和換行符結尾,通常c++讀取檔案時將這兩個字元轉換為換行符並在寫入檔案時執行相反的轉換。
    4. 布林函式is_int() 使用climits檔案中定義的兩個字元常量(INT_MAX和INT_MIN)來確定引數是否位於適當的範圍,非常適合作為條件