黑暗中漫舞i

导航

 

1.前言:

    (1)第一次题目集:知识点主要涉及变量的定义和对变量的赋值,输出的格式,还有一些相当基础的语法,比如判断,循环等等,还有一些常用到的,如字符类型的转换,数组的定义和使用,各种逻辑运算符等等。题量是8个编程题。题目难度的话,此次题目集并未涉及十分困难的知识点,所以难度较容易,但是用于初学Java,所以前面几次作业都是用面向过程写的,代码看起来和C语言的代码差不多。

    (2)第二次题目集:知识点还是和第一次差不多,后面三道题(下面会给出)我定义了static的数组,类似于C语言的全局变量,以及static类型的方法,在其他类当中可以直接进行调用而不需要new出一个新的对象来进行调用。难度的话只是相较于上次的题目更加难一些,更多的是对Java中类和对象的理解。

    (3)第三次题目集:除了上面所能用到的基本知识点外,此次作业的第三题用到了正则表达式,我也是特地去学习了一下正则表达式,但是我当时没有太理解正则表达式的使用,所以后面也没能用它来解决这个问题,以至于我这个题目有些测试点没有过去。此次题目集的题目量是三道编程题。难度的话比上两此要难许多,主要体现在字符串的匹配和字符和数字的相互转换。

2.设计与分析:

    (1)题目集一的7-8:

           题目描述:

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

          提交源码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		double a,b,c;
		a=in.nextDouble();
		b=in.nextDouble();
		c=in.nextDouble();
		if(a<1||a>200||b<1||b>200||c<1||c>200)//超过范围
		{
			System.out.print("Wrong Format");
		}
		else
		{
			if(((a+b)>c)&&((c+b)>a)&&((a+c)>b))//是三角形
			{
				if(a==b||a==c||b==c)//等腰
				{
					if(a==b&&a==c&&b==c)//等边
						System.out.print("Equilateral triangle");
					else
					{
						if(Math.abs(a*a-b*b-c*c)<0.01||Math.abs(b*b-a*a-c*c)<0.01||Math.abs(c*c-b*b-a*a)<0.01)
							System.out.print("Isosceles right-angled triangle");
						else//等腰
							System.out.print("Isosceles triangle");
					}
				}
				else
				{
					if(Math.abs(a*a-b*b-c*c)<0.01||Math.abs(b*b-a*a-c*c)<0.01||Math.abs(c*c-b*b-a*a)<0.01)//直角
					{
						System.out.print("Right-angled triangle");
					}
					else//普通
						System.out.print("General triangle");
				}
			}
			else//不是三角形
			{
				System.out.print("Not a triangle");
			}
		}
	}
}

              这个例题我是用面向过程写的,所以看起来非常的乱,毫无逻辑可言。但是随着Java后续的学习,自己会慢慢养成面向对象的习惯的,所以说问题不是很大。这个题的基础的思想是先判断这三条边能不能构成三角形,如果不行的话按照题目输出,然后就是判断三角形是不是等腰三角形,如果不是的话再判断是不是直角三角形,如果是的话就对应输出,都不是的话就是输出普通三角形了,再回到等腰三角形的条件里,判断是不是等边三角形,判断条件就不赘述了,非常简单。如果不是等边三角形的话,就判断是不是等腰直角三角形。再做出相应的输出。

              大概的思路就是这样, 然后就是要注意的地方了,就这个题来说其实也没有特别值得注意的地方,就是判断直角的条件,如果直接用两边的平方和减去第三边的平方的话,精度会有差距,只需要将它们的差小于0.01就可以。其他代码部分的话十分基础。

直角条件修改之前:

直角条件修改之后:

