作业要求 | 链接 |
---|---|
作业要求 | 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;
}