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)

32 則留言:

  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;
      對吧?

      刪除
  4. 您好:
    程式碼如下:
    #include
    int main()
    {
    float a,b,c;
    scanf("%f%f%f",&a,&b,&c);
    printf("Your input are %f, %f, and %f, I remember them!\n",a,b,c);
    int d,e,f;
    scanf("%d%d%d",&d,&e,&f);
    printf("Your input are %d, %d, and %d, I remember them!\n",d,e,f);
    char g,h,i;
    scanf("%c%c%c",&g,&h,&i);
    printf("Your input are %c, %c, and %c, I remember them!\n",g,h,i);
    return 0;
    }

    為何在輸入第三個指令(char)時,輸入abc,只有顯示Your input are, a, and b, I remember them!而不是Your input are a, b, and c, I remember them! (輸入的c無輸出在畫面上)

    謝謝

    回覆刪除
  5. #include
    int main()
    {
    int a;
    scanf("%d",&a)
    printf("Your input is %d, I remember it!\n",a);
    return 0;
    }

    it shows up error but i cant find why it is wrong
    can you help me?thanks!

    回覆刪除
    回覆
    1. Watch out! You lacked a ';' on the end of 5th line. ;)

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

    回覆刪除
    回覆
    1. Watch out! You lacked a ';' on the end of the 5th line. ;)

      刪除
  7. #include
    int main()
    {
    int a;
    scanf("%d",&a);
    printf("Your input is %d, I remember it!\n",a);
    return 0;
    }
    i can not find who i wrong, it can not show any think

    回覆刪除
    回覆
    1. In this example, be sure to enter a number such as 5.
      The output should be "Your input is 5, I remember it!\n"
      Feel free to ask any further questions! ^_^

      刪除
    2. #include
      int main()
      {
      int a;
      scanf("%d",&a);
      printf("Your input is %d, I remember it!\n",a);
      return 0;
      }

      請問這支程式 我自己打會跳error 用複製貼上也是error 是哪裡有問題

      刪除
  8. #include
    int main()
    {
    int a,b,c;
    scanf("%11%12%13",&a,&b,&c);
    printf("Your inputs are %11, %12, and %13, I remember them!\n",a,b,c);
    return 0;

    }

    請問一下我是不是哪裡寫錯為什麼我跑不出東西,謝謝

    回覆刪除
    回覆
    1. %後不能亂加吧 照格式來

      刪除
    2. %11、%12、%13都改成%d就OK囉!有後續也都歡迎提問~ ^_^

      刪除
  9. #include
    int main()
    {
    int a;
    scanf("%d",&a);
    printf("Your input is %d, I remember it!\n",a);
    return 0;
    }

    想知道為什麼照著複製這段程式碼後,在輸入數字時
    偶爾可以run出正確數字,偶爾卻不行?
    難道說這段程式碼當中有什麼限制嗎?
    比方說不能打3位數數字或是只能輸入幾位數數字之類的?

    回覆刪除
    回覆
    1. 能不能提供無法run出正確數字的截圖呢><
      三位數應該是沒問題的哦!只要不要超過2147483647或低於-2147483648就好~

      刪除
  10. #include
    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;
    }

    i use this program and type some number(eg.1010),but it shows1,1,0...why?

    回覆刪除
    回覆
    1. Your input contains no ",". Therefore, it should be:
      scanf("%d%d%d",&a,&b,&c);
      or
      scanf("%d %d %d",&a,&b,&c);
      (whitespaces do not matter)
      Welcome to ask more as long as you wish! ^_^

      刪除
  11. 問一下 iostream 和 cstdio 的語法有哪些地方不同

    回覆刪除
    回覆
    1. 一個用cout,cin;另一個是用printf scanf

      刪除
    2. 差不多XD
      就是看起來和寫起來可能不太一樣,小莫我自己是比較熟printf/scanf,cout/cin您可以另請高就(?)

      刪除
  12. 能否告訴我現在已經用到了店數的int,為何上面的 int main() 還要留著?,我是初學者很多都不懂,謝謝

    回覆刪除
    回覆
    1. 店數->變數?
      恩,就是C++規定要這樣寫XD(「int main()」的部分)
      或許真有它的道理只是小莫還沒去研究(?!)

      刪除
  13. 輸入100000000000000000000要用哪個資料型別

    回覆刪除
    回覆
    1. 這麼大的數字要自行實作大數哦
      可以先當作string讀進來再把每個位數切開來分別進行處理,會比較複雜但這是可行的

      刪除

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

注意:只有此網誌的成員可以留言。