计算与软件工程 作业3

作业要求 链接
作业要求 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454
课程目标 发现代码问题
本次作业在代码改善方面帮助我实现目标 运行单元测试,进行改善调教
参考文献 1. https://www.cnblogs.com/xinz/p/3852177.html 2. https://blog.csdn.net/weixin_41768753/article/details/86562247
作业正文 https:////www.cnblogs.com/TG1999/p/12447971.html

编程作业

要求:
数组中最大子数组的和。

用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
程序运行结果如下:

单元测试,出现问题非常多,用vs2019,添加引用 对com组件的调用返回了错误的HRESULT E_FALL,尝试了一些教程,又出现'gacutil' 不是内部或外部命令,也不是可运行的程序这个问题,无法解决。
干脆使用vs2012来测试,重新创建,在测试cpp里出现n多问题。非常的头疼,最终解决方法是把源程序给拆开,一定要有头文件,不能想着放cpp里顺带写了就行。

修改包含目录,改为你写的程序所在文件夹,不要忘记引用程序文件。


测试里加入代码,写上头文件,运行,得到如下结果。

参考链接为链接2.
码云地址:https://gitee.com/TG1999/four_arithmetic_operations/tree/master/shuzu
代码附录在最下方。

博客作业

在链接1中进行了初步自我估测,发现自己欠缺良多,虽然学习过多种语言和软件,但是离心目中的状态还差的远,还需继续努力。

预习

我们讲的“代码规范”可以分成两个部分。

(1)代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。

(2)代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C/C++/Java/C#),但是也有通用的原则,这里主要讨论通用的原则。

复审的目的在于:

(1)找出代码的错误。如:

a. 编码错误,比如一些能碰巧骗过编译器的错误。

b. 不符合项目组的代码规范的地方。

(2)发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。

(3)发现算法错误,比如使用的算法不够优化。

(4)发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。

(5)发现可能改进的地方。

(6)教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。

结对编程,互相进步

要注意意见反馈,讨论方式

#include <cstdio>
#include<cstdlib>
#include<iostream>

#define MIN -99999
using namespace std;
typedef struct positionASum {//创建该结构体保存数组中的最低位,最高位,以及最大和 
	int low;
	int high;
	int sum;
}PositionASum;

PositionASum Max_Crossing_Arr(int a[], int low, int high, int mid) {//求跨越中点的最大子数组 
	int left_sum = MIN;//左半边的最大和 
	int sum = 0;//下标i所到之处的和 
	int i;
	int max_left = 0;//左半边的数组的某一个值的最大值 
	for (i = mid; i >= low; i--) {
		sum += a[i];
		if (sum > left_sum) {//若和值大于最大和则更新之 
			left_sum = sum;
			max_left = i;//记录最大值下标 
		}
	}
	//右半边类似 
	int right_sum = MIN;
	sum = 0;
	int j;
	int max_right = 0;
	for (j = mid + 1; j <= high; j++) {
		sum += a[j];
		if (sum > right_sum) {
			right_sum = sum;
			max_right = j;
		}
	}
	PositionASum ps;//返回跨越中点的最大子数组的最低位,最高位以及最大和 
	ps.low = max_left;
	ps.high = max_right;
	ps.sum = left_sum + right_sum;

	return ps;
}

PositionASum Max_Arr(int a[], int low, int high) { //求一个子数组的最大子数组(子数组和最大) 

	PositionASum left;
	PositionASum right;
	PositionASum mid;
	int midd;
	if (high == low) {//当数组仅有一个元素 
		PositionASum ps;
		ps.low = low;
		ps.high = high;
		ps.sum = a[low];
		return ps;
	}
	else {//递归,分治合并 
		midd = (low + high) / 2;
		//此处执行一次left
		left = Max_Arr(a, low, midd);//递归调用自身找到左半边的最大子数组 

		//此处执行一次right
		right = Max_Arr(a, midd + 1, high);//递归调用找到右半边最大子数组 

		//此处执行一次mid
		mid = Max_Crossing_Arr(a, low, high, midd);//找到跨越中点的最大子数组 

	}
	if (left.sum >= right.sum && left.sum >= mid.sum) {//左半边子数组最大则返回左半边子数组 
		return left;
	}
	else if (right.sum >= left.sum && right.sum >= mid.sum) {//返回右半边子数组 
		return right;
	}
	else {//返回跨越中点子数组 
		return mid;
	}
}

int main()
{
	int A[10] = { -1,4,0,1,-1,3,-2,8,-3,-5 };
	PositionASum result = Max_Arr(A, 0, 9);
	cout << "最大子数组的最低位为A[" << result.low << "]="<< A[result.low]<<" 最高位为A["<< result.high<<"]="<< A[result.high] << "  最大数组之和为:" << result.sum << endl;//输出结果
	return 0;
}
原文地址:https://www.cnblogs.com/TG1999/p/12447971.html