iT邦幫忙

3

【C language part 2】變數&資料型態、輸入輸出、運算子&運算式

撰寫第一支程式!!

#include <stdio.h>
#include <stdlib.h>

void main() {
	
    /* some comments */

	printf("Hello World!");
	
	system("PAUSE");
	return 0;
}

我們一步一步拆開來看看

First Block

#include <stdio.h>
#include <stdlib.h>

這是在 C program 編譯之前要處理的內容,我們稱為預處理命令(preprocessing command)。預處理命令還有很多,它們也都以 # 開頭,並且不用分號結尾
stdio 是 standard input output 的縮寫,也就是有關輸入輸出的標頭檔(head file)
stdlib 也就是 standard library,包含了 C 與 C++ 裡最常用的一些函數。

Second Block

void main()

main function,從這裡開始執行 C program。

Third Block

/* some comments */

註解,C program 不會編譯執行裡面的任何內容。單行註解的話使用雙斜線 //

Fourth Block

printf("Hello World!");

printf 指令可以輸出內容顯示在螢幕上。

Fifth Block

system(“PAUSE”);
return 0;

程式暫停,按任意鍵繼續。

Steps to Write C Programs and Get the Output

  • 以下四個步驟任何 C program 都要遵循的步驟,對所有專案都通用。
  • 無論是只有數行的小程式或是包含好幾個檔案的大專案無一例外。
  1. Create
  2. Compile
  3. Execute or Run
  4. Get the Output

資料型態 Data Type

  • 資料型態(data type)是在執行程式時用來定義變數(variable)的。
  • 變數、常數(constant)和陣列(array)在記憶體所佔的空間大小是由資料型態所決定的。
  • C 的基本資料型態主要區分為:
Types Data Types
Basic data types int, char, float, double
Enumeration data type enum
Derived data type pointer, array, structure, union
Void data type void

列舉 (enumenumeration) 是另一種複合型別,主要是用在宣告僅有少數值的型別,像是一星期內的日期 (day of week) 或是一年內的月份等。

Basic data types – Integer

  • 整數資料型態(integer data type)允許變數來儲存數值(numeric values)。
  • 關鍵字 int 是用來宣告整數資料型態。
  • 記憶體所佔的儲存空間可以是 2、4 或 8 byte。配置的記憶體長度在不同編譯器上各不相同,可容納的大小各不相同。

Basic data types – Floating Point

  • 浮點數(floating point)是用來將實數數位化表示的一種表示法,簡單來講就是可以用來宣告含小數點的數字。我們現在使用的是由 IEEE 制定的浮點數表示標準。
  • 資料型態分為兩種:
    1. float
    2. double
  • 而兩者的差異在於「精確度」。
Keyword Byte Format String Comment
float 4 bytes %f 浮點數
double 8 bytes %lf%l 雙精度浮點數

Basic data types – Character

  • 字元(character)資料型態只允許變數儲存一個字元。
  • 所佔用的記憶體空間為 1 byte。
  • 用來儲存英文字母及 ASCII 碼。(字元可以跟整數型態互相轉換,也就是 ASCII 碼)
  • 關鍵字 %c 用來宣告字元資料型態。

ASCII Code

變數 Variable

Variable is a named location in a memory where a program can manipulate the data. This location is used to hold the value of the variable.

  • 在程式設計的過程中,我們會需要紀錄某些資料,我們需要把這些資料紀錄在記憶體的某個位址中,並且給它一個名稱,這就是所謂的變數。
  • 變數的值(value)可以在程式中發生變化。
  • 變數可被宣告成任何 data type。

Rules for naming C variable

  • 變數名稱必須是由英文字母或是底線()開頭。
  • 英文字母大小寫有差。
  • 可以由數字或字母組成。
  • 除了底線以外,不得使用任何特殊符號
  • 不能跟 C語言的保留字(reserved word)相同。
  • 舉例合格的變數名稱:
    1. sum
    2. height
    3. value

保留字 Reserved word

變數宣告與初始化 Declaring and initializing C variables

  • 在 C 語言裡變數需要在使用前進行宣告。
  • 而變數初始化(variable initialization)是指設定變數的值(value)。

變數宣告需要在變數「初次」使用前完成,不可在其被使用後才進行宣告。
至於宣告的位置並沒有特別規定,可以在任何地方進行宣告。
不過還是習慣於最一開始的時候先進行宣告。

