# Ch7 雜項:其他資料型態、函式庫、格式化輸出 > 搭配[green judge解題系統](http://www.tcgs.tc.edu.tw:1218/) > Special thanks to [台中女中sagit老師](http://www.tcgs.tc.edu.tw/~sagit/index.htm) \<\(\_ \_\)\> ## > 上一章:[for迴圈](https://hackmd.io/s/H1iyHQc2b) > 下一章:[處理不同輸入規則](https://hackmd.io/s/rJfcCI_R-) > 回目錄:[國立科學園區實驗中學C++程式語言自學講義](https://hackmd.io/s/B18yT_i5Z) ## <font color='darkblue'>其他資料型態</font> 練習了這麼多的題目 我們已經很熟練`int`以及`float`的用法了 然而程式中的資料型態可不只這兩個 接下來要介紹其它常用的基本資料型態 ### long long 長整數 我們一直以來所使用的`int` 它所能儲存的整數的範圍僅限於 -2147483648 至 2147483647 之間 如果超過了,它會繞一圈回到另一端,完全不是原來的數字了 (你可以試試2147483647+1,會變成-2147483648喔) 但如果使用`long long`來儲存 則可以存到 –9223372036854775808 至 9223372036854775807 之間 除了能儲存的範圍擴大了以外 它的使用方法都跟int一模一樣 <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a031: 全民公投 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a031) ### double 雙精度浮點數 用法和float相同 但是可以存到小數點後更多位 ### char 字元 字元就是單獨的一個字,可以是字母,或是符號,或是數字 相對於放在雙引號裡的字串 字元的表示法則是放在**單引號**裡 宣告一個字元 ```cpp char c; ``` 讓一個字元變成'A' ```cpp c = 'A'; ``` 檢查一個字元是否為'+' ```cpp if(c=='+') cout<<"c is plus"<<endl; ``` <font color='darkorange'>【例題】</font> > 輸入一個算式,格式為兩個數子中間一個運算符號(\+\-\*),請將運算符號換成英文的意思後輸出 > 例如 > 輸入1+2 則輸出1 add 2 > 輸入15-3 則輸出15 minus 3 > 輸入2\*10 則輸出2 time 10 ```cpp= int a, b; char c; cin >> a >> c >> b; if(c=='+') cout<<a<<" add "<<b<<endl; if(c=='-') cout<<a<<" minus "<<b<<endl; if(c=='*') cout<<a<<" time "<<b<<endl; ``` <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a032: 小小綠的數學習題 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a032) 每一個字元的背後都有一個它所代表的號碼 這個特質讓字元有個這樣的神奇功能: ```cpp cout << ('A'+3); ``` 由於字母A往後數3個是字母D,因此會在小黑窗上看到'D' 同學也可以猜猜看以下這個程式會印出什麼字? ```cpp= char word = 'z' word = word - 10; cout << word; ``` ### string 字串 還記得我們一開始學的 "Hello" 它就是一個字串 字串就是放在**雙引號**內的**一串字元** 宣告一個字串 ```cpp string s; ``` 讓一個字串變成"Hello" ```cpp s = "Hello"; ``` 檢查一個字串是否等於"blabla" ```cpp if(s=="blabla") ``` <font color='darkorange'>【例題】</font> > 輸入一個字串s > 將s前後都加上三個飄號"\~\~\~" ```cpp= string s; cin >> s; cout << "~~~" << s << "~~~" << endl; ``` <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge b006: Hello, XXX! ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b006) ### bool 布林數 布林數所儲存的資料只有分成兩種:1或是0 分別代表著「是」與「否」 它的使用方法也和int沒什麼差別 但是除了0以外 如果你讓它變成1以外的其他數字(例如2、3、100、-1、-99) 它通通會直接當成1 不過它不是拿來存數字的 而是拿來存「是或否」的資訊的 例如常常在if時用到的判斷式 ```cpp= bool a; a = (1>2) ; ``` 由於1>2是錯誤的,所以a這時就會是「否」 ## <font color='darkblue'>其他函式庫</font> 寫了這麼多的程式 每次我們都會在第一行寫上 `#include<iostream>` 那行程式的意思是,將「輸出輸入」的功能包進來 不過除了iostream之外 其實還有非常非常多的功能可以拿來包 只要加上#include<函式庫名稱> 就可以使用那些功能 ### cmath 數學函式庫 取log、算次方pow、開根號sqrt、算三角函數等等 其實都有特定的語法可以使用 要將那些語法的功能開啟 我們就要在程式的最上方加上`#include<cmath>` #### log 要對一個數字n取log,可以寫成`log(n)`、`log2(n)`、`log10(n)` 請記得n必須是雙精度浮點數,要先用double儲存 log(n) 是對n取以e為底的log (e為自然對數) log2(n) 是對n取以2為底的log log10(n) 是對n取以10為底的log #### pow 要算a的b次方,可以寫成`pow(a,b)` 請記得a和b都要是雙精度浮點數,要先用double儲存 這樣一來不管你想要幾點幾次方,它都能算出來 #### sqrt 要算n的開根號,可以寫成`sqrt(n)` 請記得n必須是雙精度浮點數,要先用double儲存 Q:如果想開3方、開5方,怎麼辦? A:直接用pow(n, 1.0/3.0)或是pow(n, 1.0/5.0)就好囉 #### 三角函數 要計算cosine n,可以寫成`cos(n)` 請記得n不是「度數」,而是「弧度」 例如直角是 $\pi/2$ ,而不是90 | Cosine | Sine | Tangent | Cosecond | Second | Cotangent | | -------- | -------- | -------- |-------- | -------- | -------- | | cos(n) | sin(n) | tan(n) |csc(n) | sec(n) | cot(n) | 也可以算反三角函數 例如你需要一個精準的 $\pi$ 的時候 與其用手打`double pi = 3.1415627` 可以改成`double pi = acos(-1)` 什麼角度取cosine會得到-1呢,那當然就是$\pi$啦 <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a035: 位數 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a035) <font color='red'>a035註:</font> 這題如果直接把$a^b$給算出來 例如n=pow(a, b) 因為$a^b$可能會是一個非常大的數字 使得n不會真的是$a^b$ 而是一個亂碼 但是$a^b$拿去取log的數字卻很正常 所以請直接算出$log(a^b)$ 也就是$b*log(a)$ ### iomanip 格式化輸出 這個函式庫裡的功能可以拿來控制輸出時的格式 若要使用 可以在程式的最上方寫上`#include <iomanip>` 來把這些功能包進來 以下將介紹格式化輸出有哪些功能 ## <font color='darkblue'>格式化輸出</font> 這些功能都會搭配cout使用 ### setw(n) 指定輸出寬度為n 輸出好幾個字串 讓他們全部靠右對齊 每個字串的寬度都設為10 ```cpp= cout << setw(10) << "Hello" << endl; cout << setw(10) << "Hi" << endl; cout << setw(10) << "Hey" << endl; cout << setw(10) << "Good bye" << endl; ``` 可以得到像這樣的效果: ![](https://i.imgur.com/u302YfQ.png) 請記得,設定格式的程式請接在要cout的東西之前 ### setfill\(c\) 指定空格補滿某字元 寬度為n的字,在空格處可以補滿某些字元 例如補滿星號\* 可以寫成 ```cpp= cout << setfill('*') << setw(10) << "Hello" << endl; cout << setfill('*') << setw(10) << "Hi" << endl; ``` 可以得到像這樣的效果: ![](https://i.imgur.com/k2oDWTS.png) ### setprecision(n) 指定小數點輸出前後總共n位 如果除法可以整除,cout預設是輸出到整除的那一位 如果到第六位都還沒整除,那麼cout預設是輸出到第6位 但是如果今天特別希望輸出到小數點前後總共n位 例如輸出到小數點前後總共4位 可以寫成 ```cpp= double p = 22.0/7.0; cout<<"p="<<setprecision(4)<<p<<endl; ``` 輸出到第4位並非無條件捨去到第4位 而是四捨五入至第4位 當然也可以setprecision(10)、setprecision(100)等等 但因為double本身可以儲存的精確度也沒有到第100位那麼多 所以就算你使用了setprecision(100) 它也不會真的印到第100位給你看 <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a034: 距離 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a034) > - [ ] [Green Judge a033: 故障的計算機 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a033) 如果要特別指定是「小數點後」的n位 可以寫成 ```cpp cout << fixed << setprecision(n) << endl; ``` 在setprecision之前加上fixed就好囉 ## > 上一章:[for迴圈](https://hackmd.io/s/H1iyHQc2b) > 下一章:[處理不同輸入規則](https://hackmd.io/s/rJfcCI_R-) > 回目錄:[國立科學園區實驗中學C++程式語言自學講義](https://hackmd.io/s/B18yT_i5Z)