(二)MagicSquqre

在MagicSquqre.java文件中添加isLegalMagicSquare()函数,判断一个矩阵是否为MagicSquare。

MagicSquare说明:矩阵行数以及列数相同,且每行元素之和,每列元素之和以及对角线元素之和都应相等:

                      

1.我们需要从https://classroom.github.com/a/qL3Yd1XX获取1.txt, 2.txt, ..., 5.txt等5个测试文件,并将其添加到项目的指定路径:\src\P1\txt\;

2.判断是否为MagicSquare,返回true or false;

函数规约:

1)boolean isLegalMagicSquare(String fileName) 

2)在 main()函数中调用五次 isLegalMagicSquare()函数,将 5 个文本 文件名分别作为参数输入进去,看其是否得到正确的输出(true, false)。

3)需要能够处理输入文件的各种特殊情况,例如:文件中的数据不符合 Magic Square 的定义(行列数不同、并非矩阵等)、矩阵中的数字并非正 整数、数字之间并非使用\t 分割、等。若遇到这些情况,终止程序执行(isLegalMagicSquare 函数返回 false),并在控制台输出错误提示信息。 
 

实现实验过程

请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
1 Magic Squares
首先,编写一个方法,参数为文件名,该方法可以从文件中读入字符串,构建出矩阵,并判断该矩阵是否为magic square。同时,还必须判断特殊情况,如是否存在负数,是否存在小数点,是否存在行列不等,是否存在不是矩阵的情况,是否存在空格代替\t的情况。然后阅读给定的generateMagicSquar代码,明白代码是如何生成magic square的,并扩展代码,使其能够处理参数为偶数,数组越界等异常。
1.1 isLegalMagicSquare()
实现思路及过程:先定义一个字符串filename为相对路径,通过这个filename创建一个File对象file,以file为参数创建一个文件输入流,然后读取Byte类型数组,再将该数组用UTF-8编码为字符串。先用‘.’分割,判断有无小数,再用‘-’分割,判断有无负数,然后用‘\n’分割行,获取行数,再用‘\t’分割每一行,分割两次,一次用\t分割,一次用\t代替多个空格后用\t分割,比较两次分割结果判断有无空格代替\t的现象,分割后可获取每一行列数,判断行列是否相等和是否为矩阵。分割后构建矩阵,若符合上述条件,开始判断是否为magic square,遍历二维数组中每一个数,对相应存储行之和,列之和的数组累加,最后判断行列,对角线之和是否相等。

1.2 generateMagicSquare()

思路及过程:参数为一个奇数n,首先,判断参数,如果是负数或偶数,输出提示并作异常处理。创建一个nn的二维数组,也就是矩阵,依次往里填充1到nn的数字,起点为第一行的中间,依次向右上角移动一格,若遇到边界就返回到另一边,如遇到第一行,则跳到最后一行,遇到最后一列就跳到第一列,每输入n个数向下移动一格,从而填充完整个矩阵,然后将矩阵中的数字用\t和\n拼接为字符串,输入到6.txt中。在main函数中测试。
结果:

2 Turtle Graphics
利用给定的Turtle,Point,Action等类实现画正方形,计算正多边形内角,给定内角计算边数,给定起始方向和当前点,目标点计算转角,计算一些点的序列所需的转角List,求取凸包,画出一个自己的图形。
2.1 Problem 1: Clone and import
$ git init命令初始化
$ git remote add origin 添加远程仓库
$ git clone [url] lab1_1170300730clone远程代码到本地并存在lab1_1170300730中,url为:
https://github.com/rainywang/Spring2019_HITCS_SC_Lab1/tree/master/P2
$ git add.添加文件到仓库
$ git commit –m “”提交
$ git push上传到远程仓库

2.2 Problem 3: Turtle graphics and drawSquare
向前走然后转90°,循环四次即可。

2.3 Problem 5: Drawing polygons
思路及过程:利用calculateRegularPolygonAngle函数计算内角角度,进而求出外角作为转向的角度,边数为n,每次向前走,然后转向,循环n次。
结果:

2.4 Problem 6: Calculating Bearings
calculateBearingToPoint函数:以当前点为原点建立坐标系,则目标点可能在四个象限,先用atan函数求出角度,对这个角度在四个象限分别作处理,第一象限为90-a;第二象限90+a;第三象限270-a;第四象限270+a;再减去原来的角,判断正负,如果为负,+360。
calculateBearings函数:初始方向为0°,每次迭代用前一个点和当前点和当前方向,调用calculateBearingToPoint函数求出角度,加入结果的容器,调整当前方向,下一个点作为当前点,如此循环。
2.5 Problem 7: Convex Hulls
先找到最下方的点,然后求出剩余点到当前点的角,再按从小到大顺序排序,依次遍历每一个点,计算每次转的角度,若左转,就将下一个点加入栈,否则将栈顶点弹出,再次计算,知道转向为左转,当遍历完所有点,结束,返回点集。
2.6 Problem 8: Personal art

2.7 Submitting
在文件夹中鼠标右键Git Bush Here
窗口打开,输入git add.加入文件
输入git commit –m “注释信息”上传
git push origin master上传到远程仓库

boolean isLegalMagicSquare(String fileName) 函数实现过程:

 1.根据文件名访问并读取对应文件:

  1)已知文件存储在项目的\src\P1\txt\文件夹下,可利用相对路径访问文件并创建file对象;

  2)通过file对象读取文件大小filelongth,新建对应大小的byte[]数组filecontent存储文件内容;

  3)将读取的文件内容转化为"UTF-8"编码的字符串存储在content字符串中;

