题目集1~3的总结性Blog
(1)前言:
这是我第一次接触java题目,之前只学过c语言,看过一点Java网课,没能坚持看下去。正如老师所说,前两次作业的难度和第三次作业难度完全是两个层次,第一次作业题相对多,不过都是基础体型,用来让我们熟悉java的编写和运行,顺便回顾了一下以前c语言的语法。第二次作业难度和第一次差不多,不过引入了正则表达式的用法。第三次作业综合了前两次的知识点,并开始需要使用多个类和方法,复杂度提升,需要有条理的编程才能使代码思路清晰。由于水平不够,没能全部完成。
(2)设计与分析:
部分题目代码:
第一次作业:这次作业都是基础题,帮助我们熟悉java编程。
7-1 身体质量指数(BMI)测算
import java.util.Scanner;
public class Main{
public static void main(String[] args){
float h,w,bmi;
Scanner in = new Scanner(System.in);
w = in.nextFloat();
h = in.nextFloat();
bmi = w/h/h;
if(w<=0||h<=0||w>727||h>2.72)
System.out.print("input out of range");
else if(bmi<18.5)
System.out.print("thin");
else if(bmi<24)
System.out.print("fit");
else if(bmi<28)
System.out.print("overweight");
else if(28<=bmi)
System.out.print("fat");
else
System.out.print("input out of range");
}
}
这题很简单,主要是学习如何建类方法和编译java代码,同时学习如何键盘输入,输出等基本操作,算法类似c语言用if else多次判断实现。需要注意的是java的if判断不能直接多次比较,如if(1<i<3)会报错,需要用或来进行多次比较。
7-2 长度质量计量单位换算
和第一题类似,运用了类型转换
7-3 奇数求和
import java.util.Scanner;
public class Main { //类
public static void main(String[] args){ //方法
int i,sum=0;
int[] a = new int[10]; //数组存放数字,sum存结果
Scanner in = new Scanner(System.in); //创建输入功能对象in
for(i=0;i<10;i++){
a[i] = in.nextInt(); //输入
if(a[i]%2!=0)
sum=sum+a[i]; //奇数求和
}
System.out.printf("%d",sum); //输出
}
}
这题相比第一题多了数组的运用
7-6 学号识别
1 import java.util.Scanner;
2 public class Main { //类
3 public static void main(String[] args){ //方法
4 String num,year,college,clas,snum; //8位学号,入学年份,学院,班级,学号
5
6 Scanner input = new Scanner(System.in);
7 num = input.next(); //输入学号
8 if(num.length() != 8){ //是否8位
9 System.out.print("Wrong Format");
10 return; //出错结束
11 }
12 year = num.substring(0,2); //按位提取
13 college = num.substring(2,4);
14 clas = num.substring(4,6);
15 snum = num.substring(6,8);
16
17 if(college.equals("01")) //学院名转化
18 college="材料学院";
19 else if(college.equals("02"))
20 college="机械学院";
21 else if(college.equals("03"))
22 college="外语学院";
23 else if(college.equals("20"))
24 college="软件学院";
25 else{
26 System.out.print("Wrong Format");return;
27 }
28 System.out.println("入学年份:20"+year+"年"); //输出
29 System.out.println("学院:"+college);
30 System.out.println("班级:"+clas);
31 System.out.println("学号:"+snum);
32 }
33 }
本题引入了字符串比较函数equals()和按位提取函数substring(),此外还学习了输出的新格式+。
7-9 二进制数值提取
import java.util.Scanner;
public class Main { //类
public static void main(String[] args){ //方法
String a; //待输入字符串a
String b = ""; //待输出字符串b
int i;
Scanner input = new Scanner(System.in);
a = input.nextLine(); //输入字符串
if(a.length()==0)
System.out.print("Wrong Format");
for(i=0;i<a.length();i++) { //遍历字符串
if(a.charAt(i)=='0'||a.charAt(i)=='1')
b += a.charAt(i); //将0和1存放到b
else if(a.substring(i,i+2).equals("-1")){ //判断结束
System.out.print(b); //输出
return;
}
}
System.out.print("Wrong Format");
return;
}
}
这题多了结束符和新函数charAT()。
7-7 判断三角形类型
输入三角形三条边,判断该三角形为什么类型的三角形。
import java.util.Scanner;
public class Main { //类
public static void main(String[] args){ //方法
double a,b,c;
Scanner input = new Scanner(System.in);
a=input.nextDouble(); //输入边的长度
b=input.nextDouble();
c=input.nextDouble();
if(a<1||a>200||b<1||b>200||c<1||c>200)
System.out.print("Wrong Format");
else if(a+b>c&&a+c>b&&b+c>a){
if(a==b&&b==c){ //等边
System.out.print("Equilateral triangle");
return;
}
else if(a==b||a==c||b==c){
if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))
System.out.print("Isosceles right-angled triangle"); //等腰直角
else
System.out.print("Isosceles triangle"); //等腰非直角
}
else if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))
System.out.println("Right-angled triangle");
else
System.out.println("General triangle"); //是一般三角形
}
else
System.out.println("Not a triangle");
}
}
这是第一次作业难度最大的一题,有多种输入输出情况需要判断,需要在设计时全面考虑各种情况,且要尽量合理一些,否则会出现为了改一个错导致多种错误出现,让过程变得很麻烦。因此在设计前面的情况时就要注意对之后其他情况的影响。
第二次作业:
7-1 字母-数字转换
import java.util.Scanner;
public class Main{ //类
public static void main(String[] args){ //方法
Scanner input = new Scanner(System.in);
String c; //字符串变量c
int i; //表示字符位置
c = input.next();
for(i=0;i<c.length();i++){
if(c.charAt(i)<'A'||c.charAt(i)>'Z'&&c.charAt(i)<'a'||c.charAt(i)>'z')
{
System.out.println("Wrong Format");
return;
}
}
for(i=0;i<c.length();i++){
if(c.charAt(i)>='A'&&c.charAt(i)<='Z')
System.out.print(c.charAt(i)-'A'+1);
if(c.charAt(i)>='a'&&c.charAt(i)<='z')
System.out.print(c.charAt(i)-'a'+1);
}
}
}
这次作业需要我们掌握ASCII码值,除此之外就是错误输入的判断:
if(c.charAt(i)<'A'||c.charAt(i)>'Z'&&c.charAt(i)<'a'||c.charAt(i)>'z')
在if成立后需结束运行,防止输入错误后程序继续运行输出。
7-2 串口字符解析
import java.util.Scanner;
public class Main{ //类
public static void main(String[] args){ //方法
Scanner input = new Scanner(System.in);
String a = input.nextLine();
//判断长度是否合法
if(a.length() <11){
System.out.println("null data");
return;
}
//有无标识符
if(a.matches("^[1]*")){ //正则表达式
System.out.println("null data");
return;
}
int num=0,sum=0; //num:序号 sum:“1”计数符
String temp; //存储待输出数据
for(int i = 0;i<a.length();i++){ //循环接收处理,i是一组数据的开头位置
if(a.charAt(i)=='0'&&i+11<=a.length()){ //起始位判断,确认数据长度未超出
num++;sum=0; //‘1’计数清0
System.out.print(num+":");
for(int j=i+1;j<i+10&&j<a.length();j++){ //计算一组中奇数个数进行奇校验
if(a.charAt(j)=='1')
sum++;
}
if(a.charAt(i+10)!='1'){ //结束符判断
System.out.println("validate error");
i=i+10;
}
else if(sum%2==0&&sum!=0){ //奇校验
System.out.println("parity check error");
i=i+10;
}
else{
temp=a.substring(i+1,i+9); //一组数据赋给temp
System.out.println(temp); //输出数据
i=i+10; //跳到下一组
}
}
}
}
}
从这一题开始引入了正则表达式--概念:正则表达式(Regular Expression)是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。简单来说就是用一串特定的字符来进行条件筛选,将原本复杂的判断条件简单化。由于输入数据在很多情况下都特定的约束,正则表达式在之后的题目中都将被大量运用,需要认真学习。在水平不够时可以通过查找常用正则表达式组成自己所需的正则表达式。
7-3 String的格式判断与内容提取
import java.util.Scanner;
public class Main{ //类
public static void main(String[] args){ //方法
Scanner input = new Scanner(System.in);
String a;
a =input.nextLine(); //输入字符串
if(!a.matches("^[0-9]*$")){ //正则表达式判断非法输入
System.out.println("Wrong Format");
return;
}
if(a.length()%8!=0){ //判断长度,排除空格等非法字符
System.out.println("Wrong Format");
return;
}
for(int i=0;i<a.length();i=i+8){ //截取学号前六位判断班级
if(a.substring(i,i+6).equals("202017")||a.substring(i,i+6).equals("202061")){
System.out.print(a.substring(i+4,i+8)); //输出学号后四位
if(i+8<a.length()){ //若不是最后一个学号,输出空格
System.out.print(" ");
}
}
}
}
}
同上一题区别不大
第三次作业:此次作业的难度远远大于前两次作业,综合运用了许多的函数和正则表达式,还有多个类与方法如何处理的问题,需要花较多的时间完成。
import java.util.Scanner;
public class Main {
public static void main(String[] args){
//两点坐标
double x1,y1,x2,y2;
Scanner input = new Scanner(System.in);
//输入
String a = input.nextLine();
String[] s = a.split("[:, ]");
for(int j=0;j<s.length;j++){
if(!s[j].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{
System.out.print("Wrong Format");
System.exit(0);
}
}
//将两点按“ ”分隔存在字符串数组中
String point[] = a.split(" ");
//坐标点个数判断,不是2个都报错
if(point.length!=2) {
System.out.print("wrong number of points");
return;
}
//分别存两点的横竖坐标
String num1[] = point[0].split(",");
String num2[] = point[1].split(",");
if(num1.length!=2||num2.length!=2){
System.out.print("wrong number of points");
System.exit(0);
}
//把坐标转化成数值类型方便计算
x1 = Double.valueOf(num1[0]);
y1 = Double.valueOf(num1[1]);
x2 = Double.valueOf(num2[0]);
y2 = Double.valueOf(num2[1]);
//若坐标相等
if(x1==x2&&y1==y2){
System.out.print("Wrong Format");
return;
}
//计算距离
double distance=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
//输出
System.out.print(distance);
}
}
本题难度主要是输入合法判断、正则表达式的使用和分隔符的使用,需要熟悉数组和各种数据类型。
正则表达式:("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")除了+-.和数字以外的其他会返回true。
7-2 点线形系列2-线的计算
import java.util.Scanner;
public class Main {
public static void main(String[] args){
int kongge=0,dianzb=0;
Scanner input = new Scanner(System.in);
String a = input.nextLine();
String str = a.substring(2,a.length());
if(a.charAt(0)<'1'||a.charAt(0)>'5'||a.charAt(1)!=':'){
System.out.print("Wrong Format");
System.exit(0);
}
for(int i=0;i<a.length();i++){
if(a.charAt(i)==' ')
kongge++;
if(a.charAt(i)==',')
dianzb++;
}
String[] s = a.split("[:, ]");
for(int j=0;j<s.length;j++){
if(!s[j].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{
System.out.print("Wrong Format");
System.exit(0);
}
if(a.charAt(j)=='+'||a.charAt(j)=='-'||a.charAt(j)=='.'){
if(a.charAt(j+1)<'0'||a.charAt(j+1)>'9'){
System.out.println("Wrong Format");
System.exit(0);
}
}
}
int x =Integer.valueOf(s[0]);
//五种情况
switch(x){
case 1:
Double k=jsk(str);
System.out.print(k);break;
case 2:
chuizhi(str);break;
case 3:
gongxian(str);
break;
case 4:
pingxing(str);
break;
case 5:
xiangjiao(str);
break;
}
}
public static void feifa(String[] a){
for(int i=0;i<a.length;i++){
if(!a[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")){
System.out.print("Wrong Format");
System.exit(0);
}
}
}
//情况1计算k
public static double jsk(String a){
String point[] = a.split(" ");
if(point.length!=2) {
System.out.print("wrong number of points");
System.exit(0);
}
String num1[] = point[0].split(",");
String num2[] = point[1].split(",");
if(num1.length!=2||num2.length!=2){
System.out.print("wrong number of points");
System.exit(0);
}
feifa(num1);
feifa(num2);
double x1 = Double.valueOf(num1[0]);
double y1 = Double.valueOf(num1[1]);
double x2 = Double.valueOf(num2[0]);
double y2 = Double.valueOf(num2[1]);
if(x1==x2&&y1==y2){
System.out.print("points coincide");
System.exit(0);
}
if(x1-x2 == 0){
System.out.println("Slope does not exist");
System.exit(0);
}
double result = ((y1-y2)/(x1-x2));
return result;
}
//情况2垂直距离
public static void chuizhi(String a){
int i=0;
String point[] = a.split(" ");
if(point.length!=3) {
System.out.print("wrong number of points");
System.exit(0);
}
String num1[] = point[0].split(",");
String num2[] = point[1].split(",");
String num3[] = point[2].split(",");
double x1 = Double.valueOf(num1[0]);
double y1 = Double.valueOf(num1[1]);
double x2 = Double.valueOf(num2[0]);
double y2 = Double.valueOf(num2[1]);
double x3 = Double.valueOf(num3[0]);
double y3 = Double.valueOf(num3[1]);
if(x2==x3&&y2==y3){
System.out.print("points coincide");
System.exit(0);
}
if(x2 == x3){
System.out.print(Math.abs(x2-x1));
System.exit(0);
}
while(a.charAt(i)!=' '){
i++;
}
i++;
String str1=a.substring(i,a.length());
double k=jsk(str1);
double distance = (Math.abs(y1-k*x1+k*x3-y3)) / (Math.sqrt(1+k*k));
System.out.print(distance);
}
//情况3 三点是否共线
public static void gongxian(String a){
int i=0;
String point[] = a.split(" ");
if(point.length!=3) {
System.out.print("wrong number of points");
System.exit(0);
}
String num1[] = point[0].split(",");
String num2[] = point[1].split(",");
String num3[] = point[2].split(",");
feifa(num1);
feifa(num2);
feifa(num3);
double x1 = Double.valueOf(num1[0]);
double y1 = Double.valueOf(num1[1]);
double x2 = Double.valueOf(num2[0]);
double y2 = Double.valueOf(num2[1]);
double x3 = Double.valueOf(num3[0]);
double y3 = Double.valueOf(num3[1]);
if(x1==x2&&x1==x3){
System.out.print(true);
System.exit(0);
}
while(a.charAt(i)!=' '){
i++;
}
i++;
String str1=a.substring(i,a.length());
double k1=jsk(str1);
while(a.charAt(i)!=' '){
i++;
}
String str2=a.substring(0,i);
double k2 = jsk(str2);
if(k1==k2) {
System.out.print(true);
}
else{
System.out.print(false);
}
}
//情况4
public static void pingxing(String a) {
String point[] = a.split(" ");
if(point.length!=4) {
System.out.print("wrong number of points");
System.exit(0);
}
String num1[] = point[0].split(",");
String num2[] = point[1].split(",");
String num3[] = point[2].split(",");
String num4[] = point[3].split(",");
double x1 = Double.valueOf(num1[0]);
double y1 = Double.valueOf(num1[1]);
double x2 = Double.valueOf(num2[0]);
double y2 = Double.valueOf(num2[1]);
double x3 = Double.valueOf(num3[0]);
double y3 = Double.valueOf(num3[1]);
double x4 = Double.valueOf(num4[0]);
double y4 = Double.valueOf(num4[1]);
if ((x1 == x2) && (y1 == y2) || (x3 == x4) && (y3 == y4) || (x1 == x3) && (y1 == y3) || (x1 == x4) && (y1 == y4) ) {
System.out.println("points coincide");
System.exit(0);
}
if ((y1 - y2) / (x1 - x2) == (y3 - y4) / (x3 - x4))
System.out.println("true");
else
System.out.println("false");
}
//情况5
public static void xiangjiao(String a){
String point[] = a.split(" ");
if(point.length!=4) {
System.out.print("wrong number of points");
System.exit(0);
}
String num1[] = point[0].split(",");
String num2[] = point[1].split(",");
String num3[] = point[2].split(",");
String num4[] = point[3].split(",");
double x1 = Double.valueOf(num1[0]);
double y1 = Double.valueOf(num1[1]);
double x2 = Double.valueOf(num2[0]);
double y2 = Double.valueOf(num2[1]);
double x3 = Double.valueOf(num3[0]);
double y3 = Double.valueOf(num3[1]);
double x4 = Double.valueOf(num4[0]);
double y4 = Double.valueOf(num4[1]);
if ((y1 - y2) / (x1 - x2) == (y3 - y4) / (x3 - x4)){
System.out.println("is parallel lines,have no intersection point");
System.exit(0);
}
double x0 = ((x4-x3)*(x1*y2-x2*y1)-(x2-x1)*(x3*y4-x4*y3))/((y3-y4)*(x2-x1)-(y1-y2)*(x4-x3));
double y0 = ((y1-y2)*(x3*y4-x4*y3)-(y3-y4)*(x1*y2-x2*y1))/((y3-y4)*(x2-x1)-(y1-y2)*(x4-x3));
if ((x1 == x2) && (y1 == y2) || (x3 == x4) && (y3 == y4) || (x1 == x3) && (y1 == y3) || (x1 == x4) && (y1 == y4) ) {
System.out.println("points coincide");
System.exit(0);
}
System.out.print(x0+","+y0);
if (((x0 == x1)&&(y0 == y1)) || ((x0 == x2)&&(y0 == y2)) || ((x0 == x3) && (y0 == y3)) || (x0 == x4) && (y0 == y4))
System.out.print("false");
else if ((x0 - x1) * (y2 - y1) - (y0 - y1) * (x2 - x1) == 0 || (x0 - x3) * (y4 - y3) - (y0 - y3) * (x4 - x3) == 0) {
if (x0 <= Math.max(x1, x2) && x0 >= Math.min(x1, x2) && y0 >= Math.min(y1, y2) && y0 <= Math.max(y1, y2)){
System.out.print(" true");
}
else {
if (x0 <= Math.max(x3, x4) && x0 >= Math.min(x3, x4) && y0 >= Math.min(y3, y4) && y0 <= Math.max(y3, y4))
System.out.print(" true");
else
System.out.print(" false");
}
}
}
}
本题开始需要用到多个类或方法,类似c语言中的主函数调用其他函数,需要封装功能,用不同的方法实现不同的功能,同时最后能用一个类表示线,另一个类表示点。由于水平有限,我只用了多个方法来实现。难点依然是输入合法的判断,还有数学公式的运用。
7-3 点线形系列3-三角形的计算
作为三次作业中最难的一题,它集合了前两题的内容和难点,由于水平有限,且功能封装未做好,导致这题没能完成,只拿了一点分。之后学习更深入一些之后再完善功能。
(3)采坑心得:
1. 需要注意的是java的if判断不能直接多次比较,如if(1<i<3)会报错,需要用或来进行多次比较。
2. java中需要频繁使用字符串,而字符串相比于其他的数据类型较为特殊,如比较过程需要用函数equals(),用来计算时需要进行类型转换。
3. 判断输入格式错误时最好减少判断次数,用尽量少的判断语句,不然过测试点改判断条件很容易出现改了一句又和另一句冲突,会让代码越改越shit。
4. 判断错误输入之后最好直接结束运行,确保不会继续输出错误数据。
(4)改进建议:
将
学习运用多个类完成代码功能。
多看网课的同时去csdn多写写练习题巩固,学习更规范更合理的代码编写格式,争取之后能够独立写出难题。
(5)总结:
通过这三次作业初步掌握了java的一些基本语法和运行规则。。但是,对类和函数还是不能够熟练的使用,同时题目练的太少,不能独立完成作业。欠缺的能力需要多看网课的同时找相关题目进行练习,争取尽快实现从c语言到Java,从面向过程到面向对象的转变。

浙公网安备 33010602011771号