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)/(c²+d²)] + [(bc-ad)/(c²+d²)]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.real² + b.imag² != 0
乘法公式混淆:注意虚部相乘时符号变化(i² = -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₁)² + (y₂-y₁)²]
- 浮点数比较:
fabs(a-b) < epsilon
(ε取1e-8) - 四边形性质:
- 正方形:四边等长 + 四角直角 + 对角线等长
- 矩形:对边等长 + 四角直角 + 对角线等长
常见考点
- 结构体作为函数参数(值传递 vs 引用传递)
- 数组边界管理(0-based索引)
- 几何属性判断的数学基础
- 浮点数处理的注意事项
总结
- 核心结构:
Point
结构体封装坐标 - 关键算法:距离计算 + 几何属性判断
- 易错点:
- 数组边界管理(考试高频错误点!)
- 浮点数精度处理
- 几何条件充分性(如菱形未被识别)
- 学习建议:
- 手动实现距离计算函数5次
- 练习不同点顺序的测试用例
- 扩展程序支持更多四边形类型
- 重点记忆浮点数比较方法
考试前务必练习数组边界检查!这是编程题常见扣分点。几何题注意先验证基本四边形条件(非共线、封闭图形)。