面試經驗分享03-群創光電(南科)-自動化系統設計工程師(台南)
群創光電
面試
tags: 本文包含作者主觀意見,若有任何建議,甚至是冒犯之處,歡迎留言反映或寄信到我的電子郵件 ching93011@gmail.com
僅講一些公開資訊、實際面試所碰到的考題。
前言
本篇文章先以重點條列面試經驗分享01-群創光電(南科)裡面針對系統開發工程師與自動化系統設計工程師 的面試過程作介紹,本篇文章會再深入講解當初印象中的程式考題與對應的解答。
並深入講說自動化系統設計工程師做的事情。
程式考題
考卷大小大概是一張A4的大小,考題其實我覺得對於資工系、資管系這些程式設計是必修課程的科系來說都不是太困難。主要都是名詞解釋的觀念題與簡答題的手寫程式碼。
這邊解釋概念就是以C/C++這兩個程式的概念下去回答,如果各位面試的其他部門要求的是其他語言,可能還是要另外準備,因為每個程式語言設計時候還是會有一些先天的特性,不能相比擬。
我當初準備面試期間有看過的面試程式考題的文章有:
- 面試常見程式考題-程式實做
- …暫時忘記當初有刷那些題庫
以下進入自動化系統設計工程師面試的考卷的考題,僅憑我個人印象…所以各位可以當參考就好。
Q1 Local Variable V.S. Global Variable
在程式設計中,何謂區域變數(Local Variable),何謂總體變數/全域變數(Global Variable)(可用實例說明)
A1
這題難度大概是資工系大一程度,如果回答不出來就有點太遜囉!網路上的題庫大概也會把這種簡單題目放在前幾題~
參考解答:
Local Variable(區域變數):
Variables that are declared inside a function or block are called local variables. They can be used only by statements that are inside that function or block of code. Local variables are not known to functions outside their own. Following is the example using local variables. Here all the variables a, b and c are local to main() function. [1]
變數被宣告在函式(function)或是區塊(block)就會被稱為區域變數。可以被在函式或是區塊內的程式碼敘述使用。區域變數並不會被在該區塊之外的地方被知道。
區域變數程式碼說明(以C為例):
#include <stdio.h>
int main ()
{
/* local variable declaration */
int a, b;
int c;
/* actual initialization */
a = 10;
b = 20;
c = a + b;
printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}
Global Variable(全域變數):
Global Variable are defined outside of a function, usually on top of the program. The global variables will hold their value throughout the lifetime of your program and they can be accessed inside any of the functions defined for the program.
全域變數會被定義在函式外面,通常會出現在整個程式的開端(最頂端)。全域變數將會保有他的數值在整個程式的生命週期中,並起他也可以被程式中任意一個已經被定義的函式所存取。
全域變數程式碼說明(以C為例):
#include <stdio.h>
/* global variable declaration */
int g;
int main ()
{
/* local variable declaration */
int a, b;
/* actual initialization */
a = 10;
b = 20;
g = a + b;
printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
return 0;
}
更詳細的補充,建議看以下這篇文章,對於C的變數的範圍與生命週期:
Scope and Lifetime of Variables in C
Q2 Call by value V.S. Address
程式呼叫副程式,參數傳遞方式有分Call by address 與 call by value? 請以程式舉例說明
比前一題再進階一點點,不過應該也是資工系大一的程度。不過時日一久解釋起來可能不會太順口,建議也要複習一下子。然後問這題的人應該會預期你回覆兩者的優缺點、差異跟適用情況。
A2
Call by value
傳值呼叫:傳遞引數時候,會產生引數值的副本,並將他傳給被呼叫的函式(經由函式呼叫堆疊)。因此對副本做的任何改變不會影響呼叫函式中原始變數的值。缺點就是如果要傳料量大,複製這些資料會耗費大量執行空間和記憶體。
例如:
//有回傳值,不然無法把計算結果回傳哦
int squareByValue( int number)
{
return number *=number;
}
** Call by reference **
傳參考呼叫:呼叫者讓被呼叫函式可以直接存取呼叫者的資料,還可以修改資料。好處是傳參考呼叫有助於提高程式效率,因為它可以避免傳值呼叫複製大量資料的額外負擔;但缺點就是降低程式的安全性,因為被呼叫的函式可以能會損毀呼叫者的資料。
//numberRef是int的參照,只需要使用變數的名稱,就可將它的參照直傳入函式。
//
void squareByReference( int &numberRef)
{
numberRef =numberRef;
}
//Call by address (Call by pointer)
//使用方法 :
void swap(int *address_a, int *address_b) {
int temp = *address_a ;
*address_a = *address_b;
*address_b = temp;
}
int main() {
int a = 1;
int b = 0;
cout<< a << " " << b << endl; // 1 0
swap(&a, &b); // 傳入a, b的address進行交換
cout<< a << " " << b << endl; // 0 1
return 0;
}
Q3 Complete the Sort function
下列為未完成程式,請將其補足:
int main()
{
int a[]={1,2,7,3,5,8,6,4};//original array definition
Sort(a);//call sort function
for(int i=0 ;i<9;i++){
printf("%d",a[i]);//for-loop print the result
}
}
void Sort(int *x){
//Write this function
}
A3
#include <stdio.h>
void Sort(int *x){
int temp; //for swap variable
int n; //size of array *x
n=sizeof(x); //calculation by size of array x
//printf("%d\n",n); //Show the size of array x
//start Sort by comparing all elements
for(int i=0;i<n-1;i++){ //Compare for 0 to (n-1)th element
for(int j=0;j<n-i;j++){ //Compare the i element and i+j th element
if(*(x+i)>*(x+i+j)){ //If (x+i) bigger than (x+i+j)th element,then I will do swap.
printf("%d%d\n",*(x+i),*(x+i+j));
printf("i=%d,j=%d,%d > %d\n",i,j,*(x+i),*(x+i+j));//for-loop print the result
temp = *(x+i); //keep the bigger value in temp
*(x+i)=*(x+i+j); //assign the smaller value to *(x+i)
*(x+i+j)=temp; //
}
}
}
}
int main()
{
int a[]={1,2,7,3,5,8,6,4};//original array definition
Sort(a);//call sort function
for(int i=0 ;i<8;i++){
printf("%d",a[i]);//for-loop print the result
}
}
更詳細的補充,建議看以下這篇文章,對於如何找出陣列(Array)中的元素個數(element):
How do I determine the size of my array in C_ - Stack Overflow
可以把上面程式丟到網路上的Compiler檢查:
Online C Compiler - online editor
Q4 Fibonacci sequence
請設計出一個遞迴程式,當輸入N時求解費波納契數列。
Fn=Fn-1 +Fn-2 ,n>=2;F0=0,F1=1
費波納契數列:1,1,2,3,5,8,13,21,34
這個大概也是資工系大一的必考題,就是會怎麼怎麼用迴圈跟遞迴的。下面提供C版本的範例…
不過我有刻意把它拆掉成fibonacci是用來計算的,然後fibonaci_seq會call fibionacci來print…(以符合題目要求),如果要兩個合而為一也可以…
A4
#include <stdio.h>
int fibonacci(int i){
if(i == 0)
{
return 0;
}
if(i == 1)
{
return 1;
}
return fibonacci(i-1) + fibonacci(i-2);
}
int fibonnacci_seq(int n){
for (int i = 0; i < n; i++)
{
printf("%d", fibonacci(i));
if(i != n-1){
printf(",");
}
}
}
int main(){
int N=10;//the test value for sequence
fibonnacci_seq(N);
return 0;
}
工作內容
招募的資訊上面表列的工作項目有以下幾點:
- Robot系統應用開發及測試
- 物流相關應用系統開發及測試
- 設備IOT應用系統開發及測試
Robot 系統開發
Robot系統開發指的就是機器手臂的設計,透過撰寫程式去控制不同廠牌的機器手臂,由於是設計可能會需要考量到載重、空間大小、使用軸數與手臂精度後,會選擇不同廠商的手臂,進行系統應用開發與測試。
國際大廠的Robot 德國的KUKA、日本的發那科(FANUC)及NACHI、EPSON,之類的國際大廠的Robot都可能碰到、用到。除了需要對Robot本身進行動作上的控制,也需要撰寫與各個介面的交握,基本上公司內部一定都會已經有行之有年的交握順序以及慣用的介面(Interface),這些通常會有資深同仁定義出來,因此新進同仁就是要熟悉各種Robot的操作來組合出對應的動作。
物流相關應用系統開發及測試
這個當初我面試其實了解不是很深入,不過就如同標題所述,我們要對物流相關應用系統進行開發,進行系統上面的整合。整合的對象可能是硬體端的傳輸設備,例如:
硬體
- 機台的進料、取料口或是緩衝區:In port、Out port、Buffer
- 傳送設備本身:地面上跑的無人搬運車AGV、天空跑的天車AMHS的OHT、OHS之類的
軟體 - 物料控制系統MCS
- 製造執行系統MES
- 機台本身的控制系統
(有人稱為TAP(Tool Automation Process)、有人稱為BC(Block Controller)) - 通訊介面
(半導體常用的是E84 Protocol、其他的也可以自己開發光通訊或是不同對口的交握)
物流相關就是含納所有搬運行為相關的監控,由小到大可以包含到每台搬運設備的行動控制、多台搬運設備之間的交通管制、整個廠區的搬運設備績效監控、跨廠區的搬運設備,同理,這邊的搬運設備可以范志前面說過的傳送設備AGV、OHT以及OHS等。
設備IOT應用系統開發及測試
其實說的簡單點就是機台的自動化開發,機台可能會有許多不同的動件與控制系統,這裡說的IOT就是將不同的動件、各別的控制系統透過不同的介面、協定,來進行通訊、交握、資料交換,整合交必要的資訊傳遞到更上層的系統,可能是製造執行系統(MES)或是物料控制系統(MCS)之類的地方。
常用的介面與協定,例如:TCP/IP、SECS、WebService,比較常碰到的挑戰可能是整合不同的新型設備或裝置,可能需要研究該裝置提供的介面與協定,並撰寫對應的程式進行處理。若有跟其他廠商、客戶合作,就是要尋求其他廠商提供Spec來進行整合或是花時間自行摸索。
撰寫的語言如同前面測驗,可能是用到Visual Basic、C#等。
若是有需要數據分析也可以用R、Excel內的VBA或是像我以前學過的Arena、AutoMod來評估績效等。
參考文獻
[1] Tutorials Point,???,C Programming Tutorial,(取得日期:2020年04月27日),[https://phy.ntnu.edu.tw/~cchen/pdf/ctutor.pdf]
Tutorials Point
[2] 群創光電股份有限公司,自動化系統設計工程師(台南)|群創光電股份有限公司|台南市新市區-104 人力銀行,(取得日期:2020年04月27日),[https://www.104.com.tw/job/5epyy]
Q3 Complete the Sort function
回覆刪除A3 中第六行 n=sizeof(x); 是否無法計算出正確陣列長度?
解法可否先在外面算好ArraySize
int ArraySize = sizeof(a) / sizeof(a[0]);
再利用void Sort(int *x, int ArraySize)
傳入陣列長度資訊?