浙江大華2012筆試題+答案解析


轉自:http://www.cnblogs.com/jerry19880126/archive/2012/08/05/2623982.html

請寫出下面程序的輸出結果:

1、

  1. int count = 3; 
  2. int main(void
  3.     int i, sum, count = 2; 
  4.     for(i=0,sum=0; i<count; i+=2,count++) 
  5.     { 
  6.         static int count = 4; 
  7.         count++; 
  8.         if(i%2 == 0) 
  9.         { 
  10.             extern int count; 
  11.             count++; 
  12.             sum += count; 
  13.         } 
  14.         sum += count; 
  15.     } 
  16.     printf("%d %d\n",count, sum); 
  17.     return 0; 

2、

  1. void func(char str[50]) 
  2.     printf("A %d B %d ",sizeof(str), strlen(str)); 
  3. int main(void
  4.     char stra[] = "HelloWorld"; 
  5.     char *strb = stra; 
  6.     printf("C %d D %d ",sizeof(stra), sizeof(strb++)); 
  7.     func(++strb); 
  8.     printf("E %d F %d\n",strlen(stra), strlen(strb++)); 
  9.     return 0; 

3、

  1. #include <vector> 
  2. int func(std::vector<int>vec) 
  3.     static int k = 2; 
  4.     std::vector<int>::reverse_iterator it; 
  5.     for(it = vec.rbegin(); it!=vec.rend(); ++it) 
  6.     { 
  7.         k += *it%2==0? ++*it: (*it)++; 
  8.     } 
  9.     return k; 
  10. int main(void
  11.     std::vector<int>vec; 
  12.     for(int i = 0; i<4; i++) 
  13.     { 
  14.         vec.push_back(i); 
  15.         printf("%d ",func(vec)); 
  16.     } 
  17.     return 0; 

 4、

  1. class Base 
  2. public
  3.     int m_a; 
  4.     Base(int a=2):m_a(a) 
  5.     { 
  6.         printf("A %d ",m_a); 
  7.     } 
  8.     virtual ~Base() 
  9.     { 
  10.         printf("B %d ",m_a); 
  11.     } 
  12. }; 
  13. class Derived:public Base 
  14. public
  15.     Derived(int a=4):Base(a) 
  16.     { 
  17.         printf("C %d ",m_a); 
  18.     } 
  19.     ~Derived() 
  20.     { 
  21.         printf("D %d ",m_a); 
  22.     } 
  23. }; 
  24. int main(void
  25.     Base *aa,bb; 
  26.     aa = new Derived; 
  27.     delete aa; 
  28.     return 0; 

5、

  1. class Base 
  2. public
  3.     int m_a,m_b; 
  4.     Base(int a = 2,int b = 5):m_a(a),m_b(b)  {  } 
  5.     int func_a() 
  6.     { 
  7.         return m_a - m_b; 
  8.     } 
  9.     virtual int func_b() 
  10.     { 
  11.         return m_a + m_b; 
  12.     } 
  13. }; 
  14. class Derived:public Base 
  15. public
  16.     Derived(int a = 4, int b = 7):Base(a, b)  {  } 
  17.     virtual int func_a() 
  18.     { 
  19.         return m_b + m_a; 
  20.     } 
  21.     int func_b() 
  22.     { 
  23.         return m_b - m_a; 
  24.     } 
  25. }; 
  26. int main(void
  27.     Base *aa, *bb; 
  28.     aa = new Base(4, 7); 
  29.     bb = new Derived(3, 5); 
  30.     printf("%d %d %d %d\n",aa->func_a(), aa->func_b(), bb->func_a(), bb->func_b()); 
  31.     delete aa; 
  32.     delete bb; 
  33.     return 0; 

6、

  1. struct SC 
  2.     int a; 
  3.     int b; 
  4.     int c; 
  5. }; 
  6. struct SD 
  7.     int a; 
  8.     int b; 
  9.     int c; 
  10.     int d; 
  11. }; 
  12. int main(void
  13.     struct SC c1[] = {{3},{4},{5},{6}}; 
  14.     struct SD *c2 = (struct SD*)c1 + 1; 
  15.     printf("%d %d %d %d\n",c2->a,c2->b,c2->c,c2->d); 
  16.     return 0; 

7、

  1. int func(int n) 
  2.     int k = 1; 
  3.     if(n > 0) 
  4.     { 
  5.         k += func(--n); 
  6.         printf("%d ", n); 
  7.         k += func(--n); 
  8.     } 
  9.     return k; 
  10.  
  11. int main(void
  12.     int a = 3; 
  13.     printf("%d\n",func(a)); 
  14.     return 0; 


編程題:
1、函數checkstr判斷一字符串是不是對稱的。其中msg爲輸入的字符串,對稱返回0,不對稱返回-1,實現該函數。
int checkstr(const char *msg);

2、給出一個單向鏈表的頭指針,輸出該鏈表中倒數第K個節點的指針,鏈表的倒數第0個節點爲鏈表的尾節點(尾節點的next成員爲NULL)
typedef struct Node
{
    struct Node *next;
}NODE;

NODE* findnode(NODE *head,unsigned int k);



簡答題:
1、簡述動態鏈接庫DLL和靜態鏈接庫lib的差別。
2、請簡述MFC中的窗口收到WM_PAINT消息是如何處理的,什麼情況下會產生WM_PAINT消息。
3、請簡述Critical Section 、Mutex、Semaphore的功能和差別
4、簡述多線程程序對比單線程程序的優點和缺點。

 

參考答案(歡迎討論)轉載請註明來源http://www.cnblogs.com/jerry19880126/

  1. 4 20 主要考查各個count的作用範圍,for循環判斷條件的count是main下第一行的count,for循環裏面的count是static的count,if語句裏面的count是main外部的count,sum+=count中的count是static的count。
  2. C 11 D 4 A 4 B 9 E 10 F9 注意函數形參裏的數組形式,其實本質上都是指針,另外sizeof是在編譯階段就處理的運算符,所以會忽略裏面的各種算術運算。
  3. 3 5 10 18 考查運算符的優先級,帶等號的運算符=、+=等等,優先級都是很低的,所以先做的是那個三目運算符,還要注意形參的變化不影響實參。
  4. A 2 A 4 C 4 D 4 B 4 B 2 構造時,先構造基類再構造派生類,釋放時先釋放派生類再釋放基類。
  5. -3 11 -2 2 構成多態的條件是基類的virtual(注意是基類一定要有,派生類自動也會是virtual,但派生類的virtual不會傳給基類),派生類對基類的覆蓋(函數名、形參和返回值類型必須完全一樣),基類指向派生類對象或引用。
  6. 0 0 5 0 注意地址轉換後的+1,並不是地址值只偏移一個,而是偏移了一整個struct SD的空間,所以c1內容300400500600會一下子偏移掉4個int,指向了4後面的0。
  7. 遞歸,花些耐心推就行了。

 

編程題

1. 如下(引用自http://blog.csdn.net/Hackbuteer1):

View Code

 

2. 如下:

View Code

 

簡答題

  1. 差別:靜態lib將各個調用函數都封裝在生成的可執行文件中(.exe),而動態DLL則在需要時才動態地裝載和所載DLL文件,動態DLL還可以利用到操作系統中既存的庫文件。
  2. 處理:BeginPaint開始畫,就是用白刷去掉原窗口,GetClientPaint獲得窗口顯示區域和尺寸等信息並繪製,EndPaint釋放繪圖句柄。
  3. 功能:都是用來解決共享變量或區域的訪問問題,防止讀寫衝突。區別:Critical Section是在用戶方式下實現同步,其他兩個是系統內核對象。Mutex是隻有獲得鎖的進程才能釋放,而semaphore可由其他進程釋放,一般mutex用於保護關鍵代碼區域,而semaphore用於保護變量。

  1. 優點:多線程程序可以分時處理,用戶因此可以同時高效地執行多個任務,用戶體驗好;缺點:線程切換有額外的代價,所以花費的總時間要長於單線程程序。
編程題目的第二題的時間複雜度有點高

NODE* findnode(NODE *head, unsigned int k)
{
if(head==NULL||k<0)
return NULL;
Node* q=head;
Node* p=head;
for(int i=0;i<k&&q!=NULL;i++)
q=q->next;
if(q==NULL)
return NULL;
while(q->next!=NULL)
{
p=p->next;
q=q->next;
}
return p;
}




發佈了28 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章