软件工程课堂练习

根据要求,本次作业结对编程完成。与队友相互思考分析题目,最终完成。蒋陵郡负责完成代码的实现,

我主要负责编程过程中的一些小问题的判断和分析。

题目:返回一个整数数组中最大子数组的和

要求:

输入一个一维整形数组,数组里有正数也有负数。

一维数组首尾相接,象个一条首尾相接带子一样。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

求所有子数组的和的最大值。

设计思想

用户自定义数组长度并依次输入数组元素,设一个全局变量初始化为零的数组a[N],N=10000;

1.因为该数组首尾相接可视作一个环,那么我们需要在一个合适的位置断开,把数组元素展成一条笔直的带子。

(1).设用户自定义数组长度为m,输入数组各元素值a[1]~a[m],在for循环中加入代码a[m+i]=a[i];(即复制输入的数组接在该数组最后一个数后面,其中i为循环变量)

例:若输入的数组为 1,-2,3,-4,5   那么实际生成的数组为1,-2,3,-4,5,1,-2,3,-4,5

(2).找出合适的位置断开,这个合适的位置即整个数组的最小值处,写一个函数找出输入的数组的最小值使该数排在第一位。

例:输入数组为 1,-2,3,-4,5   那么找出最小元素-4的位置并使其在第一位,所以实际生成并计算的数组为(下划线部分):1,-2,3,-4,5,1,-2,3,-4,5

2.在合适位置断开确定好数组后,根据第一次课堂作业(不考虑首尾相接的情况)计算

(1).从数组第一个不为零的元素累加,设累加值为S,为判断数组第一个不为负的元素,S需要初始化为零;

(2).定义另一个整形变量sum存储当前最大累加值S,sum需与累加值比较,所以sum应初始化为零  (1)每一次累加获得一个S后判断,若S为负,舍去使累加值为负的数组元素,继续从下一个数组元素开始累加(2)若sum<S,把S赋值给sum,S继续累加(3)如此循环直到数组元素取尽。

(3).最后输出的sum为子数组最大值。

出现的问题

第一次编码找出的所谓“合适”位置是累加到某个数使得累加值为负的那个元素,另其在第一位。

但是如果没有某个值累加使得累加值小于零,那么结果出错。

例:1,2,-2,4,5   累加到-2使得前面三个元素的累加值为1不为零,所以计算得出的结果为9,而应该得出的结果为12

程序源代码

#include<iostream>
using namespace std;
int a[10000];//全局变量(初始化数组a所有元素为零)

int Find(int m,int a[])//找出输入数组中最小值的下标位置c并返回
{
    int min,c=0,i;//c初始化为零是因为如果输入数组的第一个元素为最小值,将报错c未初始化
    min=a[0];
    for(i=0;i<m;i++)
    {
        if(a[i]<min)
        {
            min=a[i];
            c=i;
        }
    }
    return c;
}
int Sum(int m,int a[])//以数组中下标为c的元素为首接成环,求出最大子数组的值sum
{
    int i;
    int s=0;
    int sum=0;
    for(i=Find(m,a);i<m+Find(m,a);i++)
    {
        if(s<0)
            s=a[i];//舍去使子数组和小于零的数组元素
        else
            s=s+a[i];//临时存放数组元素的累加值
        if(sum<s)
            sum=s;//存放当前最大子数组的和
    }
    return sum;
}
void InputAndDisplay()//输入数组元素并输出子数组的最大值(首尾相接成环的数组)
{
    int i,m;
    cout<<"请输入数组长度:\n";//自定义数组长度
    cin>>m;
    for(i=0;i<m;i++)
    {
        cout<<"请输入第"<<i+1<<"个数:";
        cin>>a[i];
        a[i+m]=a[i];//复制输入的数组接在该数组最后一个数后面
    }
    cout<<"\n该数组首尾相接后子数组和的最大值为:"<<Sum(m,a)<<"\n";
}

void main()
{
    InputAndDisplay();
}

结果截图:

时间: 2024-10-07 04:32:33

软件工程课堂练习的相关文章

软件工程课堂作业04

