第2章
變數與運算子
大綱
• 變數
– 2.1 變數
– 2.2 基本資料型態
– 2.3 scanf()函數
– 2.4 常數
• 運算子
– 2.5 敘述、運算元
– 2.6 算數運算子
– 2.7 資料型態轉換
2
Memory
• 儲存資料與program的空間
• 分為:
1. Main memory(主記憶體)
– 程式執行時,程式和資料存放於此
2. Secondary memory(次記憶體)
– secondary storage(次儲存體)
– 儲存裝置:硬碟、軟碟與光碟機
– 程式和資料永久存放的地方
3
CPU
• Arithmetic logic unit:負責執行算術
與邏輯運算
• Control unit:控制memory、
arithmetic logic unit及input/output
devices的運作
• central processing unit(CPU)
– processor(處理器)
4
Multi-tasking & Time-sharing
• CPU同時運行多個程序的能力。
– 一般是運行第一個程序的一段代碼,保存工作環
境;再運行第二個程序的一段代碼,保存環
境;……恢復第一個程序的工作環境,執行第一個
程序的下一段代碼……現代的多任務,每個程序的
時間分配相對平均。
• CPU每次分配給各程序式(process)一段相同
的時間,如果該程序式無法在該段時間內完
成,都必須離開CPU回到佇列重新排隊等待
下一週期再執行
5
硬體元件與program執行流程
6
變數
• 數學的變數
• 電腦程式的變數
– 記憶體位址
– 記憶體空間大小與值
– 多工與動態記憶體位址配置
7
變數
• 變數是一個名稱,用來代表電腦記憶體
空間的一個位址。
8
變數範例(1/2)
9
變數範例(2/2)
10
• 變數的宣告與記憶空間的配置
基本資料型態
• 各種基本資料型態所佔的記憶體空間及範圍:
11
資料型態 型態說明 位元組 範圍
字元 char 字元 1 0~255
整數
short int 短整數 2 -32,768 ~ 32,767
int 整數 4 -2,147,483,648 ~ 2,147,483,647
long int 長整數 4 -2,147,483,648 ~ 2,147,483,647
浮點數
float 浮點數 4 1.18e-38~3.40e+38
double 倍精度浮點數 8 2.23e-308~1.79e+308
變數命名
• 變數名稱是一個識別字,其基本命名規則,
如下所示:
1. 只能使用英文大小寫字母、數字與底線 _ 。
– 例如:intel_4x、 _AMD。
2. 不能使用數字開頭。
– 例如:2dos。
3. 不能與C語言的保留字相同
– 例如:int、void、return等。
12
宣告變數
• 宣告變數,其語法如下:
資料型態 變數名稱的識別字清單;
• 範例:
int score;
double sales, sum;
13
設定變數初值(1/3)
• 宣告變數的同時給予初值:
int score1 = 35; /* 變數初值 */
• 指定敘述指定變數值:
int score2; /* 宣告變數 */
score2 = 27; /* 指定敘述 */
14
指定敘述
• 在程式執行中存取變數值。
• 如果在宣告變數時沒有指定初值,我們可
以使用指定敘述,即「=」等號,來指定
或更改變數值。
15
設定變數初值(2/3)
• int score1 = 35; /* 變數初值 */
• int score2; /* 宣告變數 */
score2 = 27; /* 指定敘述 */
16
設定變數初值(3/3)
• int score3; /* 宣告變數 */
score3 = score2 + 2; /* 指定敘述 */
17
scanf()函數
• 判斷輸入哪一種資料型態的資料。
• 範例:
使用「%d」讀取整數常數值來儲存至score變數:
scanf("%d", &score);
• 連續輸入2個變數值:
範例:
scanf("%d %d", &score1, &score2);
scanf("%d,%d", &score1, &score2);
18
INPUT:
60 90
60,90
scanf()函數:格式字元
19
• 格式字元需要對應輸入值的資料型態,如
下表所示:
資料型態 格式字元 輸入值
int %d 輸入沒有小數的整數常數值
float %f
輸入擁有小數的浮點數常數值
double %lf
char %c
輸入字元常數值,不需使用「'」
單引號括起
敘述與運算元
• 運算式由運算元與運算子組成
– 運算式:expression
– 運算元:operand,如變數sum,或常數10等
– 運算子:operator,如「+」、「-」、「*」
與「/」等符號
20
num = a + 10 ;
運算元 運算元 運算元運算子 運算子
運算式
敘述
算數運算子
21
• printf(“7/2=%dn”,7/2);
• OUTPUT:7/2=3
• printf(“7%%2=%dn”,7%2);
• OUTPUT:7%2=1
• 建立數學的算術運算式
資料型態轉換
• 轉換變數儲存的資料,而不是變數本身的
資料型態。
– 指定敘述的型態轉換
– 算術型態轉換
– 強迫型態轉換運算子
22
指定敘述的型態轉換
• 將「=」運算子右邊的運算式轉換成和左
邊變數相同的資料。
a = b;
• 變數a和b如果是不同的資料型態,變數b
的值會自動轉換成變數a的資料型態。
23
a b 可能的資料損失
int float 損失小數且可能更多
float double 損失精確度
浮點數 float double
24
浮點數 float double
• float 只有 7~8 個位數的精度,
double可達 15~16 個位數
25
算術型態轉換
• 運算子左右兩邊的運算元型態不同時
• 自動型態轉換
• C 語言所提供的型態中,表示範圍從大到
小依序:
double>float>int>char
• 例如:
– int 和 float 相加,int 會被轉成 float
– int的範圍:-2,147,483,648 ~ 2,147,483,647
– float的範圍:1.18e-38~3.40e+38
26
算術型態轉換範例(1/2)
27
1 #include <stdio.h>
2 int main(void){
3 char c='a';
4 int i=3;
5 float f=5.3f;
6 double d=6.28;
7
8 printf("(c+i)*(f/d)+(i-f)=%fn",(c+i)*(f/d)+(i-f));
9 return 0;
10 }
OUTPUT:
(c+i)*(f/d)+(i-f)=82.094907
算術型態轉換範例(2/2)
• 運算式中,變數型態的轉換過程:
• double>float>int>char
28
char c='a';
int i=3;
float f=5.3f;
double d=6.28;
OUTPUT:
(c+i)*(f/d)+(i-f)=82.094907
強迫型態轉換運算子
• 轉換變數儲存的資料:
29
(欲轉換的資料型態) 變數名稱;
四則運算(1/3)
• 假設我們要計算u=(z+(x*y))/3
– 先算x*y
– 將結果加上z
– 最後將結果除以3
• 需要一個新的變數t
30
四則運算(2/3)
• 流程圖
31
宣告u,x,y,z,t為實數
讀入x,y,z
印出x,y,z
t = x*y
t = z+t
u= t/3
印出u
結束
四則運算(3/3)
32
u=(z+(x*y))/3;
OUTPUT:
Enter x:2
Enter y:4
Enter z:6
x=2.000000,y=4.000000,z=6.000000
u=4.666667