发现它并不能准确的识别直角条件,只能检测出那些整数的测试点。但由于我的代码是面向过程的,所以可以改用面向对象来写,代码思路是一样的,只有再写一个三角形的类,里面包括判断三角形是何种形状的方法,以减少我代码中过多的if和else。

          (2)题目集二的7-4:

            题目描述:输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

            提交源码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in );
		int []  date=new int[3];
		int a=0;
		while(a<3)//输入日期
		{
			date[a]=in.nextInt();
			a++;
		}
			if(checkInputValidity(date[0],date[1],date[2])!=true)
				System .out.print("Wrong Format");
			else
			{
				nextDate(date[0],date[1],date[2]);
			}
			
	}
	public static boolean isLeapYear(int year) {//判断year是否为闰年,返回boolean类型;
		if((year%4==0&&year%100!=0)||(year% 400== 0))
			return true;
		else
			return false;
	}
	public static boolean checkInputValidity(int year,int month,int day){
		//判断输入日期是否合法,返回布尔值
		if(year<1820||year>2020)
		{
			return false;
		}
		else
		{
		if((month==1&&day<=31&&day>0)||(isLeapYear(year)==true&&month==2&&day<=29&&day>0)
        ||(isLeapYear(year)==false&&month==2&&day<=28&&day>0)||(month==3&&day<=31&&day>0)
        ||(month==4&&day<=30&&day>0)||(month==5&&day<=31&&day>0)||(month==6&&day<=30&&day>0)
        ||(month==7&&day<=31&&day>0)||(month==8&&day<=31&&day>0)||(month==9&&day<=30&&day>0)
        ||(month==10&&day<=31&&day>0)||(month==11&&day<=30&&day>0)||(month==12&&day<=31&&day>0))
		{
			return true;
		}
		else
			return false;
		}
	}
	public static void nextDate(int year,int month,int day) {
		//求输入日期的下一天
			if((month==1&&day==31)||(isLeapYear(year)==true&&month==2&&day==29)
            ||(isLeapYear(year)==false&&month==2&&day==28)||(month==3&&day==31)
            ||(month==4&&day==30)||(month==5&&day==31)||(month==6&&day==30)
            ||(month==7&&day==31)||(month==8&&day==31)||(month==9&&day==30)
            ||(month==10&&day==31)||(month==11&&day==30))
			{
				int m=month+1;
				System .out.print("Next date is:"+year+"-"+m+"-1");
			}
			else
			{
				if(month==12&&day==31)
				{
					int y=year+1;
					System .out.print("Next date is:"+y+"-1-1");
				}
				else
				{
					int d=day+1;
					System .out.print("Next date is:"+year+"-"+month+"-"+d);
				}
			}
			
		}
}

        这个题目我的思路是先判断输入的日期是否合法,再计算日期的下一天,具体的计算方法是先判断该年是否为闰年,再从特殊的日期考虑,比如每个月的最后一天,再特殊一点的就是该年的最后一天。

