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

      2020年5月7日 星期四

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

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


      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)

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


        解析:

        • 直接run結果建立直觀:
        • Linked list數目追蹤。
        • 陣列內容變化:
        • 題意图解:

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

        #define ARY_LENGTH 10

        void print_array(int fri[]) {
        int i = 0;

        cout <<fri[] = ";

        for (i = 0; i < ARY_LENGTH; i++) {
        cout << fri[i] << " ";
        }

        cout << endl;
        }

        void find(int fri[], int n) {
        int group=0;
        int i;

        for (i = 0; i < n; ++i) { //整個陣列掃一輪
        if (fri[i] != -1) { //開追完串列
        ++group; //串列數
        int j = i;

        while (fri[j] != -1) { //根据當前索引位置的陣列內容跳至那個item
        int next = fri[j];
        fri[j] = -1;
        j = next;

        print_array(fri);
        }
        }
        }

        cout << group << endl;
        }

        int main(void) {
        int fri[10]={4, 7, 2, 9, 6, 0, 8, 1, 5, 3};

        print_array(fri);
        find(fri, 10);

        return 0;
        }

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

        2020年5月5日 星期二

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

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


        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. 5, 2020
        88x31.png[1]

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

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


          解析:

          • 直接run結果建立直觀:
          • local variable vs. global varibale。

          #include <iostream>
          using namespace std;


          void add(int a) {
          int s=3;

          for (; a>=0; --a) {
          cout<<s;
          s++;
          cout<<s;
          }
          }

          int main() {
          cout<<s;

          add(s);
          cout<<s;

          s=5;
          cout<<s<<endl;

          return 0;
          }

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

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

          C/ C++,科園實中資科教甄109,A1&2


          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. 5, 2020
          88x31.png[1]

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

          [題組] :下面為某一程式執行的結果及其程式碼片段,請據此回答1、2 題。


          1. 請問上方程式的空格(i)與(j)應分別填入?
            (A)d、b (B)d、a (C)b、a (D)b、d
          2. 承上題,若將while 迴圈的判斷條件改為「d<=200」,則最後一個輸出的數字為何?
            (A)144 (B)200 (C)233 (D)程式出現錯誤無法輸出

            解析:
            1. 
            A. 直接run結果建立直觀:,蛋,有沒4層相4?那個Fxxx序列(這題我應該拿分的啊!)
            B.
            1A:
               d<-a b="" div="" nbsp="">
               a<-d a="" b="" div="">
               => d=d+b => 每次都加1。
            1B:
               d<-a b="" div="">
               a<=d=a+b
               b<-a a="" b="" div="">
               => d<-2 a="" b=""> 每次都乘2
            1C:
               a<-b div="">
               b<-a div="">
               =>d<-a b="2(永遠a=b=1)"> 呈式永遠不會停


            2
            1若选A,則答案為201
            1若选B,則答案為256
            1若选D,則答案為233

            ∴implement Fib #的algorithm為:

            a b d
            n 1 2 3 4 5
            Fib(n) 1 1 2 3 5
            a b d
            n 1 2 3 4 5
            Fib(n) 1 1 2 3 5


            #include <iostream>
            using namespace std;

            int main() {
            int a=1, b=1, d=0;
            cout<<a<<endl;
            cout<<b<<endl;
            while (d<=200) {
            d=a+b;
            a=b;
            b=d;
            cout<<d<<endl;
            }
            return 0;
            }

            著名演算法要背!

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

            2020年4月16日 星期四

            [AI] 8787影像故事:誰撿到這抹紅,520(Whoever finds the red, 520)

            8787影像故事:

            誰撿到這抹紅,520(Whoever finds the red, 520)


            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/

            Apr. 16, 2020
            88x31.png[1]


            難易度★★


            主題

            老皮的皮夾裡放有一封信https://reurl.cc/lVv93d),據說信中述說著一個美麗的動人故事。這個故事曾經被這位神仙姐姐https://reurl.cc/b57kMl)傳唱過。
            在這8787主題課的最後一個單元裡,我們就以紅顏色8787及其週邊硬體盒子設計三個元素替老皮重譜一個屬於曾經的他的主題曲,就姑且
            把它喚做:8787的影像故事

            任務

            老皮的女朋友小派的生日快到了。今年,小派想測試一下小彼特的彼特功練到哪個化境了,就故意以自己生日為由要考考他:「以小彼特小派三元素做出一個生日禮物。」大夥兒也幫幫忙一起破關吧!
            (讓8787偵測到人臉後啟動快閃的七彩LED。)

            材料

            項目 品名 單位 數量
            1 VTS-8787視覺感測器 1
            2 micro USB傳輸線 1
            3 Grove – 4x公端杜邦線+母座 to Grove 4pin連接線 1
            4 Arduino Nano(FT232晶片) 1
            5 mini USB傳輸線 1
            6 麵包板 1
            7 SSD1306 OLED液晶面板(I2C、128*64、0.96""、1602 LCD) 1
            8 杜邦線(公母) 4
            • 如果讀者要將項目4的開發板換成Uno或其他Arduino版本,請自行將項目5的傳輸線做調當的調整。
            • 技術咨詢(手機加Line:https://reurl.cc/Vadax6)。

              造形設計(機構)

              記得將8787及其相關電路的尺寸考量進去。

                功能設計(電路、程式)

                先依照下表及圖1 [2]接妥8787、Nano與快閃LED的連接線路。

                NanoOLED8787
                D0
                A4SDA
                A5SCL
                5V
                GND短腳(-)



                圖1:接線圖。


                在Pixetto Utility上(圖2)選用人臉偵測功能,讓8787識別並套用之,詳細操作方法可參考拙著《使用VIA Pixetto視覺感測器的辨色功能》(https://reurl.cc/20LR8m)一文。

                圖2:在Pixetto Utility上選用顏色偵測功能。

                接著,在Pixetto Junior上拉出圖3的積木程式的基本架構(稍後我們將手動加上OLED控制的Arduino程式碼)。這個程式的設計邏輯為開機時在setup()的ㄈ字形積木中先初始化接在D0和D1腳接上的8787。
                接著,若8787「看見」紅色(在上一段選用Color Detection功能時會看見紅色物件會被綠框框出,並於左上顯示red(1)的綠字字樣)後就讓Nano板載在D13接腳上的LED閃爍0.3秒後關閉。否則,就將之熄滅。

                圖3:Pixetto Junior的Blockly程式碼。

                圖3積木程式自動生成的Arduino程式碼如下所示。

                #include <Arduino.h>
                #include <SmartSensor.h>

                SmartSensor ss(0,1);

                void setup() {
                  ss.begin();
                  pinMode(13, OUTPUT);
                } //end of setup()

                void loop() {
                  if (ss.isDetected()) {
                  // red color
                  if (ss.getTypeID() == 1) {
                  digitalWrite(13, HIGH);
                  delay(300);
                  }
                  } else {
                  digitalWrite(13, LOW);
                  } //end of if
                } //end of loop()

                匯入OLED的函式庫 如圖5,在Pixetto Studio附的Arduino IDE(預設的路徑為C:\Pixetto\PixettoEditor\arduino)中,依照《Arduino 運用SSD1306 OLED 0.96吋 、0.91吋》(https://reurl.cc/1xGg7Y)一文提到的方式,匯入(import)Adafruit SSD1306Adafruit GFX Library兩隻函式庫(libraries),完成的結果如圖6所示。

                圖5:Pixetto Studio V1.0.1內含有V1.8.9版rduino IDE。

                圖6:匯入OLED控制的相關函式庫。


                Arduino IDE的幾個藏身處(存放路徑)
                檔案總管下我們使用暴力法從 C:\ 鉅細靡遺地搜出以下資訊:
                1. Pixetto Studio附帶:存在 C:\Pixetto\PixettoEditor\arduino 下,版次為V1.8.9(在V1.1.0版的Pixtto Studio中)。
                2. 自行下載安裝:預設路徑為 C:\Program Files (x86)\Arduino ,我們目前安裝的版本為V1.8.10。
                  • 匯入的外部函式庫會自動存到 C:\Users\User\Documents\Arduino\libraries 。
                3. Windows App版:安裝在 C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.33.0_x86__mdqgnx93n4wtt ,我們裝的版本是V1.8.12。


                修改標頭檔
                根據《0.96寸 藍色 白色 IIC通信 小OLED顯示屏模塊 51單片機》(https://reurl.cc/9ERZLa)一文,將路徑「C:\Users\User\Documents\Arduino\libraries」下的「Adafruit_SSD1306.h」修改為正確的顯示尺寸:

                     #define SSD1306_128_64
                //   #define SSD1306_128_32


                調整OLED輸出 參考《Coordinate System and Units》(https://reurl.cc/kdaVbr)內容說明,將《Arduino 運用SSD1306 OLED 0.96吋 、0.91吋》(https://reurl.cc/1xGg7Y)內的參考程式的testdrawstyles()函數修改如下:

                void showText(char text[]) {
                  display.clearDisplay();
                  display.setTextSize(5);             // 設定文字大小
                  display.setTextColor(1);        // 1:OLED預設的顏色(這個會依該OLED的顏色來決定)
                  display.setCursor(30,18);             // 設定起始座標
                  display.print(text);        // 要顯示的字串
                  display.display();                  // 要有這行才會把文字顯示出來
                  //delay(1000);
                }


                加在一起 經過以上從Pixetto Junior自動生成程式架構、匯入Adafruit原廠的OLED函式庫及修改輸出顯式後可得到如下的完整程式:


                #include <SPI.h>
                #include <Wire.h>
                #include <Adafruit_GFX.h>
                #include <Adafruit_SSD1306.h>

                #include <Arduino.h>
                #include <SmartSensor.h>

                SmartSensor ss(0,1);

                #define SCREEN_WIDTH 128 // OLED 寬度像素
                #define SCREEN_HEIGHT 64 // OLED 高度像素

                // 設定OLED

                #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
                Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

                void setup() {
                  pinMode(13, OUTPUT);
                  digitalWrite(13, HIGH);
                  delay(500);
                  digitalWrite(13, LOW);

                  ss.begin();


                  // 偵測是否安裝好OLED了

                  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 一般1306 OLED的位址都是0x3C
                    Serial.println(F("SSD1306 allocation failed"));
                  } //end of if

                  // 顯示Adafruit的LOGO,算是開機畫面

                  display.display();
                  delay(1000); // 停1秒

                  // 清除畫面

                  display.clearDisplay();
                } //end of setup()

                void loop() {
                  if (ss.isDetected()) {
                    if (ss.getTypeID() == 1) {
                      digitalWrite(13, HIGH);
                      showText("520");
                      //delay(300);
                    }
                  } else {
                    showText("");
                    display.display();
                    digitalWrite(13, LOW);
                  } //end of if
                } //end of loop()

                void showText(char text[]) {

                  display.clearDisplay();
                  display.setTextSize(5);             // 設定文字大小
                  display.setTextColor(1);        // 1:OLED預設的顏色(這個會依該OLED的顏色來決定)
                  display.setCursor(30, 18);            // 設定起始座標
                  display.print(text);        // 要顯示的字串
                  display.display();                  // 要有這行才會把文字顯示出來
                }// end of showText()

                最後,我們在圖7的Pixetto Junior內選用後就可以開開心心了!



                圖7:在Pixetto Junior內手動編輯Arduino程式碼上傳到Nano

                本單元的操作影片https://youtu.be/v5gEWFC1_UM 如圖8所示。

                圖8:展示影片。

                  教學活動設計

                  1. 加掛一個MP3播放器模組https://reurl.cc/E7o5XA),使得8787看到紅色後可以一邊播放《Whoever Finds This , I Love You》一邊在OLED顯示歌詞https://reurl.cc/Kk01MR),或一段話、一個點陣圖https://reurl.cc/ZOWLXV)。