--- GA: G-RZYLL0RZGV --- ###### tags: `大一程設` `東華大學` `東華大學資管系` `基本程式概念` `資管經驗分享` 七大基礎資料型態、什麼是變數、變數的功用是什麼? === [toc] ## 前言 > 不經一番寒徹骨,焉得梅花撲鼻香。 不經一番程式歷練,焉得 Ouput 美好滋味。 [name=orange] 程式能夠幫我們做到的事情非常多,不然就不會有甚麼遊戲,大家現在常看到的網頁,又甚至是很多協助人類的科技資訊研究,但是在碰到這些有趣的東西之前,該會的工具要先學起來,總不能 LV 1 的時候想要打 LV 100 的王吧! > 寫程式是固定費時、燒腦,卻也是讓你成長到跟社會接軌的一件事情。 > 你的努力一定不會白費。 > [name=orange] 話不多說,趕緊從頭學起吧!助教會用最熱忱的心教的!! ## 七大基礎資料型態 在寫程式的過程中,我們時常需要設計邏輯,而邏輯又需要很多其他的工具來輔助我們,其中**基本中的基本工具就是變數**,**變數能夠幫我們處理運算、條件判斷、字串處理這三件事**,再搭配其他額外的工具來讓變數的能力最大化,我們現在來談談在 C++ 裡有的變數型態吧! | 變數型態 | 中文名稱 | 所占記憶體空間(位元組 bytes)(以 Win10 64位元為例) | 值域範圍| | -------- | -------- | -------- | -------| | short | 整數 | 2bytes | -32,768 至 32,767 | | **int** | 整數 | 4bytes | -2,147,483,648 至 2,147,483,647 | | long | 整數 | 4bytes | -2,147,483,648 至 2,147,483,647 | | **float** | 浮點數 | 4bytes | $10^{-38}$ ~ $10^{38}$ | | **double** | 浮點數 | 8bytes | $10^{-308}$ ~ $10^{308}$ | | **bool** | 布林值 | 1bytes | false 或 true | | **char** | 字元 | 1bytes | -128 到127(預設值) | **粗體字的要熟記,因為很常用!** [參考資料看這邊](https://docs.microsoft.com/zh-tw/cpp/cpp/data-type-ranges?view=msvc-160) <span style="color:red; font-size:20px"><strong> 值域範圍跟位元組的概念是計算機概論的基本知識,這邊如果有看不懂沒關係,要和計概一起學,學計概如果有問題可以再洽 Orange</strong> </span> * 1 bytes = 8 bits >這邊請左轉**計算機概論**,我先不負責XD >我是會,但先不跟程式設計混在一起 >有需要請洽 Orange * 值域範圍 * 值域範圍會因為不同的系統而有不同,我們這邊都先記 Win10 64 位元的系統 * 整數 * int * 一般的整數型態,值域範圍在 $-2^{31}$ ~ + $2^{31}-1$ * 我們最常使用的整數資料型態 * short * 短整數,也是整數的一種,所占記憶體大小只有 2 bytes,值域是 -32768 ~ 32767 * 所以可以想像如果今天有一個整數是 50000,那就不能用 short 來存,要用更大的像 int 或 long * 一般來說較少用 short,基本上都用 int 居多 * long * 也是整數型態,但能表達更精準更大的精度 * 值域與 int 相同,但跟 int 不同的地方是,**如果今天有數字超過 $-2^{31}$ ~ + $2^{31}-1$ 那可以用 long long 來宣告** * 你可能會問那能不能也 int int,不行,這是規定,no why! <br> >我們馬上就會講宣告是什麼,莫驚莫荒。 * 浮點數 * float 與 double 最大的差異在於表達的精度 <br> 前者是 IEEE 754 32倍精度,後者是 IEEE 754 64倍精度 >這邊你們看不懂沒關係,請左轉計算機概論,有問題一樣洽 Orange >**只要記得 float 跟 double 能夠拿來做小數運算就對了!** * float * 存小數的一種資料型態 * 能存的範圍比 double 還小,不過一般我們不用寫到那麼大的數 * double * 存小數的一種資料型態 * 但還是可以養成使用 double 的習慣 * 布林值 bool * 用來做條件判斷常用的資料型態 * 值只有兩種,分別是 true/false,前者為真後者為偽 * 你也可以用 1 跟 0 來表達 true/false,在程式語言裡 1 為真 0 為偽 ``` cpp= int main(){ bool a; a = true; // a = 1; cout << a; // 會印出 1 return 0; } ``` ``` cpp= int main(){ bool a; a = 1; cout << a; return 0; } ``` 這兩種表達方式的結果一模一樣,這邊的 1 不是整數,會被識別成布林值 * 字元 * 用來存一個字的資料型態 * **未來會在介紹處理字元更方便的類別 -> string** * **類別也在未來的時候教,不用擔心** * char 型態的變數用來儲存字元,而字元必須要被單引號('')給包住,這是語法規定,沒有為甚麼 ``` cpp= int main(){ char a; a = 'h'; cout << a; //印出 h return 0; } ``` ## 甚麼是變數? 如何宣告變數? 如何初始化變數? 剛剛上面講完了資料型態,那就可以來講講甚麼是變數了,**變數藉由給定資料型態來讓其副有意義**,下面舉例。 ``` cpp= int main(){ int a; //宣告整數型態變數取名為 a float b;//宣告浮點數型態變數取名為 b double c;//宣告浮點數型態變數取名為 c bool d;//宣告布林型態變數取名為 d char e;//宣告字元型態變數取名為 e short f;//宣告整數型態變數取名為 f long g;//宣告整數型態變數取名為 g return 0; } ``` 所以我們可以得出一個通則 `variable_type variable_name;` `變數型態 變數名稱` 而變數名稱都是由自己定義的,變數型態是 C++ 這個語言規定好的,無法改變,而通常在為一個變數命名的時候,要養成取「**有意義**」的名字的習慣,這邊舉個例。 假設今天有一道題目想麻煩你算出自己的 BMI,在為變數命名的時候,我會這樣做。 ``` cpp= int main(){ double height, weight; double my_bmi; cin >> height >> weight; my_bmi = weight/(height*height); cout << my_bmi; return 0; } ``` 這樣閱讀者在閱讀的時候能夠馬上理解你在做的事,而且不會混淆,**同樣的事情我們如果用很糟糕的命名方式,那會非常頭痛,這邊舉個錯誤示範!** ``` cpp= int main(){ double a, b; double c; cin >> a >> b; c = a/(b*b); cout << c; return 0; } ``` 忽然間好像甚麼都不會了,a、b、c 分別是什麼呀? 然而這個只有寫這段程式的那個人知道,**所以一定要養成取有意義的名字的習慣!** **然後最後要加上一個分號**,在 C++ 裡面,**一個陳述句最後都要加上分號,但不是說每一行都要分號哦**,這邊舉個例,雖然有些內容沒看過,不過後面就會學到了。 ``` cpp= int main(){ int a = 10, b = 20; if(a < b){ cout << "a 比 b 小"; } else { cout << "a 比 b 大"; } return 0; } ``` 這邊看的出來,第三行第六行沒有加分號,其他還有很多大括號包住程式範圍,所以並不是每一行都要加分號哦,而是一個陳述句才要加,像是變數的宣告、內容的輸入或印出(cout / cin)。 **而條件判斷語句 if-else 後面會教不用擔心。** ### 接著我們來說說初始化 不失一般性,變數能被宣告既然要被拿來用,我們當然要給他值摟,值可以在後續運算的時候儲存,也可以在變數宣告的時候立即給他值,而這個動作就稱為初始化,我們直接看看例子。 ```cpp= int main(){ float my_height = 1.73; float my_weight = 60; int my_grade; // int my_grade = 0 my_grade = 3; } ``` 應該不難理解,第二行跟第三行是在宣告變數的同時順便初始化,而第四行跟第五行則是我先宣告一個變數,但沒有值,之後我再初始化他的值。但一般會在變數宣告的時候就立即初始化,**如果我們暫時用不到他,我們也會把他設為 0,預防一些錯誤,而這也是初始化的好處**。 ### 結論 透過上面的例子我們知道了怎麼宣告變數,而在學程式的人中,有許多潛規則,有很多用語我們都會不自覺地使用出來,這邊要講的其中之二就是<span style="color:red">宣告、初始化</span> 我們時常會說宣告一個變數,宣告一個整數變數,這邊的宣告在英文會常用 declare,未來有機會常看英文教學的時候就會知道。 > we <span style="color:red">declare</span> an integer variable called height,<br> and declare another one called weight. 而初始化我們則常用 initialize / initial,前者是動詞後者是形容詞,所以在外國教學會很常聽到如下的句子。 > 1.Now we <span style="color:red">initialize</span> an integer variable called height and give it 200. > > 2.Now we give an <span style="color:red">initial value</span> for this integer variable. > 上面兩種都是很常聽到的句子,所以可以知道在這廣大的世界中其實有很多事情都有共通的語言,你聽到的時候其實不是不懂,而是你沒有見過,所以多吸收新知吧少年少女! > [name=orange] **所以如果助教今天在台上一直講宣告宣告宣告初始化初始化,就是指這個意思!** ## 變數有甚麼功用? 程式設計師會把遇到的問題透過他的邏輯來呈現,而在我們的邏輯中需要什麼型態的資料,我們就會把它<span style="color:red">宣告</span>出來使用。 所以變數的用意會根據問題被程式設計師賦予意義,所以上面說的取名字就非常重要,以上面的 BMI 為例,double 變數是被我賦予意義的,一個用來存身高,一個存體重,最後保存我們的 bmi 值。