my first blog
前言:
- 第一次
(1) 第一题身体质量指数(BMI)测算
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。
主要考验我们Java语言最基本的输入、输出、按照不同的数据类型定义不同的数据以及数据的运算,还有就是if语句的使用。相对来说本题难度不大;
(2) 第二题长度质量计量单位换算
长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。
也主要考验我们Java语言最基本的输入、输出、按照不同的数据类型定义不同的数据以及数据的运算,
(3) 第三题,奇数求和
计算一个数列中所有奇数的和。
主要考验我们Java语言最基本的输入、输出、按照不同的数据类型定义不同的数据以及数据的运算和if语句、for语句的使用;
(4) 第四题,房产税务计算
房屋交易在日常生活中非常常见的事情,房屋交易时要额外支付各种税费,按2022年房产交易新政策的规定买房人应缴纳税费包括:
1、契税:首次购房评估额90平(含)内1%、90平-144平(含)内1.5%,超过144平或非首 次3%,买方缴纳。
2、印花税:房款的0.05%。
3、交易费:3元/平方米。
4、测绘费:1.36元/平方米。
5、权属登记费及取证费:一般情况是在200元内。
(5)第五题,游戏角色选择 (14 分)
一款网游中包括4个种族:人类、精灵、兽人、暗精灵,每个种族包含三种角色:战士、法师、射手。玩家新建人物时需要选择种族和角色。请编写角色选择程序。
主要考验我们Java语言最基本的输入、输出、按照不同的数据类型定义不同的数据以及数据的运算和if语句的运算……
(6)学号识别 (10 分)
学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号
(7)巴比伦法求平方根近似值 (10 分)
巴比伦法求n的近似值可以用以下公式:
nextGuess = (lastGuess+n/lastGuess)/2
程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。
本题要求:nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同
(8)二进制数值提取 (10 分)
在一个字符串中提取出其中的二进制数值序列。
(9)判断三角形类型 (20 分)
输入三角形三条边,判断该三角形为什么类型的三角形。
总之,第一次作业主要是考基本内容,相对难度较低,虽然题目较后几次来说数量更多,但是题量并不算大。
- 第二次作业,
(1)字母-数字转换 (11 分)
输入一个由英文字母组成的字符串(大小写均可),将所有英文字母转换成它们在字母表中的序号,例如:“AbbcD”转换为“12234”。
(2)串口字符解析 (40 分)RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
(3)String的格式判断与内容提取 (10 分)学校学生学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,
编写程序处理用全院学生学号连接起来的长字符串,学院编号为20,包括17、18、19、20四个年级,请从字符串中提取特定两个班级202017班、202061班同学的学号后四位输出,输出编号之间用空格分隔,不换行。
注意:需要排除非法输入。一共只有三个题,更侧重于对我们if语句、for循环的考察,相对第一次来说难度加大了一点,但是题目很少。
- 第三次作业
(1)点线形系列1-计算两点之间的距离 (10 分)
输入连个点的坐标,计算两点之间的距离
(2)点线形系列2-线的计算 (42 分)
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。
(3)点线形系列3-三角形的计算 (48 分)
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"
同样,也只有三个题,但是会使用到一些比较深入的代码,很多比较深入的语句,需要很多次重复对格式的判断,导致在刚开始写的时候无从下手,前 期在查资料,后期在调试,导致时间不够用,测试的点又非常多,写完的代码甚至不如直接输入报错得到的分多,相对来说工作量比较大。
设计与分析:
- 第一次作业
(1) 身体质量指数(BMI)测算:
① 输入数据-体重以及身高
Scanner in = new Scanner(System.in);
double w = in.nextDouble();
double h = in.nextDouble();
② 判断数据是否符合实际-体重和身高是否符合人体标准
if(w>727||w<0||h>2.72||h<0)
System.out.println("input out of range");
③ 判断数据属于哪一范畴-bmi的数值大小判断该人的健康情况
if(bmi<18.5)
System.out.println("thin");
第一种情况-瘦弱
else if(bmi<=24.0&&bmi>=18.5)
System.out.println("fit");
第二种情况-健康
else if(bmi<=28.0&&bmi>=24.0)
System.out.println("overweight");
第三种情况-超重
else if(bmi>=28.0)
System.out.println("fat");
第四种情况-肥胖
④ 输出结果

(2) 长度质量计量单位换算
① 输入数据-千克与米
float c=in.nextFloat();
float d=in.nextFloat();
② 转换-磅、英寸
a = (float) (c/0.45359237);
b = (float) (d/0.0254);
③ 输出

