課堂目標 : 完成ZJa001 作者 : CBJ 參考資料 : https://zh.wikipedia.org/zh-tw/%E5%8F%98%E9%87%8F_(%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)
變數
變數(Variable)是指某個值在記憶體中的一塊位置,有著專屬於自己的名稱。之所以稱為變數是因為,變數的值可能在程式執行期間被更動。而變數的值未必要在宣告時就確定,可以透過輸入或是其他流程再去定義。
變數在程式間的運作如:宣告在第a行 -> 使用在第b行 -> 在第c行改變變數的值 -> 再使用在第d行 -> 在第e行將值變成另一個變數的值 -> . . .。
變數命名可以在某些規範下自由取名,雖然看似簡單,但要為變數取一個好名稱,可是一門大學問 ! (詳可參考「變數命名規則」、「匈牙利命名法」等。)
簡介說完了,開始實作!
Step 1:宣告變數
// C/C++
int abc ; // A B ;
int abc = 5 ; // A B = C ;
int abc = efg ; // A B1 = B2 ;
## Python
abc = 5 # B = C
abc = efg # B1 = B2
上面範例程式碼中的 A ,指的是「資料型態」,表示要告訴電腦,我的變數是屬於整數 (int)、字元 (char)、浮點數 (float, double) 還是字元陣列 (字串) (char[ ], string) 等等。會發現C/C++會需要 A ,而Python是不需要的,這取決於各種程式語言的特性。
再來是 B 的部分, B 在範例裡指的是「變數名稱」,只要在規範之內都可以自由的去命名,通常會建議使用純英文,比較不會有命名上的問題。
最後是 C , C 就是所謂的「值」。會發現在C/C++中,宣告一個變數不一定需要預先給定好他的值,而在Python中,若沒有要先設定值,那大可等到需要這個變數時再宣告就好。
另外,在宣告變數時,也可以直接將變數的值指派成另一個變數的值,例如範例中的 A B1 = B2 和 B1 = B2 。
※補充:範例出現的「=」並不是數學上的等於,而是「指派成」的意思,因此 A = B 指的是將 A 的值「指派成」B 的值,如此一來A的值就會接到B的值。(程式中的「等於」是「==」,這在之後的運算符號單元會提到)
※請務必切記,C/C++請在每行後面加上分號!!!
Step 2:操作變數
int a = 10;
int b = a;
a = 4;
a = b;
假設上面的程式片段執行後,a和b的值會是多少?
我們可以拆成一行一行來看
第 1 行: a = 10, b = ?
第 2 行: a = 10, b = a = 10
第 3 行: a = 4, b = 10
第 4 行: a = b = 10, b = 10
因此 a = b = 10
輸入輸出
在家靠父母,出外靠朋友,輸入輸出靠函式。
輸入輸出的原理非常的複雜,所以輸入輸出的函式早已經為我們準備好,我們只需要知道該如何用他就OK了。
// C
輸入 : scanf()
輸出 : printf()
// C++
輸入 : cin
輸出 : cout
## Python
輸入 : input()
輸出 : print()
以下分開來講各個語言的輸入輸出函式 :
。C
int abc;
scanf("%d", &abc);
printf("%d\n", abc);
這裡開始出現了許多難以理解的符號和參數,沒關係我會一一的帶大家認識它們。
焦點 1:“ ”
被 ” ” 所框起來的一律稱為「字串(字元陣列)」,所以可以知道scanf()第一個要放的參數是一個「字串」(函式的參數間由逗號作分隔)。
焦點 2:%d或類似(%c, %f, %lf …)
%_ 指的是「格式化(格式指定)」,表示告訴電腦輸入(or輸出)的東西要轉成甚麼「型別」(int -> %d, char -> %c, float/double -> %f/%lf …),此外,printf()中,%_ 在字串中的位置,就會是最後輸出出來的位置,且允許多個%_,但要搭配一樣多要輸出的內容。
printf("%d x %d = %d", 3, 5, 15)
// output: 3 x 5 = 15
焦點 3:&
「&」指的是「取地址」,也就是取得abc這個變數在記憶體中的位置,詳細的位置是甚麼我們倒不需要去理解,只要知道scanf()需要他就好,我們的任務就是丟給他,然後就沒我們的事了。
(讀入字元陣列不需要&)
(printf() 不需要&)
焦點 4 :\n
「\n」指的是換行字元,他的功能應該是人人都會使用,就是在打文件時按下Enter鍵換行,他就只是變成了一個轉義字元(有興趣可以去查詢「轉義字元」),僅此而已。(\n請當成一個字看待)
printf("123") // output: 123
printf("1\n2\n3") /* output: 1
2
3 */
。C++
int abc;
cin>>abc;
cout<<abc<<"\n";
C++就比較人性化了,沒有那些奇奇怪怪的「符號」,只剩下「>>」和「<<」,那這部分就必須要用記的(cin配>>, cout配<<),以下提供一種記憶法:
cin 要去抓東西,所以箭頭朝向變數 >>
要輸出東西,要去找cout,所以箭頭朝向cout
(個人是這樣記起來的,算是原創(?)的記憶法吧)
※另外提醒,越靠近cout的會越早輸出(排隊照順序)
。Python
abc = int(input())
print(abc)
Python這邊用到的是int()函式,功能上就類似%d的效果,一樣有str()(轉字串), float()(轉浮點數) 等函式幫助做轉換。
※補充:input()函式預設將輸入內容看成字串,所以才要用int()
Python的輸出也十分簡單,只要在print()裡面放入想輸出的變數即可,而且print()函式還自帶換行,連\n都不用認識了(誤)
練習
學完以上這些內容,就來現學現賣,請完成下列題目吧:
ZJa001:https://zerojudge.tw/ShowProblem?problemid=a001
提示
題目提到要輸入字串,
若使用C/C++,需要先宣告好字串再輸入
//C
char s[100]; //char是型別, s是名稱, [100]是字元陣列大小
scanf("%s",s) //讀字串用%s, 且字元陣列不需要加「&」
//C++
string s; //若要使用string, 則需要另外include<string>
cin>>s; //直接讀s即可(箭頭朝向變數)
若使用Python,則直接輸入存入變數即可
## Python
s = input() #input()讀入的本身就是字串,所以不需要函式轉換
題目要求輸出Hello, (字串)
若使用C,用格式化輸出(%s專門格式化字串(字元陣列))
// C
printf("hello, %s\n",s);
若使用C++/Python,直接輸出字串相加(運用加號)
// C++
cout<<"hello, " + s + "\n";
## Python
print("hello, " + s)
完整程式碼
請參考本站 解題筆記 > ZJ解題 > 基礎題庫 > a001: 哈囉
發佈留言