Try   HackMD

Ch7 雜項:其他資料型態、函式庫、格式化輸出

搭配green judge解題系統
Special thanks to 台中女中sagit老師 <(_ _)>

上一章:for迴圈
下一章:處理不同輸入規則
回目錄:國立科學園區實驗中學C++程式語言自學講義

其他資料型態

練習了這麼多的題目
我們已經很熟練int以及float的用法了
然而程式中的資料型態可不只這兩個
接下來要介紹其它常用的基本資料型態

long long 長整數

我們一直以來所使用的int
它所能儲存的整數的範圍僅限於 -2147483648 至 2147483647 之間
如果超過了,它會繞一圈回到另一端,完全不是原來的數字了
(你可以試試2147483647+1,會變成-2147483648喔)

但如果使用long long來儲存
則可以存到 –9223372036854775808 至 9223372036854775807 之間

除了能儲存的範圍擴大了以外
它的使用方法都跟int一模一樣

【學生練習題】

double 雙精度浮點數

用法和float相同
但是可以存到小數點後更多位

char 字元

字元就是單獨的一個字,可以是字母,或是符號,或是數字
相對於放在雙引號裡的字串
字元的表示法則是放在單引號

宣告一個字元

char c;

讓一個字元變成'A'

c = 'A';

檢查一個字元是否為'+'

if(c=='+') cout<<"c is plus"<<endl;

【例題】

輸入一個算式,格式為兩個數子中間一個運算符號(+-*),請將運算符號換成英文的意思後輸出
例如
輸入1+2 則輸出1 add 2
輸入15-3 則輸出15 minus 3
輸入2*10 則輸出2 time 10

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;

【學生練習題】

每一個字元的背後都有一個它所代表的號碼
這個特質讓字元有個這樣的神奇功能:

cout << ('A'+3);

由於字母A往後數3個是字母D,因此會在小黑窗上看到'D'
同學也可以猜猜看以下這個程式會印出什麼字?

char word = 'z' word = word - 10; cout << word;

string 字串

還記得我們一開始學的 "Hello"
它就是一個字串
字串就是放在雙引號內的一串字元

宣告一個字串

string s;

讓一個字串變成"Hello"

s = "Hello";

檢查一個字串是否等於"blabla"

if(s=="blabla")

【例題】

輸入一個字串s
將s前後都加上三個飄號"~~~"

string s; cin >> s; cout << "~~~" << s << "~~~" << endl;

【學生練習題】

bool 布林數

布林數所儲存的資料只有分成兩種:1或是0
分別代表著「是」與「否」
它的使用方法也和int沒什麼差別
但是除了0以外
如果你讓它變成1以外的其他數字(例如2、3、100、-1、-99)
它通通會直接當成1

不過它不是拿來存數字的
而是拿來存「是或否」的資訊的
例如常常在if時用到的判斷式

bool a; a = (1>2) ;

由於1>2是錯誤的,所以a這時就會是「否」

其他函式庫

寫了這麼多的程式
每次我們都會在第一行寫上 #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不是「度數」,而是「弧度」
例如直角是

π/2 ,而不是90

Cosine Sine Tangent Cosecond Second Cotangent
cos(n) sin(n) tan(n) csc(n) sec(n) cot(n)

也可以算反三角函數
例如你需要一個精準的

π 的時候
與其用手打double pi = 3.1415627
可以改成double pi = acos(-1)
什麼角度取cosine會得到-1呢,那當然就是
π

【學生練習題】

a035註:
這題如果直接把

ab給算出來
例如n=pow(a, b)
因為
ab
可能會是一個非常大的數字
使得n不會真的是
ab

而是一個亂碼
但是
ab
拿去取log的數字卻很正常
所以請直接算出
log(ab)

也就是
blog(a)

iomanip 格式化輸出

這個函式庫裡的功能可以拿來控制輸出時的格式
若要使用
可以在程式的最上方寫上#include <iomanip>
來把這些功能包進來

以下將介紹格式化輸出有哪些功能

格式化輸出

這些功能都會搭配cout使用

setw(n) 指定輸出寬度為n

輸出好幾個字串
讓他們全部靠右對齊
每個字串的寬度都設為10

cout << setw(10) << "Hello" << endl; cout << setw(10) << "Hi" << endl; cout << setw(10) << "Hey" << endl; cout << setw(10) << "Good bye" << endl;

可以得到像這樣的效果:

請記得,設定格式的程式請接在要cout的東西之前

setfill(c) 指定空格補滿某字元

寬度為n的字,在空格處可以補滿某些字元
例如補滿星號*
可以寫成

cout << setfill('*') << setw(10) << "Hello" << endl; cout << setfill('*') << setw(10) << "Hi" << endl;

可以得到像這樣的效果:

setprecision(n) 指定小數點輸出前後總共n位

如果除法可以整除,cout預設是輸出到整除的那一位
如果到第六位都還沒整除,那麼cout預設是輸出到第6位

但是如果今天特別希望輸出到小數點前後總共n位
例如輸出到小數點前後總共4位
可以寫成

double p = 22.0/7.0; cout<<"p="<<setprecision(4)<<p<<endl;

輸出到第4位並非無條件捨去到第4位
而是四捨五入至第4位

當然也可以setprecision(10)、setprecision(100)等等
但因為double本身可以儲存的精確度也沒有到第100位那麼多
所以就算你使用了setprecision(100)
它也不會真的印到第100位給你看

【學生練習題】

如果要特別指定是「小數點後」的n位
可以寫成

cout  <<  fixed <<  setprecision(n) << endl;

在setprecision之前加上fixed就好囉

上一章:for迴圈
下一章:處理不同輸入規則
回目錄:國立科學園區實驗中學C++程式語言自學講義