中興2011筆試題+答案解析


參考答案(大部分答案和都和卷子上給的相同,歡迎討論)轉載請注明來源http://www.cnblogs.com/jerry19880126/

一、單選題

  1. B。p2是int型,只有p1是int*型。
  2. D。區分0和\0。
  3. C。
  4. B。除號與取余的優先級是一樣的,所以順序是從左向右。快速與(邏輯與)只要不是0的都認為是true(1),是0則認為是false(0)。
  5. 重復。
  6. 重復。
  7. A。字符串常量不可更改。
  8. 重復。
  9. C。可以用排除法。
  10. D。
  11. C or D。沒查到,C6000是指DSP嗎?如果是32位PC機上,D是錯的,因為long還是4字節。但本科做過單片機知道,int是2字節的,所以C是錯的。這里貌似是硬件環境,所以選C還是保穩些。
  12. C。只要有一個被顯式初始化了,數組中其他元素也會被初始為0。
  13. B。百度一下就知道了。
  14. B。注意while里面的==誤寫成=了。
  15. B。
  16. B。我覺得是D,百度上沒有找到確切的。
  17. A。應該是A,我百度到了。
  18. C。
  19. A。
  20. B。語句覆蓋是最弱的,其次是條件覆蓋,再次是條件及判定覆蓋,最強的是條件組合覆蓋。

 

二、多選題

  1. ABD。
  2. ABCD。形參、實參不一致時,會有默認的轉換,若不能轉換,則編譯器報錯。
  3. ACD。
  4. ACD。A只有是字符串數組時,才可以整體輸出。B編譯器沒那么聰明,不知道是下標越界,報的只是讀沖突錯。C可以的。D是對的,數組名為地址常量。
  5. ABD。D是左移運算符,也是位操作。
  6. BCD。C和D都可以訪問。
  7. 后面題目是軟件測試、linux的,請自行百度確認答案。第16題好像有問題,信號量是進程互斥用的,信號才是用來通信的。

 

三、判斷題

  1. 錯。
  2. 對。
  3. 對。
  4. 對。
  5. 重復。
  6. 重復。
  7. 對。
  8. 錯。
  9. 錯。不是沒有結果,而是垃圾值。
  10. 對。

 

四、問答題

  1. static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝,且static函數只能使用static變量。
  2. (1)和(2)是一樣的,為指向常量的指針,(3)是指針常量。
  3. ZTE 垃圾值 DB。字符串常量存儲於字符串常量區,在整個程序運行完畢后才釋放。
  4. 程序代碼在代碼段,常量分為字符串常量和其他常量,字符串常量存儲於字符串常量區,其他常量存儲於代碼段,局部變量存儲於棧上,全局變量(包括靜態變量)存儲於全局數據區。

 

五、如下。

1. 鏈表反序

View Code
 1 #include <iostream>
 2 using namespace std;
 3 //鏈表反序
 4 struct node
 5 {
 6     struct node *next;
 7     int data;
 8 };
 9 
10 
11 struct node* Reverse(struct node *p)
12 {
13     node *p1, *p2;
14     if(!p) return 0;
15     p1 = p->next;
16     if(!p1) return p;
17     p2 = p1->next;
18     p->next = 0;
19     while(true)
20     {
21         p1->next = p;
22         p = p1;
23         p1 = p2;
24         if(!p2) break;
25         p2 = p2->next;
26     }
27     return p;
28 }
29 
30 void output(struct node *p)
31 {
32     while(p)
33     {
34         cout << p->data << " ";
35         p = p->next;
36     }
37     cout << endl;
38 }
39 
40 
41 int main()
42 {
43     //添加鏈表
44     node *head, *p;
45     head = new node();
46     head->data = 0;
47     p = head;
48     for(int i = 1; i < 5; ++i)
49     {
50         p->next = new node();
51         p = p->next;
52         p->data = i;
53     }
54     p->next = 0;
55     output(head);
56     head = Reverse(head);
57     output(head);
58 }

 

2. 雙向鏈表

View Code
  1 #include <iostream>
  2 using namespace std;
  3 //刪除兩個鏈表中的重復數據
  4 typedef struct node
  5 {
  6     int data;
  7     struct node *front, *next;
  8 }Node;
  9 
 10 
 11 void output(Node *head)
 12 {
 13     Node *p = head;
 14     while(p->next != head)
 15     {
 16         p = p->next;
 17         cout << p->data << " ";
 18     }
 19     cout << endl;
 20 }
 21 
 22 //構造一個雙鏈表
 23 Node* createLink(int* a, int len)
 24 {
 25     Node *pHeadA = new Node;
 26     Node *p;
 27     pHeadA->data = 0xffffffff;
 28     pHeadA->next = pHeadA;
 29     pHeadA->front = pHeadA;
 30     p = pHeadA;
 31     for(int i = 0; i < len; ++i)
 32     {
 33         Node *p1 = new Node;
 34         p1->data = a[i];
 35         p->next = p1;
 36         p1->front = p;
 37         pHeadA->front = p1;
 38         p1->next = pHeadA;
 39         p = p1;
 40     }
 41     return pHeadA;
 42 }
 43 
 44 //刪除指定的結點
 45 Node* removeNode(Node* p)
 46 {
 47     Node *pPrevious = p->front;
 48     Node *pNext = p->next;
 49     pPrevious->next = pNext;
 50     pNext->front = pPrevious;
 51     delete p;
 52     return pPrevious;
 53 }
 54 
 55 //找到要刪除的結點
 56 bool findRemoveNode(Node* head, int data)
 57 {
 58     Node *p = head;
 59     bool flag = false;
 60     while(p->next != head)
 61     {
 62         p = p->next;
 63         if(p->data == data)
 64         {
 65             p = removeNode(p);
 66             flag = true;
 67         }
 68     }
 69     return flag;
 70 }
 71 
 72 //刪除重復結點
 73 void DeleteSameNodes(Node* pHeadA, node* pHeadB)
 74 {
 75     Node *pA = pHeadA;
 76     Node *pAPre;
 77     while(pA->next != pHeadA)
 78     {
 79         pAPre = pA;
 80         pA = pA->next;
 81         int Adata = pA->data;
 82         int flag = findRemoveNode(pHeadB, Adata);
 83         if(flag)
 84         {
 85             //在B中重復的結點,那么A中的結點也要都刪去
 86             findRemoveNode(pHeadA, Adata);//注意會引起A中pA失效
 87             pA =  pAPre;//重定位指針
 88         }
 89     }
 90 }
 91 
 92 int main()
 93 {
 94     cout << "刪除前:"<<endl;
 95     //創建A鏈表
 96     int a[6] = {1,2,3,2,4,3};
 97     Node* pHeadA = createLink(a, 6);
 98     cout << "A鏈表中的元素為:";
 99     output(pHeadA);
100 
101     //創建B鏈表
102     int b[4] = {0,2,4,2};
103     Node* pHeadB = createLink(b, 4);
104     cout << "B鏈表中的元素為:";
105     output(pHeadB);
106 
107     //刪除兩個鏈表中重復的值,題意不是很清楚,這里理解為若B中與A有相同的元素data,
108     //則A與B中所有含data的結點都要刪去,而若B中沒有相同的data,那么即使A內部有多
109     //個data,也不刪除。
110     cout <<endl<< "刪除后:"<< endl;
111     DeleteSameNodes(pHeadA, pHeadB);
112     cout << "A鏈表中的元素為:";
113     output(pHeadA);
114     cout << "B鏈表中的元素為:";
115     output(pHeadB);
116     return 0;
117 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM