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。

2^{32}

如果超出範圍,就稱為 overflow,可能會導致程式出錯。

所以,一個 int 最多只能表示出       種可能的組合。

只能表示出           到                間的所有整數。

   (-2147483648到2147483647)

-2^{31}
2^{31}-1

overflow

如何避免 overflow 的問題?

1. 以 long long int (64 bits)取代 int(32 bits)

看清楚題目會用到的數字的範圍。

overflow

如果數字真的太大怎麼辦?

2. 開陣列(以後會教)存每個位數的數值。

float:4 bytes = 32 bits =        種可能

2^{32}

其儲存的方式有些複雜,

有興趣可以自己查。

double:8 bytes = 64 bits =        種可能

2^{64}

浮點數誤差

運算子

來用你的程式計算加減乘除吧!

+:加。(如,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,

不要用截圖的或翻拍的。

另外,

問問題也是一種學問,

也請大家好好學習問問題的技巧。

 

https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way

如果你覺得今天的內容很簡單:

恭喜你~下週繼續加油吧!

可以再多練習哦!建議可以打開你的 IDE 多玩玩看,

會比只看投影片來得更有用很多ㄛ!

如果你覺得今天的內容有點難:

Sprout 2024 Basic I/O, Variable, and Operators

By gtcoding

Sprout 2024 Basic I/O, Variable, and Operators

  • 172