其他日期的话就比较简单了,就只要把day加一就可以了。最后注意它的输出格式。

     (3)题目集二的7-5:

        题目描述:输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。

       提交源码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in );
		int []  date=new int[3];
		int a=0;
		int n;
		while(a<3)//输入日期
		{
			date[a]=in.nextInt();
			a++;
		}
		n=in.nextInt();
			if(checkInputValidity(date[0],date[1],date[2],n)!=true)
				System .out.print("Wrong Format");
			else
			{
				nextDate(date[0],date[1],date[2],n);
			}
			
	}
	public static boolean isLeapYear(int year) {//判断year是否为闰年,返回boolean类型;
		if((year%4==0&&year%100!=0)||(year% 400== 0))
			return true;
		else
			return false;
	}
	public static boolean checkInputValidity(int year,int month,int day,int n){
		//判断输入日期是否合法,返回布尔值
		if(n<-10||n>10)
		{
			return false;
		}
		else
		{
		if(year<1820||year>2020)
		{
			return false;
		}
		else
		{
		if((month==1&&day<=31&&day>0)||(isLeapYear(year)==true&&month==2&&day<=29&&day>0)
        ||(isLeapYear(year)==false&&month==2&&day<=28&&day>0)||(month==3&&day<=31&&day>0)
        ||(month==4&&day<=30&&day>0)||(month==5&&day<=31&&day>0)||(month==6&&day<=30&&day>0)
        ||(month==7&&day<=31&&day>0)||(month==8&&day<=31&&day>0)||(month==9&&day<=30&&day>0)
        ||(month==10&&day<=31&&day>0)||(month==11&&day<=30&&day>0)||(month==12&&day<=31&&day>0))
		{
			return true;
		}
		else
			return false;
		}
		}
	}
	public static void nextDate(int year,int month,int day,int n) 
	{
		//求输入日期的下n天
		if(n>0)//前n天
		{
			if(day<n)
			{
				if((month==2)||(month==4)||(month==6)||(month==8)||(month==9)||(month==11))//前月是31天的
				{

					System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(31+day-n));
				}
				else
				{
					if(month==5||month==7||month==10||month==12)//前月是30天
					{
						System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(30+day-n));
					}
					if(month==3)//前月是2月
					{
						if(isLeapYear(year))
						{
							System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(29+day-n));
						}
						else
							System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(28+day-n));
					}
					else if(month==1)//前月是12月
					{

						System .out.print(n+" days ago is:"+(year-1)+"-"+"12"+"-"+(31+day-n));
					}
				}
			}
			else
			{
				System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
			}
		}
		if(n<0)
		{
				if((month==4)||(month==6)||(month==8)||(month==9)||(month==11))//本月30天的
				{
					if(day-n>30)
						System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-30));
					else
						System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
				}
				else
				{
					if(month==1||month==3||month==5||month==7||month==8||month==10)//本月是31天
					{
						if(day-n>31)
							System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-31));
						else
							System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
					}
					if(month==2)//本月是2月
					{
						if(isLeapYear(year))
						{
							if(day-n>29)
								System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-29));
							else
								System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
						}
						else
						{
							if(day-n>28)
								System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-28));
							else
								System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
						}
					}
					else if(month==12)//本月是12月
					{
						if(day-n>31)
							System .out.print(n+" days ago is:"+(year+1)+"-"+"1"+"-"+(day-n-31));
						else
							System .out.print(n+" days ago is:"+(year+1)+"-"+"1"+"-"+(day-n));
					}
				}
			}
		if(n==0)
			System .out.print(n+" days ago is:"+year+"-"+month+"-"+day);
	}
}

        这个题目的大概思路和上个题差不多,我是先判断day小于n的情况,也就是所得的日期不在本月了,然后由上个月一共多少天决定怎么减,具体实现就是简单的计算,如下

if(n>0)//前n天
		{
			if(day<n)
			{
				if((month==2)||(month==4)||(month==6)||(month==8)||(month==9)||(month==11))//前月是31天的
				{

					System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(31+day-n));
				}
				else
				{
					if(month==5||month==7||month==10||month==12)//前月是30天
					{
						System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(30+day-n));
					}
					if(month==3)//前月是2月
					{
						if(isLeapYear(year))
						{
							System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(29+day-n));
						}
						else
							System .out.print(n+" days ago is:"+year+"-"+(month-1)+"-"+(28+day-n));
					}
					else if(month==1)//前月是12月
					{

						System .out.print(n+" days ago is:"+(year-1)+"-"+"12"+"-"+(31+day-n));
					}
				}
			}
			else
			{
				System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
			}
		}

        然后的情况就是n小于零的情况了,也就是后n天,也上一题更像了,也是重点判断那些使月或者年会变的日期,加入简单的运算就可以实现。具体如下

