zoukankan      html  css  js  c++  java
  • 计算与软件工程作业三

    计算与软件工程作业三

    作业要求 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454
    课程目标 单元测试
    此作业在哪个具体方面帮我实现目标 Visual Studio 2010
    作业正文 https://www.cnblogs.com/li-lingling/p/12455057.html
    码云链接 https://gitee.com/ling_ling_li/array/blob/master/3.cpp

    作业正文

    单元测试

    要求
    求数组中最大子数组的和:
    用类/函数来实现
    需求:希望返回 3 种信息
    最大子数组的和
    最大子数组开始的下标
    最大子数组结束的下标
    从文本文件中读输入的数据,熟悉文件操作, 文件有两种数据
    第一个数字:这次测试中有多少个数据, 数字后面是冒号。
    后续数字: 每个数据的值,用逗号隔开

    代码

    #include<iostream>
    #include<cstdlib>
    #define N 100
    using namespace std;
     
    //构造子数组结构
    typedef struct SArray
    {
        int Sdata;  //子数组中的数
        int start;  //子数组的起始位置
        int end;    //子数组的终止位置
    }SArray;
     
    //构造链表的存储结构
    typedef struct LNode
    {
        int data;   //数
        int position;   //数所在数组中的位置
        struct LNode *next; //指针
    }LNode, *LinkList;
     
    //创建循环链表
    void CreateList(LinkList &L, int Group[], int n)
    {
        L = new LNode;
        L->next = NULL;
        LNode *r;
        r = L;
        for (int i = 0; i < n - 1; i++)
        {
            LNode *p;
            p = new LNode;
            p->data = Group[i];
            p->position = i + 1;
            p->next = NULL;
            r->next = p;
            r = p;
        }
        LNode *p;
        p = new LNode;
        p->data = Group[n - 1];
        p->position = n;
        p->next = L->next;
        r->next = p;
    }
     
    //返回最大子数组
    SArray Compare(LinkList L, int Length)
    {
        SArray MaxSum[N][2];
        //MaxSum[N][0].Sdata表示前N-1个数中,最大的子数组
        //MaxSum[N][1].Sdata表示前N-1个数的最大的子数组和加第N个数的和与第N个数相比的最大值
        LNode *r;
        r = L->next;
        MaxSum[0][0].Sdata = MaxSum[0][1].Sdata = r->data;
        MaxSum[0][0].start = MaxSum[0][1].start = r->position;
        MaxSum[0][0].end = MaxSum[0][1].end = r->position;
        for (int i = 1; i < Length; i++)
        {
            if (MaxSum[i - 1][0].Sdata > MaxSum[i - 1][1].Sdata)
            {
                MaxSum[i][0].Sdata = MaxSum[i - 1][0].Sdata;
                MaxSum[i][0].start = MaxSum[i - 1][0].start;
                MaxSum[i][0].end = MaxSum[i - 1][0].end;
            }
            else
            {
                MaxSum[i][0].Sdata = MaxSum[i - 1][1].Sdata;
                MaxSum[i][0].start = MaxSum[i - 1][1].start;
                MaxSum[i][0].end = MaxSum[i - 1][1].end;
            }
            if (MaxSum[i - 1][1].Sdata + r->next->data > r->next->data)
            {
                MaxSum[i][1].Sdata = MaxSum[i - 1][1].Sdata + r->next->data;
                MaxSum[i][1].start = MaxSum[i - 1][1].start;
                MaxSum[i][1].end = r->next->position;
            }
            else
            {
                MaxSum[i][1].Sdata = r->next->data;
                MaxSum[i][1].start = r->next->position;
                MaxSum[i][1].end = r->next->position;
            }
            r = r->next;
        }
        if (MaxSum[Length - 1][0].Sdata > MaxSum[Length - 1][1].Sdata)
        {
            return MaxSum[Length - 1][0];
        }
        else
        {
            return MaxSum[Length - 1][1];
        }
    }
     
    //将含n个数的循环数组依次从各个点断开,产生n个含n个数组的单链数组
    SArray Divide(LinkList L, int length)
    {
        LinkList LGroup[N]; //头节点集合
        LNode *r;
        r = L;
        for (int i = 0; i < length; i++)
        {
            LGroup[i] = r;
            r = r->next;
        }
        SArray MaxGroup[N]; //分成的各个数组的最大子数组的集合
        for (int i = 0; i < length; i++)
        {
            MaxGroup[i].Sdata = Compare(LGroup[i], length).Sdata;
            MaxGroup[i].start = Compare(LGroup[i], length).start;
            MaxGroup[i].end = Compare(LGroup[i], length).end;
        }
        SArray Max = MaxGroup[0];   //各个数组的最大子数组和的最大值
        for (int i = 1; i < length; i++)
        {
            if (Max.Sdata < MaxGroup[i].Sdata)
            {
                Max.Sdata = MaxGroup[i].Sdata;
                Max.start = MaxGroup[i].start;
                Max.end = MaxGroup[i].end;
     
            }
        }
        return Max;
    }
     
    int main()
    {
        int Number[N];  //整数数组
        int length; //数组长度
        cout << "请输入一个整型数组:" << endl;
        cin >> Number[0];
        length = 1;
        while (getchar() != '
    ')
        {
            cin >> Number[length++];
        }
        LinkList L;
        CreateList(L, Number, length);
        cout << "该数组中的最大的子数组和为:";
        cout << Divide(L, length).Sdata << endl;
        cout << "该最大子数组的起始位置为:";
        cout << Divide(L, length).start << endl;
        cout << "该最大子数组的终止位置为:";
        cout << Divide(L, length).end << endl;
        system("pause");
        return 0;
    }
    

    运行结果

    push到远程仓库

    码云链接: https://gitee.com/ling_ling_li/array/blob/master/3.cpp

    设计单元测试,运行单元测试

    void TestMethod1()
    		{
    			//
    			// TODO: 在此处添加测试逻辑
    			//
    			 int array[]={-32,16,-3,27,-1,4,12,11,10,-9,18};
                Assert::AreEqual(85,Divide(L, length).Sdata);
                Assert::AreEqual(2,Divide(L, length).start);
                Assert::AreEqual(11,Divide(L, length).end);
    		};
    	};
    }
    

    回顾 简历

    作为信科学生,我们已深入了解了信息或计算科学的基本理论、方法与技能,大一的c加加编程,学习了浅显编程知识,大二java比较好掌握,能做一些比较简单的代码编辑,大三学习了数据库操作系统,asp网页设计,发现每一门学科都有着深层联系,例如matlab就可以用在很多问题的解决上。希望这一学期提高自己的自觉性,掌握好必备技能,提高编程能力。

    预习 3 两人合作

    代码风格的原则是:简明,易读,无二义性。
    复审的目的在于:找出代码的错误;发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的;发现算法错误,比如使用的算法不够优化;发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现;发现可能改进的地方。;传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。

    结对编程让两个人所写的代码不断地处于“复审”的过程,代码被不断地复审,变成一个互相督促的过程,每个人的一举一动都在两一个人的视线之内,所有的想法都要受到对方的评价。由于这种督促的压力,使得程序员更认真地工作。进而能提高团队工作生产效率,使产品得到最优效果。

  • 相关阅读:
    深入理解Java内存模型(JMM)
    Java基础知识①
    Java自旋锁的几种实现
    ConcurrentHashMap的CAS操作
    Java集合对比总结
    python模块--os模块
    python模块--random
    Datafactory 学习笔记
    Datafactory 实际使用案例
    Oracle三种排名函数使用
  • 原文地址:https://www.cnblogs.com/li-lingling/p/12455057.html
Copyright © 2011-2022 走看看