第6章 分支語句和邏輯操作符
6.3 字元庫函數 cctype
6.4 ? : 操作符
6.5 switch 語句
6.6 break 和 continue 語句
這一節真的真的很重要,因為有的時候我們的程式到這個地方就該結束了,或者說程式的出口不止一個。之前有在遞歸等章節寫過break; 這裡再來仔細的整理一下。
我是這麼記得:break就是不做了,是以就跳出目前的循環,執行循環體外的下一條語句。continue還是要做,這是這次的不做了,進行下一趟循環。
還有一點要注意,無論是break還是continue的跳出,針對的都是循環體(for/while) 而不是 條件語句(if/else)。
6.7 讀取數字的循環
#include <iostream>
using namespace std;
int main()
{
int a[10];
int i = 0;
while(cin>>a[i] && i < 10)
{
i++;
}
cin.clear();
cin.ignore();
cin>>a[i++];
for(int num = 0;num < i;num++)
{
cout<<a[num]<<"\t";
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int a[10];
int i = 0;
cin>>a[i];
while(i < 10)
{
i++;
cin>>a[i];
if(a[i] == '\0')
{
cin.clear();
cin.ignore();
i--;
}
}
for(int j = 0;j < i;j++)
{
cout<<a[j]<<"\t";
}
return 0;
}
當我們僅通過while循環來輸入資料時,一旦遇到輸入一個非數字型資料,那麼此時輸入隊列中的最後一個位置(即字元位置),值為0(false),那麼其後想向其中輸入資料是不可能的,可以通過clear()清除錯誤标志,并用ignore()來忽略這個符号位,以此來将輸入隊列後面的内容指派給接下來的位置(即原符号位)。
#include <iostream>
using namespace std;
int main()
{
const int num = 5;
int a[num];
int i = 0;
cin>>a[i];
while(i < 5)
{
if(a[i] == '\0')
{
cin.clear();
cin.ignore();
i--;
cout<<"Please input a number: "<<endl;
}
i++;
cin>>a[i];
}
for(int j = 0;j < i;j++)
{
cout<<a[j]<<"\t";
}
return 0;
}
書上代碼:
之是以選擇粘出書上的代碼,是因為有個地方可以學習一下:1. 用 while 循環結合 continue,來循環,如果不滿足就跳出,這就對于多個字元輸入是有益的,cin隊列裡的數字會被順換取出,如果是字元就被處理掉,然後再輸出一句:請輸入一個數字(提示)。我的代碼就有問題,比如輸入兩個字元,就會導緻兩次輸出提示。。。
6.8 簡單檔案輸入/輸出
無關痛癢的話:不知道你現在遇到 / \ 是不是也得轉個彎。(✿◡‿◡)
6.8.1 文本 I/O 和文本檔案
6.8.2 寫入到文本檔案中
代碼中幾個點整理一下:
1. 整體的使用流程是:包含頭檔案:fstream -》建立ofstream對象 -》建立關聯:outFile.open("XXX.txt"); -》具體的操作,比如輸入啊計算之類的 -》可以通過outFile對象将檔案内的東西讀出來,使用方法與cout相同 -》關閉關聯:outFile.close();
2. 聲明一個ofstream對象後,便可以使用方法 open() 來将該對象同一個特定的檔案關聯起來
3. 使用完一個檔案後,應該将其關閉:outFile.close(),注意,方法close()不需要使用檔案名作為參數,這是因為outFile已經同特定的檔案關聯起來了,如果您忘記關閉檔案,程式正常終止時将自動關閉它。
4. outFile(ofstream建立的對象)可以使用cout可使用的任何方法,也可以使用各種格式化方法,如setf()和precision(),但是它不能使用操作符<<
5.
6.8.3 讀取文本檔案
6.10 複習題
答:第二種統計的個數不對鴨,走的路徑不一樣。
由這個題聯想了三個題,自己來練習一下:
- 1. 統計一個輸入的字元串中,單詞的個數
- 2. 統計一個輸入的字元串中,空格的個數
- 3. 統計一個輸入的字元串中,換行符的個數
首先來解決這幾個問題,然後再回看之前的問題,嘿嘿~
1. 因為cin可以提取的機關是單詞,是以可以用cin來解決這個問題,不過下面的程式隻能通過Ctrl+Z結束。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int num = 0;
while(cin>>str)
{
num++;
}
cout<<num;
return 0;
}
2.3. 統計空格和換行符 ‘\n’ 使用cin顯然不合适,是以可以用cin.get(ch)函數來獲得目前輸入的字元,已統計數量。
#include <iostream>
using namespace std;
int main()
{
char charr;
int num = 0;
int newlines = 0;
while(cin.get(charr) && charr != '\n')
{
if(charr == ' ')
{
num++;
}
}
cout<<num<<"\t"<<newlines;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
char charr;
int num = 0;
int newlines = 0;
while(cin.get(charr))
{
if(charr == ' ')
{
num++;
}
if(charr == '\n')
{
newlines++;
}
}
cout<<num<<"\t"<<newlines;
return 0;
}
答:ch+1,ch的值本身不會改變;++ch會讓ch的值+1。
答:我看不懂→前面是不是有個空格,我就按有算了哈:思路ct1統計了循環執行的次數,整個cin隊列一共有27個字元,ch = cin.get()就是從隊列中逐一取字元,如果不等于 '$',那麼就可以繼續進行循環體内的内容,是以我的答案是:9 0。
嗯。。。自古套路得人心,這是個什麼題:
答:a. weight >= 115 && weight <125
b. ch == q || ch == Q
c. x % 2 == 0 && x != 26
d. x % 2 == 0 && x % 26 != 0
e. donation >= 1000 || donation <= 2000 || guest == 1
f. (ch >= 'a' && ch <<'z') || (ch >= 'A' && ch <= 'Z')
答:不相同。x=6 -》!x = 0 -》!!x = 1
首先回憶一下求絕對值的函數abs,頭檔案是stdlib.h,不過隻能求整型數的絕對值,不同類型針對的求絕對值的函數也是不同的。
#include <iostream>
#include <stdlib.h> //abs(int a);函數的頭檔案
/*
int abs(int x)傳回整型參數i的絕對值
double cabs(struct complex znum) 傳回複數znum的絕對值
double fabs(double x) 傳回雙精度參數x的絕對值
long labs(long n) 傳回長整型參數n的絕對值
*/
using namespace std;
int main()
{
int a = -2;
a = abs(a);
cout<<a;
return 0;
}
再回到題上就很簡單了:
#include <iostream>
using namespace std;
int main()
{
int x;
cin>>x;
x = x > 0 ? x : -x;
cout<<x;
return 0;
}
當然這裡沒有用到絕對值函數而是使用了唯一的一個三目表達式來處理滴。如果 x > 0,則整個表達式的值為x的值,然後指派給x;否則,整個表達式的值為-x的值,然後指派給x。