一、设计思想
我们的设计思路两步走,先实现重文本框里读取数组,然后再实现求最大子数组的和。
实现求最大数组的和时,我们的想法是任选二维数组两点,求该两点之间的二维数组的和,将所有可能遍历,求出最大子数组,并求出和。
二、实验代码
package com.minirisoft;
import java.util.*;
import java.io.*;
public class MaxTwoArray
{
public static void ShowArr(int arr[][],int line1,int line2,int row1,int row2)
{
for(int i=line1;i<=row1;i++)
{
for(int j=line2;j<=row2;j++)
{
System.out.print(+arr[i][j]+" ");
}
System.out.println();
}
}
public static int GetSum(int arr[][],int n,int m,int k,int l)
{
int sum=0;
for(int f=n;f<=k;f++)
{
for(int h=m;h<=l;h++)
{
sum+=arr[f][h];
}
}
return sum;
}
public static void main(String[] args) throws NumberFormatException, IOException
{
int y=0;
int x=0;
String line;//一行数据
int row1=0;
File file=new File("f:\\input.txt");//存放数组数据的文件
BufferedReader in=new BufferedReader(new FileReader(file));
int[][] arr1 = new int[5][20];//读取出的数组
int[][] arr = new int[5][20];//读取出的数组
while((line=in.readLine())!=null)
{
String[]temp=line.split(",");
for(int i=0;i<temp.length;i++)
{
arr1[row1][i]=(int) Double.parseDouble(temp[i]);
}
row1++;
}
in.close();
x=arr1[0][0];
y=arr1[1][0];
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
arr[i][j] = arr1[i+2][j];
}
}
System.out.println("文本里的数组为");
for(int i=0;i<x ;i++ )
{
for(int j=0;j<arr.length-1 ;j++ )
{
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
int sum=0;
int n;
int m;
int k;
int l;
Scanner sc=new Scanner(System.in);
int line1=0;
int line2=0;
int row2=0;
int row3=0;
int max=arr[0][0];
for(n=0;n<x;n++)
{
for(m=0;m<y;m++)
{
for(k=n;k<x;k++)
{
for(l=m;l<y;l++)
{
sum=GetSum(arr,n,m,k,l);
if(sum>max)
{
max=sum;
line1=n; //保存第一个数的行
line2=k; //保存第二个数的行
row2=m; //保存第一个数的列
row3=l; //保存第二个数的列
}
}
}
}
}
System.out.println("最大子数组的为:");
ShowArr(arr,line1,row2,line2,row3);
System.out.println("最大子数组的和为:"+max);
}
}
三、实验截图






四、心得体会。
这次合作充分体现了团队合作的伟大。因为做实验可以说处处碰壁,我们两个相互合作,探索,解决了所有问题。
首先在读入文本中二维数组时遇到很多问题,比如如何跳过逗号,读出说有数,如何读数时跳入下一行,如何读出数而不是字符。等等一系列的问题。
在求最大子数组时,用了算法,比如用实现一维数组时的那个算法等都不能实现,等等
但最后,终于经过我俩努力做出来了
五、小组成员:郭健豪,杨广鑫