一、填空題(共17題,每題3分,總共51分)
1.設有int a = 5, *b, **c,執行語句c = &b, b = &a後,**c的值為________
答:5
2.以下程式是否有誤,如果無誤,請寫出執行的次數________
[cpp] view plain copy
- x = -1;
- do
- {
- x = x * x;
- }while(!x);
答:1
3.設有如下定義:
[cpp] view plain copy
- struct sk
- {
- int a;
- float b;
- }data;
- int *p;
若要使p指向data中的a域,正确的指派語句是________
答:p = &data.a;
4.用變量a給出下面的定義,一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并傳回一個整型________
答:int (*a)[10](int)
5.若有語句:int array[2][3][4],則數組array的元素個數為________
答:24
6.已知int a[5], *p = a,則(p+1)等價于________
答:a[1]的位址
7.一個C源程式必須包含一個________函數
答:main
8.Intel X86 PC上以下程式運作的輸出值是________
[cpp] view plain copy
- int main(int argc, char *argv[])
- {
- union
- {
- struct
- {
- unsigned short s1:3;
- unsigned short s2:3;
- unsigned short s3:3;
- }x;
- char c;
- }v;
- v.c = 103;
- cout<<v.x.s1<<endl;
- return 0;
- }
[cpp] view plain copy
- 答:7
- 103轉換為8位的二進制為01100111,存儲方式如下:
- 01|100|111
- __|___|___
- s3|s2 |s1
9.請用文字說明p是何種類型變量:int (*p)[n];________
答:p是指針一個二維int型數組的指針。注意,p不是函數指針數組,如果是函數指針數組,應該寫成int (*p)[n]()
10.程式設計實作兩個數互換
[cpp] view plain copy
- int main(int argc, char *argv[])
- {
- int temp, x, y;
- cin>>x>>y;
- temp = x;
- ________
- ________
- cout<<x<<','<<y;
- }
答:x = y; y = temp;
11.32位系統中,size_SA值是________
[cpp] view plain copy
- struct
- {
- int a1:8;
- int a2:8;
- char a3[2];
- char a4[2];
- }sA;
- int size_SA = sizeof(sA);
[cpp] view plain copy
- 答:8
- 以最大資料類型為準進行對齊,與位域無關。本例中最大資料類型是int,對齊大小是4B。
- a1和a2共4B,a3和a4共4B。一共8B
12.以下程式輸出結果m是________ [cpp] view plain copy
- int w = 1, x = 2, y = 3, z = 4;
- m = (w < x) ? w : x;
- m = (w < y) ? w : y;
- m = (w < z) ? w : z;
- cout<<"m="<<m;
答:1
13.函數t()、f()的定義如下所示,若調用函數t時傳遞給x的值為3,并且調用函數f()時,第一個參數采用傳值(call by value)方式,第二個參數采用傳引用(call by reference)方式,則函數t的傳回值為________
[cpp] view plain copy
- int t(int x)
- {
- int a;
- a = 3 * x - 1;
- f(x, a);
- return a+x;
- }
- void f(int r, int &s)
- {
- int x;
- x = 2 * r + 1;
- s = s * r;
- r = s - x;
- return ;
- }
答:27
14.下述程式的運作結果是________
[cpp] view plain copy
- int main(int argc, char *argv)
- {
- short unsigned int a = 5;
- int b = 7;
- int c = b + a > 0 ? a + b : a - b;
- cout<<a+b<<' '<<b+c<<' '<<c+a<<endl;
- return 0;
- }
答:-2 5 17
15.下述程式的運作結果是________
[cpp] view plain copy
- int main(int argc, char *argv[])
- {
- int a, b, c;
- c = a = 0x30, b = 0x60;
- a = c | b >> 4;
- cout<<a<<' '<<b<<' '<<c<<endl;
- return 0;
- }
[cpp] view plain copy
- 答:54 96 48
- 移位運算符的優先級較高,先執行移位操作,得a=0x36,即54
16.下面程式的運作結果是________ [cpp] view plain copy
- char *p = "abcdefgh";
- p += 3;
- cout<<strlen(strcpy(p, "ABCD"))<<endl;
[cpp] view plain copy
- 答:運作出錯
- 因為p的對象存儲于文字常量區,不能對其進行修改
17.下述程式輸出結果是________ [cpp] view plain copy
- #define CAL(x, y) (x * x - y * y)
- int main(int argc, char *argv[])
- {
- int a = CAL(4, 3);
- int b = CAL(3, 2);
- cout<<a<<' '<<b<<' '<<CAL(a+1, b-1)<<endl;
- return 0;
- }
答:7 5 4
二、程式設計題(第1題10分,第2題15分,總共25分)
1.已知一圖像數組unsigned char Image[m][n],其中m>2000,n>1500;編寫函數計算Image數組中所有元素的中間值,并傳回計算得到的中間值。 2.已經兩個矩陣數組double Src1[x][y]和double Src2[y][z],編寫函數計算矩陣Src1和矩陣Src2的乘積值矩陣Dst,假設Src1,Src2和Dst的記憶體都已經申請好了并且夠用
三、專業題(簡答題)(嵌入式、windows和算法三個方向請根據申請崗位選擇一個方向答題)(每小題8分)
嵌入式平台方向
1.簡述多線程和多程序之間各自的優點和缺點 [cpp] view plain copy
- (1)多線程的優點:
- 無需跨程序邊界;
- 程式邏輯和控制方式簡單;
- 所有線程可以直接共享記憶體和變量等;
- 線程方式消耗的總資源比程序方式好;
- (2)多線程缺點:
- 每個線程與主程式共用位址空間,受限于2GB位址空間;
- 線程之間的同步和加鎖控制比較麻煩;
- 一個線程的崩潰可能影響到整個程式的穩定性;
- 到達一定的線程數程度後,即使再增加CPU也無法提高性能;
- 線程能夠提高的總性能有限,而且線程多了之後,線程本身的排程也是一個麻煩事兒,需要消耗較多的CPU
- (3)多程序優點:
- 每個程序互相獨立,不影響主程式的穩定性,子程序崩潰沒關系;
- 可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運作的子產品算法效率低也沒關系;
- 通過增加CPU,就可以容易擴充性能;
- 每個子程序都有2GB位址空間和相關資源,總體能夠達到的性能上限非常大
- (4)多程序缺點:
- 邏輯控制複雜,需要和主程式互動;
- 多程序排程開銷比較大;
- 需要跨程序邊界,如果有大資料量傳送,就不太好,适合小資料量傳送、密集運算
2.Linux環境程式設計中線程間通信都有哪幾種? [cpp] view plain copy
- 1.套接字(socket)
- 2.共享記憶體(share memory)
- 共享記憶體實作分為兩個步驟:
- (1)建立共享記憶體,使用shmget函數。
- (2)映射共享記憶體,将這段建立的共享記憶體映射到具體的程序空間去,使用shmat函數。
- 3.信号(signal)
- (1)信号類型,下面是幾種常見的信号:
- SIGHUP:從終端上發出的結束信号
- SIGINT:來自鍵盤的中斷信号(Ctrl-C)
- SIGKILL:該信号結束接收信号的程序
- SIGTERM:kill指令發生的信号
- SIGCHLD:辨別了程序停止或結束的信号
- SIGSTOP:來自鍵盤(Ctrl-Z)或調試程式的停止執行信号
- (2)信号處理:
- 1.忽略此信号
- 2.執行使用者希望的動作
- 3.執行系統預設動作
- (3)信号發送:
- 發送信号的主要函數有kill和raise。kill既可以向自身發送信号,也可以向其他程序發送信号。與kill函數不同的是,raise函數是向程序自身發送信号。
- 4.消息隊列(message queue)
- (1)定義:unix早期通信機制之一的信号能夠傳送的資訊量有限,管道則隻能傳送無格式的位元組流,這無疑會給應用程式開發帶來不便。消息隊列(也叫做封包隊列)則克服了這些缺點。
- (2)發展:消息隊列就是一個消息的連結清單。可以把消息看作一個記錄,具有特定的格式。程序可以向中按照一定的規則添加新消息;另一些程序則可以從消息隊列中讀走消息。
- (3)持續性:系統V消息隊列是随核心持續的,隻有在核心重起或者人工删除時,該消息隊列才會被删除。
- (4)鍵值:消息隊列的核心持續性要求每個消息隊列都在系統範圍内對應唯一的鍵值,是以,要獲得一個消息隊列的描述字,必須提供該消息隊列的鍵值。
- 5.管道(pipe)和有名管道(FIFO);
- 當一個管道建立時,它會建立兩個檔案描述符:filedis[0]用于讀管道,filedis[1]用于寫管道。
- 管道關閉:關閉管道隻需将這兩個檔案描述符關閉即可,可以使用普通的close函數逐個關閉。
- 命名管道和無名管道基本相模同,但也有不同點:無名管道隻能由父子程序使用;但是通過命名管道,不相關的程序也能交換資料。
3.ARM Linux中的Bootloader主要起到什麼作用? [cpp] view plain copy
- Bootloader(引導加載程式)是系統加點後運作的第一段代碼。在嵌入式系統中,通常并沒有香BIOS那樣的固件程式(有的嵌入式CPU會在晶片内部嵌入一段短小的程式,一般用來将Bootloader裝載進AM中,是以 Bootloader的作用于PC機上的BIOS類似),通過Booloader可以完成對系統闆上的主要部件如CPU,SDRAM,FLASH和序列槽等進行初始化,也可以下載下傳檔案到系統闆,對FLASH進行擦出于程式設計。在一個基于ARM的嵌入式系統中,系統的在上電或複位時通常都從位址 0x00000000處開始執行,而這個位址安排的通常就是系統Bootloader。通過這段小程式可以初始化硬體裝置,建立記憶體空間的映射。進而将系統的軟硬體環境帶到一個合适的狀态,一邊最終調用作業系統核心準備好正确的環境。
- Bootloader一般包含一下幾個必備功能
- (1)初始化處理器。這個動作都是用彙編語言完成的,當電源接通就會執行這個動作,通常隻有兩三個彙編指令,目的是将CPU的控制權轉交給硬體初始化的程式。
- (2)初始化一些必要的硬體,這個動作都是彙編語言完成的。主要是初始化CPU,SDRAM等,其他硬體,例如序列槽,可以由C語言等比較進階的語言來完成後續動作。
- (3)設定處理器的寄存器以及記憶體,關掉所有輸入管腳(包括終端管腳),以防突然有信号進入妨礙我們接下來的硬體初始化動作。然後初始化序列槽,以便後續運作的程式能夠同Host端進行通信,便于調試。
- (4)從特定的位置把作業系統和檔案系統調入記憶體,并設定一些必要的初始參數。然後把CPU的控制權交給作業系統。有的Bootloader會先從串講偶或者網絡其他路徑得到核心的映象檔案。然後把這些檔案寫入到target系統的Flash或者其他的存儲媒體,然後把核心載入到RAM執行,同時交出控制權。
windows平台方向
1.簡述VC中,下面這個錯誤意思,可能原因和處理方法: error LINK2005:symbol "xxx" already defined 2.簡述SendMessage和PostMessage的差别 3.簡述Critical Section、Mutex、Semaphore的功能和差别
算法方向
1.給出水準邊和垂直邊的邊緣檢測的soble算子 2.adboost的含義是什麼?簡單介紹一下定義 3.