任务一:幻方
幻方是一个行和、列和、对角线和均相等的方阵。要求一是编写一个程序读入文本文件,判断是否为幻方。
public static boolean isLegalMagicSquare(String fileName) throws FileNotFoundException {
FileReader f=new FileReader(fileName);
Scanner in = new Scanner(f);
//以下先读入文本的第一行,统计第一行元素个数作为方阵的维数
String line1= in.nextLine();
String[] sline1=line1.split("\t");
int n=sline1.length;
//以下按行读入文本,每读入一行后用split分隔,再转换成整数形式读入二维数组square
int[][] square=new int[n][n];
try {
for (int k=0;k<n;k++)
{
square[0][k]=Integer.valueOf(sline1[k]);
}
int i=1;
for (;in.hasNextLine();i++)
{
sline1=in.nextLine().split("\t");
if(sline1.length!=n)//检查每行元素个数是否都为n
{
System.out.println(fileName+":Illegal input.");
return false;
}
for (int k=0;k<n;k++)
{
square[i][k]=Integer.valueOf(sline1[k]);
}
}
if(i!=n)//检查行数是否为n
{
System.out.println(fileName+":Illegal input.");
return false;
}
}catch (Exception e){
System.out.println(fileName+":Illegal input.");
return false;
}
//输入合法,以下验证方阵是否满足Magic Square应有的性质
int[] num=new int[n*n];//用于检查方阵中是否1~n^2的所有整数均出现且仅出现一次
int sum=n*(1+n*n)/2;//若满足行和=列和=对角线和,则此常数=(1+2+...+n^2)/n=n*(1+n*n)/2,记为sum
for (int[] a: square)
{
for (int b: a)
{
num[b-1]++;
}
}
for (int t: num)
{
if(t!=1) {
System.out.println(fileName + " is not a Magic Square.");
return false;
}
}
int sum1,sum2,sum3=0;
for (int i=0;i<n;i++)//检验每行元素和及每列元素和
{
sum1=0;sum2=0;
for(int j=0;j<n;j++)
{
sum1+=square[i][j];
sum2+=square[j][i];
}
sum3+=square[i][i];
if(sum1!=sum||sum2!=sum) {
System.out.println(fileName + " is not a Magic Square.");
return false;
}
}
if(sum != sum3)//检查对角线元素和
{
System.out.println(fileName+" is not a Magic Square.");
return false;
} else {
System.out.println(fileName+" is a Magic Square.");
return true;
}
}
在main函数中调用该方法
要求二是阅读并改进一个给定的生成奇数阶幻方的函数
画出流程图:
对于n为偶数和n为负数的情况,程序报错的原因是数组越界。对于n为偶数时的分析如下:
按要求对函数进行扩展:
(1)将产生的幻方写入文件,使用PrintWriter的print方法进行写入操作。
值得注意的是写完之后要记得关闭文件
(2)对异常的处理
采用try catch来捕获并处理异常
省略的部分为原来给出的代码及写入文件部分
任务二:海龟图形
这部分主要是使用提供的海龟图形代码,调用它们以完成相应的任务
首先到给出的链接上下载代码,然后阅读帮助文档
程序首先要新建一个“海龟”作为画笔 DrawableTurtle turtle=new DrawableTurtle 默认朝向正上方
turtle.forward(int units) 将turtle沿当前方向移动units个单位并留下轨迹
turtle.turn(double degrees) 将turtle顺时针旋转degrees度,其中degrees采用角度制
turtle.color(PenColor color) 设置画笔颜色,PenColor为枚举类,包含十种颜色
第一个要完成的功能是画正方形
计算正多边形的内角及给定内角算正多边形的边数,套公式即可
画正多边形
接下来是计算从初始状态指向目标位置,要顺时针转过的度数。atan2(x,y)计算的是点(x,y)在极坐标下对应的角度,即从(x,y)与原点连线与x轴正方向的夹角,返回值为弧度制。
于是将原点取在初始位置。theta为在起始位置,方向朝正上方,欲指向目标位置要顺时针转过的角度,亦即从起始位置指向目标位置的“朝向”。
从起始位置指向目标位置的朝向theta,减去初始朝向currentBearing,即为要顺时针转过的角度。如果小于0,则加上一个360度。
然后是对一系列点的计算,给定点的x坐标xCoords和y坐标yCoords,开始时位于第一个点且朝向为正上,然后每次顺时针转到并直线运动到下一个点,计算这个过程中每次需要转过的角度。
可以反复调用上面的calculateBearingToPoint函数,维护一个变量sum表示当前朝向,转过一个角度turn后令sum=(sum+turn) mod 360
凸包问题,我的思路如下:
由于需要计算角度,且提供的点坐标为double型,故定义了一个dcalculateBearingToPoint方法,它与calculateBearingToPoint的唯一不同之处是它接受的点坐标为double型
个人艺术,我写的是从窗口中心随机选择一个方向出发,碰到边缘就反弹并改变画笔颜色。效果如下:
任务三:人际关系图
要求建立一个图结构来表示人际关系,节点为Person型。这里采用邻接表结构表示图。
首先建立一个Person类
visited属性用于在之后的搜索中判断该顶点是否被访问过。静态属性names用于存储已有的名字,以防止创建具有相同名字的Person对象。
FriendshipGraph类表示一个图,存储其包含的节点
由于FriendshipGraph是无向图,故添加边的时候要加两条有向边
采用BFS计算距离
标签:square,int,sum,System,构造,fileName,实验,println,软件 From: https://www.cnblogs.com/Y-Y-R/p/17399961.html