Basic I/O, Variables, Operators
黃祥陞 @Sprout 2024 C/C++語法班
Modified from @Sprout 2023
上半堂大家已經學會...
2. 知道什麼是程式碼跟 IDE
3. 寫出你的第一個程式碼
1. 知道了資訊之芽的課程在做什麼
下半堂大家會學到...
1. 學習變數如何輸入輸出及運算
跳脫字元
有些字元印不出來
有些字元是特殊用途
-
“ 是用來包住字串的
-
' 是用來包住字元的
-
<tab> 是用來縮排
-
<enter> 是換行
#include <iostream>
int main() {
std::cout << "\\" << std::endl; // print \
std::cout << "\'" << std::endl; // print '
std::cout << "\"" << std::endl; // print "
std::cout << "\t" << std::endl; // print <tab>
std::cout << "\n" << std::endl; // newline
}
變數
什麼是變數?
一個有值的東西,可以更改、運算。
被存在電腦記憶體的某個位置。
int:整數
float、double:浮點數(小數)
char:字元 (如'a'、'B'等)
bool:布林值 (true / false)
變數有分哪些種類?
其他還有非常多種,就不一一列出
長度1~255。
只能包含[a-zA-Z]、[0-9]、_。
名字不能數字開頭。
不能和某些關鍵字同名。(如:不能叫做int)
變數的命名
一定要遵守的規定:
建議:
有意義的字串連在一起。
如:num_students、current_weather 等
「宣告」,是指跟電腦說,我要用到某個變數。
例如:
意思:宣告一個形態是 TYPE 的變數,
名字是 VARIABLE_NAME。
int x;
float y;
char a, b;
方式:TYPE VARIABLE_NAME ;
變數的宣告
方法:VARIABLE_NAME = SOMETHING ;
例如:
意思:把 VARIABLE_NAME 值改成 SOMETHING。
x = 3;
「賦值」,是指把某值指派給變數。
變數的賦值
int x; // Declare
x = 3; // Assign
int y = 10; // Declare + Assign (better)
事實上,宣告和賦值可以同時做(如下第四行)。
注意:在 C++, = 是「賦值」,不是「等於」。
「等於」是 == ,下禮拜才會交到。
變數的輸入
int x, y, z;
std::cin >> x;
std::cin >> y >> z;
std::cin >> VARIABLE_NAME ;
語法
上面的 std::cin >> y >> z;
意同 std::cin >> y;
std::cin >> z;
#include <iostream>
int main(){
int x, y, z;
std::cin >> x >> y >> z;
std::cout << x << std::endl;
std::cout << y << std::endl;
std::cout << z << std::endl;
}
輸入多個 int、float、double、... 時,
是以換行或者空白作為間隔。
大家可以玩玩看這個程式。可以試試看各種不同的輸入,程式會把 x、y、z 的值印出來。
#include <iostream>
int main(){
int x, y, z;
std::cin >> x >> y >> z;
std::cout << x << std::endl;
std::cout << y << std::endl;
std::cout << z << std::endl;
}
1
2
3
1 2 3
123
a b c
大家可以試試看各種不同的輸入。例如:
#include <iostream>
int main(){
char x, y, z;
std::cin >> x >> y >> z;
std::cout << x << std::endl;
std::cout << y << std::endl;
std::cout << z << std::endl;
}
a
b
c
a b c
abc
玩玩看把 int 改成 char(字元)的版本:
在連續輸入很多變數時,空白鍵或換行常常被我們用來分隔這些不同的變數。
發現
補充:輸入 char 時,如果我希望我輸入的東西
能夠包含空白鍵或換行,該怎麼辦?
A:用 scanf。有興趣可以自己查。
變數的輸出
std::cout << x << std::endl;
std::cout << y << std::endl;
std::cout << z << std::endl;
std::cout << VARIABLE_NAME ;
語法
小複習:下為印出 Hello World! 的程式碼。
std::cout << "Hello World!" << std::endl;
可以發現:印變數不用 " ",印字串要 " "。
#include <iostream>
int main(){
int a = 0;
std::cout << a << std::endl;
}
小練習1:猜猜以下這些程式會輸出什麼?
#include <iostream>
int main(){
int a = 0;
std::cout << "a" << std::endl;
}
0
a
宣導觀念:雙引號的意義。
#include <iostream>
int main(){
int a = 1, b = 2;
std::cout << a << std::endl;
std::cout << b << std::endl;
}
小練習2:猜猜以下這些程式會輸出什麼?
#include <iostream>
int main(){
int a = 1, b = 2;
std::cout << a << b << std::endl;
}
1
2
12
輸出多個變數時,用 endl 或空白來分隔會比較好看
變數賦值的應用
把變數 x 和變數 y 的值交換
直覺來看,我們最初步的想法可能會如第 5、6 行:
#include <iostream>
int main(){
int x = 1, y = 2;
x = y;
y = x;
std::cout << x << std::endl;
std::cout << y << std::endl;
}
2
2
可是,輸出出來的東西好像是錯的...
#include <iostream>
int main(){
int x = 1, y = 2;
x = y;
y = x;
std::cout << x << std::endl;
std::cout << y << std::endl;
}
原因:在第五行跑完後,x 的值已經被更新了 (更新成2)
因此,在第六行,y 就會被賦值為 2,而不是 1。
那怎麼辦?
#include <iostream>
int main(){
int x = 1, y = 2;
int temp;
temp = x; // 先存好 x 一開始的值
x = y;
y = temp; // 把 x 一開始的值賦值給 y
std::cout << x << std::endl;
std::cout << y << std::endl;
}
解決方式:再宣告一個變數,把原本 x 的值先存起來。
2
1
變數的相關限制
overflow 與浮點數誤差
#include <iostream>
int main(){
int x = 10000;
std::cout << x << std::endl;
int y = 20230304;
std::cout << y << std::endl;
int z = 314159265358979;
std::cout << z << std::endl;
}
跑過之後,你會發現 z 輸出來的東西好像怪怪的...
給大家跑跑看這個程式,看看會印出什麼?
有時候你可能會發現程式輸出跟預期的不太一樣。
解釋剛剛那個程式,要從電腦怎麼存資料開始講...
電腦記憶體是用二進位 ( 0和1 ) 存資料的。
bit:記憶體的最小單位。就是一個 0 或 1。
byte:8個bit。
bit / byte
1 個 int,電腦會用 4 個 byte 去存,也就是 32 個 bits。
如果超出範圍,就稱為 overflow,可能會導致程式出錯。
所以,一個 int 最多只能表示出 種可能的組合。
只能表示出 到 間的所有整數。
(-2147483648到2147483647)
overflow
如何避免 overflow 的問題?
1. 以 long long int (64 bits)取代 int(32 bits)
看清楚題目會用到的數字的範圍。
overflow
如果數字真的太大怎麼辦?
2. 開陣列(以後會教)存每個位數的數值。
float:4 bytes = 32 bits = 種可能
其儲存的方式有些複雜,
有興趣可以自己查。
double:8 bytes = 64 bits = 種可能
浮點數誤差
運算子
來用你的程式計算加減乘除吧!
+:加。(如,16 + 9 得到 25)
-:減。(如,16 - 9 減九不夠借一是 16 - 9 得到 7)
/:除。整數除法中,形同取商。(如,16 / 9 得到 1)
*:乘。(如,16 * 9 得到 144)
%:模。整數除法中,形同取餘。(如,16 % 9 得到 7)
運算子種類 - 整數
加、減、乘:同整數運算。
除:浮點數除法中,也會算出浮點數。
(如,16.0 / 9.0 得到 1.77778)
模:沒有模。
運算子種類 - 浮點數
整數與浮點數可以一起運算:
會被轉成浮點數運算。(所以一樣沒有模)
#include <iostream>
int main(){
int x = 16;
float y = 9.00;
std::cout << x/y << std::endl;
std::cout << y/x << std::endl;
}
1.77778
0.5625
^ 不是次方,注意不要用錯。
先乘除模,後加減。
#include <iostream>
int main(){
std::cout << 3 + 4 * 2 << std::endl;
std::cout << (3 + 4) * 2 << std::endl;
}
11
14
小提示
運算子的應用
把變數 x 的值加1
「把變數 x 的值加一」。如果換一種講法,其實就是
「把 x+1 的值賦值給變數 x 」
所以我們有了答案: x = x + 1 ;
基本寫法
看起來雖然不直觀,但畢竟 = 是賦值,不是等於,所以這個寫法是完全沒問題的!
速寫法1:x += 1;
同 x = x + 1。
在減、乘、除、模等運算子或其他數字也都適用。
速寫法2:x ++;
只適用於加一 (x ++) 和減一 (x --)。
速寫法
小練習
小提示
WA 了嗎? 也許可以看看你行尾是不是多換行了哦!
像這題輸出說明有提到「不用換行」,就不能再加 endl。
不過往後的題目,只要有寫「要換行」,就要換行。
如果沒特別寫要不要換,通常也表示是要換行的哦!
(雖然不排除可能會出現一些例外)
#include <iostream>
int main(){
int a, b;
std::cin >> a >> b;
std::cout << 4 * 3 * (a*a + b*b);
}
參考答案1
#include <iostream>
int main(){
int a, b;
std::cin >> a >> b;
int head = 4 * 3 * a * a;
int body = 4 * 3 * b * b;
std::cout << head + body;
}
參考答案2
兩種做法都會對。你們可以比較看看你們喜歡哪一種。
課程最後
作業記得做哦~
如果遇到困難隨時歡迎提問或討論~
儘量在討論看版上討論,不要私訊講師,
這樣其他同學也許也能夠幫助你!
如果要給我們看你的 code,儘量找可以貼 code 的網站,
例如 ideone 或 codepad,來放你的 code,
不要用截圖的或翻拍的。
如果你覺得今天的內容很簡單:
恭喜你~下週繼續加油吧!
可以再多練習哦!建議可以打開你的 IDE 多玩玩看,
會比只看投影片來得更有用很多ㄛ!
如果你覺得今天的內容有點難:
Sprout 2024 Basic I/O, Variable, and Operators
By gtcoding
Sprout 2024 Basic I/O, Variable, and Operators
- 172