第一次blog
作者:互联网
(1)题目集1-3前言:
题目集一:Java pta 题目集一的题目比较简单,一共有9个编程题,虽然题目量比较大,但是考察的都是比较基础的知识,主要考察Java的输入输出以及一些语法的使用,比如判断三角形类型、学号的识别、游戏角色选择等等。语法方面和C语言比较相似,只是表达方式不太一样,第一次大作业也是顺利的拿下了满分,完成这一次大作业后,我对Java语言有了最基本的概念,题目集中用到的for循环、if else 嵌套、switch case 都是和C语言相通的,但在完成作业过程中也遇到了一些困难,比如第八题的二进制数值提取中把-1拆为‘-’和‘1’分别判断,还有测试点中要用float强制转换成浮点数让我尝试了很多次才通过,总的来说第一次大作业让我熟悉了Java语言的语法,慢慢从C语言转变过来。
题目集二:题目集二的题目相对题目集一难一些,但是题目量不多,只有三道题,需要用到字符串处理String,用for循环对字符串进行遍历,还有将26个字母转换为序号,考察了我们对二进制的处理怎样应用到字符串上,以及Java中的数学函数,Math.pow的使用,考察了Java数组的知识,第三题String的格式判断与内容提取考察我们从字符串中提取学号,这里比较难过的一个知识点是考虑学号之间是否有空格,对这方面的知识不太了解所以最后导致有两个测试点没有得到分,总结就是老师讲的新内容要及时复习并运用。
题目集三:题目集三的题目比前两个要难许多,题目量也是三道题,第一题需要将坐标中的数字提取出来进行两点之间的距离计算,但光是这个坐标里面带有逗号就把我难住了,而且两个坐标之间需要用空格分开,需要判断输入的坐标的x、y的正负。然而第一题只是后两题的基础,完不成第一题那后面两题也是做不出来的,后两题需要实现的功能更多,甚至需要一定的数学知识,比如第三题中输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部,都是很难解决的问题。
三次题目集的得分情况:
(2)设计与分析:
题目集一7-9: 二进制数值提取
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String A = input.nextLine(); int flag = 0; for(int i = 0; i < A.length()-1; i++) { char a = A.charAt(i); char b = A.charAt(i+1); if(a == '-' && b == '1') { flag = 1; } } if(flag == 1) { for(int j = 0; j < A.length()-1; j++) { char c = A.charAt(j); char d = A.charAt(j+1); if(c == '-' && d == '1') { break; } else if(c == '0') { System.out.print("0"); } else if(c == '1') { System.out.print("1"); } } } else { System.out.println("Wrong Format"); } } }
本题需要先对输入的字符串遍历,然后输出‘-1’之前的‘0’和‘1’,需要用到
A.charAt(i)
java.lang.String.charAt() 方法返回指定索引处的char值。索引范围是从0到length() - 1。对于数组索引,序列的第一个char值是在索引为0,索引1,依此类推。
题目集二7-2:串口字符解析
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String A = in.next(); int flag = 0; if(A.length() <= 10) { System.out.print("null data"); } for(int j = 0;j < A.length();j++) { if(A.charAt(j) == '0') { flag = 1; } } if(flag == 0) { System.out.print("null data"); } else { int begin = 0,i=0,num = 1,sum = 0; int a = 0,b = 0; for(begin = 0;begin < A.length()-10;begin++) { if(A.charAt(begin) == '0') { System.out.print(num+":"); num++; if(A.charAt(begin+10) == '0') { b = 0; } else { b = 1; sum = 0; for(i = begin+1;i < begin+9;i++) { if(A.charAt(i) == '1') { sum++; } } if(sum%2 == 0) { if(A.charAt(begin+9) == '1') { a = 1; } else { a = 0; } } else { if(A.charAt(begin+9) == '0') { a = 1; } else { a = 0; } } } if(b == 1) { if(a == 1) { for(i = begin+1;i < begin+9;i++) { System.out.print(A.charAt(i)); } System.out.print("\n"); } else { System.out.println("parity check error"); } } else { System.out.println("validate error"); } begin += 10; } } } } }
本题需要从一组字符串数据中过滤掉空闲、起始、结束以及奇偶校验位之后的数据,并对一些非法输入进行相应输出,要用到
charAt(i);
将字符串中的元素进行遍历,然后再看看是1还是0进行数字的运算,然后在进行格式化输出,在这些运算之前,我们首先要判断这串字符是不是合法,运用到
String.length();
函数
题目集三7-1: 点线形系列1-计算两点之间的距离(部分代码)
public boolean test(String a)
{
String judge ="^([-+]?\\d+)(\\.\\d+)?,([-+]?\\d+)(\\.\\d+)?$";
boolean z=a.matches(judge);
if(z==true)
{
for(int j = 0 ; j < a.length() ; j++)
{
if(a.charAt(j) == ',')
{
x=Double.parseDouble(a.substring(0,j));
y=Double.parseDouble(a.substring(j+1,a.length()));
}
}
}
return z;
}
}
用了正则表达式(正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑)
String judge ="^([-+]?\\d+)(\\.\\d+)?,([-+]?\\d+)(\\.\\d+)?$";
可以通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
题目集7-2:7-2 点线形系列2-线的计算 (部分代码)
public static void fn1(String s) { int flag1 = 0; int flag2 = 0; int flag3 = 0; for(int i = 0; i < s.length()-1; i++) { char a = s.charAt(i); char b = s.charAt(i+1); if(a==':'){ flag1++; } else if(a==',') { flag2++; } else if(a==' ') { flag3++; } if((a=='+'&&b=='+')||(a=='-'&&b=='-')) { System.out.print("Wrong Format"); return; } } if(flag1!=1||flag2!=2||flag3!=1) { System.out.print("Wrong Format"); } else { String s1 = s.replaceAll(":",","); String s2 = s1.replaceAll(" ",","); String[] num = s2.split(","); double a = Double.parseDouble(num[1]); double b = Double.parseDouble(num[2]); double c = Double.parseDouble(num[3]); double d = Double.parseDouble(num[4]); if(a==c&&b==d) { System.out.print("points coincide"); } else if(a==c&&b!=d) { System.out.print("Slope does not exist"); } else { double xl=(b-d)/(a-c); System.out.print(xl); } } }
这段代码为计算斜率的方法
String[] num = s2.split(",");
通过这个可以将坐标中逗号去掉留下数字。(查找相关资料)
1、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是转义字符,必须得加"\";
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split("and|or");
使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。
我们看jdk doc中说明
public String[] split(String regex)
Splits this string around matches of the given regular expression.
参数regex是一个 regular-expression的匹配模式而不是一个简单的String,他对一些特殊的字符可能会出现你预想不到的结果。
题目集三7-3:点线形系列3-三角形的计算 (部分代码)
class coordinate { double x; double y; public boolean test(String a) {
boolean z=a.matches(judge); if(z==true) { for(int j = 0 ; j < a.length() ; j++) { if(a.charAt(j) == ',') { x=Double.parseDouble(a.substring(0,j)); y=Double.parseDouble(a.substring(j+1,a.length())); } } } return z; } }
正则表达式(查找资料)
定义:正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串
用途:正则表达式会与系统管理员来说非常重要,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到的重要信息,如“用户账号登陆失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。
分类正则表达式的字符串表达方式根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。在Linux系统中常见的文件处理工具中grep与sed支持基础正则表达式,二egrep与awk支持扩展正则表达式。
String judge ="^([-+]?\\d+)(\\.\\d+)?,([-+]?\\d+)(\\.\\d+)?$";
- 使用String类的matches方法可以进行整个字符串的匹配,判断某些字符串是否符合相关的规则。只要有一处不符合规则就会返回false,如果都符合返回true。如: 在用matches方法进行判断时,会从字符串开始处依次向下进行匹配,当发现不匹配时,匹配结束,后面的字符不会进行匹配了。
(3)踩坑心得:
1.题目集一中有一个测试点一直无法通过,询问同学之后才知道是没有将结果进行强制类型转化,而题目是要求了需要输出浮点数的,这一点涉及了题目集一的大部分题目,还有不同精度的类型设定会导致不同的输出结果,需要注意结果的类型确定保留的小数位数.
2.题目集二则是字符串截取方面的问题,例如可能会截取多了或者少了,还有提取字符串中的数据,这些都要仔细读懂题目的意思,养成良好的编程习惯。
3.题目集三最大的问题就是正则表达式的使用,这类问题由于还没有进行了解,所以暂时还解决不了,另一个就是从坐标中获取数字。还有一个很大的问题是能看懂同学的代码,但是自己动手写就完全没有头绪,在经过自己不断的敲代码之后,这类问题不那么严重了。
(4)改进建议:
1.应当养成良好的编程习惯,使自己的代码看起来容易理解,自己能看懂,加上一些必要的注释使别人也能看懂代码的作用。
2.对于变量的命名做到和变量有关系,让人看见变量名就能知道这个变量是什么。
3.以后的代码编写,应尽量少使用if语句,减少自己的圈复杂度,提高自己代码的效率。
4.知识都是主动摄取的,不是被动灌输的,要提前学习Java,这样才能跟上老师的步伐。
5.加快敲代码的速度,这需要日积月累不断地坚持。
6.对于新知识,如正则表达式应当主动去学习并应用,不要拖到需要用时才开始学。
7.只有边学习边敲代码才能得到进步,光看视频或是听老师讲课是远远不够的。
(5)总结:
1.Java需要循序渐进而且系统的学习方案,不要想着天上掉馅饼的速成方式,给自己制定一个学习计划,制定好每天学习的新知识,然后用什么案例和练习巩固你每天学习的新东西。系统的学习教程,自学Java肯定是主视频,副书籍,因为书大多数人是看不下去的,所以视频要新颖,要系统,不要杂乱不精。
2.学习中需要注意一些问题:开始养成良好代码习惯;先自己多思考,然后再去问老师,培养自己解决问题能力。大量时间用来写代码,而不是看视频。书籍用来回顾知识点,而不要用来一页一页翻书。提高学习效率,一个问题不要在意太久,规划好每天做的事情,完成就行,贪多嚼不烂。
3.从这三次题目集中收获了很多,对于Java基本语法,类的概念,类的特有属性,都有了一些掌握和加深,学习态度也发生了转变,靠混日子学好Java是不现实的,不能有惧怕困难的心理,要迎难而上。
标签:题目,String,正则表达式,第一次,blog,字符串,Java,charAt 来源: https://www.cnblogs.com/h2821513043/p/16127438.html