复制代码
String filename = "src/P1/txt/" + fileName;//构造文件路径
        String encoding = "UTF-8";//文件字符串编码规格
        String content = null;
        File file = new File(filename);//文件对象
        Long filelongth = file.length();
        byte[] filecontent = new byte[filelongth.intValue()];
        int cols = 0 , rows = 0;
        
        try{
            FileInputStream in = new FileInputStream(file);
            in.read(filecontent);
            in.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
        
        try{
            content = new String(filecontent,encoding);
        }catch(UnsupportedEncodingException e){
            System.err.println("The OS does not support " + encoding);//实时输出
            e.printStackTrace();
        }
复制代码

2.对文件内容进行分割从而得到所需数据

1)利用"\n"对字符串content进行分割,从而得到各行数据以及矩阵行数;

2)对数据进行处理,判断矩阵数据的合法性并分离出各数据的值同时得到各行各列以及对角线的和

3)通过各行各列以及对角线的和判断矩阵是否为MagicSquare

复制代码
 1         String line[] = content.split("\n");
 2         rows = line.length;    //the rows of the square
 3         cols = rows;
 4         int nums[][] = new int[rows][rows];
 5         int sumR[] = new int[rows];//各行和
 6         int sumC[] = new int[cols];//各列和
 7         int sumD[] = new int[2];//对角线和
 8         //默认初始化为0
 9         
10         for(int i = 0; i < rows;i++)//对数据进行处理,判断数据的合法性并分离出值
11         {
12             
13             if(line[i].split("\\.").length != 1)
14             {
15                 System.out.println("数据存在浮点数");
16                 return false;
17             }
18             
19             if(line[i].split("-").length > 1)
20             {
21                 System.out.println("数据存在负数");
22                 return false;
23             }
24             
25             String []data = line[i].split("\t");
26             
27             if(data.length != rows)
28             {
29                 if(i == 0)
30                     System.out.println("行列数不等");
31                 else
32                     System.out.println("不为矩阵");
33                 return false;
34             }
35             
36             for(int j = 0; j < rows ;j++)
37             {
38                 try{
39                     int num = Integer.valueOf(data[j]).intValue();
40                     nums[i][j]=num;
41                 }catch(NumberFormatException e){
42                     System.out.println("数据存在非法符号");
43                     return false;
44                 }
45                 
46                 sumR[i] += nums[i][j];
47                 sumC[j] += nums[i][j];
48                 
49                 if(i == j)
50                 {
51                     sumD[0] += nums[i][j];
52                 }
53                 
54                 if(i + j +1 == cols)
55                 {
56                     sumD[1] += nums[i][j];
57                 }
58             }
59         }
60         
61         if(sumD[0] != sumD[1])
62         {
63             return false;
64         }
65         
66         int sum = sumD[0];
67         
68         for(int i = 0; i<rows; i++)
69         {
70             if(sumR[i] != sum || sumC[i] != sum)
71                 return false;
72         }
73         
74         return true;
复制代码

main()函数测试代码

复制代码
public static void main(String args[]){
    MagicSquare magic = new MagicSquare();
    for(int i = 1 ; i<6 ; i++)
    {
        if(magic.isLegalMagicSquare(String.valueOf(i)+".txt"))
            System.out.println(i+":Yes");
        else{
            System.out.println(i+":No");
        }
    }
}
复制代码

要求2

阅读以下代码,将其加入你的 MagicSquare 类中作为一个静态函数,并试着 在 main()中测试它:

复制代码
    public static boolean generateMagicSquare(int n) 
    {      
        int magic[][] = new int[n][n];
        int row = 0, col = n / 2, i, j, square = n * n; 
        
        for (i = 1; i <= square; i++)
        {    
            magic[row][col] = i;
            if (i % n == 0)
                row++;
            else 
            {
                if (row == 0)
                    row = n - 1;
                else
                    row--;
                if (col == (n - 1)) 
                    col = 0;
                else    
                    col++;
            }
        } 
         
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
                System.out.print(magic[i][j] + "\t");
            System.out.println(); 
        }
        return true; 
    } 
复制代码

  为该函数绘制程序流程图,并解释它如何根据输入的参数(奇数 n)生成一 个 n×n 的 Magic Square。

  如果输入的 n 为偶数,函数运行之后在控制台产生以下输出: 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12

  at MagicSquare.generateMagicSquare(MagicSquare.java:17) 
  at MagicSquare.main(MagicSquare.java:121)

  如果输入的 n 为负数,函数运行之后在控制台产生以下输出: 
Exception in thread "main" java.lang.NegativeArraySizeException 

  at MagicSquare.generateMagicSquare(MagicSquare.java:11) 

  at MagicSquare.main(MagicSquare.java:121)

  请查阅 JDK 了解上述异常的含义,并分析该函数为何会产生这些异常(注: 我们将在 Lab4 中训练异常处理机制)。

  对该函数做扩展:(1) 将产生的 magic square 写入文件\src\P1\txt\6.txt 中;(2) 当输入的 n 不合法时(n 为偶数、n 为负数等),不要该函数抛出异常 并非法退出,而是提示错误并“优雅的”退出——函数输出 false 结束。

   利用你前面已经写好的 isLegalMagicSquare()函数,在 main()函数判断 该函数新生成的文本文件 6.txt 是否符合 magic square 的定义。 
 
项目的目录结构:

  

程序流程图:

猜你喜欢

转载自www.cnblogs.com/szjk/p/11061206.html