2020年6月8日 星期一

[程式設計工法] C,新北国中資科教甄108,11

C,新北国中資科教甄108,11


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/

June 8, 2020
88x31.png[1]

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


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

    #include <iostream>
    using namespace std;

    int main(void) {
    int space=5;
    int X=1;

    for(int i=1; i<=6; i++){ //控制高度 
    for(int j=1; j<=space; j++) //控制每行印幾個空格 
    printf(" ");

    for(int k=1; k<=X; k++) //控制每行印幾個X 
    printf("X");

    printf("\n");
    space--;
    X+=2;
    }

    return 0;
    }

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

    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. 六種授權條款