第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。