Cch2v6

Editor's Notes

  • #6 在同一時間完成許多程式的處理工作。也可以由多個CPU去執行同一程式,並相互比較核對執行結果的正確性。 作業系統可同時執行多項程式。此方式的好處是可充分運用電腦的資源, 例如有些程式需要比較多的 CPU 運算時間, 有的則是需要消耗較多的網路資源, 如果這些程式同時被執行, 將使電腦的資源能更充分地運用;對使用者而言, 也能同時做多項工作。
  • #7 一個典型的電腦系統要執行一個程式時,首先會將儲存在secondary memory的程式載入到main memory中 接著透過input device讓使用者輸入程式所需的資料並儲存到main memory 再由CPU執行程式並將執行結果儲存回main memory或透過output device將結果呈現給使用者
  • #9 電腦程式在執行時常常需要記住一些資料,所以在程式語言會提供一個地方,用來記得執行時的一些資料,這個地方就是「變數」(variables)。 問題是,這些需記住的資料是儲存在哪裡,答案就是電腦的「記憶體」(memory),變數是一個名稱,用來代表電腦記憶體空間的一個位址
  • #10 洪3-2
  • #12 字元型態佔有一個位元組,可以用來儲存英文字母等字元 整數:一個班級學生人數的總數、樓層數 在日常生活中經常會使用到小數型態的數值,如里程數、身高、體重等需要較精確的數值時,整數的儲存方式就會不敷使用
  • #15 宣告3個變數score1~2後,分別使用變數初值和指定敘述指定變數值,如下所示: score1是在宣告時指定初值;score2是使用指定敘述指定變數值 指定敘述「=」等號左邊的變數稱為「左值」(lvalue),表示是變數的位址(address)屬性;等號的右邊稱為「右值」(rvalue),這是變數值(value)屬性,我們是將變數值或常數值27指定給左邊變數的記憶體位址,即更改此記憶體位址的內容
  • #16 「指定敘述」(assignment statements)可以在程式執行中存取變數值,如果在宣告變數時沒有指定初值,我們可以使用指定敘述,即「=」等號,來指定或更改變數值。 C語言指定敘述的基本語法,如下所示: 變數 = 運算式; 在上述指定敘述的左邊是變數名稱,右邊是「運算式」(expression),運算式是C語言運算子和運算元組成的運算式,程式碼的目的是「將運算式的運算結果指定給左邊的變數」。
  • #17 宣告3個變數score1~2後,分別使用變數初值和指定敘述指定變數值,如下所示: score1是在宣告時指定初值;score2是使用指定敘述指定變數值 指定敘述「=」等號左邊的變數稱為「左值」(lvalue),表示是變數的位址(address)屬性;等號的右邊稱為「右值」(rvalue),這是變數值(value)屬性,我們是將變數值或常數值27指定給左邊變數的記憶體位址,即更改此記憶體位址的內容
  • #18 在等號左邊的變數score3是左值,取得的是位址;右邊變數score2是右值,取出的是變數值,所以指定敘述是將變數score2的「值」加2後,存入變數score3的記憶體「位址」,即1008,即更改變數score3的值成為score2+2的值,即29(所以,指定敘述是指定變數值,不要弄錯成數學的等於,因為它不是等於)
  • #21 吳2-10
  • #22 求出17/5的餘數 printf(“17%/5=%d\n”,17/5); OUTPUT:17/5=3 printf(“17%%5=%d\n”,17%5); OUTPUT:17%5=2
  • #23 「資料型態轉換」(type conversions)是因為運算式可能擁有多個不同資料型態的變數或常數值。例如:在運算式中擁有整數和浮點數的變數或常數值時,就需要執行型態轉換。 資料型態轉換是指轉換變數儲存的資料,而不是變數本身的資料型態,因為不同型態佔用的位元組數不同,在進行資料型態轉換時,例如:double轉換成float,變數資料就有可能損失資料或精確度。
  • #24 指定敘述的型態轉換規則很簡單,就是將「=」運算子右邊的運算式轉換成和左邊變數相同的資料型態,如下所示: a = b; 上述指定敘述的變數a和b如果是不同的資料型態,變數b的值會自動轉換成變數a的資料型態。
  • #27 「算術型態轉換」(arithmetic conversions)並不需要特別語法,運算式如果擁有不同型態的運算元,就會將儲存的資料自動轉換成相同資料型態,且是運算元中範圍大的資料型態,運算式型態轉換的順序是型態數值範圍大者比較高,如下所示: