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)。

                2020年4月5日 星期日

                [AI] 一見你就閃:使用VIA Pixetto視覺感測器之人臉偵測(Face Detection)功能

                一見你就閃:

                使用VIA Pixetto視覺感測器之人臉偵測(Face Detection)功能


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

                難易度★★★☆☆


                主題

                8787內建的AI影像處理(image processing)功能應用實作。

                任務

                小彼特女朋友小派的生日快到了。今年,小派想測試一下小彼特的彼特功練到哪個化境了,就故意以自己生日為由要考考他:「以小彼特我(小派)三元素做出一個生日禮物。」大夥兒也幫幫忙一起破關吧!
                (讓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 RGB七彩快閃 LED燈 1
                8 130Ω電阻 1
                • 如果讀者要將項目4的開發板換成Uno或其他Arduino版本,請自行將項目5的傳輸線做調當的調整。
                • 技術咨詢(手機加Line:https://reurl.cc/Vadax6)。

                  造形設計(機構)

                  請參考禮物盒子https://reurl.cc/ZObNQV)或小造型盒https://reurl.cc/lVe49A)概念設計作品外觀。記得將8787及其相關電路的尺寸考量進去。

                    功能設計(電路、程式)

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

                    Nano 快閃LED 8787
                    D0
                    D1
                    D7 長腳(+)
                    5V
                    GND 短腳(-)


                    圖1:接線圖。


                    在Pixetto Utility上(圖2)選用人臉偵測功能,讓8787識別並套用之(例如:以這個AI生成的偽人臉https://reurl.cc/NjRLAQ)來做為待識別影像),詳細操作方法可參考拙著《VIA Pixetto視覺感測器大開箱(unboxing):AI開發工具(Development Kits)篇》(https://reurl.cc/Qd6eVO)一文。

                    圖2:在Pixetto Utility上選用人臉偵測功能。

                    接著,在Pixetto Junior上拉出圖3的積木程式。這個程式的邏輯是一開機後先初使化8787。
                    接著,若8787「看見」前述的人臉後就讓接在Nano D7接腳上的快閃七彩LED閃爍0.5秒。否則,就將之熄滅。

                    圖3:Pixetto Junior的Blockly程式碼。

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

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

                    SmartSensor ss(0,1);

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

                    void loop() {
                      if (ss.isDetected()) {
                         if (ss.getTypeID() == 0) {
                      digitalWrite(7, HIGH);
                      delay(500);
                      }
                      } else {
                      digitalWrite(7, LOW);
                      } //end of if
                    } //end of loop()

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

                    圖4:展示影片。

                      教學活動設計

                      1. 參考《快樂頌:使用VIA Pixetto視覺感測器之模板匹配(Template Matching)功能》(https://reurl.cc/lVe479)一文的做法接上蜂鳴器,使得8787看到小派後邊閃爍LED邊唱歌。

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