ds老師產物,純為期末復習,自用。
題目1
編寫程序,將一個整型變量右移 4 位,并以二進制數形式輸出該整數在移位前和移位后的數值。
//觀察系統填補空缺的數位情況
代碼解答
#include <iostream>//編寫程序,將一個整型變量右移 4 位,并以二進制數形式輸出該整數在移位前和移位后的數值。
//觀察系統填補空缺的數位情況using namespace std;void bitDisplay(unsigned value);int main()
{unsigned x;cout<<"請輸入一個無符號數:";cin>>x;bitDisplay(x);//右移四位x >>= 4;cout<<"移位后\n";bitDisplay(x);return 0;
}void bitDisplay(unsigned value)
{unsigned c;unsigned bitMask = 1 << 31; //掩碼,最高位置1cout<<value<<" = \t";for(c=1;c<=32;c++){cout<<(value & bitMask ? '1' : '0'); //輸出value的最高位value <<= 1; //value左移一位if(c%8 == 0)cout<< ' ';}cout <<endl;
}
1. 程序功能總結
核心目標:輸入一個無符號整數,將其右移4位,并以二進制形式輸出移位前和移位后的值,觀察右移時系統如何填補空缺位(高位補0)。
執行流程:
- 用戶輸入一個無符號整數(如 10)。
- 程序調用 bitDisplay 函數輸出該數的32位二進制表示(如 00000000 00000000 00000000
00001010)。 - 將整數右移4位(x >>= 4)。
- 再次調用 bitDisplay 輸出移位后的二進制(如 00000000 00000000 00000000 00000000)。
關鍵觀察:由于是無符號整數,右移時高位補0(邏輯右移)。
例如,10 的二進制是 1010,右移4位后變成 0。
2. 關鍵知識點(考試重點)
位操作運算符:
右移(>>):無符號整數右移時,高位補0(邏輯右移);有符號整數右移時,高位補符號位(算術右移,考試常考區別!)。
左移(<<):低位補0(無論有無符號)。
按位與(&):用于檢查特定位(如 value & bitMask 判斷最高位是否為1)。
無符號整數(unsigned):
范圍:0 到 4,294,967,295(32位系統)。
右移時高位固定補0(區別于有符號整數的符號位填充)。
掩碼(Bitmask)技術:
使用 1 << 31 創建一個最高位為1、其余位為0的掩碼(10000000 00000000 00000000 00000000)。
通過 (value & bitMask) 逐位提取二進制值。
二進制輸出邏輯:
循環32次(32位整數),每次輸出最高位后左移一位(value <<= 1),實現從高位到低位的輸出。
每8位添加空格,符合字節分組習慣(如 00000000 00000000 …)。
移位賦值運算符:x >>= 4 等價于 x = x >> 4。
3. 代碼分析(加深理解)
bitDisplay 函數詳解:
void bitDisplay(unsigned value) {unsigned bitMask = 1 << 31; // 第31位(最高位)設為1for(int c = 1; c <= 32; c++) {cout << (value & bitMask ? '1' : '0'); // 輸出當前最高位value <<= 1; // 左移1位,丟棄當前最高位,次高位成為新最高位if(c % 8 == 0) cout << ' '; // 每8位加空格}
}
為什么左移?
通過 value <<= 1 逐步“暴露”每一位,從最高位(MSB)到最低位(LSB)輸出。
掩碼作用:bitMask 始終固定,與 value 的當前最高位比較。
主函數中的右移:
x >>= 4:將 x 的所有位向右移動4位,左側空位補0。
示例:若輸入 x = 10(二進制 1010),右移4位后變為 0。
4. 記憶與練習建議(考試沖刺)
記憶技巧:
無符號 vs 有符號右移:
unsigned:右移高位補0(邏輯右移)。
signed:右移高位補符號位(算術右移)。考試高頻考點!
掩碼口訣:1 << n 創建第 n 位為1的掩碼(例如 1 << 3 = 00001000)。
移位方向:
<<:向高位移動(數值通常變大)。
“>>”:向低位移動(數值通常變小)。
二進制輸出流程:固定掩碼 + 循環左移(從高位到低位輸出)。
練習題(強化理解):
手動計算:
輸入 x = 255(二進制 11111111),手動計算右移4位后的結果,再運行程序驗證。
若改為有符號整數(int x = -10;),右移4位后的二進制是什么?(提示:高位補1)
代碼修改練習:
擴展功能:修改 bitDisplay 函數,使其能輸出有符號整數的二進制(需處理符號位)。
cpp
void bitDisplay(int value) {unsigned bitMask = 1 << 31;for(int i = 0; i < 32; i++) {cout << (value & bitMask ? '1' : '0');value <<= 1;if((i + 1) % 8 == 0) cout << ' ';}
}
添加十六進制輸出:在 bitDisplay 中加入 cout << hex << value << dec; 輸出十六進制值。
位操作實戰:
編寫函數提取一個數的第 n 位:
cpp
int getBit(unsigned value, int n) {return (value >> n) & 1; // 右移n位后與1按位與
}
考試常見題型:
問:unsigned x = 16; x >>= 2; 后,x 的值是多少?(答案:4)
問:如何用位操作判斷整數是奇數還是偶數?(答案:(x & 1) == 1)
考試重點:無符號/有符號移位的區別、掩碼的應用、二進制輸出邏輯。
題目2
使用結構類型表示復數。設計程序,輸入兩個復數,可以選擇進行復數的+、-、×或÷運算,并輸出結果。
代碼解答
#include <iostream>
#include <iomanip> //格式化輸出
//使用結構類型表示復數。設計程序,輸入兩個復數,可以選擇進行復數的+、-、×或÷運算,并
//輸出結果。using namespace std;struct Complex
{double real; //實部double imag; //虛部
};int main()
{Complex a,b,result;char operation;double n1;cout<<"請輸入第一個復數:";cin>>a.real>>a.imag;cout<<"請輸入第二個復數:";cin>>b.real>>b.imag;cout<<"請選擇運算(+,-,*,/):";cin>>operation;switch(operation){case '+':result.real = a.real + b.real;result.imag = a.imag + b.imag;break;case '-':result.real = a.real - b.real;result.imag = a.imag - b.imag;break;case '*':result.real = a.real * b.real - a.imag*b.imag;result.imag = a.real * b.imag + a.imag*b.real;break;case '/':if(b.real * b.real + b.imag*b.imag == 0){cout<<"除數不能為0"<<endl;return 1;}n1 = b.real * b.real + b.imag * b.imag;result.real = (a.real*b.real + a.imag*b.imag)/n1;result.imag = (a.imag*b.real - a.real*b.imag)/n1;break;default:cout<<"請正確輸入運算符"<<endl;return 1;}cout<<"計算結果:";cout<<result.real;if(result.imag >= 0){cout<<"+"<<result.imag<<"i"<<endl;}else{cout<<"-"<<-result.imag<<"i"<<endl;}return 0;
}
這個程序實現了復數的四則運算,是結構體應用的典型示例。以下是針對考試復習的詳細總結:
1. 核心功能
輸入兩個復數的實部和虛部
選擇四種運算(+、-、*、/)
按復數運算規則計算結果
格式化輸出結果(正確處理虛部符號)
2. 關鍵知識點
(1) 結構體定義與使用
cpp
struct Complex {
double real; // 實部
double imag; // 虛部
};
結構體作用:將相關數據(實部/虛部)打包為單一類型
變量聲明:Complex a, b, result; 創建三個復數變量
成員訪問:通過.運算符訪問成員(如a.real, b.imag)
(2) 復數運算規則
運算 公式 代碼實現
加法 (a+bi) + (c+di) = (a+c) + (b+d)i real = a.real+b.real; imag = a.imag+b.imag;
減法 (a+bi) - (c+di) = (a-c) + (b-d)i real = a.real-b.real; imag = a.imag-b.imag;
乘法 (a+bi)(c+di) = (ac-bd) + (ad+bc)i real = a.realb.real - a.imagb.imag;
imag = a.realb.imag + a.imagb.real;
除法 (a+bi)/(c+di) = [(ac+bd)/(c2+d2)] + [(bc-ad)/(c2+d2)]i
分母計算:n1 = b.realb.real + b.imagb.imag;
分子實部:(a.realb.real + a.imagb.imag)/n1
分子虛部:(a.imagb.real - a.real*b.imag)/n1
3. 代碼亮點分析
(1) 除法運算優化
cpp
n1 = b.real*b.real + b.imag*b.imag; // 計算分母模的平方
result.real = (a.real*b.real + a.imag*b.imag)/n1;
result.imag = (a.imag*b.real - a.real*b.imag)/n1;
(2) 智能輸出處理
cpp
if(result.imag >= 0) {cout<<"+"<<result.imag<<"i";
} else {cout<<"-"<<-result.imag<<"i"; // 負虛部轉換為正數輸出
}
4. 考試重點記憶
必背公式(筆試常考!)
運算 實部公式 虛部公式
乘法 real?·real? - imag?·imag? real?·imag? + imag?·real?
除法 (real?·real? + imag?·imag?)/denom (imag?·real? - real?·imag?)/denom
易錯點警示
除法未檢查分母:必須驗證b.real2 + b.imag2 != 0
乘法公式混淆:注意虛部相乘時符號變化(i2 = -1)
輸出格式錯誤:負虛部需轉換符號輸出
題目3
使用結構表示 X-Y 平面直角坐標系上的點,編寫程序,順序讀入一個四邊形的 4 個頂點坐標,判別由這4個頂點的連線構成的圖形是否為正方形、矩形或其他四邊形。要求:定義求兩個點距離的函數使用結構參數。
代碼解答
#include <iostream>
#include <cmath>//使用結構表示 X-Y 平面直角坐標系上的點,編寫程序,順序讀入一個四邊形的 4 個頂點坐標,判別由這
//個頂點的連線構成的圖形是否為正方形、矩形或其他四邊形。要求:定義求兩個點距離的函數使用結構參數。using namespace std;struct Point
{double x;double y;
};double calculateDistance(Point p1,Point p2)
{return sqrt(pow(p1.x - p2.x , 2) + pow(p1.y - p2.y , 2)); //距離公式
}int main()
{Point vertices[4];for(int i = 0;i<4;i++){cout<<"請輸入第"<<i+1<<"個頂點的橫坐標和縱坐標:";cin>>vertices[i].x>>vertices[i].y;}double side1 = calculateDistance(vertices[0], vertices[1]);double side2 = calculateDistance(vertices[1], vertices[2]);double side3 = calculateDistance(vertices[2], vertices[3]);double side4 = calculateDistance(vertices[3], vertices[0]);double diagonal1 = calculateDistance(vertices[0], vertices[2]);double diagonal2 = calculateDistance(vertices[1], vertices[3]);if(fabs(side1 - side3)<= 1e-8 && fabs(side2 - side4)<= 1e-8){if(fabs(side1 - side2)<= 1e-8){//四條邊相等if(fabs(diagonal1 - diagonal2)<=1e-8){cout<<"四個頂點構成的圖形是正方形"<<endl;}}else if (fabs(diagonal1 - diagonal2)<=1e-8){cout<<"是矩形"<<endl;}}else {cout<<"其他四邊形"<<endl;}return 0;
}
四邊形類型判斷程序總結與分析
這個程序用于判斷四個點構成的四邊形是否為正方形、矩形或其他四邊形。以下是詳細的總結和分析,幫助您準備考試:
1. 程序功能
- 輸入四個點的坐標(假設按順序連接)
- 計算四邊形的四條邊和兩條對角線
- 根據邊和對角線的長度關系判斷四邊形類型:
- 正方形:四條邊相等且兩條對角線相等
- 矩形:對邊相等且兩條對角線相等
- 其他四邊形:不滿足上述條件
2. 關鍵知識點
(1) 結構體表示點
struct Point {double x;double y;
};
- 將點的x、y坐標打包為單一類型
- 使用數組存儲多個點:
Point vertices[4];
(2) 距離計算函數
double calculateDistance(Point p1, Point p2) {return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}
- 應用歐幾里得距離公式
- 使用
pow()
函數計算平方,sqrt()
開平方
(3) 浮點數比較技巧
fabs(a - b) <= 1e-8 // 代替 a == b
- 避免浮點數精度誤差
- 考試重點:必須掌握這種比較方式
(4) 四邊形判斷邏輯
類型 | 條件 |
---|---|
正方形 | 四條邊相等 (side1=side2=side3=side4 ) + 對角線相等 |
矩形 | 對邊相等 (side1=side3 且 side2=side4 ) + 對角線相等 |
其他 | 不滿足以上條件 |
3. 考試重點記憶
必背公式
- 距離公式:
d = √[(x?-x?)2 + (y?-y?)2]
- 浮點數比較:
fabs(a-b) < epsilon
(ε取1e-8) - 四邊形性質:
- 正方形:四邊等長 + 四角直角 + 對角線等長
- 矩形:對邊等長 + 四角直角 + 對角線等長
常見考點
- 結構體作為函數參數(值傳遞 vs 引用傳遞)
- 數組邊界管理(0-based索引)
- 幾何屬性判斷的數學基礎
- 浮點數處理的注意事項
總結
- 核心結構:
Point
結構體封裝坐標 - 關鍵算法:距離計算 + 幾何屬性判斷
- 易錯點:
- 數組邊界管理(考試高頻錯誤點!)
- 浮點數精度處理
- 幾何條件充分性(如菱形未被識別)
- 學習建議:
- 手動實現距離計算函數5次
- 練習不同點順序的測試用例
- 擴展程序支持更多四邊形類型
- 重點記憶浮點數比較方法
考試前務必練習數組邊界檢查!這是編程題常見扣分點。幾何題注意先驗證基本四邊形條件(非共線、封閉圖形)。