2020年6月23日 星期二

[程式設計工法] C/ C++,a005: Eva 的回家作業@0判

C/ C++,a005: Eva 的回家作業@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. 16, 2020
88x31.png[1]

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


    解析:
    • 直接run結果建立直觀:
    • Idea:將test data讀入(存在1-D陣列data[]中)後計算結果(等差或等比),再依題目需求編排輸出格式。
    • 一般測資(例如:open data)會以CSV(Comma Separated ValuesXML(Extensible Markup Language)JSON(JavaScript Object Notation)格式(format)儲存。所以,programmer會呼叫parser來幫忙將raw data讀進memory中。讀進來的資料常會以arraystructures、甚或data base的tables革等data structures來儲存。
    • 用scanf()讀console輸入的字串時要留意字串結尾控制碼'\0'的額外處理。
    • 學習要學一般的通則(general purpose),這樣會一理通、萬理通。所以,我們乖乖的從stdin讀入data後,存在內部的資料結構。經運算後再丟到stdout(實際應用可能是用.txt、.csv、.xml、.json格式存)。

    #include <iostream>
    using namespace std;

    int data[100];

    void printArray(int t) {
    int i = 0;

    for (i=0; i<5*t; i++) {
    cout << data[i] << " ";
    if ((i+1)%5==0) {
    cout << endl;
    }
    }
    }

    int main(void) {
    //int data[100]={1, 2, 3, 4, 0, 1, 2, 4, 8, 0, 4, 6, 8, 10, 0};

    int i = 0;
    int d1 = 0;
    int d2 = 0;
    int r1 = 0;
    int r2 = 0;

    int t = 0;
    int j = 0;
    int lf = 0;

    //讀入數列筆數
      cin >> t;

      for (i=0; i<t; i++) {
       for (j=0; j<4; j++) {
       cin >> lf;

    data[i*5+j] = lf;
    }
      }

      //printArray();
      
    for (i=0; i<100; i+=5) {
    d1 = data[i+3] - data[i+2];
    d2 = data[i+2] - data[i+1];
    if (d1 == d2) { //處理等差
    data[i+4] = data[i+3] + d1;
    } else { //處理等比
    r1 = data[i+3] / data[i+2];
    r2 = data[i+2] / data[i+1];
    data[i+4] = data[i+3] * r1;
    }
    }

    printArray(t);

    return 0;
    }

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

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