请设计一个IP地址类,该类存储一个IP地址及对应的子网掩码信息。通过下面写好的main函数来使用IP地址类。 int main(){ int n,m; cin>>n>>m; IPAddr myip(n,m); myip.showIPInfo(); return 0; } 输入描述 输入一个整数n和一个4~30之间的正整数m,使用n来初始化IP地址(IP地址的二进制表示和n一摸一样),使用m来初始化子网掩码,m代表子网掩码中1的个数 输出描述 分三行分别输出IP地址、子网掩码和网络地址的点分十进制形式 提示 你需要提交除了main函数之外的其他代码。注意输入的n可能是一个负数
时间: 2024-03-17 21:42:07 浏览: 102
以下是实现IP地址类的代码:
```cpp
#include <iostream>
#include <sstream>
#include <bitset>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
class IPAddr {
public:
IPAddr(int n, int m) {
// 将n转换成二进制字符串
bitset<32> bits(n);
string bit_str = bits.to_string();
// 将二进制字符串分成四段
for (int i = 0; i < 32; i += 8) {
string sub_str = bit_str.substr(i, 8);
int num = stoi(sub_str, nullptr, 2);
segments_.push_back(num);
}
// 计算子网掩码
int mask = pow(2, m) - 1;
mask <<= (32 - m);
bitset<32> mask_bits(mask);
string mask_str = mask_bits.to_string();
// 将子网掩码分成四段
for (int i = 0; i < 32; i += 8) {
string sub_str = mask_str.substr(i, 8);
int num = stoi(sub_str, nullptr, 2);
mask_segments_.push_back(num);
}
}
void showIPInfo() const {
cout << toString() << endl;
cout << toMaskString() << endl;
cout << toNetworkString() << endl;
}
private:
vector<int> segments_;
vector<int> mask_segments_;
string toString() const {
stringstream ss;
for (int i = 0; i < 4; i++) {
ss << segments_[i];
if (i != 3) {
ss << ".";
}
}
return ss.str();
}
string toMaskString() const {
stringstream ss;
for (int i = 0; i < 4; i++) {
ss << mask_segments_[i];
if (i != 3) {
ss << ".";
}
}
return ss.str();
}
string toNetworkString() const {
vector<int> network_segments;
for (int i = 0; i < 4; i++) {
int segment = segments_[i] & mask_segments_[i];
network_segments.push_back(segment);
}
stringstream ss;
for (int i = 0; i < 4; i++) {
ss << network_segments[i];
if (i != 3) {
ss << ".";
}
}
return ss.str();
}
};
```
可以看到,IP地址类将一个32位整数n和一个子网掩码的位数m作为构造函数的参数,然后将n和m转换成IP地址、子网掩码和网络地址,并提供了一个showIPInfo()函数来输出这些信息。
以下是使用示例:
```cpp
int main() {
int n, m;
cin >> n >> m;
IPAddr myip(n, m);
myip.showIPInfo();
return 0;
}
```
这个main函数会先读入n和m,然后用它们来初始化IPAddr对象myip,最后调用showIPInfo()函数输出IP地址、子网掩码和网络地址的点分十进制形式。
阅读全文