2016年4月28日 星期四

給新手的C++教學 (上冊) - 2. 變數 (Variable)

回到「給新手的C++教學 (上冊)」

上一章

利用上一章學到的東西,我們已經有能力可以在螢幕上顯示任何文字了!
但是,這樣的程式還無法和人互動

我們的程式要怎麼和人互動呢?
方法是人輸入一些文字然後按下鍵盤上的Enter鍵,把這些文字輸入給程式
然後程式就可以依照輸入的東西來作出對應的回應了 (這裡的「回應」指的是在螢幕上顯示東西)

這裡先來向大家解釋甚麼是「輸入 (Input)」和「輸出 (Output)」
它們可以當動詞也可以當名詞,在以後的文章看到時,可能需要自行判斷一下
當動詞時,「輸入」代表將一段文字傳給程式,「輸出」代表程式將一段文字顯示在螢幕上
當名詞時,「輸入」代表傳給程式的一段文字,「輸出」代表程式在螢幕上顯示的一段文字
懂了嗎?^_^
(p.s.其實輸入輸出的意義不僅僅是這樣,但在以後的教學中,它們就只會是這個意思)

不過,要做到「程式依照輸入的東西來作出對應的回應」,就代表
你的程式必須記住你輸入了甚麼東西

我們要怎麼實現讓程式擁有記憶呢?
方法就是把資訊以「變數 (Variable)」的形式儲存起來

變數要怎麼使用呢?
在C++裡面,變數有很多種類型,我們稱作「型別 (Type)」
有哪些型別呢?
我想想喔,有short、int、long long、bool、char、float、double、......,甚至在新版的C++ (C++11) 又新增了一些型別
不過,大部分都不會用到 (或很少用到)
事實上,你只要學好int、char、float這三種型別,就足夠應付所有功能了!
其他的型別就只是int、char、float這三種型別的「功能增強版」或「功能削弱版」(?)

「int」是「整數 (Integer)」,這種型別的變數是用來儲存「一個整數」的
「char」是「字元 (Charactor)」,這種型別的變數是用來儲存「一個字」的
「float」是「浮點數 (Floating-point number)」,別被它的名字嚇到,其實「float」做的事情就和「int」一樣,只是「float」可以允許「小數」的存在,缺點是你必須接受些微的計算誤差。現階段,這個誤差你可以不用考慮它

介紹完了,那要怎麼使用呢?
來看個範例
我們希望輸入一個整數,然後程式就會輸出一個跟你輸入的數值相同的整數 (例如:輸入「12」或「012」,會得到輸出「12」)
也就是『輸入一個「int」,輸出一個「int」』
程式碼在這裡:


#include<cstdio>
int main()
{
    int a;
    scanf("%d",&a);
    printf("Your input is %d, I remember it!\n",a);
    return 0;
}
 
上一章一樣,在「Dev-C++」裡面照著打出跟上面一樣的程式碼,然後按下鍵盤上的「F11鍵」,就可以玩玩看了!

這裡我們看到了一個陌生的名字:scanf
還記得printf嗎?或許你沒有印象,但事實上,在上一章我們已經偷偷地使用了

「printf」是用來「輸出」的,而這裡看到的新朋友「scanf」,是用來「輸入」的
可以發現,scanf之後的兩個小括號包起來的部分,和printf一樣,都有兩個「"」框起來的東西
事實上,因為都是對文字作處理,之後你會慢慢發現,其實「scanf」和「printf」是很像的東西
那麼,「%d」是甚麼呢?

上一章有隱約的表示,「\」是一種特殊符號,當程式碼中 (僅限兩個「"」框起來的地方) 出現「\」這個符號時,電腦會把「\」和下一個字合在一起,代表某種具有特殊意義的......東西 (?)
同樣的,「%」也是一種特殊符號  (同樣僅限兩個「"」框起來的地方),電腦在閱讀 (還記得上一章我們把程式碼比喻為文章嗎?) 到「%」這個符號時,也會自動把「%」和下一個字 (有時候是兩個或多個) 合在一起,代表某種「變數」顯示在螢幕上的樣子

在這裡,我來向大家介紹,對於每一種型別的變數,對應到「%」後面接甚麼東西 (亂接的話電腦會看不懂喔XD)
「int」           對應到「%d」
「char」        對應到「%c」
「float」        對應到「%f」

剩下的型別,我也一一介紹,要看不看隨便你
「long long」對應到「%lld」
「double」    對應到「%lf」(輸入用「%lf」,但輸出要用「%f」)
「char*」      對應到「%s」(以後會提到)

試著實現char版本和float版本的程式看看吧~

輸入一個char,輸出一個char:

#include<cstdio>
int main()
{
    char a;
    scanf("%c",&a);
    printf("Your input is %c, I remember it!\n",a);
    return 0;
}
 

輸入一個float,輸出一個float:

#include<cstdio>
int main()
{
    float a;
    scanf("%f",&a);
    printf("Your input is %f, I remember it!\n",a);
    return 0;
}
 

另外,你甚至可以「輸入三個int,輸出三個int」喔!
程式碼:

#include<cstdio>
int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    printf("Your inputs are %d, %d, and %d, I remember them!\n",a,b,c);
    return 0;
}
 
試著亂調a、b、c這三個變數在程式碼中的順序,看看會發生甚麼事吧!(有三個位置,任君亂調(?) )

你還能修改出其他東西嗎?
把任意幾行程式碼複製一遍或多遍,你的程式會變成怎麼樣的行為呢?
把任意兩行或多行程式碼交換,會有甚麼差別嗎?
「%」後面如果接其他的東西,會有甚麼神奇的事發生呢?(咦?XD)

下一章

感謝:李旺陽學長
(版權所有 All copyright reserved)

9 則留言:

  1. 想請問一下
    我寫了以下這段
    為何輸出會是
    -5
    -5 1
    而不是只有
    -5 1
    呢??

    #include <iostream>
    using namespace std;

    int foo(int a){
    cout << a << '\n';
    a = 1;
    return a;
    }
    int main(){
    int a = -5, b;
    b = foo(a);
    cout << a << ' ' << b << endl;
    }

    回覆刪除
    回覆
    1. 您的foo函式也有cout一行呀XDD

      刪除
    2. 可是不是只執行main裡面的程式嗎?
      不是只會cout a << ' ' << b 嗎?

      刪除
    3. 哈哈,您可能搞錯囉
      使用函式會讓函式裡面的程式碼被執行哦~
      另外,本系列教學還有一章叫做函式,歡迎參考看看~

      刪除
  2. 想請問一下
    我想找三個數的最大值
    寫了以下程式碼
    應該是對的
    但想問一下
    為何不用比num2跟num3大小呢

    #include <iostream>
    using namespace std;
    int main(int argc, char **argv)
    {
        int num1, num2, num3;
        
        cout << "Enter three interger";
        int max;
        
        cin >> num1 >> num2 >> num3;
        
        max = num1;
        
        if (num2 > num1)
            max = num2;
        if (num3 > num1)
            max = num3;
            
        cout << "max is " << max <<endl;
    }

    回覆刪除
  3. 我有一個留言好像被刪掉了QQ

    回覆刪除
    回覆
    1. 別擔心~小莫幫您還原回來了~~XD
      其實您的程式碼是有些小問題的哦~
      試試看num1=1, num2=3, num3=2
      正確答案應該是3(?)

      刪除
    2. 啊我知道了
      改成
      if (num2 > max)
      max = num2;
      if (num3 > max)
      max = num3;
      對吧?

      刪除

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原