網上弄到的一份題,不是很完整,邊猜邊做。
1.寫出運行結果
char array[] = “abcde”; char* s = array;
cout<<sizeof(array)<<strlen(array)<<sizeof(s)<<strlen(s);6585
2.什麼是用戶級線程和內核級線程?區別。
內核級線程:(1)線程的創建、撤銷和切換等,都需要內核直接實現,即內核瞭解每一個作爲可調度實體的線程。
(2)這些線程可以在全系統內進行資源的競爭。
(3)內核空間內爲每一個內核支持線程設置了一個線程控制塊(TCB),內核根據該控制塊,感知線程的存在,並進行控制。
在一定程度上類似於進程,只是創建、調度的開銷要比進程小。有的統計是1:10
用戶級線程:
(1)用戶級線程僅存在於用戶空間。——>對比內核(3)
(2)內核並不能看到用戶線程。——>重要的區別
(3)內核資源的分配仍然是按照進程進行分配的;各個用戶線程只能在進程內進行資源競爭。
3.從C++文件到生成exe 文件經過哪三個步驟?
預編譯,編譯優化,彙編,鏈接
4.有個二維數組 A(6*8),每個元素佔 6 字節,起始地址爲 1000,請問最後一個元素 A[5][7]的起始地址爲??? 數組A佔內存大小爲??? 假設以行優先,則A[1][4]起始地址爲???
1)1000 + 6*6*8 - 8 = 11282; 2)6*6*8=288; 3)A[1][4]位置爲5行2列,1000+6*(8*1+4) = 1272.
如果給出結構體,考慮到字節對齊的話就要另外考慮了。
5.用C語言把雙向鏈表中的兩個結點交換位置,考慮各種邊界問題。
考慮三種情況:第一個結點在頭,第一個結點在中間,第一個結點在尾巴。
struct Node{ Node* prev; Node* next; void* data; }; struct LinkedList{ Node* head; Node* tail; Node* cur; int size; }; bool exchange(LinkedList* list,Node *node1,Node *node2) { if(node1== NULL || node2==NULL) return false; Node *p,*q; //node1 on the front if(list->head->next == node1) { //node2 on the last if(list->tail->next == node2) { p = node2->prev; //Cope with node2 list->head->next = node2; node2->prev = list->head; node2->next = node1->next; node2->next->pre = node2; //Cope with node1 list->tail->prev = node1; node1->next = list->tail; node1->prev = p; p->next = node1; return true; } //node2 not on the last else { p = node2->prev; q = node2->next; //Cope with node2 list->head->next = node2; node2->prev = list->head; node2->next = node1->next; node2->next->prev = node2; //Cope with node1 p->next = node1; node1->prev = p; node1->next = q; q->prev = node1; return true; } } //node1 on the last else if(list->tail->next == node1) { //node2 on the front if(list->head->next == node2) { p = node1->prev; //Cope with node1 list->head->next = node1; node1->prev = list->head; node1->next = node2->next; node1->next->prev = node1; //Cope with node2 list->tail->prev = node2; node2->next = list->tail; node2->prev = p; p->next = node2; return true; } //node2 not on the front else { p = node2->prev; q = node2->next; //Cope with node2 list->tail->next = node2; node2->prev = list->tail; node2->next = node1->next; node2->next->prev = node2; //Cope with node1 p->next = node1; node1->prev = p; node1->next = q; q->prev = node1; return true; } } //node1 on the middle else { //node2 on the front if(list->head->next == node2) { p = node1->prev; q = node1->next; node1->prev = list->head; list->head->next = node1; node1->next = node2->next; node2->next->prev = node1; node2->prev = p; p->next = node2; node2->next = q; q->prev = node2; } //node2 on the last else if(list->tail->next == node2) { p = node1->prev; q = node1->next; node1->prev = node2->prev; node2->prev->next = node1; node1->next = list->tail; list->tail->prev = node1; node2->prev = p; p->next = node2; node2->next = q; q->prev = node2; } //both in the middle else { p = node2->prev; q = node2->next; //Cope with node2 node2->prev = node1->prev; node1->prev->next = node2; node2->next = node1->next; node1->next->prev = node2; //Cope with node1 p->next = node1; node1->prev = p; node1->next = q; q->prev = node1; return true; } } }
6.*.dll,*.lib,*.exe 文件分別是什麼,有什麼區別?
lib是靜態的庫文件,dll是動態的庫文件。
所謂靜態就是link的時候把裏面需要的東西抽取出來安排到你的exe文件中,以後運行exe的時候不再需要lib。
所謂動態就是exe運行的時候依賴於dll裏面提供的功能,沒有這個dll,exe無法運 行。
lib, dll, exe都算是最終的目標文件,是最終產物。而c/c++屬於源代碼。源代碼和最終 目標文件中過渡的就是中間代碼obj,實際上之所以需要中間代碼,是你不可能一次得到目 標文件。比如說一個exe需要很多的cpp文件生成。而編譯器一次只能編譯一個cpp文件。這 樣編譯器編譯好一個cpp以後會將其編譯成obj,當所有必須要的cpp都編譯成obj以後,再統 一link成所需要的exe,應該說缺少任意一個obj都會導致exe的鏈接失敗.
7.附加題(20):使用八叉樹算法把24位真彩色轉化成 256色。24位真彩色包括 R,G,B顏色,每種顏色8 位。
在計算機中像素的計算單位一般是二進制的,256色,即2的8次方,因此我們也把256色圖形叫做8位圖;16位圖,它可以表達2的16次方即65536種顏色;還有24位彩色圖,可以表達16,777,216種顏色。
算法參考:http://blog.csdn.net/zuzubo/article/details/1597985
8.有 11 盆花,圍成一圈,要求每次組合時,每盆花相鄰的兩盆花與上次不同,請問有多少排列方法?
待解答。
9.2 只寵物合成,1只有 5技能,1 只有4 技能,每個技能有 a%概率遺傳,請問剛好有7 個技能遺傳成功的概率是?
只有
第一隻5個技能 + 第二隻2個技能:(a%)^7*C(4,2)
第一隻4個技能 + 第二隻3個技能:(a%)^7*C(5,4)*C(4,3)
第一隻3個技能 + 第二隻4個技能:(a%)^7*C(5,3)
加起來就可以了。
10.輸出結果爲?
#include <iostream> using namespace std; class A { public: A(){cout<<"1";} A(A &a){cout <<"2";} virtual ~A() {cout<<"3";} }; class B:public A { public: B(){cout<<"4";} B(B &b){cout<<"5";} ~B(){cout<<"6";} }; int main() { A* pa = new B(); delete pa; return 0; }
1463
子類構造之前首先調用基類的構造函數,然後是子類的構造函數,析構的時候相反,注意基類的析構函數聲明爲virtual纔可以.