2020年6月4日 星期四

[程式設計工法] C,北市国中資科教甄109,54

C,北市国中資科教甄109,54


FB2http://gg.gg/TedLeeMicrobitFB/
URL2http://gg.gg/TedLeeMicrobit/

Line:ted2016.kpvs
Email:Lct4246@gmail.com
FB1http://gg.gg/TedLeeFB/
Bloghttp://gg.gg/TedLeeBlog/
URL1http://gg.gg/TedLeeURL/

May. 24, 2020
88x31.png[1]

問題解決(Problem Solving之逻輯思維 =
心法: 程式設計哲思(Philosophical Thinking for Programming) +
技法:程式設計工法(Skills for Programming)

11. 若 num 陣列元素值為 40、60、30、10,則以 abc(num,0,3)呼叫執行下列函式 abc 後 num 陣列元素值為何? 
(A)40、10、30、60
(B)10、40、30、60
(C)40、30、10、60
(D)40、60、30、10 

    解析:
    • 直接run結果建立直觀
    • 图解

    #include <iostream>
    using namespace std;

    int num[]={40, 60, 30, 10};

    void abc(int d[], int first, int last) {
    int i, j, k, l;
    i=k=first; //拿d[k]當基準
    j=last;

    while (i<j) {
    while (d[i]<=d[k]&&i<last) //往右找大的(>)
    i++;
    while (d[j]>d[k]) //往左找小的(?)
    j--;
    if (i<j) { //沒交錯前交換之
    l=d[i];
    d[i]=d[j];
    d[j]=l;
    }
    }
    }

    void show(void) {
    for (int i=0; i<4 i="" span="">
    cout << num[i] >> ", ";
    }

    cout << endl;
    }

    int main(void) {
    show();
    abc(num, 0, 3);

    show();
    return 0;
    }

    参考資料
    1. 六種授權條款

    2020年5月25日 星期一

    [程式設計工法] 文章目錄

    文章目錄


    FB2http://gg.gg/TedLeeMicrobitFB/
    URL2http://gg.gg/TedLeeMicrobit/

    Line:ted2016.kpvs
    Email:Lct4246@gmail.com
    FB1http://gg.gg/TedLeeFB/
    Bloghttp://gg.gg/TedLeeBlog/
    URL1http://gg.gg/TedLeeURL/

    May. 25, 2020
    88x31.png[1]

    問題解決(Problem Solving之逻輯思維 =
    心法: 程式設計哲思(Philosophical Thinking for Programming) +
    技法:程式設計工法(Skills for Programming)
    • C/ C++


    参考資料
    1. 六種授權條款

    2020年5月24日 星期日

    [程式設計工法] C/ C++,連加求和、乘積(階乘)

    C/ C++,連加求和、乘積(階乘)


    FB2http://gg.gg/TedLeeMicrobitFB/
    URL2http://gg.gg/TedLeeMicrobit/

    Line:ted2016.kpvs
    Email:Lct4246@gmail.com
    FB1http://gg.gg/TedLeeFB/
    Bloghttp://gg.gg/TedLeeBlog/
    URL1http://gg.gg/TedLeeURL/

    May. 24, 2020
    88x31.png[1]

    問題解決(Problem Solving之逻輯思維 =
    心法: 程式設計哲思(Philosophical Thinking for Programming) +
    技法:程式設計工法(Skills for Programming)

     = 1 + 2 + 3 + ... + j + ... + n

      解析:
      • 直接run結果建立直觀:
      • Idea:

      • 疊代(iteration)

      #include <iostream>
      using namespace std;

      //sum = 1 + 2 + 3 + ... + j + ... + n
      //用i來掃過[1, n],邊掃邊加 
      int main(void) {
      int sum = 0; //保存目前累加和,1 + 2 + 3 + ... + k 
      int i = 0;   //下一個累加值,1 + 2 + 3 + ... + k + i 

      for (i=1; i<11; i++) {
      sum += i;
      cout << "i = " << i << endl;
      cout << "  sum = " << sum << endl;
      }

      return 0;
      }
      • 遞迴(recursive)
      #include <iostream>
      using namespace std;

      int summation(int n) {
      if (n == 1) { //base condition
      return 1;
      }

      return (n + summation(n-1)); //recursive formula
      }

      int main(void) {
      int n = 10;

      cout << "1+2+3+...+" << n << " = " << summation(n) << endl;
      return 0;

      }

      参考資料
      1. 六種授權條款

      2020年5月21日 星期四

      [程式設計工法] C/ C++,麗山高中資科教甄109,專業檢定:求n!後面連續0個數

      C/ C++,麗山高中資科教甄109,專業檢定:求n!後面連續0個數


      FB2http://gg.gg/TedLeeMicrobitFB/
      URL2http://gg.gg/TedLeeMicrobit/

      Line:ted2016.kpvs
      Email:Lct4246@gmail.com
      FB1http://gg.gg/TedLeeFB/
      Bloghttp://gg.gg/TedLeeBlog/
      URL1http://gg.gg/TedLeeURL/

      May. 21, 2020
      88x31.png[1]

      問題解決(Problem Solving之逻輯思維 =
      心法: 程式設計哲思(Philosophical Thinking for Programming) +
      技法:程式設計工法(Skills for Programming)

      寫出一個function求出n!後面的連續"0"個數,(int n為此function的參數)
      例如n=6, 6!=720 , 後面有1個連續的0,所以output為1。

        解析:
        • 直接run結果建立直觀:
        • Idea:直接用疊代(iteration)法[註]先玩看看n!的前幾個數字乘積:
          以下是用小算盤算出來的結果:
        1! = 1
        2! = 2
        3! = 6
        4! = 24
        5! =120
        6! = 720
        7! = 5,040
        8! = 40,320
        9! = 362,880
        10! = 3,628,800
        11! = 39,916,800
        12! = 479,001,600‬
        13! = 6,227,020,800
        14! = 87,178,291,200
        15! = 1,307,674,368,000

        它在第13!以後就出現了差異。所以直覺上本題不能用程式硬幹吧?
        因此,考慮用因式分解

        下列程式碼出自於這裡

        #include <iostream>
        using namespace std;

        int fact_tail_zero(int n) {
           int ret=0;
           
           while (n/=5) { //原問題転換成:能被5重覆除的次數
                cout << "   n = " << n << endl;
                cout << "      ret = " << ret << endl;
        ret+=n;
           }
           return ret;
        }

        int main(void) {
        int x;
            while(scanf("%d", &x)==1) //重覆玩
               printf("tail zero : %d\n", fact_tail_zero(x));
               
        return 0;
        }


        註:疊代法求n!:

        #include <ostream>t
        using namespace std;

        //produc = 1 * 2 * 3 * ... * j * ... * n
        //用i來掃過[1, n],邊掃邊加 
        int main(void) {
        unsigned int product = 1; //保存目前累乘和,1 * 2 * 3 * ... * k 
        int i = 0;   //下一個累乘值,1 * 2 * 3 * ... * k * i 
        for (i=1; i<41; i++) {
        product *= i;
        cout << i << "! = " << product << endl;
        }
        return 0;

        }

        参考資料
        1. 六種授權條款

        2020年5月16日 星期六

        [程式設計工法] C/ C++,a006: 一元二次方程式@0判

        C/ C++,a006: 一元二次方程式@0判


        FB2http://gg.gg/TedLeeMicrobitFB/
        URL2http://gg.gg/TedLeeMicrobit/

        Line:ted2016.kpvs
        Email:Lct4246@gmail.com
        FB1http://gg.gg/TedLeeFB/
        Bloghttp://gg.gg/TedLeeBlog/
        URL1http://gg.gg/TedLeeURL/

        Jun. 23, 2020
        88x31.png[1]

        問題解決(Problem Solving之逻輯思維 =
        心法: 程式設計哲思(Philosophical Thinking for Programming) +
        技法:程式設計工法(Skills for Programming)


          解析:
          • 直接run結果建立直觀:
          • Idea:依据判別式的三种情況,使用if判斷各條件成立下的相應公式解計算。
          • sqrt()定義在math.h裡。

          //http://siro.moe.edu.tw/teach/index.php?n=0&m=0&cmd=content&sb=3&v=3&p=437
          #include <iostream>
          #include <math.h>
          using namespace std;

          int main(void) {
          int a=0, b=0, c=0;
          float D=0;

          cin>>a>>b>>c; 

          D=b*b-4*a*c;

          if (D>0) 
          cout << "Two different roots x1=" << (-b+sqrt(D))/(2*a)  < " , "  << "x2=" << (-b-sqrt(D))/(2*a); //第一次作時打成2*a,忘了() 

          if (D<0 span="">
          cout <"No real root";

          if (D==0)
          cout << "Two same roots x=" << (-b+sqrt(D))/(2*a);

          return 0;
          }

          参考資料
          1. 六種授權條款

          2020年5月13日 星期三

          [程式設計工法] C/ C++,麗山高中資科教甄109,專業檢定:子字串

          C++,麗山高中資科教甄109,專業檢定:子字串


          FB2http://gg.gg/TedLeeMicrobitFB/
          URL2http://gg.gg/TedLeeMicrobit/

          Line:ted2016.kpvs
          Email:Lct4246@gmail.com
          FB1http://gg.gg/TedLeeFB/
          Bloghttp://gg.gg/TedLeeBlog/
          URL1http://gg.gg/TedLeeURL/

          May. 13, 2020
          88x31.png[1]

          問題解決(Problem Solving之逻輯思維 =
          心法: 程式設計哲思(Philosophical Thinking for Programming) +
          技法:程式設計工法(Skills for Programming)

          子字串(substrings) 找出字串1中是否包含子字串2,子字串2的每個元素需依序出現在字串1中,例如:str1 = "AbcYmn",str2 = "AY",str1 Ê str2。

            解析:
            • 直接run結果建立直觀:
            • Idea:從小例子觀察出規律(regularity) Þ 把str2中的每個元素(i-loop)和str1比对(j-loop),当对到的次數和str2長度相等時(都有match到)就為尋獲
            • 此題包含迴圈控制(loop control)search problem

            #include <iostream>
            using namespace std;

            int main(void) {
            char str1[]={'A', 'b', 'c', 'Y', 'm', 'n'};
            //char str2[]={'A', 'Y'};
            char str2[]={'b', 'c', 'Y'};

            int i=0, j=0;
            int found=0;

            for (i=0; i<3; i++) {
            for (j=0; j<6; j++) { //把str2[]內的元素和str1[]相比
            if (str2[i] == str1[j]) {
            found++;
            break;
            }
            }
            }

            if (found==3) {
            cout << "Found.\n";
            } else {
            cout << "Not found.\n";
            }
            return 0;
            }

            参考資料
            1. 六種授權條款

            2020年5月9日 星期六

            [程式設計工法] C/ C++,科園實中資科教甄109,B8

            C/ C++,科園實中資科教甄109,B8


            FB2http://gg.gg/TedLeeMicrobitFB/
            URL2http://gg.gg/TedLeeMicrobit/

            Line:ted2016.kpvs
            Email:Lct4246@gmail.com
            FB1http://gg.gg/TedLeeFB/
            Bloghttp://gg.gg/TedLeeBlog/
            URL1http://gg.gg/TedLeeURL/

            May.7, 2020
            88x31.png[1]

            問題解決(Problem Solving之逻輯思維 =
            心法: 程式設計哲思(Philosophical Thinking for Programming) +
            技法:程式設計工法(Skills for Programming)

            8. 下列程式碼執行後的輸出結果為 (8)


              解析:
              • 直接run結果建立直觀:
              • 追蹤fib()的呼叫过程:
              fib(3) = fib(2) + fib(1)
                        = fib(1) + fib(0) + fib(1)
                        = 1 + 1 + 1
                        = 3

              #include <iostream>
              #include <iomanip>
              using namespace std;

              int fib(int n) {
              cout << n;

              if (n < 2)
              return 1;
              else
              return fib(n-1) + fib(n-2);
              }

              int main() {
              int result = fib(3);
              cout << result << endl;

              return 0;
              }

              参考資料
              1. 六種授權條款