21201424-第一次BLOG
作者:互联网
(1)前言
第一次PTA作业:
第一次PTA作业较为简单,题量相较于难易程度而言也是较为少的。这次作业许是检验我们是否在课设期间是否有自学翁恺老师的《零基础学Java》的课程。
于是,知识点也是较为的简单,和上个学期学习的基础程序设计也是大差不差,如:循环结构,分支结构等。
第二次PTA作业:
第二次PTA作业难度中等,至于题量,是老师少发了两道题目,所以也是较少的。这次作业也是对我们来说不算很难。完成起来说不上得心应手但也不至于到困难的程度。
这次的作业虽然实现的难度不高,但就我而言,读题的难度不低。还有就是这次的作业我基本还是将自己的思维放在面向过程,并没有领悟到这门课的精髓:面向对象程序设计。
本次的三道题基本是用String的charAt和substring来完成的
第三次PTA作业:
第三次的作业难度偏高,题量不多,与上次不同,虽题目理解容易,但实现的难度不低,其中涉及到不少的数学知识,对我来说,数学已经很难了,用程序来实现更难。当然如果是为了及格的话还是比较简单的。其二,正则表达式,也就是用来检验输入格式的方法确实是在一开始非常苦恼,但是写完第一题就得心应手起来。
(2)设计与分析
第一次PTA作业:
第一次的作业大概就是以下几类:
1、if-else的嵌套
2、switch语句
3、字符串的提取+for循环
4、字符串的提取+switch语句
没有什么独特之处,但是我们平时应用起来最为广泛的,多写写来提高我们的熟练度,这些题是不错的选择。
第二次PTA作业:
这次作业主要是涉及到String的运用。
第一题:
字母大小写的转换,使用for循环,然后对照AVCII码表对大小写字母的char类型时加减。
第三题:
String的格式判断与内容提取,按照班级的不同提取出自己想要的信息,这里只需要运用String.charAt将下标的对应数字和题目要求的数字进行对比,符合的输出,不符合跳过,同时设立一个flag判断是否有输出。
int count = 0 ;
s = in.nextLine();
for(;j < s.length() ; j++)
{
if(s.charAt(j) <= '9' && s.charAt(j) >= '0')
;
else
count = 1;
}
if(s.length()%8 != 0 || count == 1)
{
System.out.print("Wrong Format");
}
else
{
for(; i < s.length(); i = i + 8)
{
if((s.charAt(i) == '2' && s.charAt(i+1) == '0' && s.charAt(i+2) == '2' && s.charAt(i+3) == '0' && s.charAt(i+4) == '1' && s.charAt(i+5) == '7') || (s.charAt(i) == '2' && s.charAt(i+1) == '0' && s.charAt(i+2) == '2' && s.charAt(i+3) == '0' && s.charAt(i+4) == '6' && s.charAt(i+5) == '1'))
{
System.out.print(s.charAt(i+4));
System.out.print(s.charAt(i+5));
System.out.print(s.charAt(i+6));
System.out.print(s.charAt(i+7));
if(i < s.length() - 8)
System.out.print(" ");
}
}
}
}
第二题:
串口字符解析,读懂题目的难度较高。
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
这道题的复杂度不高,写起来也是清晰明了,一个Main就可以解决,没有必要去加入其他的类
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String s;
Scanner in = new Scanner(System.in);
s=in.nextLine();
int count=0;
int sum=0;
int i,j,k;
for( i=0;i<s.length()||i+10<=s.length();i++){
if(s.charAt(i)=='1'){
count++;
}
}
if(count==s.length()||s.length()<11){
System.out.print("null data");
}
for( i=0;i<s.length();){
if(s.charAt(i)=='0'){
k=0;
for ( j = i + 1; j < i + 9; j++) {
if (s.charAt(j) == '1' )
k++;
}
if(s.charAt(i + 9) == '1'){
k++;
}
if (k % 2 != 0&&s.charAt(i + 10) == '1') {
sum++;
System.out.println(sum + ":" + s.substring(i + 1, i + 9));
}
if (k % 2 == 0&&s.charAt(i + 10) == '1'){
sum++;
System.out.println(sum + ":" + "parity check error");
}
if(s.charAt(i + 10) != '1'){
sum++;
System.out.println(sum + ":" + "validate error");
}
i+=11;
}
else{
i++;
}
}
}
}以9为循环,对输入的数组进行判断,同时加入几个标志,用来判断是否为error data,validate error,。
第三次PTA作业:
第一题:
这道算两点之间的距离的题,比较简单主要是正则表达是比较复杂
String c = "(-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[ ](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)";
String d ="(-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[ ](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)([ ](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*))+";
一个点有四种可能xxx.xxx or xxx or 0.xxx or 0所以对这四种情况分别使用正则表达式表达中间使用“|”间隔表达或。
同时还有一种wrong number of points的情况这种情况下点的个数是3及其以上,但其又符合点的标准方式,所以需要另用正则表达式来表达,所以我需要在上一个正则表达式的地方在加一个点的判定同时把它括起来背后加一个“+”(表示一个或多个的意思||出现一次或多次)
还有需要从字符串中提取出需要的double类型的数字,即坐标,这里需要使用到Double.parseDouble来进行强制类型转换,而且提取数字时要使用substring而不是用charAt(下标),因为这样提取出来的东西是char类型的,而不是string的。
第二题:
String a ="1[\\:](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[ ](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)";
String b ="1[\\:](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[ ](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)([ ](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*))+";
这道题的正则和上道题的大差不差,所以复制粘贴即可,但是提取的部分略有不同
int j = 0, k = 2;
if(dxx == 1) {
if(point.matches(a)) {
for(i = 0;i < point.length(); i++) {
if(point.charAt(i) == ',' || point.charAt(i) ==' ') {
s1[j] = point.substring(k,i);
k = i+1;
j++;
}
}
s1[j] = point.substring(k,point.length());
x1 = Double.parseDouble(s1[0]);
y1 = Double.parseDouble(s1[1]);
x2 = Double.parseDouble(s1[2]);
y2 = Double.parseDouble(s1[3]);
}
}
提取时要注意前面有个选项所以在赋值时对k的初始赋值为2。
1-4的选项都是较为容易实现基础数学问题,就是第五题实现起来有几分困难
double rate1,rate2;
if(point.matches(o)) {
rate1 = (y2 - y1)/(x2 - x1);
rate2 = (y4 - y3)/(x4 - x3);
if(rate1 == rate2)
count4 = true;
else
{
x5 = (-(x1*y2+x2*y1)*(x3-x4)-(x1-x2)*-(x3*y4+x4*y3))/((y2-y1)*(x3-x4)-(x1-x2)*(y4-y3));
y5 = ((y2-y1)*-(x3*y4+x4*y3)+(x1*y2+x2*y1)*(y4-y3))/((y2-y1)*(x3-x4)-(x1-x2)*(y4-y3));
if(((x5 >= x1&&x5 <= x2|| x5 <= x1&&x5 >= x2)||(x5 >= x3&& x5 <= x4||x5 <= x3&& x5 >= x4))&&((y5 >= y1&&y5 <= y2||y5 <= y1&&y5 >= y2)||(y5 >= y3&&y5 <= y4||y5 <= y3&&y5 >= y4)))
{
count5 = true;
}
}
}
我现在草稿纸上算出公式,然后简化成可以写成代码的(也就是我提取了坐标的),最后使用笨方法来表示范围用以得出交叉点是否在线段内。计算的过程确实让我这个数学fw死了很多脑细胞。
第三题:
正则表达式和数据的获取和上道题一摸一样,但是前两道题是,点与点之间,线与线之间的的关系,但是第三道是三角形的判定所以对这些的关系要求更高,是否可以构成三角形。
这道题的复杂度较高,但在max Depth较低,可以看出,这个代码的深度还是太低了。
(3)踩坑心得
第二次PTA作业的第二题
for( i=0;i<s.length()||i+10<=s.length();i++){
if(s.charAt(i)=='1'){
count++;
}
}
if(count==s.length()||s.length()<11){
System.out.print("null data");
}
for( i=0;i<s.length();){
if(s.charAt(i)=='0'){
k=0;
for ( j = i + 1; j < i + 9; j++) {
if (s.charAt(j) == '1' )
k++;
}
if(s.charAt(i + 9) == '1'){
k++;
}
if (k % 2 != 0&&s.charAt(i + 10) == '1') {
sum++;
System.out.println(sum + ":" + s.substring(i + 1, i + 9));
}
if (k % 2 == 0&&s.charAt(i + 10) == '1'){
sum++;
System.out.println(sum + ":" + "parity check error");
}
if(s.charAt(i + 10) != '1'){
sum++;
System.out.println(sum + ":" + "validate error");
}
i+=11;
}
else{
i++;
}
}
}
一定要以9个为一组不然极其容易出错
第三次PTA作业的第一题:
在这里发现就算提取出的数据只是一个数字也一定要用substring否则到后面使用的时候会出现各类的问题,比如:强制强制类型转换时转换失败等。。
String[] s = new String[4];
if(x.matches(c)) {
for(;i < x.length(); i++) {
if(x.charAt(i) == ',' || x.charAt(i) ==' ') {
s[j] = x.substring(k,i);
k = i+1;
j++;
}
}
s[j] = x.substring(k,x.length());
而且这样也可以和前面建立的数组对上。
在建立变量时要注意是否时全局变量时哪个类的变量或是某个方法的变量,不然调用时调用的可能时一个重名但是不是你想调用的数据。
使用Boolean变量时要注意赋值,是先赋值为true还是false。
(4)改进建议
第三次PTA作业的类都过于单调了,没有真正的面向对象编程,看似建立了类实际上总体来说还是一个解决了方法,代码冗杂,阅读起来难度极高
public static void main(String[] args) {
// TODO Auto-generated method stub
line line1 = new line();
line1.input();
line1.result();
line1.output();
}
基本都是用一个line类来实现所有的功能。仅仅套了一个面向对象的壳子。
代码缺乏想象力,如:
String a = "(-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)";
String b = a + "[\\,]" + a + "[ ]" + a + "[\\,]" + a;
String c = "(-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[ ](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)";
string c 可以尝试用string a和string b 来替代而不需要使用一大堆来表达自己想要结果。
(5)总结
第一次PTA作业比较简单,总体来说全部写完还用不到半天的时间,当然我写带的速度太慢了,思维的速度比较慢。
第二次PTA作业难度适中,其中涉及到String了的运用,对我而言读题比写题难,其实实现起来并没有想象的那么复杂,甚至有点简单,比如使用charAt()就可以了和for语句就几乎可以解决问题。
第三次PTA作业学到了类和对象,将上课的内容和作业结合了起来,但是我掌握的较差,只是形似而未能领悟到其真正的内涵,或者说并不能熟练的运用,题目的难度较高,几何知识解决本就不容易,通过代码实现更是对我来说有点困难。
我对题目的分析,对责任的分配较为差,或者说非常混乱,职责到最后会混为一谈,有时会把各种任务堆加到一个类上去。造成代码的复杂形很高但max depth不高。
标签:charAt,++,System,第一次,BLOG,21201424,PTA,&&,String 来源: https://www.cnblogs.com/wjsissbbb/p/16124571.html