(3) 奇数求和
① 输入数组-
in = new Scanner(System.in);
int[] a = new int[10];
for(int i=0;i<10;i++)
{
a[i]=in.nextInt();
}
遍历循环-输入10个数据
② For循环-
for(i=0;i<10;i++)
{
if (a[i]%2 != 0)
{
sum=sum+a[i];
}
}
遍历循环(2)-判断所输入的每一个数字是否为奇数。
③ 输出

(4) 房产税费计算
① 输入数据-
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
float d = in.nextInt();
注意:不同的数据要使用不同的变量名称
第几次购房(整数)、房款(整数/单位万元)、评估价(整数/单位万元)、房屋面积(浮点数/单位平方米)
② 判断-契税:首次购房评估额90平(含)内1%、90平-144平(含)内1.5%,超过144平或非首 次3%,买方缴纳。
if(a==1)
{
if(d<=90)
m=(float)(c*100);
else if(d<=144)
m=(float)(c*150);
else
m=(float)(c*300);
}
else
m=(float)(c*300);
③ 输出

(5) 游戏角色选择
① 输入数据-
int a = in.nextInt();
int b = in.nextInt();
② 判断-
if(a>4||a<1||b>3||b<1)
{
System.out.print("Wrong Format");
}
所选择的种族、角色的名称,以空格分隔。输出“Wrong Format
else
{
switch(a)
{
case 1: System.out.print("人类 ");
break;
case 2: System.out.print("精灵 ");
break;
case 3: System.out.print("兽人 ");
break;
case 4: System.out.print("暗精灵 ");
break;
}
种族选项设定为:1、人类 2、精灵 3、兽人 4、暗精灵
switch(b)
{
case 1: System.out.print("战士");
break;
case 2: System.out.print("法师");
break;
case 3: System.out.print("射手");
break;}
角色选项设定为:1、战士 2、法师 3、射手
③ 输出

(6) 学号识别
① 输入-学号
int xh= in.nextInt();
② 判断-前两位是入学年份(省略了20);第3、4位是学院编号
if(xh>100000000 ||xh<10000000)
{
System.out.print("Wrong Format");
}
输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入
else
{
int a,b,c,d;
a = xh/1000000;
b = (xh-a*1000000)/10000;
c = (xh-a*1000000-b*10000)/100;
d = xh-a*1000000-b*10000-c*100;
if(b!=1&&b!=2&&b!=3&&b!=20)
System.out.print("Wrong Format");
else if (b==1)
System.out.printf("入学年份:20%02d年\n学院:材料学院\n班级:%02d\n学号:%02d",a,c,d);
else if (b==2)
System.out.printf("入学年份:20%02d年\n学院:机械学院\n班级:%02d\n学号:%02d",a,c,d);
else if (b==3)
System.out.printf("入学年份:20%02d年\n学院:外语学院\n班级:%02d\n学号:%02d",a,c,d);
else if (b==20)
System.out.printf("入学年份:20%02d年\n学院:软件学院\n班级:%02d\n学号:%02d",a,c,d);
}
}
01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。
③ 输出

(7) 巴比伦法求平方根近似值
① 输入数据-两个浮点数,以空格分隔,第一个是n,第二个是lastGuess最初的猜测值。
float a=in.nextFloat();
float b=in.nextFloat();
② 判断-nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同
if(a<0||b<=0)
{
System.out.println("Wrong Format");
}
若输入的两个数中包含负数或者lastGuess初始输入为0,认定为非法输入
else
{
while (y-b<=-0.00001||y-b>0.00001)
{
b=y;
y=(float)((b+a/b)/2);
}
System.out.println(b) ;
}
nextGuess = (lastGuess+n/lastGuess)/2,程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值
③ 输出n的平方根近似值:lastGuess。

- 第二次作业
(1) 字母-数字转换
① 输入-一个由英文字母组成的字符串(大小写均可)
String s = in.nextLine();
② 循环+判断-将所有英文字母转换成它们在字母表中的序号
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if((int)s.charAt(i)<65||(int)s.charAt(i)>90&&(int)s.charAt(i)<97||(int)s.charAt(i)>122)
{
b = false;
break;
}
}
判断是否含有不为字母的违法输入
if (b){
for(int i = 0; i < s.length(); i++)
{
if((int)s.charAt(i)>=65&&(int)s.charAt(i)<=90)
System.out.print((int)s.charAt(i)-64);
else if((int)s.charAt(i)>=97&&(int)s.charAt(i)<=122)
System.out.print((int)s.charAt(i)-96);
}
遍历循环将字母转换为其在字母表中所对应的数字
}
else {
System.out.print("Wrong Format");
}
判断是否非法输出
③ 输出-所有英文字母转换成它们在字母表中的序号

