Java第一阶段学习总结
Java第一阶段学习,有三道题。第一道是创建账户类Account,第二题是定义日期类,第三题是一元多项式求导(类设计),三道题难度依次增加,逐步深入对类这部分知识点的考察,一点点加深对类的应用。
在做第一道题创建账户类Account时,我发现如果不new一个对象,代码哪怕是能正常运行也不无发达到预期目标,输出想要的结果,不用new来新建一个对象就无法真正的了解类的内涵,第一题要求很多,比如要有一个能创建默认账户的无参构造方法,一个能创建特定id和初始余额的账户的构造方法,id、balance、annualInterstRate的和getter和setter方法,dataCreated的getter方法,用getmonthlyInterestRate的方法返回月利率,withdraw的方法从账户提取特定数额,一个deposit的方法向账户存储特定数额。这些方法都要在类中一一实现,虽然比较的麻烦,但也确实是解决这道题的最完美的方法。
第二题定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 data的类图如下:
第三题要求实现对简单多项式的导函数进行求解,具体要求是:
⚫ 带符号整数:前导不为 0 的带符号整数,如果是正号,可以省略,例如 -2,、+23、34442409 等。
⚫ 幂函数:由自变量 x(只支持小写)和指数组成,指数为一个带符号整 数,如 x^-2、x^+25。当指数为 1 时,可以省略指数,如 x。
⚫ 项:具体包括变量项和常数项。 ➢ 变量项是指带有系数的幂函数,如 2*x^2、-1*x^12; ✓ 系数为 1 时的时候,可以省略系数或表示为正号开头的形式,如 x^-2; ✓ 系数为-1 时的时候,可以表示为符号开头的形式,如-x^3。 ➢ 常数项包含一个带符号整数,例如:233。
⚫ 表达式:由加法和减法运算符连接若干项组成,如:-1+x^20-x^-6。注 意,表达式中空串不属于合法的表达式,另外,系数与指数均不能为 0。
⚫ 空白字符:在本次作业中,空白字符仅限于空格。
⚫ 此外,带符号整数内不允许出现空白字符,其他位置均可以存在空白字 符。 (2)求导算法 求导是数学计算中的一个计算方法,它的定义是:当自变量的增量趋于零时, 因变量的增量与自变量之商的极限。 在本次作业中,我们要对输入的多项式进行求导计算,并输出它的导函数。 本次作业可能用到的导函数公式为: 当 f(x)=a(a 为常数)时,𝑓′(𝑥)=0 当 f(x)=𝑎𝑥𝑏时,𝑓′(𝑥)=𝑎b𝑥𝑏-1 例如: 当 f(x)=2𝑥6+6𝑥4+200 时,𝑓′(𝑥)=12𝑥5+24𝑥3 输入 2*x^6+6*x^4+200,输出为:12*x^5+24*x^3。
程序功能需求也很复杂:
⚫ 判定输入表达式是否为正确的表达式;
⚫ 若输入为正确表达式,则计算其导函数并按要求输出。 (2)输入输出规则 ①输入规则 在一行内输入一个待计算导函数的表达式,以回车符结束。②输出规则
⚫ 如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。
⚫ 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: ➢ 结果不需要排序,也不需要化简; ➢ 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”; ➢ 当输出结果第一项系数符号为“+”时,不输出“+”; ➢ 当指数符号为“+”时,不输出“+”; ➢ 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
这道题是第一阶段的学习过程中最难也是对类的考察最为深入的一道题,我在这道题上花的时间几乎等于前两道题的总和。
我的java基础并不好,在完成代码编写编译运行的过程中遇到了不小的麻烦,进度完成的非常慢,但是遇到一个问题就去积极努力的去解决这个问题,虽然有些磕磕绊绊,但是我仍旧是完成了这三道题的代码编写,后来又经过一次次的编译,调试,终于输出了符合要求的结果,前两道题创建Account账户类和设计日期类求当前日期的下一天虽然要求不少,但是并不复杂,对输出的结果的要不算太高。
第一题在计算月利率的时候,对于余额的值的情况我不知道需不需要算上存款金额和取款金额,于是只能每种情况都尝试了一遍,最后通过和输出样例的比较我确定,只要输入的存款金额和取款金额数值合法就都会算到月利率的计算公式中去。
第二题的难点在于当前日期的请何况,比如某个月的月末,特殊月份的月末,像闰年的二月有29天,平年的二月有28天,虽然下一天都是当年的三月一日,但是判定的条件是不同的,还有就是年末的时候,每一种情况都要考虑进去,很多个if,而其中某些if之间是有联系的,有些可以合并,有些不可以合并,需要详细设计一下。
第三题,当看到这道题的时候,我就知道这道题对输入和输出的要求很高,不仅涉及到数字的输入和输出更涉及到了字母的输入和输出,对于合法的情况和不合法的情况我设计了很久,最终根据老师给出的题目说明度过了输入合法的判断阶段,接下来就是求导阶段,根据求导公式,指数的降次,系数的数值改变,某一项是否为零的情况,判断每一项的指数,系数情况,最终以这样的格式输出:2*x^6-0*x^7+5。
这是部分求导代码:
for(int i=0;i<polynomial.num;i++) {
m=polynomial.Coeff[i+1].multiply(polynomial.Index[i+1]);//相乘
n=polynomial.Index[i+1].subtract(new BigInteger ("1"));//指数减1
// if(polynomial.num==1&&n.compareTo(new BigInteger ("-1"))==0)
//System.out.print("0");
if(n.compareTo(new BigInteger ("-1"))==0) {//返回值0 等于
System.out.print("Wrong Format");
System.exit(0);
}
//System.out.print(i);
if(i!=0&&m.compareTo(new BigInteger ("0") )==1)//返回值 1 大于
//System.out.print("+");
s+="+";
if(n.compareTo(new BigInteger ("0"))==0)
//System.out.print(m);
s+=m;
else if(m.compareTo(new BigInteger ("1"))==0)//返回值0 等于
//System.out.print("x");
s+="x";
else
//System.out.print(m+"*x");
s+=m+"*x";
if(n.compareTo(new BigInteger ("1"))==0||n.compareTo(new BigInteger ("0"))==0 )//返回值为0 等于
//System.out.print("");
s+="";
else
//System.out.print("^"+n);
s+="^"+n;
}
if(s=="") {
System.out.print("0");
}
System.out.print(s);
}
这是检查数值字母是否合法的代码:
public boolean CheckData() {//检查是否符合要求
String a=data;
for(int i=0;i<a.length();i++) {
if(i==a.length()-1&&!a.substring(i,i+1).matches(" "))
return true;
// System.out.println(a.substring(i,i+1));
if(a.substring(i,i+1).matches("x")&&a.substring(i+1,i+2).matches("[x\\*]"))
return false;
else if(a.substring(i,i+1).matches("[\\^\\*]")&&a.substring(i+1,i+2).matches("[\\^\\*\\+]"))
return false;
else if(a.substring(i,i+1).matches("[\\*]")&&a.substring(i+1,i+2).matches("[\\^\\*\\+-]"))
return false;
else if(a.substring(i,i+1).matches("[-\\+]")&&a.substring(i+1,i+2).matches("[-\\+\\^\\*]"))
return false;
else if(a.substring(i,i+1).matches("[\\*x\\^]"))
continue;
if(!a.substring(i,i+1).matches("[-\\+\\d]")) {
// System.out.print(a.substring(i,i+1));
return false;}
if(a.substring(i,i+1).matches("0")&&i==0)
return false;
if(a.substring(i,i+1).matches("0")&&a.substring(i+1,i+2).matches("\\*")) {
//System.out.print(a.substring(i,i+1));
if(i==0||!a.substring(i-1,i).matches("\\d"))
return false;
}
}
return false;
}
这是指数以及系数的代码:
public void getIndex() {//指数
String a=data;
//BigInteger [] Index = null;//指数
String [] a0=new String [10086];//指数
int j=0;
for(int i=0;i<a.length();i++) {
if(a.substring(i,i+1).matches("x")) {
j++;
num++;
}
if(a.substring(i,i+1).matches("\\^"))
{
i++;
a0[j]="";
if(a.substring(i,i+1).matches("-")) {
a0[j]="-";i++;}
while(a.substring(i,i+1).matches("\\d")) {
a0[j]+=a.substring(i,i+1);
i++;
if(i==a.length()||a.substring(i,i+1).matches("[\\+-]"))
//(i!=a.length()&&a.substring(i,i+1).matches("[\\+-]"))
break;
}
}
if(a0[j]=="-")
Index [j]= new BigInteger ("-1");
else if(a0[j]==null)
Index [j]= new BigInteger ("1");
else
Index [j]= new BigInteger (a0[j]);
}
//Index [3]= new BigInteger ("1");
//System.out.print(Index[2]);
// int i=1;
// System.out.println("指数");
// while(Index[i]!=null) {
// System.out.println(Index[i]);
// i++;
// }
}
public void getCoeff() {//系数
String a=data;
// Coeff;//系数
String [] a0=new String [10086];//系数
int j=1;
for(int i=0;i<a.length();i++) {
if(a.substring(i,i+1).matches("x"))
j++;
if(a.substring(i,i+1).matches("(\\d)|-"))
{
if(i==a.length()-1)
break;
a0[j]=a.substring(i,i+1);
i++;
if(a.substring(i,i+1).matches("[\\+-]")) {
//System.out.print(a.substring(i,i+1));
i--;
continue;
}
while(a.substring(i,i+1).matches("(\\d)")) {
a0[j]+=a.substring(i,i+1);
i++;
if(i==a.length()||a.substring(i,i+1).matches("[\\+-]")) {
i--;
a0[j]=null;
break;
}
//System.out.print(j);
}
}
}
for(int i=1;i<j;i++) {
if(a0[i]=="-")
Coeff [i]= new BigInteger ("-1");
else if(a0[i]==null)
Coeff [i]= new BigInteger ("1");
else
Coeff [i]= new BigInteger (a0[i]);
}
虽然看上很简单,但是却费了我很多时间,基础不牢地动山摇,说的很有道理,有些时候虽然知道逻辑思路结构,但是用代码来实现的时候,就会有些磕磕绊绊。
从设计逻辑结构,到编写代码,到代码的调试,最后的代码输出,在这过程中,我发现,调试和修改是真的很重要,好代码是改出来的,只有经过一遍遍的调试,最后一点点的接近想要的结果,不要害怕麻烦,解决的麻烦越多,最后编写成功的代码质量越高。
知识点方面,把书本上的知识应用了起来,虽然不算是真正的学以致用,但是也体会到了光学不练也不行,从知识到应用这一过程需要细细品味才能明白其中的奥妙。
浙公网安备 33010602011771号