看到幾道比較好的考察C++基礎知識的試題,摘錄如下。
1、下面的變量a都代表什麼含義?
(1)float(**a)[10];
(2) double*(*a)[10];
(3) double(*a[10])();
(4) int*((*a)[10]);
(5) long(*a)();
(6) int(*(*a)(int,int))(int);
2、用變量a給出下面各項的定義。
(1) 一個整型數
(2) 一個指向整型數的指針
(3) 一個指向指針的指針,它指向的指針是指向一個整型數
(4) 一個有10個整型數的數組
(5) 一個有10個指針的數組,該指針是指向一個整型數的
(6) 一個指向有10個整型數數組的指針
(7)一個指向數組的指針,該數組有10個指針,每個指針指向一個整型數
(8)一個指向函數的指針,該函數有一個整型參數並返回一個整型數
(9)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數
(10)一個指向函數的指針,該函數有一個整形參數並返回一個指向函數的指針,返回的函數指針指向有一個整型參數且返回一個整型數的函數
3、一個射擊運動員打靶,靶一共有10環,連開10槍打中90環的可能性有多少種?請用遞歸算法編程實現。
4、輸入兩個整數n和m,從數列1、2、3、...n中任意取幾個數,使其和等於m,要求將其中所有可能的組合都列出來,請編程求解。
5、下面一段程序的輸出是什麼?
1 srand(time(NULL));
2 int nCount = 0;
3 for (int i = 0; i < LOOP_TIMES; i++)
4 {
5 int x = rand();
6 int y = rand();
7 if (x*x + y*y < RAND_MAX*RAND_MAX)
8 {
9 nCount++;
10 }
11 }
12 printf("%d\n", nCount);
6、編程將unsigned short a = 0xABCD的高低字節交換。
這幾道題考察的側重點不一樣,前兩題主要考察對指針的理解,第3題和第4題都用到了遞歸的思想,第5題間接考察建立數學模型的能力,第6題則用到了各種位操作。下面一一進行解答。
1、 (1) a是一個二級指針,該指針指向一個一級指針,這個一級指針指向一個有10個float型元素的數組。
(2) a是一個指針,該指針指向一個有10個指針元素的數組,每個指針元素指向一個double類型的數據。
(3) a是一個有10個元素的數組,每個元素都是一個函數指針,該函數指針指向一個沒有參數且返回double的函數。
(4) a是一個指針,該指針指向一個有10個指針元素的數組,每個指針元素指向一個int類型的數據。
(5) a是一個指向函數的指針,該函數沒有參數且返回long。
(6) a是一個指向函數的指針,該函數有兩個整形參數並返回一個指向函數的指針,返回的函數指針指向有一個整型參數且返回一個整型數的函數。
2、 (1) int a;
(2) int *a;
(3) int *aa;
(4) int a[10];
(5) int *a[10];
(6) int(*a)[10];
(7) int *(*a)[10];
(8) int(*a)(int);
(9) int(*a[10])(int);
(10) int(*(*a)(int))(int);
3、這道題關鍵是要給出遞歸過程中的截斷條件,以下代碼可作為參考。
1 #define SHOT_TIME 10
2 #define SHOT_SCORE 90
3 #define MAX_SCORE_PER_TIME 10
4
5 static int g_nCount = 0;
6 static int g_pScore[SHOT_TIME] = {0};
7
8 void Shot(int nTime, int nScore)
9 {
10 if (nScore < 0 || nScore > nTime*MAX_SCORE_PER_TIME)
11 {
12 return;
13 }
14
15 if (nTime == 1)
16 {
17 g_nCount++;
18 g_pScore[nTime-1] = nScore;
19 for (int i = 0; i < sizeof(g_pScore)/sizeof(g_pScore[0]); i++)
20 {
21 cout << g_pScore[i] << " ";
22 }
23 cout << endl;
24 return;
25 }
26
27 for (int i = 0; i <= MAX_SCORE_PER_TIME; i++)
28 {
29 g_pScore[nTime-1] = i;
30 Shot(nTime-1, nScore-i);
31 }
32 }
33
34 int main(int argc, char* argv[])
35 {
36 Shot(SHOT_TIME, SHOT_SCORE);
37 cout << "total count is " << g_n
4、這道題是一道典型的0-1背包問題,參考算法如下。
1 static bool *g_pIsSelected = NULL;
2 static int g_nNumber = 0;
3
4 void Select(int nNum, int nSum)
5 {
6 assert(g_pIsSelected != NULL);
7
8 if (nNum < 1 || nSum < 1 || (nNum==1 && nSum != 1))
9 {
10 return;
11 }
12
13 if (nNum == nSum)
14 {
15 g_pIsSelected[nNum-1] = true;
16 for (int i = 1; i <= g_nNumber; i++)
17 {
18 if (g_pIsSelected[i-1])
19 {
20 cout << i << " ";
21 }
22 }
23 g_pIsSelected[nNum-1] = false;
24 cout << endl;
25 return;
26 }
27
28 Select(nNum-1, nSum);
29
30 g_pIsSelected[nNum-1] = true;
31 Select(nNum-1, nSum-nNum);
32 g_pIsSelected[nNum-1] = false;
33 }
34
35 int main(int argc, char* argv[])
36 {
37 cout << "number is: ";
38 cin >> g_nNumber;
39 cout << "sum is: ";
40 int nSum = 0;
41 cin >> nSum;
42
43 g_pIsSelected = new bool[g_nNumber];
44 assert(g_pIsSelected != NULL);
45 memset(g_pIsSelected, 0, sizeof(bool)*g_nNumber);
46 Select(g_nNumber, nSum);
47 delete []g_pIsSelected;
48 g_pIsSelected = NULL;
49
50 cin >> nSum;
51 return 0;
52 }
5、如果僅看代碼本身,是很難得到輸出結果的。實際上這是一道概率題,計算的是在一個正方形內部放置一個點,點落在以正方形邊長為半徑的四分之一圓內的概率。由此可得輸出結果為1/4*PI*1000=785(當然,在785附近的值應當都是合理的)。
6、參考代碼如下。
1 int main(int argc, char* argv[])
2 {
3 unsigned short a = 0xABCD;
4 unsigned short b = a << 8;
5 unsigned short c = a >> 8;
6 a = b | c;
7 cout << hex << a << endl;
8
9 getchar();
10 return 0;
11 }