常數 Constant

  • C 常數觀念跟變數一樣,唯一的差別是:一旦定義其值,程式將無法對其進行修改。簡單來說,常數就是一個「唯讀」的變數。
  • 代數(algebra)裡所謂的常數與程式語言裡的常數概念上有些不同:
    • 代數中的常數,例如:在 $?(?)=?^3+?$ 中的 $?$ 表示在自變數與因變數改變時維持固定的數字,它的值不是問題觀察的重點,但可以是某些合理的數字中的一個。
    • 程式語言中的常數在觀念上和程式中的變數是一致的,也就是說,常數是一個 CPU 紀錄數值資料的地方,只是 CPU 在整個程式執行過程中,只會去讀取該資料,而不會修改它。
  • 經宣告並給定初始值後,就不再(且不允許)變更其數值的資料。

C 語言的變數四要件

  • C 語言變數包含四個要件:
    1. 資料型態 Data type
    2. 識別字 Identifier
      • 電腦程式中,編譯器或是直譯器會透過識別字來了解程式碼的意義,有些識別字是內建的,像是保留字、內建變數、內建函式、標準函式庫的韓式等等。有些識別字則是程式設計者宣告後創造出來的,像是變數。
    3. 值 value
    4. 可視度 Scope
      • Scope 較白話的講法應該可以解釋為「變數範圍」,涉及許多層次,由小到大可以分為:區塊可見(block scope)、函式可見(function scope)、區域可見(local scope)、全域可見(global scope)。詳細內容之後還會再提到。

printf & scanf

  • 輸入輸出函式(printf, scanf)是 C語言非常重要的函式,也是 C語言必學的兩個函式。在 C語言的程式中,幾乎每一個程式都會使用到這兩個函式,尤其是輸出函式。
  • 如果程式中需要使用 printf 或者是 scanf,那麼在撰寫時就需要引用標頭檔(head file)stdio.h。stdio 為 standard input output 的縮寫,而這兩個函式就包含在這個標頭檔裡。
  • 學習 C 的過程中,通常是從主控台(也就是文字模式)開始,為了與程式互動,在主控台下輸出程式結果,或是從主控台取得使用者的輸入資料是基本需求。其中 printf 的功能很強大,用法靈活,比較難掌握;而 scanf 用法相對比較固定。

printf

  • printf,print format 的縮寫。

Syntax:

# include <stdio.h>
int printf (const char *format, ...);

標準語法如上。
以下舉幾個例子來示範 printf 的使用方法。

printf("字符串\n");