if(n<0)
		{
				if((month==4)||(month==6)||(month==8)||(month==9)||(month==11))//本月30天的
				{
					if(day-n>30)
						System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-30));
					else
						System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
				}
				else
				{
					if(month==1||month==3||month==5||month==7||month==8||month==10)//本月是31天
					{
						if(day-n>31)
							System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-31));
						else
							System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
					}
					if(month==2)//本月是2月
					{
						if(isLeapYear(year))
						{
							if(day-n>29)
								System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-29));
							else
								System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
						}
						else
						{
							if(day-n>28)
								System .out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(day-n-28));
							else
								System .out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));
						}
					}
					else if(month==12)//本月是12月
					{
						if(day-n>31)
							System .out.print(n+" days ago is:"+(year+1)+"-"+"1"+"-"+(day-n-31));
						else
							System .out.print(n+" days ago is:"+(year+1)+"-"+"1"+"-"+(day-n));
					}
				}
			}

        由于我这个题也是用面向过程写的。所以类图比较单一,如下

       (4)题目集三的7-2: 

          题目描述:定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

         提交源码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in );
		int y,m,d;
		y=in.nextInt();
		m=in.nextInt();
		d=in.nextInt();
		Date date=new Date(y,m,d);
		
			if(date.checkInputValidity(date.getYear(),date.getMonth(),date.getDay())!=true)
				System .out.print("Date Format is Wrong");
			else
			{
				date.getNextDate(date.getYear(),date.getMonth(),date.getDay());
			}
			
	}
}
class Date{
	int year;
	int month;
	int day;
	public Date() {};
	public Date(int year,int month,int day) {
		this.year=year;
		this.month=month;
		this.day=day;
	}
	public int getYear() {
		return this.year;
	}
	public void setYear(int year) {
		this.year=year;
	}
	public int getMonth() {
		return this.month;
	}
	public void setMonth(int month) {
		this.month=month;
	}
	public int getDay() {
		return this.day;
	}
	public void setDay(int day) {
		this.day=day;
	}
	
	
	
