前三次作业总结
前言
经历过一段时间的java学习并完成了三次大作业之后,在此分享我的一些感悟和心得。
第一次大作业由于是刚开始学习java和面向对象的程序设计,对于java的语法不熟悉,第一次的大作业虽然题量偏多但都是非常简单的题目,以让我们能更快更好的适应java的语法。
第二次大作业:由于经历了第一次大作业的java语法的练习,第二次的java作业的题量偏少且题目的难度也偏低,有助于我们更进一步的熟悉和巩固java的语法,也让我们初步的有了一个面向对象程序设计的概念,而不仅仅停留于面向过程。
第三次大作业:第三次大作业总计有三道题目,在第一道题目中可能涉及一段正则表达式的方面偏难,让初学正则表达式的我苦苦思索了许久才堪堪弄懂。而第二题和第三题的题目难度相比于前面的作业的难度就显得无比巨大,且需要使用面向对象的程序设计方法来简化程序,若仅仅是使面向过程则会使得程序变得繁杂冗长。
设计与分析
输入一个由英文字母组成的字符串(大小写均可),将所有英文字母转换成它们在字母表中的序号,例如:“AbbcD”转换为“12234”。
输入格式:
由英文字母组成的字符串(大小写均可)。例如:“AbbcD”
若包含非英文字母,视为非法输入。
输出格式:
所有英文字母转换成它们在字母表中的序号,例如:“12234”。
非法输入输出"Wrong Format".
输入样例:
在这里给出一组输入。例如:
AbbcD
输出样例:
在这里给出相应的输出。例如:
12234
输入样例1:
在这里给出一组输入。例如:
AFOPI
输出样例1:
在这里给出相应的输出。例如:
1615169
输入样例2:
在这里给出一组输入。例如:
c3u
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String s1 = input.next();
int key = 0;
// toLowerCase(s1);
for(int i=0;i<s1.length();i++)
{
if(s1.charAt(i)>='a'&&s1.charAt(i)<='z');
else if((s1.charAt(i)>='A'&&s1.charAt(i)<='Z'));
//s1.charAt(i) = Character.toLowerCase(s1.charAt(i));
else
key = 1;
}
if(key==1)
System.out.print("Wrong Format");
else
{
for(int i=0;i<s1.length();i++)
System.out.print((int)Character.toLowerCase(s1.charAt(i))-96);
}
}
}
在本题中主要是明白字符的ascill码,利用ascii码来进行字符的转换且在最后输出时进行一个类型转换即可
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
输入样例:
在这里给出一组输入。例如:
1111011101011111111111
输出样例:
在这里给出相应的输出。例如:
1:11101011
输入样例1:
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
输出样例1:
在这里给出相应的输出。例如:
1:11101011
2:01001101
3:validate error
输入样例2:
输入数据不足11位。例如:
111101
输出样例2:
在这里给出相应的输出。例如:
null data
输入样例3:
输入数据全1没有起始位。例如:
1111111111111111
输出样例3:
在这里给出相应的输出。例如:
null data
输入样例4:
输入数据全1没有起始位。例如:
111101110101111111101111111101
输出样例4:
在这里给出相应的输出。例如:
1:11101011
2:parity check error
输入样例5:
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
输出样例5:
在这里给出相应的输出。例如:
1:validate error
2:validate error
输入样例6:
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
输出样例6:
在这里给出相应的输出。例如:
1:00000000
2:01110000
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int key = 0,len = 0,num = 1,odd = 0;
if(s.length()<11)
System.out.print("null data");
else
{
while(s.length()-len>=10)
{
if(s.charAt(len)=='0')
{
key = 1;
odd = 0;
for(int i=len+1;i<=len+8;i++){
if(s.charAt(i)=='1')
odd++;
}
if((odd%2==0&&s.charAt(len+9)=='1'||odd%2==1&&s.charAt(len+9)=='0')&&s.charAt(len+10)=='1')
{
System.out.print(num+":");
num++;
for(int i=1;i<=8;i++)
System.out.print(s.charAt(++len));
System.out.println();
len+=3;
}
else if((odd%2==0&&s.charAt(len+9)=='1'||odd%2==1&&s.charAt(len+9)=='0')&&s.charAt(len+10)=='1'&&s.charAt(len+10)=='0')
{
System.out.print(num+":");
num++;
System.out.println("validate error");
len = len + 11;
}
else if((odd%2==1&&s.charAt(len+9)=='1'||odd%2==0&&s.charAt(len+9)=='0')&&s.charAt(len+10)=='1'&&s.charAt(len+10)=='1')
{
System.out.print(num+":");
num++;
System.out.println("parity check error");
len = len + 11;
}
else
{
System.out.print(num+":");
num++;
System.out.println("validate error");
len = len + 11;
}
}
else
len++;
}
}
if(key==0&&s.length()>=11)
System.out.print("null data");
}
}
在本题中,输入字符串后先判断字符串的大小是否小于11,若是小于11则可直接输出“null data”。若是大于则可进行下一步,利用while来保证字符串剩余长度大于11,在遇到0起始符时则可计算接下来八位字符的1的个数,再通过判断奇偶校验位和结束位是否正确,并依次输出相应的结果。
学校学生学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,
编写程序处理用全院学生学号连接起来的长字符串,学院编号为20,包括17、18、19、20四个年级,请从字符串中提取特定两个班级202017班、202061班同学的学号后四位输出,输出编号之间用空格分隔,不换行。
注意:需要排除非法输入。
输入格式:
全院学生学号组成的长字符串(学号之间无分隔)
学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,
输出格式:
特定两个班级202017班、202061班同学的学号后四位
如:1701 6103 1704
输入样例1:
在这里给出一组输入。例如:
2020610120201702202051132020110320201706
输出样例1:
在这里给出相应的输出。例如:
6101 1702 1706
输入样例2(第一个学号多输入一位):
在这里给出一组输入。例如:
20206100120201702202051132020110320201706
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
输入样例3(第一个学号少输入一位数字):
在这里给出一组输入。例如:
202061120201702202051132020110320201706
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
输入样例3(学号之间有空格):
在这里给出一组输入。例如:
2020610120201702 202051132020110320201706
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String s = input.nextLine();
String s1 = "202017",s2 = "202061";
int len = 0,key = 0;
if(s.length()%8!=0)
System.out.print("Wrong Format");
else
{
while(s.length()!=len)
{
if(key==0&&s.substring(len,len+6).equals(s1)||s.substring(len,len+6).equals(s2))
{
System.out.print(s.substring(len+4,len+8));
key = 1;
}
else if(key==1&&s.substring(len,len+6).equals(s1)||s.substring(len,len+6).equals(s2))
System.out.print(" "+s.substring(len+4,len+8));
len+=8;
}
}
}
}
在此题中先进行字符串长度的判断,若字符串整除8有余数便可直接输出"Wrong Format",否则便可使用两个字符串String s1 = "202017",s2 = "202061";并使用substring函数和euqal函数来判断学号前六位是否相同,若相同则直接输出。
输入连个点的坐标,计算两点之间的距离
输入格式:
4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
输出格式:
计算所得的两点之间的距离。例如:1.4142135623730951
输入样例:
整数输入。例如:
0,0 1,1
输出样例:
在这里给出相应的输出。例如:
1.4142135623730951
输入样例1:
带符号double类型实数输入。例如:
+2,-2.3 0.9,-3.2
输出样例1:
在这里给出相应的输出。例如:
1.42126704035519
输入样例2:
格式非法。例如:
++2,-2.3 0.9,-3.2
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
输入样例3:
点的数量超过两个。例如:
+2,-2.3 0.9,-3.2 +2,-2.3
输出样例3:
在这里给出相应的输出。例如:
wrong number of points
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
double x1,y1,x2,y2;
String s = input.nextLine();
String[] token1 = s.split(" ");
String[] token2 = null;
for(String i:token1) {
token2 = i.split(",");
for(String i1:token2) {
if(!i1.matches("^[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?)$"))
{System.out.print("Wrong Format");
return ;}
}
}
if(token1.length!=2){
System.out.print("wrong number of points");
return ;}
token2 = token1[0].split(",");
x1 = Double.valueOf(token2[0]);
y1 = Double.valueOf(token2[1]);
token2 = token1[1].split(",");
x2 = Double.valueOf(token2[0]);
y2 = Double.valueOf(token2[1]);
if(x1==x2&&y1==y2)
System.out.print("Wrong Format");
System.out.print(Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
}
}
在此题中要学会使用正则表达式和split函数便可轻松解决,但是正则表达式对于没接触的我来说让我有点摸不清头脑。
踩坑心得
在做第二次大作业的过程中,刚开始看题目的时候让我有种无从下手的感觉,在经历了老师讲解正则表达式之后才有种豁然开朗的感觉,而在做其他题目时除了有一些细节和语法的错误和函数的使用错误以外暂时感受不到错误。
改进建议
在做前三次的大作业中我使用的都是面向过程的写法,每种作业的程序都是使用了一个类,使得程序十分繁杂难懂,在随后的程序设计中我会使用面向对象的思想,使用多个类使得程序更加有结构,有层次。
总结
在经过这三次大作业后,我对于java的语法已经十分的熟悉且对于java的类的使用也有了一个初步的认识,对于面向对象的程序设计也有了一个初步的概念。在编写程序的过程中碰到困难后通过上网搜索得知一些函数后就轻易的解决了,让我对于java的一些函数也有了一些认知。
对于老师的授课方式和作业布置方式我个人觉得十分的完美,上课通过现场讲解源码的方式来帮助我们认识一些java的细节语法和函数的使用,让我们对于java的使用能更快的更好的掌握
浙公网安备 33010602011771号