1 單選題(每題 2 分,共 30 分)
第1題 8位二進制原碼能表示的最小整數是:(?? )
A. -127????????????????????????????????? B. -128?????????????????????????????? C. -255??????????????????????????????????????? D. -256
解析:答案:A。原碼最高位表示符號,8位二進制原碼低7位表示數值,最大值為127,所以8位二進制原碼表達數值范圍為-127≤X原≤127,故選A。
第2題 反碼表示中,零的表示形式有:(?? )
A. 1種????????????????????????????????? B. 2種?????????????????????????????? C. 8種?????????????????????????????????????????????? D. 16種
解析:答案:B。反碼表示負數時符號位1,其他位是原碼取反,所以0可以表示為000…00(+0),也可以表示為111…11(-0),其中的00…00表示除符號位的所有數值位都為0,11…11表示除符號位的所有數值位都為1。故選B。
第3題 補碼 1011 1011 對應的真值是:(?? )
A. -69????????????????????????? ? ? ? ? B. -59? ? ? ? ? ? ? ? ? ? ? ? ? ???? ?C. -68?????????????????????????????????????????? D. -58
解析:答案:A。負數的補碼為除符號位外原碼數值位取反加1,負數的補碼轉原碼,仍可用為除符號位外補碼數值取反加1(也可先減1,再取反)。補碼 10111011轉原碼為11000101,(1000101)?=69。故選A。
第4題 若X的8位補碼為 0000 1010,則 X/2 的補碼是(? ?)。
A. 0000 0101? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?B. 1000 0101?????????????????????????????????????
C. 0000 0101 或 1000 0101????????????????????????????????????? D. 算術右移后結果取決于符號位
解析:答案:A。正數補碼與原碼相同,X=(0000 1010)?=10,X/2=5=(0000 0101)? (相當于右移一位)。故選A。
第5題 二進制數 1101.101 對應的十進制數是(?? )
A. 13.625????????????????????????????? B. 12.75???????????????????????????? C. 11.875?????????????????????????????????? D. 14.5
解析:答案:A。1101.101?=1×23+1×22+0×21+1×2?+1×2?1+0×2?2+1×2?3=8+4+1+0.5+0.125=13.625。故選A。
第6題 補碼加法中,若最高位和次高位進位不同,則說明( ??)
A. 結果正確?????????????????????? B. 發生上溢?????????????????? C. 發生下溢?????????????????????????????????????????????? D. 結果符號位錯誤
解析:答案:B。在補碼加法運算中,若最高位(符號位)產生的進位與次高位(最高數值位)產生的進位不同,則說明?運算發生了溢出?。一般正溢出稱上溢出、負溢出稱下溢出。溢出判斷,一般用雙符號位進行判斷:符號位00表示正數,11表示負數,結果的符號位為01時,稱為上溢;為10時,稱為下溢。對正數加,最高位(符號位)不可能產生的進位,次高位(最高數值位)不產生的進位,則正常(結果正確);若最高位(符號位)不產生的進位,次高位(最高數值位)產生的進位,則發生上溢出。例如:設x=01101000,y=01001000,用補碼求x+y。符號位用雙符號位
[x]補+[y]補=00 1101000+00 1001000=01 0110000
上溢出(注負數加屬減法)。
用補碼求-x-y(屬減法)。符號位用雙符號位
[-x]補-[y]補=[-x]補+[-y]補=11 0011000+11 0111000=10 1010000
下溢出。
故選B。
第7題 八進制數35.6對應的十進制數是(?? )
A. 29.75??????????????????????????????? B. 28.5?????????????????????????????? C. 27.625?????????????????????????????????? D. 30.25
解析:答案:A。35.6?=3×81+5×8?+6×8ˉ1=29.75。故選A。
第8題 二進制數 1010 | 1100 的結果是(? ?)
A. 1000???????????????????????????????? B. 1110????????????????????????????? C. 1010????????????????????????????????????? D. 1100
解析:答案:B。按位或“|”,兩個位同為0時才為0,兩個位只要有為一個為1時為1。
故選B。
第9題 以下哪個位運算可以交換兩個變量的值(無需臨時變量)(?? )
A. a = a ^ b; b = a ^ b; a = a ^ b;????????????????????????????????? B. a = a & b; b = a | b; a = a & b;
C. a = a | b; b = a ^ b; a = a ^ b;????????????????????????????????? D. a = ~a; b = ~b; a = ~a;
解析:答案:A。位運算“^”的特點是兩次^同一數,內容不變,即b^a^a=b。設原a、原b為運算前的a、b,a = a ^ b;,a=原a^原b,b = a ^ b=原a^原b^原b=原a,a = a ^ b=原a^原b^原b^原a=原b,實現了a、b交換。故選A。
第10題 如何正確定義一個長度為5的整型數組(?? )
A. int array = new int[5];? ??????????????????????????????????????????? B. array int[5];
C. int[] array = {1,2,3,4,5};?????????????????????????????????????????? D. int array[5];
解析:答案:D。?A.?int array = new int[5];? ?錯誤;new?返回的是指針(int*),不能直接賦值給?int?變量。正確寫法應為?int* array = new int[5];(動態數組,需手動?delete[])。?B.?array int[5];? ??錯誤?;語法完全不符合C++規范,類型和變量名順序錯誤。?C.?int[] array = {1,2,3,4,5}; ?錯誤;C++不支持int[]作為變量聲明語法(Java風格)。正確靜態初始化應為?int array[] = {1,2,3,4,5};?或?int array[5] = {1,2,3,4,5};。?D.?int array[5]; ?正確?;這是C++中定義靜態數組的標準方式,聲明一個長度為5的整型數組(未初始化,值隨機)。若需初始化,可改為?int array[5] = {};(全零初始化)。故選D。
第11題 以下程序使用枚舉法(窮舉法)求解滿足條件的三位數,橫線處應該填入的是(? )
- #include <iostream>
- using namespace std;
- int main() {
- ????int count = 0;
- ????for (int i = 100; i <= 999; i++) {
- ????????int a = i / 100;
- ????????___________________
- ????????int c = i % 10;
- ????????if (a * a + b * b == c * c) {
- ????????????count++;
- ????????}
- ????}
- ????cout << count << endl;
- ????return 0;
- }
A. int b = (i / 10) / 10;?????B. int b = (i / 10) % 10;?? C. int b = (i % 10) / 10;? D. int b = (i % 10) % 10;
解析:答案:B。按題目上下文,a為百位,c為位,那要填的b為十位。求十位,可將數整除10后,再求除以10的余數,即(i/10) %10;或將數除以100的余數,再整除10,即(i % 100) / 10。故選B。
第12題 以下程序模擬了一個簡單的小球反彈過程,橫線處應該填入的是(?? )
- #include <iostream>
- using namespace std;
- int main() {
- ????int height = 10;
- ????int distance = 0;
- ????for (int i = 1; i <= 5; i++) { // 模擬5次落地
- ????????_________________
- ????????height /= 2;
- ????????distance += height;
- ????}
- ????cout << distance << endl;
- ????return 0;
- }
A. distance += height/2;?????????????????????????????????????????????? B. distance += height;
C. distance += height*2;????????????????????????????????????????????? D. distance += height+1;
解析:答案:B。根據題目和程序,程序應該是求經過的總距離,下降h,反彈h/2,所以第8行應該填加下降h,第9、10行加反彈的h/2,參照第10行,第8行應填distance += height。故選B。
第13題 C++代碼 string s = "GESP考試"; ,s占據的字節數是(?? )
A. 10????????????????????????????????????? ?????????????????????????????????????????B. 8
C. 8或10???????????????????????????? ??????????????????????????????????????????? D. 取決于計算機采用什么編碼
解析:答案:D。string占用字節數不同編譯系統是不同,如TDM-GCC 32位為4字節,TDM-GCC 64位為8字節,MinGW-w64 64位為32字節。故選D。
第14題 C++語句 string s="Gesp Test"; 執行s.rfind("e")以后,輸出的是(?? )
A. 1??????????????????????????????????????? B. 2???????????????????????????????????? C. 6???????????????????????????????????????????? D. 3
解析:答案:C。rfind()是從右向左查找。s.rfind("e")是從s中從右向左查找第一個"e",也就是Test中的"e",索引(下標)為6。故選C。
第15題 字符串"Gesp考試",字符數是(? ?)
A. 10????????????????????????????????????????????????????????????????????????????????? B. 8
C. 6??????????????????????????????????????????????????????????????????????????????????? D. 字符數多少取決于編碼
解析:答案:C。在C++中漢字按GBK編碼存儲,英文單字節,漢字雙字節。" Gesp考試")四個英文字符占4字節,兩個漢字為2字符占4字節,合計6字符8字節。故選C。
2 判斷題(每題 2 分,共 20 分)
第1題 C++中 string 的 == 運算符比較的是字符串的內存地址,而非內容。(?? )
解析:答案:錯誤。在 C++ 中,string?類型的對象使用?==?運算符進行比較時,并不是比較它們的內存地址,而是比較它們的內容;也就是說string?類型的個變量可以直接用==進行比較。故錯誤。
第2題 string 的 substr(1, 3) 返回從下標1開始的3個字符的子串。(?? )
解析:答案:正確。在 C++ 中,substr語法為substr(int pos = 0, int n = npos)
其中:pos——要截取的起始位置;位置從0開始計數,表示字符串中的第一個字符;n——要截取的字符數量; 默認值為npos(表示到字符串末尾的所有字符)。該函數返回一個包含從pos位置開始的n個字符的新字符串。故正確。
第3題 x是浮點數,(x >> 1)等價于 x / 2。(?? )
解析:答案:錯誤。在C++中,浮點數不能進行左移、右移操作,編譯錯誤。故錯誤。
第4題 string("hello") == "hello" 的比較結果為true。
解析:答案:正確。在C++中,string("hello") == "hello" 的比較結果為true,輸出為1。故正確。
第5題 sort可以直接用于排序set中的元素。(?? )
解析:答案:錯誤。在C++中,sort要求傳入的迭代器必須是?隨機訪問迭代器?(RandomAccessIterator),而set的內部實現(基于紅黑樹)只提供?雙向迭代器?(BidirectionalIterator),無法支持隨機訪問操作(如索引跳轉)。故錯誤。
第6題 (x & 1) == 0 可以判斷整數 x 是否為偶數。(?? )
解析:答案:正確。在C++中,(x & 1)則只保留x的最低位,其他位置為0,如x的最低位為0則x為偶數,否則x的最低位為1則x為奇數,故(x & 1) == 0 為“真”則整數x是為偶數,否則不是。故正確。
第7題 string 的 substr(2, 10) 在字符串長度不足時會拋出異常。(?? )
解析:答案:錯誤。在C++中,string的substr(2, 10)函數在字符串長度不足時確實可能拋出異常,具體行為如下:substr(int pos, int n)?異常觸發條件?:當起始位置pos(本題是2)大于等于字符串長度時,會拋出out_of_range異常,當pos有效但pos + len(這里是2+10)超過字符串長度時,默認會截取到字符串末尾而不會拋出異常。故錯誤。
第8題 在數學紙面計算中,pow(2, 3)的計算結果一定是8,但是在C++中,如果遇到數據類型是浮點數,那就不一定正確。(?? )
解析:答案:正確。在數學紙面計算中,pow(2,3)計數結果一定是8(精確計算),但在C++中使用浮點數進行冪運算時,結果可能就不一定與紙面計算結果一致。原因是?浮點數的精度限制,浮點數(float、double)遵循IEEE 754標準,以二進制形式存儲數值,尾數用有限的二進制位表示,所以浮點數無法精確表示為二進制浮點數,導致舍入誤差。運算過程中(pow為乘法)會累積這些誤差,影響最終結果。故正確。
第9題 在C++中,枚舉的底層類型可以是非整型(如 float 或 double )。(?? )
解析:答案:錯誤。C++標準規定枚舉的底層類型只能是整數類型(包括char、short、int、long等),不支持浮點數(如float或double)作為底層類型。故錯誤。
第10題 函數聲明double f(); 返回int時,會自動轉換為double。(?? )
解析:答案:正確。在C++中,當函數聲明的返回類型為double,但實際返回int類型時,編譯器會自動將int值隱式轉換為double類型。若反向操作(如聲明返回int但實際返回double),則需顯式類型轉換,隱式轉換會丟失小數部分。故正確。
3 編程題(每題 25 分,共 50 分)
3.1 編程題1
- 試題名稱:奇偶校驗
- 時間限制:1.0 s
- 內存限制:512.0 MB
3.1.1 題目描述
數據在傳輸過程中可能出錯,因此接收方收到數據后通常會校驗傳輸的數據是否正確,奇偶校驗是經典的校驗方式之一。
給定n個非負整數c?,c?,...,c?代表所傳輸的數據,它們的校驗碼取決于這些整數在二進制下1的數量之和的奇偶性。如果這些整數在二進制下共有奇數個1,那么校驗碼為1;否則校驗碼為0。你能求出這些整數的校驗碼嗎?
3.1.2 輸入格式
第一行,一個正整數n,表示所傳輸的數據量。
第二行,n個非負整數c?,c?,...,c?,表示所傳輸的數據。
3.1.3 輸出格式
輸出一行,兩個整數,以一個空格分隔:
第一個整數表示c?,c?,...,c?在二進制下1的總數量;
第二個整數表示校驗碼(0或1)。
3.1.4 樣例
3.1.4.1 輸入樣例1
- 4
- 71 69 83 80
3.1.4.2 輸出樣例1
- 13 1
3.1.4.3 輸入樣例2
- 6
- 1 2 4 8 16 32
3.1.4.4 輸出樣例2
- 6 0
3.1.5 數據范圍
對于所有測試點,保證1≤n≤100,0≤c?≤255。
3.2.6 編寫程序思路
分析:本題目主要考察位運算,c & 1為1表示c為奇數,c & 1為0表示c為偶數。要統計一個數對應二進制中1的個數,方法有多種,這里給兩種。方法一:可以用c & 1獲得c對應二進制的最后一位,加c & 1即這位是1則加1,否則加0,然后將該數右移1一位,丟掉最后一位,直至該數為0結束。方法二:可以用 c =c & (c - 1)去掉c中對應二進制中最右邊的1,直至c=0結束,能運算c = c & (c - 1)的次數即為c對應二進制中1的個數。
用方法一編程參考程序:
#include <iostream>
using namespace std;int n, cnt=0;
int main() {cin >> n;for (int i = 0; i < n; i++) {int c;cin >> c;while (c) {cnt += c & 1;c >>= 1;}}cout << cnt << " " << (cnt & 1) << endl;return 0;
}
用方法二編程參考程序:
#include <iostream>
using namespace std;int n, cnt = 0;
int main() {cin >> n;for (int i = 0; i < n; i++) {int c;cin >> c;while (c) {c = c & (c - 1);cnt++;}}cout << cnt << " " << (cnt & 1) << endl;return 0;
}
3.2 編程題2
- 試題名稱:分糖果
- 時間限制:1.0 s
- 內存限制:512.0 MB
3.2.1 題目描述
有n位小朋友排成一隊等待老師分糖果。第i位小朋友想要至少a?顆糖果,并且分給他的糖果數量必須比分給前一位小朋友的糖果數量更多,不然他就會不開心。
老師想知道至少需要準備多少顆糖果才能讓所有小朋友都開心。你能幫幫老師嗎?
3.2.2 輸入格式
第一行,一個正整數 ,表示小朋友的人數。
第二行,n個正整數a?,a?,...,a?,依次表示每位小朋友至少需要的糖果數量。
3.2.3 輸出格式
輸出一行,一個整數,表示最少需要準備的糖果數量。
3.2.4 樣例
3.2.4.1 輸入樣例1
- 4
- 1 4 3 3
3.2.4.2 輸出樣例1
- 16
3.2.4.3 輸入樣例2
- 15
- 314 15926 53589793 238462643 383279502 8 8 4 1 9 7 1 6 9 3
3.2.4.4 輸出樣例2
- 4508143253
3.2.5 數據范圍
對于所有測試點,保證1≤n≤1000,1≤a?≤10?。
3.2.6 編寫程序思路
分析:根據題意,第i人,除了至少給該人期望的糖果數,還必須比前一人多(至少多1顆),故第i人應該給的糖果數為兩者中大的那個數。算法可以用變量,也可以用數組。
方法一(用變量):第i人應該給的糖果數為max(b+1,a),b為前一人給的糖果數,而a則是該人期望的糖果數(輸入的數值)。對第1個人的前一人給的糖果數b為0。
#include <iostream>
using namespace std;int n, a, b; //初始化a=0,b=0,b為前一人,a為當前人
long long ans; //答案準備糖果數初始化為0
int main() {cin >> n; //輸入人數for (int i = 1; i <= n; i++) {cin >> a; //輸入當前人期望糖果數b = max(b + 1, a); //當前人應給糖果數,b也是下一人的前一人ans += b; //累加當前人應給糖果數}cout << ans << endl;return 0;
}
?方法二(用數組):第i人應該給的糖果數a[i]=max(a[i-1]+1,a[i]),右邊的a[i-1]為前一人給的糖果數,而a[i]則是該人期望的糖果數(輸入的數值)。對第1個人的前一人給的糖果數為0。完整程序如下:
#include <iostream>
using namespace std;const int N = 1005; //不超過1000,用1005預留防越界
int n, a[N]; //初始化a全為0,a[0]=0
long long ans; //答案準備糖果數初始化為0
int main() {cin >> n; //輸入人數for (int i = 1; i <= n; i++) {cin >> a[i]; //輸入當前人期望糖果數a[i] = max(a[i - 1] + 1, a[i]); //前一人糖果數+1與當前人期望糖果數取大者ans += a[i]; //累加當前人應給糖果數}cout << ans << endl;return 0;
}