	public static boolean isLeapYear(int year) {//判断year是否为闰年,返回boolean类型;
		if((year%4==0&&year%100!=0)||(year% 400== 0))
			return true;
		else
			return false;
	}
	public boolean checkInputValidity(int year,int month,int day){
		//判断输入日期是否合法,返回布尔值
		if(year<1900||year>2000)
		{
			return false;
		}
		else
		{
		if((month==1&&day<=31&&day>0)||(isLeapYear(year)==true&&month==2&&day<=29&&day>0)
        ||(isLeapYear(year)==false&&month==2&&day<=28&&day>0)||(month==3&&day<=31&&day>0)
        ||(month==4&&day<=30&&day>0)||(month==5&&day<=31&&day>0)||(month==6&&day<=30&&day>0)
        ||(month==7&&day<=31&&day>0)||(month==8&&day<=31&&day>0)||(month==9&&day<=30&&day>0)
        ||(month==10&&day<=31&&day>0)||(month==11&&day<=30&&day>0)||(month==12&&day<=31&&day>0))
		{
			return true;
		}
		else
			return false;
		}
	}
	public void getNextDate(int year,int month,int day) {
		//求输入日期的下一天
			if((month==1&&day==31)||(isLeapYear(year)==true&&month==2&&day==29)
            ||(isLeapYear(year)==false&&month==2&&day==28)||(month==3&&day==31)
            ||(month==4&&day==30)||(month==5&&day==31)||(month==6&&day==30)
            ||(month==7&&day==31)||(month==8&&day==31)||(month==9&&day==30)
            ||(month==10&&day==31)||(month==11&&day==30))
			{
				int m=month+1;
				System .out.print("Next day is:"+year+"-"+m+"-1");
			}
			else
			{
				if(month==12&&day==31)
				{
					int y=year+1;
					System .out.print("Next day is:"+y+"-1-1");
				}
				else
				{
					int d=day+1;
					System .out.print("Next day is:"+year+"-"+month+"-"+d);
				}
			}
			
		}
}

         这个题目和上一个题目集的7-4几乎是一模一样,所以思路上没有不一样,只是按照题目的意思写了一个date类,所以也没有什么值得分析的点。

       (5)题目集三的7-3:

         题目描述:编写程序性,实现对简单多项式的导函数进行求解。

         输入格式:在一行内输入一个待计算导函数的表达式,以回车符结束。

         输出格式:

  1. 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
  2. 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
  • 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
  • 当输出结果第一项系数符号为“+”时,不输出“+”;
  • 当指数符号为“+”时,不输出“+”;
  • 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。

     提交源码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in );
		String s1,s2;
		s1=in.nextLine();
		s1=s1.replaceAll(" ", "");
		Dfunction df=new Dfunction(s1);
		if(df.isFunc(s1)==false)
		{
			System .out.print("Wrong Format");
			return ;
		}
		df.setDfunction();
		df.prin();
	}
}
class Dfunction{
	String s;
	static char [] operator=new char[10];
	static String [] expression=new String[] {"","","","","","","","","","",""};
	static int no=0;
	public Dfunction() {};
	public Dfunction(String s) {
		this.s =s;
	}
	public  static boolean isFunc(String s) {//判断表达式是否正确;
		int i=0,n=s.length();
		int k=1;
		int a=0,b=0,x1=0,x2=0;
		char op;
		String exp;
		while(i<n)
		{
			if(s.charAt(i)=='0') 
			{//有0出现
				if(s.charAt(i-1)=='+'||s.charAt(i-1)=='-'||s.charAt(i-1)=='*'||s.charAt(i-1)=='^')
				{
					k=0;
					break;
				}
			}
			if(s.charAt(i)=='+'||s.charAt(i)=='-')
			{
				if(i!=0&&s.charAt(i-1)!='^')
				{
					b=i;
					setExpression(s.substring(a, b),x1);
					x1++;
					no++;
					setOperator(s.charAt(i),x2);
					x2++;
					no++;
					a=b+1;
				}
			}
			if(i==n-1)
			{
				setExpression(s.substring(a, i+1),x1);
				x1++;
				no++;
			}
			i++;
		}
		if(k==0)
			return false;
		else
			return true;
	}
	public static void setOperator(char s,int x){//将运算符存入数组;
		
		operator[x]=s;
	}
	public static void setExpression(String s,int x) {//将表达式存入数组;
		expression[x]=s;
	}
	public static int num(char c)
	{
		int a=0;
		if(c=='0')
			a=0;
		if(c=='1')
			a=1;
		if(c=='2')
			a=2;
		if(c=='3')
			a=3;
		if(c=='4')
			a=4;
		if(c=='5')
			a=5;
		if(c=='6')
			a=6;
		if(c=='7')
			a=7;
		if(c=='8')
			a=8;
		if(c=='9')
			a=9;
			return a;
	}
		
