輸入, 輸出與變數型別
標題放不下啦幹(?
啊哈
今天發文的不是你們平常看到那帥氣
又會寫程式 成績又是電神
會讓人暈爆的雷丘(?
是我 英文字
好啦不鬧了
我們趕快進入正題
今天我們要來介紹基本的輸入, 輸出與變數型別的部分
首先, 我們先來講變數型別
--------------------------------------------------------------------------------------------
##變數型別(Type)
一般來講, 可以把變數型別分成五大類
1. int
2. char
3. float
4. string
5. bool
###int
Int是整數(Integer)的縮寫
舉凡平常看到的0, 15, -2, 100這種的 都叫做整數
在C++中 int有三種不同的大小
這裡的大小指的是在記憶體中
可以存放的大小
那int前面有四個不一樣的形容詞去改變這個整數變數的大小
分別是short, long, long long, unsigned
unsigned的意思是沒有正負號的
所以如果有一個變數他的型別是unsigned int
意思就是他是一個非負的整數
unsigned也可以跟前面三個做搭配
例如 : unsigned long int等等
語法如下圖
我們可以像第7行一樣
直接指定這個整數變數a是3
也可以像第8行跟第9行一樣
令b跟c是一個未指定的整數變數
那b跟c的差別就是整數的上限跟下限的不同
諸如此類
###char
char是字元(Character)的縮寫
像是5, *, /, %等等的符號
那符號我們有一個表叫做ASCII(American Standard Code for Information and Interchange)
他是以數字的方式去記錄了符號或是一些動作(action)
包含了33個不可印出字元以及95個可印出字元
編號分別從0一直到127
上圖是ASCII table
char的語法如下圖
我們可以像第7行一樣
讓她是一個不指定的字元變數
或是像第8行一樣
直接指定這個字元變數b為B這個字元
如果很多個字元組合再一起
就會變成字串(下面會講到)
再來我想要提到比較特別的字元
叫做跳脫字元(Escape Character)
跳脫字元又叫做轉義字元
跳脫字元有兩個功能 :
1. 還原所要表示的字元或符號 —
因為有些字元如果是用平常的方式打進去
他是沒有辦法被呈現出來的
所以我們就可以利用跳脫字元
把那個字元印出來
2. 給予指令 —
像是換行 空四格等等的
##float
float是浮點數
它的定義跟在數學上的小數差不多
其語法與整數型別的類似
如下圖
都是型別加上變數名稱
那整數中有長整數long int, long long int
那浮點數有沒有
答案是有的
我們把它叫做double
##string
String是字串
我們在上面有講到
很多個字元組合在一起
就會變成字串
字元跟字串在命名變數的時候有一個小差別
尤其是指定變數值的時候
如下圖
你們可以注意到
在指定變數的值的時候
字元用的是單引號
而字串用的是雙引號
這個可以小小筆記一下
##bool
bool是布林運算(Boolean Algebra)的縮寫, 他所對應的結果只有對與錯(True or False)
講到布林運算
我們就可以請出一個好朋友
叫做真值表(Truth Table)
他有一些規則可以去幫助你了解命題(Statement)是正確的還是錯誤的
讓你之後在寫程式的時候
對於邏輯的思考與順序有多一層的認識
語法如下圖
這邊我們來解釋一下這個程式碼是甚麼意思
假設1這個命題是對的
然後我們令一個布林變數a是對的
之後我們對a指派一個值
並利用if的巢狀結構去判斷a這個變數是否為1
如果是1就印出a是對的這個字串
接下來 我們就進入到輸入與輸出的部分
##輸入與輸出(Input and Output)
輸入與輸出的用法有三組
一組是scanf/printf
一組是cin/cout
最後一組是用成員函數(Member Function)
cin.get()/cout.put()
但第三組我們今天先不講
scanf對應到的是cin
而printf對應到的是cout
以C++來說
比較常用的會是第二組
怎麼用呢
我們先令一個變數a
然後用cin對a指派一個值
這邊因為我的變數型別是整數
所以a就會是一個整數
接下來
我們遇到了一個新的東西
叫做endl
這是甚麼意思呢
endl的意思是換行
跟前面在跳脫字元那邊提到的\n是一樣的(等等會來小小總結一下)
最後把a印出來
這邊可以做個小小筆記
cin跟cout的箭頭要怎麼記比較快
因為程式碼的讀取是從左到右
所以你可以想像你現在遇到一台機器
你要把一個變數丟到這台機器裡面
所以你要先從左邊的入口丟入
然後從右邊的出口出來
所以cin的箭頭會是>>
cout的箭頭是<<
不然如果cin的箭頭是<<
就沒有入口可以把變數a丟進去這台機器裡面了
cout的道理類似
小小總結 :
換行的方法有三種
第一種是用endl這個manipulator
第二種是用跳脫字元而且是用字元的形態呈現(‘\n’)
第三種也是用跳脫字元但是是用字串的形態呈現(“\n”)
然後cin跟cout如果要同時輸入或輸出多個變數
是不能把全部的變數都擠在同一格裡面
像是下圖醬
這樣會讓你編譯錯誤
這個道理就有點像是
假設那個洞口一次只能放入一個東西
而你卻把全部的東西一起丟進去
是不是那個洞口就會塞住了
所以請記得(畫重點
在輸出的部分
有一個名詞
叫做格式化輸出(Formatting)
他有點像排版小工具
通常我們會利用前面提到的printf來完成
語法如下
前面放的是字串
後面放的是你被代換的變數
字串中放的是要代換的東西的型別
這裡的型別跟前面所介紹的有點不太一樣
我來幫大家整理一下
int --> d(Decimal)
long (long) int --> ld
float --> f
double --> lf
char --> c
string --> s
大家可以看到上面那張圖
我在%跟型別中間的5是甚麼意思呢
這個5指的是空格的數量
假設我指派a一個值叫做23
那我這裡給了5個空格
所以在執行的時候
大家可以看到23前面有3個空格
結果如下圖
如果我們的a是一個浮點數
printf那邊的空格也可以是一個小數
如下圖
那那個6.3又是一個什麼樣的情況呢
後面的.3表示的是給小數點後的空格數
如果a這個值的小數點後的位數沒有到我給的空格數
程式執行的時候就會自動幫我補上0
前面這個6是最前面的空格數 + 整數部位的格數 + 小數點 + 小數點後的格數會等於6
所以舉例
如果我給8.3格空格
然後a是5.1
那輸出結果就會是3格空格 + 1格整數部位 + 小數點 + 100三格
所以是3 + 1 + 1 + 3 = 8
如下圖
cout也有格式化輸出的寫法
但是在最前面要引入一個叫做iomanip的函式庫(Input/Output Manipulator)
語法如下圖
我們會需要用到一個叫做setw()的函式
這個setw()裡面只能放整數
他和printf的格式化輸出有一點點的不同是
setw()他在小數點後面是不會自動幫你補上0的
其他的都一樣
都是前面空格 + 整數部分 + 小數點 + 小數點後的部分會等於所有空格數
再來講講字串的輸入與輸出
你令一個變數 型別是字串
假設輸入的是一句英文句子
你輸出的時候卻只會有一個單字卻就結束了
像是如下圖
為甚麼
這是因為電腦在判讀程式碼的時候
cin只要讀到空格或是換行就會結束了
所以我們可以利用getline()函數去讀取整個輸入的內容
語法如下圖
要注意的是
如果你用了getline
你的cin就要拿掉
因為前面的cin會先讀取到第一個i
然後到空格就會中斷
然後繼續由getline()讀取
所以會發生少了第一個字的情況
-----------------------------------------------------------------------
OK 好啦
今天的教學文就先到這邊結束啦
ㄚ有鑑於米特編輯器有夠難用(偷嘴XD
還有不要傷大家的眼睛
還有前幾篇有大佬建議我們放上用hackmd編輯過的畫面
所以就在這裡放上連結
https://hackmd.io/@ihBAVIPZTumBHFNiJOpH6w/S12TyQs0_
但我已經盡量調到跟連結進去後的畫面一樣了
然後我是第一次寫教學文
所以如果要炮請炮小力一點
如果大佬有什麼建議或補充
可以幫我在下面留言
或是你是剛起步 想要從頭開始學的人
也可以把你的問題打在留言讓我知道
如果內文有錯誤的地方
也可以在留言區留言指正
十分感謝大家
喜歡的朋友請幫我按讚 訂閱 分享 開啟小鈴鐺(沒這東東
我是英文字
我們下次見
你可能有興趣的文章...
全部留言
uint8_t uint16_t uint32_t???? 🤣🤣🤣
匿名
cin>>a>>endl?
匿名
筆者真的有Compile 過嗎 cin >> a >>endl 是一個在概念上錯誤也不會Compile 過的用法 我個人是很樂見程式設計版出現這種文章 但我覺得可能從教學文改成學習筆記會比較妥當
匿名
求functor在stl的運用 比如替換priority queue的compare function 看到別人寫 實在不了解為什麼這個會用到
匿名
我真的不覺得會有人看你的文章學C++ 網路上那麼多資源 隨便一個都教得比你好 不用在這邊刷存在感 反而還被砲轟
B16並沒有不開心的意思 我不知道哪裡讓你誤解了😂 只是想讓樓上上知道我們不管會不會被炮轟還是會發的 至於學習筆記的部分容許我們思考一下 我是認真滿開心看到你在樓上回的訊息 因為有人是認真看我們說的內容的 至於剛寫程式的部分 你說的是沒有錯的 因為自己還在初階的狀況 有很多當時遇到的問題可以馬上分享出來 因為都是新手所以有很多相同的問題 你說的事情我們會想一下 感謝
我昨天重新寫hello world結果程式執行錯誤,搞半天結果是我把分號打成冒號^_^🔥
匿名
推~好文 可以卡一個python的教學文嗎w
按讚 訂閱 放入收藏箱(`>∀・)b(欸不對 但我有看完啦ꉂ(ˊᗜˋ*)
匿名
B13你是指類似這段 Code 的寫法嗎? https://stackoverflow.com/a/44795242 是的話簡單來說,如同你提到 std::priority_queue 的第三個 Type 是要塞一個 Compare function 在 C++ 中,`()` 也是一個 Operator,是可以被 Overload 的,所以你可以寫一個 Class 並且 Overload () 來把他當作一個 Functor 傳進去,達到 Compare 的功能
感謝你的補充跟解說 其實我覺得你可以直接寫一篇文了wwwww 可以賺一些流量(X 可以讓大家多學一點東西(O (?
匿名
續樓上,超過 500 不讓我發== 不過關於你提到的情境,我其實最一開始聯想到的是 C++11 後的 Lambda Expression Lambda 允許你寫「匿名函式」(Anonymous Function),可以很大程度的縮短你的 Code 就像是 ``` std::priority_queue<int, vector<int>, decltype([](int lhs, int rhs) { return lhs < rhs; })> pq; // or declare it first auto cmp = [](int lhs, int rhs) { return lhs < rhs; }; std::priority_queue<int, std::vector<int>, decltype(cmp)> pq; ``` 概念上差不多就是了 另外 Anonymous Function 也很常在 sort() 看到 通常會把像是上面的 cmp 當作第三個引數傳進去