第二次寒假作业总结二


第二次寒假作业总结二

主要代码解析

/*ip转化*/
		for (int i = 7; i >= 0; i--) {
			zw1[i] = num1[len] % 2;
			num1[len] /= 2;
		}
		for (int i = 15; i >= 8; i--) {
			zw1[i] = num2[len] % 2;
			num2[len] /= 2;
		}
		for (int i = 23; i >= 16; i--) {
			zw1[i] = num3[len] % 2;
			num3[len] /= 2;
		}
		for (int i = 31; i >= 24; i--) {
			zw1[i] = num4[len] % 2;
			num4[len] /= 2;
		}
		//网址转化
		for (int i = 0; i < num5[len]; i++) {
			zw2[i] = 1;
		}
		for (int i = 0; i <= 31; i++) {
			zw3[i] = zw1[i] & zw2[i];
			zw4[i] = zw3[i];
		}
		for (int i = num5[len]; i < 32; i++) {
			zw4[i] = 1;
		}

		//重新赋值
		int ss = 0, sss = 128;
		for (int i = ss; i <= ss + 7; i++) {
			num1[len] += zw3[i] * sss;
			sss /= 2;
		}
		ss += 8;
		sss = 128;
		for (int i = ss; i <= ss + 7; i++) {
			num2[len] += zw3[i] * sss;
			sss /= 2;
		}
		ss += 8;
		sss = 128;
		for (int i = ss; i <= ss + 7; i++) {
			num3[len] += zw3[i] * sss;
			sss /= 2;
		}
		ss += 8;
		sss = 128;
		for (int i = ss; i <= ss + 7; i++) {
			num4[len] += zw3[i] * sss;
			sss /= 2;
		}
		ip1[len] = 16777216 * num1[len] + 65536 * num2[len] + 256 * num3[len] + num4[len];

在此我是用的是先将127.0.0.1的网址先转化成二进制,根据/x的x值对其处理之后再进行与运算,最后赋值计算即可

优点:无,但是符合定义

缺点:代码量大

switch (ds1[len]) {
			case 'A':
				dp1[len] = ds1[len] - 55;
				break;
			case 'B':
				dp1[len] = ds1[len] - 55;
				break;
			case 'C':
				dp1[len] = ds1[len] - 55;
				break;
			case 'D':
				dp1[len] = ds1[len] - 55;
				break;
			case 'E':
				dp1[len] = ds1[len] - 55;
				break;
			case 'F':
				dp1[len] = ds1[len] - 55;
				break;
			default:
				dp1[len] = ds1[len] - 48;
		}
        

对协议号进行处理,由于无法(大概也是我不会),只能让每一位进行一个字符到整型的处理,然后再转化

最后就是数据比较的问题,由于代码实在太长,就不放了,最主要的就是ip地址的匹配,/32就是等于即可,/31就是等于两个数据即可,其他的就是在一个范围内进行一个判断,所以第二种计算ip网宽的方法除了能减少计算量,判断过程也能少写一点(又是快一百行)

#include 
#include 
using namespace std;

int main() {
	int a[10001], b[10001];
	int len = 0;
	ifstream file("ans1.txt");
	while ( ! file.eof() ) {
		file >> a[len];
		len++;
	}
	len = 0;
	ifstream fil("output.txt");
	while ( ! fil.eof() ) {
		fil >> b[len];
		len++;
	}
	int flag = 0;
	len --;
	for (int i = 0; i < len; i++) {
		if (a[i] != b[i]) {
			flag++;
			cout << i << "\n";
		}
	}
	cout << flag ;
	return 0;
}

然后就是这个check的代码可以把结果和ans进行对比,代码应该很简单的,就不多介绍了,不过看着错误数从上千到173,然后到11,最后到0的成就还是不错的

屏幕截图 2022-01-26 002031.jpg
屏幕截图 2022-01-26 002003.jpg

运行时间

时间大概0.3秒一个数据包,比较长了

学习过程

首先了解基本概念,然后文件的输入和输出,ip计算方法等等,写代码(第一版),协议号问题(第二版),传输协议问题(第三版),/31的bug(第四版也是最终版本)

需要解决的问题,最大问题就是需求没弄懂

1.模块化问题

我是没有将所有的东西模块化的,事实上就只有一个文件,我感觉没什么必要,小工程的情况下,而且是单人,整个的代码编写过程我都没有感觉算法哪里出问题,除了输入数据的处理很难受之外

2.代码量问题

如果使用scanf,printf的话会减少很多的代码。ip计算使用第二种方法的话也会再少很多。

3./main文件名的问题

问就是我不会了,建议直接打开我文件直接改代码文件名。【滑稽】

我的github:https://github.com/gudiffany/gudiffany

相关