	public  void setDfunction() {//各项求导并合并
		int n=(no+1)/2;
		String str,s;
		int i=0,len;
		int y=0,relt1=0,relt2=0,k;
		while(i<n)
		{
			s=expression[i];
			len=s.length();
			int j=0,io=0;
			while(j<len)
			{
				if(s.charAt(0)!='-')//求系数
				{
					if(s.charAt(j)!='*')
					{
						y++;
					}
					if(s.charAt(j)=='*')
					{
						for(k=1;k<=y;k++)
						{
							int a=num(s.charAt(y-k));
							relt1+=a*(Math.pow(10,k-1));
						}
					}
				}
				
				if(s.charAt(0)=='-'&&i==0)//第一项的系数
				{
					if(s.charAt(j)!='*')
					{
						y++;
					}
					if(s.charAt(j)=='*')
					{
						for(k=2;k<=y;k++)
						{
							int a=num(s.charAt(y-k+1));
							relt1+=a*(Math.pow(10,k-2));
						}
						relt1=0-relt1;
					}
				}
				
				if(s.charAt(j)=='x')//求指数
				{
					int x=j+1;
					io=1;
					if(j!=len-1)
					{
						if(s.charAt(x+1)=='-')
						{
							for(k=1;k<=len-x-2;k++)
							{
								int a=num(s.charAt(len-k));
								relt2+=a*(Math.pow(10,k-1));
							}
							relt2=0-relt2;
						}
						else
						{
							for(k=1;k<=len-x-1;k++)
							{
								int a=num(s.charAt(len-k));
								relt2+=a*(Math.pow(10,k-1));
							}
						}
					}
					else
					{
						relt2=1;
					}
				}
				
				j++;
			}
			relt1=relt1*relt2;
			relt2=relt2-1;
			
			
			if(relt2==0)
			{
				String numInString3 = Integer.toString(relt1);
				expression[i]=numInString3;
			}
			else
			{
				if(io==1)
				{
			String numInString1 = Integer.toString(relt1);
			String numInString2 = Integer.toString(relt2);
			expression[i]=numInString1+"*x^"+numInString2;
				}
			}
			if(io==0)
				expression[i]="0";
			/*System .out.println(expression[i]);*/
			
			relt1=0;
			relt2=0;
			y=0;
			io=0;
			i++;
		}
	}
	public  void prin()
	{
		int n=(no-1)/2,i=0,y=0;
		while(i<n)
		{
			if(expression[i]!="0")
			{
				if(i!=n-1)
				{
				System .out.print(expression[i]+operator[i]);
				y=1;
				}
				else
				{
					if(expression[i+1]!="0")
					{
						System .out.print(expression[i]+operator[i]+expression[i+1]);
						y=1;
					}
					else
					{
						System .out.print(expression[i]);
						y=1;
					}
				}
			}
			i++;
		}
		if(y==0)
			System .out.print("0");
		
	}

}

             先说一下我做这个题目的思路,先设置一个运算符数组,一个表达式数组。然后吸收字符串的多余空格,用到replaceAll方法。再逐个遍历字符串,判断它是不是合法的表达式,如果不是的话就直接输出然后返回。如果是的话就直接同步的将单个表达式和运算符储存在对应的数组里。此时我们就将运算符和单个表达式处理完了。然后就是处理单个表达式,将它们一个一个求导,再覆盖原来的表达式,具体求导的细节体现在字符串与数字的相互转换,可以借助Java自带的方法,也可以自己写一个转换的方法。但是这个题目要测试的点比较多,所以说要用到大数,这也是这个题目的困难所在,我之前也卡了很多测试点没过去,后来问了别人才知道用正则表达式解决会比较简单。关于正则表达式读者可以试着自学一下,因为内容相当多,要做到灵活应用需要大量的练习。类图如下

总结:因为之前学的是C语言,所以之前写的编程题大多都是面向过程写的,还是停留在以前那种主函数遇到问题,然后跳到解决问题的函数,解决完问题后返回一个结果,然后输出这个结果。解题思路也是一条路往下的方式,初学Java一开始不能理解类的使用,对于一些简单的问题尚可解决,但是遇到一些复杂的问题的时候往往就会容易搞混淆,后来我是将类理解成C语言的结构体,将类当中的方法理解成C语言的函数,再结合不同的题目慢慢就理解了类。但在后续的学习中还需要加深自己对面向对象的理解,在分析问题开始就加入面向对象的思考,能把这个问题分解成什么样的类,它们有什么属性,能解决什么样的问题,这样遇到再复杂的问题都可以步步分解,把它分解成小而简单的问题。对Java课程的建议就是重在培养我们解决问题的思考方法,而不是一味的学习语法,通过平时的作业和实验等能加深我们对面向对象的理解。

        

posted on 2021-10-15 13:33  严磊i  阅读(44)  评论(0)    收藏  举报
 
$().ready( function (){ AjaxPost( "/ws/di" + "gg.as" + "mx/di" + "gg" , '{ent' + 'ryId:' + cb_entryId + ',blog' + 'Id:' + cb_blogId + ',digg' + 'Ty' + 'pe:1}' , OnDiggSuccess); });