(2) 串口字符解析
① 输入-由0、1组成的二进制数据流。
String s=in.next();
② 判断+for循环
if (s.length()>=11&&x(n,s.length()))
{
String p;
for (int i=0;i<s.length();i++)
{
int b=0;
if(n[i]=='0'&&s.length()-i>=11)
{
p=s.substring(i+1,i+1+8+2);
for(int j=0;j<8;j++)b+=p.charAt(j);
final boolean y=((b&1)==1&&p.charAt(8)=='0')||((b&1)==0&&p.charAt(8)=='1');
if (y)
{
if (p.charAt(9)=='1')
System.out.println(m++ +":"+p.substring(0,8));
else
System.out.println(m++ +":"+"validate error");
}
某个数据的结束符不为1
else if(!(p.charAt(9)=='1'))
System.out.println(m++ +":"+"validate error");
数据结束符和奇偶校验均不合格,
else System.out.println(m++ +":"+"parity check error");
某个数据奇偶校验错误
i+=(8+2);
}
}
}
}
}
③ 定义x-
private static boolean x(char[] abc,int len)
④ 循环-
for (int i=0;i<len;i++)
if (abc[i]=='0')
{
z=true;
break;
}
return z;
遍历循环,判断所有数据
⑤ 输出-过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。

(3) String的格式判断与内容提取