软件工程课堂作业04 源代码: 1 package jian; 2 import java.io.*; 3 import java.util.Scanner; 4 public class Point3D{ 5 public static int Lenght(int list[],int lenght) 6 { 7 int i,max; 8 max=list[0]; 9 for(i=1;i<=(lenght-1);i++) 10 { 11 if(list[i]>max) 12 { 13 ma

软件工程——课堂改进意见

这学期有一门必修课程<软件工程>.老师是软件工程专业的系主任王建民老师.从上第一节<软件工程>课起.就发现了王老师讲课特点:1)上课不准睡觉,抓到睡觉的同学会提出批评.2)上课不准玩手机3)上课带电脑,会有相应的课堂练习4)讲课激情洋溢,上课氛围从不会沉闷.感觉课堂练习还是蛮重要的,像我们之前听的课或现在正在进行的课程,全都是老师在讲台上讲,同学们在下面死气沉沉的听,一节课下来几乎不动手,不动脑,就只是机械的抬头看黑板,看多媒体.由于大一的C++基础比较薄弱,加上学完这门课程后好久

软件工程课堂练习-随机生成30道四则运算练习题

习题要求:随机生成30道四则运算题 以下是程序代码: 1 #include "stdafx.h" 2 #include "stdio.h" 3 #include "time.h" 4 #include "stdlib.h" //随机器函数头文件 5 6 void print() 7 { 8 srand((int)time(0)); 9 for(int i=0;i<=29;i++) 10 { 11 int x; 12 in

软件工程课堂练习四则运算续篇

一.设计思想 根据题目的新要求我做了以下更改 1.为使用户可定制数量以及打印方式,可使用户输入打印方式.数量的参数来进行设置2.参数设置:提示用户是否有乘除法运算,是/否用户可输入[1/0]表示. 提示用户是否有负数参与运算: 提示用户参与运算的数值范围: 提示用户输入出多少道题目: 提示用户输入题目输出列数: 二.源代码 1 #include "stdafx.h" 2 #include "stdio.h" 3 #include "time.h"

软件工程课堂作业(七)续——电梯调度之整体设计

一.题目要求: 1.可以获得电梯和乘客所在楼层: 2.可以根据乘客的需求到达想到达的楼层. 二.设计思路: 1.通过用户输入可以获取乘客和电梯所在楼层: 2.通过循环,输出电梯向上/向下走的过程. 三.源代码: 1 // 电梯调度——胡亚宝 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 8 9 int _tmain() 10 { 11 int a,b,c,m,i; 12

软件工程课堂训练——结对开发之环数组最大和

一.题目及要求: 题目:返回一个整数数组中最大子数组的和 要求(新加):①如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:②同时返回最大子数组的位置. 结对人员:胡亚宝  焦燕 二.设计思路: 我们要解决两个问题:求出环数组中最大的子数组:并且定位出该子数组的位置,把它们的名称输出来.要解决这两个问题,我们从以下两个方面入手: ①求出最大子数组:将数组数值按顺序排好称为“一趟”,每求出一趟的最大子数组后,将第一个数值放到最后一个

软件工程课堂训练——数组之大数溢出

一.题目及要求: 题目:返回一个整数数组中最大子数组的和. 要求(新加):①要求程序必须能处理1000个元素:②每个元素都是int32类型的. 结对人员:胡亚宝  焦燕 二.设计思路: ①处理1000个元素的问题,我们将数组的长度设为1000,其中的每一个元素都是随机生成,因为这道题目重点是溢出问题,所以我们将它们设的值都比较大: ②现阶段我们将它们都设为int型,超过表示范围时,系统会自动转化成负值,判断后将显示溢出. 1 // 结对开发— 胡亚宝 焦燕 2 3 #include "stdaf

软件工程课堂练习:返回一个一维整数数组中最大子数组的和

题目:返回一个一维整数数组中最大子数组的和.要求:输入一个一维整形数组,数组里有正数也有负数.一维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 此次何琳琳负责程序分析,代码编程,张一博负责代码复审和代码测试计划. 经分析讨论设计思路如下: 1.定义一个长为20的数组,先对前10个数进行初始化,后10个数等于前10个数: 2.设置长度为10的循环依次以前十个数为头进行最大子数组的计算: 3,再设置一个数组用来存储

软件工程——课堂练习“找水王”

题目: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖 数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 一.设计思想 如果ID表是有序的,由于水王ID超过总贴数一半,则在有序表中的N/2项一定是水王的ID,此时算法的复杂度为O(n*n) 若想要时间复杂度为O(n),可以遍历ID表,两两相邻的ID进