2016年6月1日 星期三

給新手的C++教學 (上冊) - B. 遇到困難了? (There are troubles?)

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

上一章 (這要怎麼定義上一章啦喂)

本章列出新手在進行本教學的練習時可能會遇到的困難
並提供解決方案
希望能幫助新手們更快、更方便的利用本教學學習新知識!

Q:
看不懂教學在說甚麼QAQ

A:
請問您真的有動手把程式碼用鍵盤打出來,並按下F11執行過嗎?
程式的學習非常依賴自己動手試試看
就像做實驗一樣,在一個字一個字慢慢的打出程式碼的過程中,您才會去觀察規律、猜測其規則、自己修改程式碼來驗證看看,相信很快 (10分鐘內) 就可以掌握觀念!
(真的,不動手試試看就永遠學不會)
這些規則其實是很簡單的,類似小學在玩的益智遊戲,但如果每一個規則都要弄成文字說明,大概在看懂之前就會眼花了吧XD
如果還是不懂,或者理解時間超過10分鐘,歡迎在文章下面留言~
您看不懂,一定還有另一個人也看不懂,所以請別吝嗇,在文章下面勇敢留言說出您遇到的困難吧!

Q:
電腦一直說我的程式寫錯,我不知道為甚麼?
我寫出來的程式就是無法依照預期的方式運作,我不知道為甚麼?

A:
這種情況對新手來說通常不是自己能解決的事,請先參考本教學提供的範例程式碼,並嘗試照著打一遍看看
如果還是出錯,請直接用「複製」、「貼上」的方式,將程式碼貼到你的「Dev-C++」裡面,再按一次鍵盤上的「F11」試試看
當電腦成功讀懂你的程式碼,並且程式是正確執行出預期的結果之後
請再回去比對你原本會出錯的程式碼,找出出錯的原因
這很重要,可以幫助你以後更不會再犯相同的錯誤
如果還是出錯......就代表非常緊急的狀況發生了--本教學的程式碼也錯了!!!
請務必盡快通知小莫,將盡快做修正,感激不盡!
電子信箱:fsps60312@yahoo.com.tw

Q:
怎麼教學看到一半就突然出現看不懂的專有名詞?
怎麼教學看到一半就突然出現還沒教到的東西?

A:
代表小莫沒有考慮好初學者的立場,不小心用到了很專業的術語或進階的語法
請務必盡快通知小莫,將盡快做修正,感激不盡!
電子信箱:fsps60312@yahoo.com.tw

Q:
怎麼辦?上面都沒有提到我的問題QAQ

A:
唉呀呀,你遇到了甚麼問題?
趕快在本章下面留言,或者用任何方式和管道通知小莫
小莫會盡快提供解答,並更新本章內容!
感激不盡!
電子信箱:fsps60312@yahoo.com.tw

下一章 (這要怎麼定義下一章啦喂)

感謝:
(版權所有 All copyright reserved)

