求一个有一千个元素的整数数组的最大子数组的和
小组成员:司宇,滕达
设计过程:
设计界面:
在c#界面添加一些控件。
程序设计:
1.使用for循环和取随机数的函数产生一千个随机数并且将其赋值到数组中。
2.封装获取最大子数组和的子函数;
3.设计主函数调用封装好的子函数;
4.将最大子数组和在textbox中显示出来;
调试和运行程序:
遇到的问题:
1.没办法随意设定随机数的范围。
2.主函数需要的数值类型和子函数定义的数值类型不一致
3.调试的时候进行一次调试以后就无法进行第二次调试。解决方案:
1.给随机数的上下限分别用两个可变量来定义,并且通过外界TextBox来进行输入;
2.主函数中的数组定义的是double类型,子函数定义的是int类型,在调用子函数之前将数组的类型转化为int类型;
3.设计一个清屏键,每次调试完以后,使用这个键清除文本,方便进行第二次调试。
几次运行的结果:
源程序:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace _1000个数字的整数组的最大子数数组和
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//求一个整数数组任意的连续子数组的最大和
public int Sum(int[] a)
{
if (null == a)
{
return 0;
} //判断数组是否为空,如果是空的话,令返回值为0
if (a.Length == 1)
{
return a[0];
} //判断数组里面是否只有一个元素,是,则返回此元素
int sum = a[0];
int temp;
for (int i = 0; i < a.Length - 1; i++)
{
temp = a[i]; //开始从a[i]往它之后遍历,从a[i]开始累加,逐一跟sum对比
for (int j = i + 1; j < a.Length; j++)
{
temp = temp + a[j];
if (sum < temp)
{
sum = temp; //得出最大的一个Sum值,并且返回Sum
}
}
}
return sum;
}
private void button1_Click(object sender, EventArgs e)
{
Random random = new Random();
double min, max;
min = Convert.ToDouble (textBox2.Text);
max = Convert.ToDouble (textBox3.Text);
int[] a = new int[1000];
for (int i = 0; i < 1000; i++)
{
a[i] = random.Next((int)min, (int)max);
richTextBox1.AppendText(Convert.ToString(a[i])+" ");
}
int sum=Sum (a); //调用定义的封装好的子程序求和
textBox1.Text = Convert.ToString(sum);
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
richTextBox1.Text="";
textBox1.Text = "";
}
private void button3_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}
}