最近在看Junit,正好上一篇写了螺旋矩阵算法,顺便写个测试代码。
创建Junit,我用的是eclipse,它自带Junit。所以比较简单,不需要安装
方法就是先右键java项目,选Build Path,AddLibraries,打开之后选Junit。
然后你会发现在类里面多了个luoxuanTest,然后编写代码。因为用Junit测试需要用一个返回值,所以我稍微改了一下luoxuan.java的代码,加了一个返回值。
luoxuan.java的代码:
package news;
import java.util.Scanner;
public class luoxuan {
public static final int NMAX = 100;
public static void main(String [] arg){
/*
* 编程输出螺旋方阵.
螺旋方阵是指将从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。如4阶的螺旋方阵形式如下:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
要求:1)从键盘输入螺旋方阵的阶数
2)代码有注释
3)对算法的思路给出文字描述
*/
System.out.println("请输入螺旋矩阵阶数:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[][] arrays=new int[NMAX][NMAX];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
arrays[i][j] = 0;
System.out.println("从矩阵的左上角开始从数字1开始螺旋:");
getluoxuan1(arrays,n);
display(arrays,n);
System.out.println();
System.out.println("从矩阵的右上角开始从数字1开始螺旋:");
getluoxuan2(arrays,n);
display(arrays,n);
System.out.println();
System.out.println("从矩阵的左上角开始从数字的最大值开始螺旋:");
getluoxuan11(arrays,n);
display(arrays,n);
System.out.println();
System.out.println("从矩阵的右上角开始从矩阵的最大值开始螺旋:");
getluoxuan22(arrays,n);
display(arrays,n);
}
static int[][] display(int[][] arrays, int n) {
// TODO Auto-generated method stub
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
System.out.printf("%5d",arrays[i][j]);
System.out.println();
}
return arrays;
}
//核心算法:
static int[][] getluoxuan1(int [][]arrays,int n){
// System.out.println("从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:");
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++) //从左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j--;j>=c;j--)//从右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou++;
}
c++;
}
//System.out.println(arrays[2][3]);
return arrays;
}
static int[][] getluoxuan11(int [][]arrays,int n)
{
// System.out.println("从矩阵的左上角开始从数字的最大值开始螺旋");
int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++) //从左到右
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j--;j>=c;j--)//从右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou--;
}
c++;
}
return arrays;
}
static int[][] getluoxuan2(int [][]arrays,int n)
{
// System.out.println("从矩阵的右上角开始从数字1开始螺旋:");
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{
i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--) //从右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j++;j<n-c;j++)//从左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou++;
}
c++;
}
return arrays;
}
static int[][] getluoxuan22(int [][]arrays,int n)
{
// System.out.println("从矩阵的右上角开始从矩阵的最大值开始螺旋:");
int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{
i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--) //从右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j++;j<n-c;j++)//从左到右
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou--;
}
c++;
}
return arrays;
}
}
测试代码:luoxuanTest.java:
package news;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class luoxuanTest {
public static final int[][] ARRAYS=new int[100][100];
public static final int N=4;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is setUpBeforeClass()...");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is tearDownAfterClass()...");
}
@Before
public void setUp() throws Exception {
int ii,jj;
for(ii=0;ii<100;ii++)
for(jj=0;jj<100;jj++)
ARRAYS[ii][jj] = 0;
System.out.println("this is setUp()...");
}
@After
public void tearDown() throws Exception {
System.out.println("this is tearDown()...");
}
/*
@Test
public final void testMain() {
fail("Not yet implemented"); // TODO
}
@Test
public final void testDisplay() {
fail("Not yet implemented"); // TODO
}
*/
@Test
public final void testGetluoxuan1() {
System.out.println("测试最小值在左上角的算法是否正确:");
int result = (luoxuan.getluoxuan1(ARRAYS, N))[2][3];
assertEquals("测试最小值在左上角的算法不正确",6, result);
}
@Test
public final void testGetluoxuan11() {
System.out.println("测试最大值在左上角的算法是否正确:");
int result = (luoxuan.getluoxuan11(ARRAYS, N))[2][3];
assertEquals("测试最大值在左上角的算法不正确",11, result);
}
@Test
public final void testGetluoxuan2() {
System.out.println("测试最小值在右上角的算法是否正确:");
int result = (luoxuan.getluoxuan2(ARRAYS, N))[3][2];
assertEquals("测试最小值在右上角的算法不正确",9, result);
}
@Test
public final void testGetluoxuan22() {
System.out.println("测试最大值在右上角的算法是否正确:");
int result = (luoxuan.getluoxuan22(ARRAYS, N))[3][2];
assertEquals("测试最大值在右上角的算法不正确",8, result);
}
}
然后发现是绿色的,说明正确。