36 則留言:

  1. 啊抱歉排版跑掉了等我一下

    回覆刪除
  2. 和 一樣嗎是問那個stdio.h 和 cstdio

    回覆刪除
  3. http://codepad.org/e4frAxeZ

    回覆刪除
  4. stdio.h 是給C程式語言用的
    cstdio 是給C++程式語言用的
    不知有沒有回答到您的問題?

    回覆刪除
  5. 有~!謝謝(可以刪了)

    回覆刪除
  6. 嗨,我現在懂了,我自以為
    if(){
    if(){}
    }
    else{}

    if()
    if(){}

    else{}
    一樣,結果下面變成
    if(){
    if(){}
    else{}
    }
    所以就跑不出來

    謝謝你

    回覆刪除
    回覆
    1. 哈哈,我也犯過這種錯XD
      所以會盡量避免這種寫法
      寧願多加幾個大括號也不要最後debug一整天~OwO

      刪除
  7. 你好,我是剛學沒幾天C++語言的初學者,你的教學淺顯易懂,非常感謝你寫這種教學文章 我有問題想要請教一下!!
    #include
    int main()
    {
    printf("我是天才?\n");
    char n;
    scanf("%c,&n");
    if(n==是)
    {
    printf("真是識相!\n");
    }
    char b,c;
    scanf("%c%c,&b,&c");
    if(b,c==不是);
    {
    ptintf("你眼光有問題!\n");
    }
    return 0;
    }
    這個有錯誤 但是我不知道怎麼修正..

    回覆刪除
    回覆
    1. 哈囉~其實您的程式碼有滿多錯誤的哦XD
      舉幾個例子:
      「scanf("%c,&n");」→「scanf("%c",&n);」(「"」位置放錯)
      「if(n==是)」→「if(n=='是')」(請記得用「'」框住表示一個字元)
      「ptintf("你眼光有問題!\n");」→「printf("你眼光有問題!\n");」(「printf」拼錯)
      「if(b,c==不是);」→「if(b=='不'&&c=='是')」(修正邏輯、請記得用「'」框住表示一個字元、if後面直接分號=沒有作用(?))
      另外,有個重點是本教學忘記提及的,感謝您的提醒
      「一個中文字」其實是「兩個字元」組成的哦~
      因此就算只有「一個中文字」,也應該當作「字串」來看待
      字串處理(中英文都是)其實還有有滿多需要注意的地方,是本教學有所遺漏的,小莫之後會將其加入,再次感謝您的發問!

      刪除
    2. 我已經將你所舉的例子 訂正完了 不過還是有錯誤.

      #include
      int main()
      {
      printf("我是天才? YES or NO\n");
      char n;
      scanf("%c",&n);
      if(n=='是')
      {
      ptintf("真是識相!\n");
      }
      char b,c;
      scanf("%c%c,&b,&c");
      if(b='不'&&c=='是')
      {
      ptintf("你眼光有問題!\n");
      }
      return 0;
      }

      刪除
    3. 還有 我有點看不太懂迴圈 1+2+3...+100 的那個例子

      刪除
    4. 執行的時候會停止運作.

      刪除
    5. 我提到的只是一部分錯誤哦~
      而且請注意到,一個中文字是兩個字元組成的,因此不能直接用「'」框起來(如之前的回答有誤導請見諒)
      這裡提供我另外寫的程式碼,功能應該和您想實現的類似
      可以修改看看並趁機將沒學好的觀念補回來哦~
      另外,您有提到「執行的時候會停止運作」,請問是怎麼一回事呢?

      #include<cstdio>
      int main()
      {
          printf("我是天才? YES or NO\n");
          char answer[4];
          scanf("%s",answer);
          if(answer[0]=='Y'&&answer[1]=='E'&&answer[2]=='S'&&answer[3]=='\0')
          {
              printf("真是識相!\n");
          }
          if(answer[0]=='N'&&answer[1]=='O'&&answer[2]=='\0')
          {
              printf("你眼光有問題!\n");
          }
          return 0;
      }

      刪除
    6. ANSWER後面的[數字] 這個怎麼用

      刪除
    7. 【ANSWER後面的[數字] 這個怎麼用】
      請參考「陣列」這個章節哦~
      網址:http://codingsimplifylife.blogspot.tw/2016/05/c-6-array.html

      刪除
    8. 您好,已經針對您的問題做研究並撰寫教學囉~
      給新手的C++教學 (上冊) - 13 - 7. 中文字元字串的處理
      http://codingsimplifylife.blogspot.tw/2016/09/c-13-7.html

      刪除
  8.  執行的時候 輸入後按ENTER就檔案停止運作

    回覆刪除
    回覆
    1. 哈囉~請問是哪一份程式碼執行的時候按ENTER會檔案停止運作呢?
      是教學內文的嗎?

      刪除
  9. 不好意思想問一下

    Finish the following requirements:
    (1) Every time when a grade is inputted, print the grade and whether the grade is passed or not.
    (2) Output the average (with one digits to the left of the decimal point) of all students.
    (3) After finishing entering all grades, output the maximal grade among all.

    我的問題是要怎麼寫可以隨意輸入數次的成績直到不想輸入了呢?然後就可以輸出平均及最大數
    不太會寫QQ

    謝謝~~

    回覆刪除
    回覆
    1. 不知道可不可以給個提示或一開始應如何寫呢
      謝謝~~

      刪除
    2. 以下程式碼可做到:輸入任意個數字直到輸入不是數字(例如輸入「abc」)為止
      #include<cstdio>
      int main()
      {
          int n;
          while(scanf("%d",&n)==1)
          {
              printf("n = %d\n",n);
          }
          printf("輸入完畢");
          return 0;
      }
      若您想了解更多,scanf其實是一種函式,它的回傳值就是成功輸入的變數數量,可參考這篇:「scnaf 回傳值是 "引數成功 match 之數目"」

      刪除
    3. 不好意思那如果用C++語法寫呢?
      要怎麼寫判斷輸入的是否為數字呢?
      (因為不太會用scanf及printf)QQ

      刪除
    4. 在想是否可以用迴圈的寫法呢

      刪除
    5. 抱歉小莫其實不太熟cin/cout XD
      問過別人,可以這樣寫:
      #include<iostream>
      int main()
      {
          int n;
          while(std::cin>>n)
          {
              std::cout<<"n = "<<n<<std::endl;
          }
          std::cout<<"輸入完畢";
          return 0;
      }
      至於原理細節,會牽涉到覆載、進階轉型和許多小莫自己也不熟的概念。哈哈,有趣XD

      刪除
  10. 請問一下
    如果我想用define,這樣之後只要改一次數字的話
    下面還要再宣告那個變數嗎

    #define target 52
    就是如果我打了上面
    下面還需不需要打
    int target
    呢?

    回覆刪除
    回覆
    1. 不用,可以直接用~
      電腦會自動將程式碼裡面的每個「target」替換成「52」哦~

      刪除
    2. 那如果再宣告一次可以嗎

      刪除
    3. 不行哦,這樣等於是「int 52;」,並不符合語法(變數名稱不能用數字做開頭),會編譯錯誤~

      刪除
  11. 請問我想算
    級數和 i=-1到i=1,(2i^3+6i=5)
    code這樣寫
    為什麼不對呢QQ

    #include <iostream>
    using namespace std;
    int main(int argc, char **argv)
    {
        int k = 1, i, z;
        for (int j = 1; j <= 3; j++)
         {
            k *= i;
        }

        for (i = -1; i <= 1; i++)
         {
            z = (2 * k + 6 * i + 5);
        }

        cout << z;
    }

    回覆刪除
    回覆
    1. 另外想問個問題
      為什麼int k跟z都要在一開始就宣告呢?
      如果我在for loop裡面才宣告k跟z
      為什麼不行執行呢

      刪除
    2. 啊啊抱歉我想更新一下問題
      我發現我的一個錯誤了
      但是似乎還有其他錯誤找不出來QQ

      請問我想算
      級數和 i=-2到i=10,〔2(i)^7+3i+7〕
      code這樣寫
      為什麼不對呢QQ

      #include <iostream>
      using namespace std;
      int main(int argc, char **argv)
      {
          int k = 1, i, z, sum = 0;
          for (int j = 1; j <= 7; j++)
           {
              k *= i;
          }

          for (i = -2; i <= 10; i++)
           {
              z = 2 * k + 3 * i + 7;
              sum += z;
          }

          cout << sum;
      }

      另外還有個問題
      為什麼int k跟z都要在一開始就宣告呢?
      如果我在for loop裡面才宣告k跟z
      為什麼不能執行呢

      刪除
    3. 我有更新問題好像不見了QQ

      刪除
    4. 您好,抱歉晚回
      小莫大概知道您的問題出在哪了
      那個k代表的是一個「變數(在這裡是指數字)」而不是「算式」哦
      因此改變i並不會影響k的數值
      關於您的第二個問題:
      >為什麼int k跟z都要在一開始就宣告呢?
      >如果我在for loop裡面才宣告k跟z
      >為什麼不行執行呢
      可以參考變數的作用範圍這篇哦~
      最後,小莫已將您的程式碼修正,希望執行結果是您想要的!
      #include <iostream>
      using namespace std;
      int main(int argc, char **argv)
      {
          int sum = 0;
          for (int i = -2; i <= 10; i++)
          {
              int k = 1;
              for (int j = 1; j <= 7; j++)
              {
                  k *= i;
              }
              int z = (2 * k + 3 * i + 7);
              sum += z;
          }
          cout << sum;
          return 0;
      }

      刪除
    5. 那請問為什麼變數全部在外面宣告會不行呢
      像這樣執行結果就不對QQ

      #include <iostream>
      using namespace std;
      int main(int argc, char **argv)
      {
          int k = 1, i, z, sum = 0;

          for (i = -2; i <= 10; i++)
           {
              for (int j = 1; j <= 7; j++)
               {
                  k *= i;
              }

              z = (2 * k + 3 * i + 7);
              sum += z;
          }

          cout << sum;
      }

      刪除
    6. 啊啊我知道是因為k的位置齁

      刪除

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