① 输入-全院学生学号组成的长字符串(学号之间无分隔)
String s = in.nextLine();
② 判断+for循环
if (x.length()%8==0)
{
String[][] z = new String[y][8];
for (int i = 0; i < y; i++)
{
for (int j = 0; j < 8; j++)
{
char a = x.charAt(i * 8 + j);
String s = String.valueOf(a);
z[i][j] = s;
}
if ("2".equals(z[i][0])&&"0".equals(z[i][1])&&"2".equals(z[i][2])&&"0".equals(z[i][3])&&"1".equals(z[i][4])&&"7".equals(z[i][5]))
{
m = getJudge(m,z,i);
}
if ("2".equals(z[i][0])&&"0".equals(z[i][1])&&"2".equals(z[i][2])&&"0".equals(z[i][3])&&"6".equals(z[i][4])&&"1".equals(z[i][5]))
{
m = getJudge(m,z,i);
}
}
}
else
{
System.out.println("Wrong Format");
}
}
遍历循环,判断是否为202017班、202061班同学,并提取两个班级同学的学号后四位
③ 定义getJudge-
private static int getJudge(int n,String[][] s,int i)
④ For循环+判断
for(int k = 4; k < 8; k++)
{
if(k == 4)
{
if(n == 0)
n++;
else
System.out.print(" ");
}
使输出的学号之间以空格分隔

- 第三次作业
(1) 点线形系列1-计算两点之间的距离
① 输入-4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。
Point A = new Point();
Point B = new Point();
② 判断-输入格式是否正确
if(k(q)){
A.x = Double.parseDouble(q[0]);
B.x = Double.parseDouble(q[1]);
A.y = Double.parseDouble(q[2]);
B.y = Double.parseDouble(q[3]);
System.out.println(A.Distance(B));
}
输入两个点的x,y坐标,依次是x1、y1、x2、y2,每个点的x,y坐标以英文“,”分隔。
else
return ;
③ 定义k
static boolean k(String[] q)
④ For循环+判断-判断是否格式正确
for(int i=0;i<q.length;i++) {
if (!q[i].matches("^([+-]?\\\\d+)(\\l.\\\\d+)?")){
System.out.println("Wrong Format");
return false;
}
else
{
r++;
}
⑤ 判断-输入格式合法但坐标点的数量超过两个
if(p != 2){
System.out.print("wrong number of points\n" );
return false;
}
⑥ 定义point-存入横坐标纵坐标
public static class Point
⑦ 输出-计算所得的两点之间的距离

(2) 点线形系列2-线的计算
① 输入两点坐标-
定义点-判断是否为两点-定义点函数
② 计算斜率-
若线条垂直于X轴,输出"Slope does not exist"。
③ 输入三个点坐标-
定义点-判断是否为三个点=定义点函数
④ 输出第一个点与另外两点连线的垂直距离。
⑤ 判断三个点是否在一条线上-
输出true或者false。
⑥ 输入四个点坐标-
定义点-判断是否为四个点-定义点函数
double x1 = Double.parseDouble(strArr[0]);
double y1 = Double.parseDouble(strArr[1]);
double x2 = Double.parseDouble(strArr[2]);
double y2 = Double.parseDouble(strArr[3]);
⑦ 判断前两个点所构成的直线与后两点构成的直线是否平行-
输出true或者false.
⑧ 计算输出前两个点所构成的直线与后两点构成的直线的交点坐标-
x、y坐标之间以英文分隔","
⑨ 输出交叉点是否在两条线段之内(不含四个端点)的判断结果-
(true/false),
⑩ 判断结果与坐标之间以一个英文空格分隔。
若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。

⑪ 定义点函数
判断两数字之间是否为逗号
(3) 点线形系列3-三角形的计算
① 输入三个点坐标-
判断是否是三个点-判断三点是否在同一条直线上
② 判断是否是等腰三角形、等边三角形-
判断结果输出true/false,两个结果之间以一个英文空格符分隔。
③ 输出周长、面积、重心坐标-
三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
public static void main(String[] args)
Scanner in = new Scanner(System.in);
String s = in.nextLine();
dataFormat3 d = new dataFormat3(s);
boolean m = d.judge(s)
④ 输出是钝角、直角还是锐角三角形-
依次输出三个判断结果(true/false),以一个英文空格分隔,
⑤ 输入五个点坐标,
判断是否是五个点-判断五个点中任意三点是否在同一条直线上
⑥ 输出前两个点所在的直线与三个点所构成的三角形相交的交点数量-
如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
⑦ 输入四个点坐标-
判断是否是四个点-判断四个点中任意三点是否在同一条直线上
⑧ 输出第一个是否在后三个点所构成的三角形的内部-
(输出in the triangle/outof triangle)。

⑨ 必须使用射线法-
原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"
踩坑心得:
- 我在提交源码的过程中,遇到了很多不同的问题。在第一次作业中,虽然题目比较简单,但是很多琐碎的测试点和一些不存在的情况都有出现问题,要改了再改,不仅可能不能过一个测试点,甚至可能推翻别的测试点。
- 经常需要自己一遍又一遍的测试,或者是问一问已经过了测试点的同学。例如,对于一个点的定义。
- 第二次作业中,对于ascll需要引入,需要经常查资料,写完了还是很多点过不去,分数越改越少。例如,做第三次作业第一题时,分数曲线由3到1到0再到3到4。
- 第三次做作业,整体难度偏高,需要引入正则表达式,对于我这种基础不好的同学来讲很难上手,所以我应该致力于攻克测试点。作业没过的测试点还有很多,希望有机会可以重新尝试。例如第三次作业对于坐标两个数字之间“,”的判断。
- 有的题目测试点有问题,正确的代码无法通过测试。
- 有些题目内容不够详细,需要提示。
改进建议:
- 基础不好应该先进行复习,做题时与资料结合,进行知识的巩固与加强。
- 写代码的时候进行注释,方便自己的后续修改以及同学们的帮助。
- 进行简易测试点的判断,把自己尽力能得到的分得到,例如,一些输入错误的测试点相对来说最容易。
- 通过习题学习知识点,使得自己记忆更加深刻。
- 对于类的掌握不够透彻,还需要加量学习,以便自己后续程序的书写
- 输入正确错误的格式掌握不够透彻,需要进一步学习使用Java语言对格式进行判断。例如第三次作业,基本上每一次都要进行格式的判断。
- 题目结果总是出现0,0的情况,还需要进一步了解此情况出现的原因。
总结:
- 在三次作业过程中,我能看出难度跨度较大,也就说明了我们永远不会知道以后会面对多么困难的问题,必须要用尽可能多的时间提升自己。
- 在这三次作业中,我发现有很多考点是自己上课并未注意到的,所以做题的过程中,可以更加清楚的意识到自己学习的重点内容是哪一部分。
- 在三次作业过程中,我也拓宽了自己的视野,学会借助外部资料来解决自己的某一个针对性问题,合理使用手中的资源。
- 由于第三次作业写得匆忙,我更加意识到时间的宝贵,意识到作业之所以给一整周的时间是为了让我们时时刻刻可以修改自己的错误,从作业发布就要及时下手。
- 遇到问题要积极求助,虚心学习,如果问题不能自己解决就要学习,身边的同学和老师都会帮助你。
- 由于作业的需求,我们迫不得已学习了ascll语言以及正则表达式等等,但这是一件对于我们来说很有利的事情。


浙公网安备 33010602011771号