# include <stdio.h>
int main(void)
{
    printf("Hello World!\n");
    return 0;
}
  • 其中 \n 表示換行的意思,是一個跳脫字元。
  • n 為 new line 的縮寫。
  • 除此之外要注意的是,printf 裡必須使用雙引號("),雙引號內的字幅串可以是英文,也可以是中文。

printf("輸出控制符",輸出參數);

# include <stdio.h>
int main(void)
{
    int i = 10;
    printf("%d\n", i);  
    return 0;
}
  • 這個程式的意思就是讓變數 i 以十進制的方式輸出。
  • 不過 i 本身就是十進制,又為甚麼還要將 i 以十進制輸出?因為程式碼中,雖然寫的是 i=10,但是在記憶體中並不是將「10」這個十進制的值存進去,而是以二進制的方式存進去。所以我們在輸出的時候就必須要有「輸出控制符」(或稱格式指定字,format specifier)來告訴系統應該怎麼解讀這個二進制的數值。

跳脫字元 Escape Character

格式指定字 Format Specifier

scanf

  • scanf,scan format 的縮寫。
  • scanfprintf 的用法幾乎完全一樣。但是需要注意以下兩點:
    1. scanf 裡面絕對不要包含 \n
    2. scanf 後面不是直接放變數,前面需要再加上 & ,不過字元或陣列不需要加上& (至於為甚麼,等之後上到指標的時候會再解釋)。

以下也示範幾個例子說明 scanf 的使用方法。

#include <stdio.h> 
int main() { 
	int a = 0, b = 0, c = 0, d = 0; 
	scanf("%d", &a); 
	scanf("%d", &b);
	printf("a+b = %d\n", a+b); 

	scanf("%d %d", &c, &d); 
	printf("c*d = %d", c*d); 
	
	return 0; 
}

從鍵盤上輸入 12,按下 Enter 鍵之後,scanf() 就會讀取輸入數據並給定給變數 a,本次輸入結束。接著執行下一個 scanf(),再從鍵盤輸入 60,按下 Enter 鍵就會將 60 給定給變數 b
後面的 scanf() 有兩個用空格分開的 %d,後面跟著兩個變數 cd,這個代表我們要一次輸入兩個整數,並且會分別給定給 cd。注意,%d %d 之間是有空格的,所以我們在輸入數據時也要有空格。對於 scanf(),輸入數據的格式要和控制字符串的格式一樣。

scanf(“%d %d”, &a, &b); // 獲取使用者輸入的兩個整數,分別給定變數a和b
printf(“%d %d”, a, b); // 將變數a和b的值在螢幕上輸出

scanf 和 printf 非常相似,只是功能相反。

兩者都有格式控制字符串,都有變數,不同的是 scanf 的變數前需要加一個 & 符號。
&稱為取址符號,也就是可以獲得變數在記憶體的位址。(詳細內容會在指標單元詳細介紹)

#include <stdio.h>
int main() {
	int a, b, c; 
	scanf("%d %d", &a, &b); 
	printf("a+b=%d\n", a+b); 

	scanf("%d %d", &a, &b); 
	printf("a+b=%d\n", a+b); 

	scanf("%d, %d, %d", &a, &b, &c); 
	printf("a+b+c=%d\n", a+b+c);

	scanf("%d is bigger than %d", &a, &b); 
	printf("a-b=%d\n", a-b); 

	return 0; 
}

  1. 第一個scanf()格式控制符為”%d %d”,中間只有一個空格,但是輸入時,多輸入一個空格。
  2. 第二個scanf()格式控制符為”%d %d”,中間有兩個空格,輸入卻只輸入一個。不過就算如此,print 出來的格式是正確的。這代表scanf()對輸入數據之間的空格處理比較寬鬆,並沒有嚴格要求空格的對應數量,只要有空格就可以了。
  3. 第三個scanf()的控制符”%d, %d, %d”,中間用逗號分隔,所以輸入的整數也要用逗號分隔。
  4. 第四個scanf()要求兩整數之間以is bigger than分隔。

使用者每次按下 Enter 鍵,程式就會認為完成了一次輸入操作,scanf() 開始讀取使用者的輸入內容,並且根據格式控制符中提取有效的數據,只要使用者輸入的內容和格式控制符匹配,就能夠正確提取。


scanf 連續輸入

我們將前兩個程式碼改寫看看!

  • 一開始我們每輸入一個數值,就按一次 Enter 鍵,而這次我們一次輸入四個數值(中間以空格分隔)再按下 Enter,可以發現 scanf 都能正確讀取。
  • 到這邊,我們可以合理推斷第一個 scanf() 讀取完後並沒有拋棄多餘的值,而是將它們保存在某個地方,下次接著使用。
  • 而如果我們多輸入一個數字,依樣可以正確讀取,只是最後一個數值沒有使用而已。
  • 那如果我們少輸入一個數字呢?
  • 輸入三個整數後,前兩個 scanf() 把前面兩個整數給讀進去了,此時剩下一個整數 60。而第三個 scanf() 要求要輸入兩個整數,一個單獨的整數 60 並不能滿足其要求,所以我們還是必須輸入數值湊足兩個整數以後,第三個 scanf() 才能正確讀取。

所以,從基本上我們可以發現從鍵盤輸入進去的數值並沒有直接交給 scanf(),而是放入一個「緩衝區」,直到我們按下 Enter,scanf() 才會到緩衝區去讀取數值。如果緩衝區的數值符合 scanf() 的要求,那麼就可以讀取結束;如果不符合要求,那麼就繼續等待用戶輸入,或者乾脆讀取失敗。

運算子 & 運算式 Operators & Expressions

  • 在C語言中,用來執行邏輯和數學運算的符號我們稱為 C的運算子(C operator)。
  • 這些 operators 將各個 constants、variables 和 functions 組合起來,我們稱為運算式(C expression)。

以此算式為例:

C operators

Types of Operators Description
Arithmetic operators 用於執行數學計算,例如:加減乘除和取餘數。
Assignment operators 用在為變數分配值(value)。
Relational operators 用來比較兩個變數的值。
Logical operators 對給定的變數執行邏輯運算。
Bit wise operators 對於給定的兩個變數執行 bit operations。
Conditional (ternary) operators 如果條件為 true,則條件運算子會回傳一個值;如果是 false,則回傳另一個。
Increment / decrement operators 用於將變數的值增加或減少一。
Special operators &、*、sizeof() 和 ternary operators。

算數運算子 Arithmetic operators

  • 也就是一般數學四則運算會用到的運算子,再加上 ﹪、遞增運算子、遞減運算子。

  • ++ 遞增運算子與 -- 遞減運算子

  • 複合指定運算:指的是同時執行『算術運算子或位元運算子』以及『指定運算子』兩件工作。

  • 比較關係運算子

  • 邏輯運算子 Logical Operator

運算子的優先順序

  • 算術運算子 → 比較運算子 → 邏輯運算子
    • 先乘除,後加減;同一列中的運算,其優先順序相同時,是由左至右運算。
    • 常見運算子的優先順序如下:
順序 運算子
1 () 小括號
2 + 正數、- 負數
3 */%
4 +-
5 <<=>>=
6 =!=
7 &&
8 ||
9 = assign、*=/=%=+=-=

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言