NCHUWXW第一次大作业总结

NCHUWXW第一次大作业总结

    第一个博客   ^_^

   目录

    1.   开始学JAVA的初始

    2.   设计与分析:总结三次题目集的知识点、题量、难度等情况,重点对题目的提交源码进行分析

    3.   采坑心得:对源码的提交过程中出现的问题及心得进行总结

    4.   总结:对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。

 

一 .   开始学JAVA的初始

   1. 这个学期才开始学习java,因为开始三小了所以也学了一点Python,也了解了一点面向对象的思想,我们那个三小项目是检测口罩,这个必须要用面向对象,如果面向过程的话,那么断开一个点的话其他的东西就完全废了,其次还要用树莓派虚拟机来搞所以面向对象是完全必要的。

   2. 一开始那些类和方法完全不懂就是无脑去写,用面向过程的想法来用JAVA的语法来写,所以完全就是管中窥豹了,后面学会调用和上课的时间就明白了。其实就是方法,结构体,只不过在面向过程里面,结构体是一个总的一些对象,然后在主函数去用它,但是这个类        就不一样,将每个要干的分开来,然后在主函数里去拼成最终的机器。所以面向对象是很必要的,因为在一个团队里,每个程序员写的都是不同的功能,当你写的东西去动了主函数的话,就会非常麻烦

   3.尽量别抄别人的代码,因为在java里调试和错误都是很严格的,不跟C一样错了也能运行,调试简单,分开简单。抄要抄思想和别人新的东西,变成自己的,抄也有技巧的。因为学计算机一开始就是学外国的,我们肯定能反超,但是现在我们连一伙的都没有学懂,怎么      去学别的呢。

   4.像以后还有多态和继承就在下一次的博客里去写吧(也有可能放鸽子)

二.  设计与分析:总结三次题目集的知识点、题量、难度等情况,重点对题目的提交源码进行分析

  1.面向对象程序设计-2021-物联网-1

     总结:这个知识点没啥可说的,基本上就是算法分析和麻烦,特别是税率,基本上就是if  else语句的运用和回忆了一下冒泡排序,还有在java里面用数组的特殊方法,下面重点讲解,还有一些小bug,可以说一说。

     知识点     1   题量   4    难度  3  (满分5)

   (1.计算两个数的和)  这个就不要讲了吧它提供的正常规范格式就是这个代码,不必多说了吧。直接上代码,输入每个语言不一样具体可以去看看书

    

import java.util.Scanner;

public class Liangshujia {
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
        	Scanner s=new Scanner(System.in);
        	int m=s.nextInt();
        	int n=s.nextInt();
        	int num=m+n;
        	System.out.print(num);
	}

}

  

   (2.电话键盘字母数字转换)这个主要不能输入单个字符要输入一个字符串然后用charAT来取第一个字符然后进行if else判断。输出的话要用+来连接两个不一样的输出,否则会输出错误

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner str=new Scanner(System.in);
		String shuru=str.nextLine();
		char c=shuru.charAt(0);
		if((c>='a'&&c<='c')||(c>='A'&&c<='C'))
			System.out.println(2);
		else if((c>='d'&&c<='f')||(c>='D'&&c<='F'))
			System.out.println(3);
		else if((c>='g'&&c<='i')||(c>='G'&&c<='I'))
			System.out.println(4);
		else if((c>='j'&&c<='l')||(c>='J'&&c<='L'))
			System.out.println(5);
		else if((c>='m'&&c<='o')||(c>='M'&&c<='O'))
			System.out.println(6);
		else if((c>='p'&&c<='s')||(c>='P'&&c<='S'))
			System.out.println(7);
		else if((c>='T'&&c<='V')||(c>='t'&&c<='v'))
			System.out.println(8);
		else if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))
			System.out.println(9);
		else 
			System.out.println(c+" is an invalid input");
	}

}

  

      (3.成绩分级管理)这个就直接上

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
       Scanner n=new Scanner(System.in);
       int num=n.nextInt();
       if(num<60)
    	   System.out.println("E");
       else if(num>=60&&num<70)
    	   System.out.println("D");
       else if(num>=70&&num<80)
    	   System.out.println("C");
       else if(num>=80&&num<90)
    	   System.out.println("B");
       else if(num>=90)
    	   System.out.println("A");
	}

}

  (4.计算税率)这个就是无语的题,就是死算,和算法,然后就是if  else

import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		int a = input.nextInt();
		double b = input.nextDouble();
		double s;
		if(a!=1&&a!=2&&a!=3&&a!=0||b<0)
			System.out.print("Wrong Format");
		else if(a==0)//Single
		{
			if(b>=0&&b<=8350)
			{
				s=b*0.1;
				System.out.print(s);
			}
			else if(b>8350&&b<=33950)
					{
						s=8350*0.1+(b-8350)*0.15;
						System.out.print(s);
					}
			else if(b>33950&&b<=82250)
					{
						s=8350*0.1+(33950-8350)*0.15+(b-33950)*0.25;
						System.out.print(s);
					}
			else if(b>82250&&b<=171550)
					{
						s=8350*0.1+(33950-8350)*0.15+(82250-33950)*0.25+(b-82250)*0.28;
						System.out.print(s);
					}
			else if(b>171550&&b<=372950)
					{
				s=8350*0.1+(33950-8350)*0.15+(82250-33950)*0.25+(171550-82250)*0.28+(b-171550)*0.33;
				System.out.print(s);
					}
			else if(b>372950)
			{
				s=835+(33950-8350)*0.15+(82250-33950)*0.25+(171550-82250)*0.28+(372950-171550)*0.33+(b-372950)*0.35;
				System.out.print(s);
			}
			}
				
		
		else if(a==1)//Married Filling Jointly or Qualified Widoe(er)
		{
			
			if(b>=0&&b<=16700)
			{
				s=b*0.1;
				System.out.print(s);
			}
			else if(b>16700&&b<=67900)
					{
						s=16700*0.1+(b-16700)*0.15;
						System.out.print(s);
					}
			else if(b>67900&&b<=137050)
					{
						s=16700*0.1+(67900-16700)*0.15+(b-67900)*0.25;
						System.out.print(s);
					}
			else if(b>137050&&b<=208850)
					{
						s=16700*0.1+(67900-16700)*0.15+(137050-67900)*0.25+(b-137050)*0.28;
						System.out.print(s);
					}
			else if(b>208850&&b<=372950)
					{
				s=16700*0.1+(67900-16700)*0.15+(137050-67900)*0.25+(208850-137050)*0.28+(b-208850)*0.33;
				System.out.print(s);
					}
			else if(b>372950)
			{
				s=1670+(67900-16700)*0.15+(137050-67900)*0.25+(208850-137050)*0.28+(372950-208850)*0.33+(b-372950)*0.35;
				System.out.print(s);
			}
		}
		else if(a==2) //Married Filling Separately
		{
			if(b>=0&&b<=8350)
			{
				s=b*0.1;
				System.out.print(s);
			}
			else if(b>8350&&b<=33950)
					{
						s=8350*0.1+(b-8350)*0.15;
						System.out.print(s);
					}
			else if(b>33950&&b<=68525)
					{
						s=8350*0.1+(33950-8350)*0.15+(b-33950)*0.25;
						System.out.print(s);
					}
			else if(b>=68525&&b<=104425)
					{
						s=8350*0.1+(33950-8350)*0.15+(68525-33950)*0.25+(b-68525)*0.28;
						System.out.print(s);
					}
			else if(b>104425&&b<=186475)
					{
				s=8350*0.1+(33950-8350)*0.15+(68525-33950)*0.25+(104425-68525)*0.28+(b-104425)*0.33;
				System.out.print(s);
					}
			else if(b>186475)
			{
				s=835+(33950-8350)*0.15+(68525-33950)*0.25+(104425-68525)*0.28+(186475-104425)*0.33+(b-186475)*0.35;
				System.out.print(s);
			}
			
		}
		else  if(a==3)//Head of Household
		{
			if(b>=0&&b<=11950)
			{
				s=b*0.1;
				System.out.print(s);
			}
			else if(b>11950&&b<=45500)
					{
						s=11950*0.1+(b-11950)*0.15;
						System.out.print(s);
					}
			else if(b>45500&&b<=117450)
					{
						s=11950*0.1+(45500-11950)*0.15+(b-45500)*0.25;
						System.out.print(s);
					}
			else if(b>117450&&b<=190200)
					{
						s=11950*0.1+(45500-11950)*0.15+(117450-45500)*0.25+(b-117450)*0.28;
						System.out.print(s);
					}
			else if(b>190200&&b<=372950)
					{
				s=11950*0.1+(45500-11950)*0.15+(117450-45500)*0.25+(190200-117450)*0.28+(b-190200)*0.33;
				System.out.print(s);
					}
			else if(b>372950)
			{
				s=1195+(45500-11950)*0.15+(117450-45500)*0.25+(190200-117450)*0.28+(372950-190200)*0.33+(b-372950)*0.35;
				System.out.print(s);
			}
		}
		
	}

}

  (5.计算钱币 )这个就是原来C语言里的算法了,就是最简单的取每个数字,学一下算法

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
           Scanner input=new Scanner(System.in);
           double sum=input.nextDouble();
           double y[]=new double[10];
           System.out.println((int)(sum/10)+"张十元");
           y[0]=sum%10;
           System.out.println((int)(y[0]/5)+"张五元");
           y[1]=y[0]%5;
           System.out.println((int)(y[1]/1)+"张一元");
           y[2]=y[1]%1;
           System.out.println((int)(y[2]/0.5)+"个五角");
           y[3]=y[2]%0.5;
           System.out.println((int)(y[3]/0.1)+"个一角");
           y[4]=y[3]%0.1;
           System.out.println((int)(y[4]/0.02)+"个贰分");
           y[5]=y[4]%0.02;
           System.out.println((int)(y[5]/0.01)+"个壹分");
	}

}

  (6.使用一维数组求平均值)循环输入数组里的值然后求平均值

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
         Scanner input=new Scanner(System.in);
         double sum;
         int[] y=new int [5];
         for(int i=0;i<5;i++)
         {
        	 y[i]=input.nextInt();
         }
         sum=(y[0]+y[1]+y[2]+y[3]+y[4]);
         System.out.println(sum/5);
	}

}

  (7.对多个整数进行排序)  输入数组继续,然后用C的冒泡排序

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
         Scanner input=new Scanner(System.in);
         int n=input.nextInt();
         int a[]=new int [n];
         for(int i=0;i<n;i++)
         {
        	 a[i]=input.nextInt();
         }
         int t=0;
         for(int i=0;i<n-1;i++)
         {
        	 for(int j=0;j<n-i-1;j++)
        	 {
        		 if(a[j]>a[j+1])
        		 {
        			 int temp=a[j];
        			 a[j]=a[j+1];
        			 a[j+1]=temp;
        		 }
        	 }
         }
         System.out.print("The sorted numbers are:");
         for(int i=0;i<n;i++)
         {
        	 System.out.print(a[i]+" ");
         }
	}

}

   (8.判断三角形类型) 这个就是if else的判定,不过要注意一个细节,就是在判断直角三角形用勾股定理的时候,不能用=因为计算机没有无理数去匹配例如1+1=2,这时候根号2就找不到了,所以并没有用,要小于0.001

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) 
	{
		Scanner input=new Scanner(System.in);
		double a,b,c,temp;
		a=input.nextDouble();b=input.nextDouble();c=input.nextDouble();
		if(a>b)
		{
            temp=a;a=b;b=temp;
        }
        if(a>c)
        {
            temp=a;a=c;c=temp;
        }
        if(b>c)
        {
            temp=b;b=c;c=temp;
        }//上面就是简单排个序
        double sum;
        sum=a*a+b*b-c*c;//计算勾股定理的值
        if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200)
        {
        	if(a+b>c)
        	{
        		if(a==b&&b==c&&a==c)
        			System.out.println("Equilateral triangle");
        		else if((sum<0.000001)&&(a==b))
        			System.out.println("Isosceles right-angled triangle");
        		else if((a==b&&a!=c)||(a==c&&b!=a)||(b==c&&a!=c))
        			System.out.println("Isosceles triangle");
        		else if(a*a+b*b-c*c<0.000001)
        			System.out.println("Right-angled triangle");
        		else
        			System.out.println("General triangle");
        	}
        	else
        		System.out.println("Not a triangle");
        }
        else
        	System.out.println("Wrong Format");
	}

}

  

 

 这个重点就是看复杂度,这个直接最大的复杂度调到23,就离谱,需要用class来改变了否则就是复杂度爆棚

2.面向对象程序设计-2021-物联网-2

  总结: 前面三道题就不说了,其实后面就是前面的东西了没有必要的吧,。这次开始就有类的比较了,学习类和调用它的方法,来写出这个题,所以说知识点还是OK的,难度也没有太高,一只调试就可以出来了。

  知识点 :  3    题量:2   难度:2

  (1.求下一天)啊一开始就要学会拆分,不然还是面向过程,学了跟没学似的,把判断闰年,日期合法,下一天,都写到其他方法里面去,然后在主函数里面调用他们,下面第一个写好主函数里要干啥,然后没有的就可以直接创建出来,不需要那么麻烦了,这边默认你搞好了,直接开讲那三个方法调用

    判断闰年.首先传入一个参数year,这个不跟C一样要在开头写一个,直接在java类里面直接创建就行了,不需要再在开头写一个函数名字,。好写一个bool的方法因为只是判断是不是闰年,所以返回一个bool的真假就好了,闰年判断就不讲了哈,忘了就百度,

private static boolean runnian(int year) 
{
	// TODO 自动生成的方法存根
	boolean runnian=true;
    if((year%4==0&&year%100!=0)||(year%400==0))
    	return runnian;
    else
    	return false;
}

 

  日期合法.发现了吧这个只能用check去返回值否则则会报错的哦,然后这个要注意下闰年多一天,所以在创建日期数组的时候要注意稍稍改变一下,然后日期合法就出来了,

public static boolean check(int year,int month,int day)
{
	boolean check=true;
	int a[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
	if(runnian(year)==false)
		a[2]=28;
	if(year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0)
		return check;
	else
		return false;
}

  判断下一天.首先需要日期合法,合法在进行下一步操作,首先年份跨年的时候就要+1变1,其次就是正常还有月份夸的时候要注意一下,置一还有+1

public static void numOfDays(int year, int month, int day)
{
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; int d=0,m=0; if(runnian(year)==false) a[2] = 28; if(check(year,month,day)) { if(month==12) { if(day==a[month]) { year = year+1; m = 1; d=1; } else { m=month; d =day +1; } } else { if(day==a[month]) { m = month + 1; d = 1; } else { m=month; d = day+1; } } System.out.println("Next date is:"+year+"-"+m+"-"+d); } else System.out.println("Wrong Format"); }

  好了直接全代码了,main里面创建三个year,day,month,然后检查和直接调用天数

import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
        Scanner input=new Scanner(System.in);
        int year=input.nextInt();
        int month=input.nextInt();
        int day=input.nextInt();
        
        if(check(year,month,day)==false)
        	System.out.println("Wrong Format");
        else
        {
        	numOfDays(year,month,day);
        }
	}



public static boolean check(int year,int month,int day)
{
	boolean check=true;
	int a[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
	if(runnian(year)==false)
		a[2]=28;
	if(year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0)
		return check;
	else
		return false;
}

private static boolean runnian(int year) 
{
	// TODO 自动生成的方法存根
	boolean runnian=true;
    if((year%4==0&&year%100!=0)||(year%400==0))
    	return runnian;
    else
    	return false;
}

public static void numOfDays(int year, int month, int day)
{
	 int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
     int d=0,m=0;
     if(runnian(year)==false)
         a[2] = 28;
     if(check(year,month,day))
     {
         if(month==12) 
         {
             if(day==a[month]) 
             {
                 year = year+1;
                 m = 1;
                 d=1;
             }
             else
             {
                 m=month;
                 d =day +1;
             }
         }
         else 
         {
             if(day==a[month]) 
             {
                 m = month + 1;
                 d = 1;
             }
             else
             {
                 m=month;
                 d = day+1;
             }
         }
         System.out.println("Next date is:"+year+"-"+m+"-"+d);
     }
     else
         System.out.println("Wrong Format");
 }

}

  

 

 

 

 

 

 发现没有,这个用了方法之后最大的圈复杂度直接就变成10了,完全就很爽了,所以圈复杂度还是有必要的,因为we are 伐木累。

  (2.求前N天)

    这个哈跟上面一样的一个下一天就是前N天,判断闰年和日期合法就不搞了直接看前N天

    前N天首先哈要注意这个N他会有 负数输入的情况所以要讨论,那我就讲一个正的,负的你们自己去想下哈,首先跟上面一样的,month要注意那这个就是1的时候了,首先看会不会跳,跳的话,月份减一,依旧这个月天数去减N,然后在用上一个月的去减这个值,没有的话,直接就day-N就好了,那1月的话就要注意跳年了,计算情况要自己想一下了,,这个应该很简单的吧

public static void nextDate(int year,int month,int day,int n)
    {
        int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
        int d=0,m=0,b;
        if(!isLeapYear(year))
            a[2] = 28;
        if(checkInputValidity(year,month,day,n))
        {
            if(n>0)
            {
                if(month!=1)
                {
                    if(n<day)
                    {
                        m=month;
                        d=day-n;
                    }
                    else 
                    {
                        b=n-day;
                        m=month-1;
                        d=a[month-1]-b;
                    }
                }
                else
                {
                    if(n<day) 
                    {
                        m=month;
                        d=day-n;
                    }
                    else  
                    {
                        b=n-day;
                        year=year-1;
                        m=12;
                        d=31-b;
                    }
                }
                System.out.println(n+" days ago is:"+year+"-"+m+"-"+d);
            }
            else
            {
                n=-n;
                if(month!=12)
                {
                    if(n+day<a[month]) 
                    {
                        m=month;
                        d=day+n;
                    }
                    else 
                    {
                        b=n+day;
                        m=month+1;
                        d=b-a[month];
                    }
                }
                else
                {
                    if(n+day<a[month])
                    {
                        m=month;
                        d=day+n;
                    }
                    else  
                    {
                        b=n+day;
                        year=year+1;
                        m=1;
                        d=b-a[month];
                    }
                }
                n=-n;
                System.out.println(n+" days ago is:"+year+"-"+m+"-"+d);
            }
        }
        else
            System.out.println("Wrong Format");
    }

  好了,听懂扣个1,直接上代码了,这个没有输入的考虑情况,直接就好了

import java.util.Scanner;
public class Main {
     //主函数
     public static void main(String[] args) {
         Scanner x = new Scanner(System.in);
         int year = x.nextInt();
         int month = x.nextInt();
         int day = x.nextInt();
         int n=x.nextInt();
         nextDate(year,month,day,n);
     }
    public static boolean isLeapYear(int year) {
        boolean isLeapYear;
        isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
        return isLeapYear;
    }
    public static boolean checkInputValidity(int year,int month,int day,int n) {
        boolean checkInputValidity;
        int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
        if(!isLeapYear(year))
            a[2] = 28;
        checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0&&n<=10&&n>=-10);
        return checkInputValidity;
    }
    public static void nextDate(int year,int month,int day,int n)
    {
        int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
        int d=0,m=0,b;
        if(!isLeapYear(year))
            a[2] = 28;
        if(checkInputValidity(year,month,day,n))
        {
            if(n>0)
            {
                if(month!=1)
                {
                    if(n<day)
                    {
                        m=month;
                        d=day-n;
                    }
                    else 
                    {
                        b=n-day;
                        m=month-1;
                        d=a[month-1]-b;
                    }
                }
                else
                {
                    if(n<day) 
                    {
                        m=month;
                        d=day-n;
                    }
                    else  
                    {
                        b=n-day;
                        year=year-1;
                        m=12;
                        d=31-b;
                    }
                }
                System.out.println(n+" days ago is:"+year+"-"+m+"-"+d);
            }
            else
            {
                n=-n;
                if(month!=12)
                {
                    if(n+day<a[month]) 
                    {
                        m=month;
                        d=day+n;
                    }
                    else 
                    {
                        b=n+day;
                        m=month+1;
                        d=b-a[month];
                    }
                }
                else
                {
                    if(n+day<a[month])
                    {
                        m=month;
                        d=day+n;
                    }
                    else  
                    {
                        b=n+day;
                        year=year+1;
                        m=1;
                        d=b-a[month];
                    }
                }
                n=-n;
                System.out.println(n+" days ago is:"+year+"-"+m+"-"+d);
            }
        }
        else
            System.out.println("Wrong Format");
    }
}

  这个圈复杂就不看了,应该可以自己想吧,这个比上面情况多一点,自然复杂度就高了。

 3.面向对象程序设计-2021-物联网-3

   总结:前面两题很简单最后的难一点,依旧是关于类思想的写法,但是出了一个正则表达式,我觉得大家可以去由浅入深的学习一下,这个东西很方便,以后绝对用的到,而不是用数据结构栈的思想来写这个那是在太简单了把,就是代码Ctrl c ctrl v了,那实在贻笑大方了,不是说不行,但是很慢了,复杂度不知道会有多少。

    知识点:4 题量:2 难度“4

   (1.定义日期类)这个就不说了哈更上面一样你们就自己写下吧哈,不上主代码了,加一点输出就好了,就是前面复制粘贴,算了还是上吧。

import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
        Scanner input=new Scanner(System.in);
        int year=input.nextInt();
        int month=input.nextInt();
        int day=input.nextInt();
        
        if(check(year,month,day)==false)
        	System.out.println("Date Format is Wrong");
        else
        {
        	numOfDays(year,month,day);
        }
	}



public static boolean check(int year,int month,int day)
{
	boolean check=true;
	int a[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
	if(runnian(year)==false)
		a[2]=28;
	if(year>=1900&&year<=2000&&month>0&&month<=12&&day<=a[month]&&day>0)
		return check;
	else
		return false;
}

private static boolean runnian(int year) 
{
	// TODO 自动生成的方法存根
	boolean runnian=true;
    if((year%4==0&&year%100!=0)||(year%400==0))
    	return runnian;
    else
    	return false;
}

public static void numOfDays(int year, int month, int day)
{
	 int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
     int d=0,m=0;
     if(runnian(year)==false)
         a[2] = 28;
     if(check(year,month,day))
     {
         if(month==12) {
             if(day==a[month]) {
                 year = year+1;
                 m = 1;
                 d=1;
             }
             else{
                 m=month;
                 d =day +1;
             }
         }
         else {
             if(day==a[month]) {
                 m = month + 1;
                 d = 1;
             }
             else{
                 m=month;
                 d = day+1;
             }
         }
         System.out.println("Next day is:"+year+"-"+m+"-"+d);
     }
     else
         System.out.println("Date Format is Wrong");
 }

}

  复杂度还是一样的哈,具体为啥想一想就知道了,就改了print会有啥改变呢。   各位同学是还是不是?

(2.一元多项式求导)首先是正则表达式了,因为这个是重点!!!

正则表达式   

1.replace检测空格换成空的在java里就是//s为空格,替换成“”

2."([+-]?[1-9][0-9]*)?" + "(\\*?[+-]?x(\\^([+-]?[1-9][0-9]*))?)?"这个就是匹配单个的表达式,是不是直接懵B,我先来直接讲解一下吧,第一个是判断+-号应该通俗吧,后面有?是什么意思呢就是后面这一个数有没有都无所谓,有就是两位数没有就是一位数,[1-9][0-9]就是两位数字十位上【1-9】个位上【0-9】对没错,这个只能搞两位数,后面这个*相当于一个无所谓的,没有他就是错的,?前面说了是后面有没有都无所谓所以这里相当于一个结束符,java里的+就是连接大家都知道吧,后面的话大家应该知道了吧可以自己去翻译一下,那下面再来讲一下正则表达式先来这个代码讲解

好了后面就是匹配了,把express跟匹配wholeexpress,然后在返回,错了就直接输出错误,对了就进行计算,

那么计算函数里

Pattern p=Pattern.compile(termExpress);
Matcher m=p.matcher(express);

这两句是先把匹配规则制定下来,然后用m把他们一个个匹配好的存储到内存池里然后由下面去调用

下面那些M.GROUP(1)和M.GROUP(4)然后进行单个的求导运算否则直接一股脑那太……,用BigInteger变成一个数字,不为空,然后来看-1还是1,后面就是指数来直接运算了来一个例子输出讲解,(rat.equals(new BigInteger("-1"))?"-x":(rat+"*x")三项运算符来看如果是-1的话就输出-x,不是就输出rat+x,那后面就懂了吧。

好了直接上了

import java.beans.Expression;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main{

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner input=new Scanner(System.in);
		String inputexpress=input.nextLine();
		String express=inputexpress.replaceAll("\\s", "");
		Solve majorexpress=new Solve();
		majorexpress.Express(express);
		if(majorexpress.check())
		{
			majorexpress.calculator();
		}
		else
			System.out.println("Wrong Format");
		int a[]=new int[100];
	    int b[]=new int[100];
	    int c[]=new int[100];
	    for(int i=0;i<10;i++)
	    {
	    	c[i]=a[i];
	    }
	    for(int j=0;j<10;j++)
	    {
	    	c[1]=b[j];
	    }
	    for(int i=0;i<10;i++)
	    {
	   	 for(int j=0;j<9-i-1;j++)
	   	 {
	   		 if(c[j]>c[j+1])
	   		 {
	   			 int temp=c[j];
	   			 c[j]=c[j+1];
	   			 c[j+1]=temp;
	   		 }
	   	 }
	    }
		}
	
	

}
class Solve
{
	
    
	private String express;
	private String index;
	private String ratio;
	private BigInteger ind;
	private BigInteger rat;
	public void Express(String express) 
	{
		this.express=express;
	}
	String termExpress = "([+-]?[1-9][0-9]*)?" + "(\\*?[+-]?x(\\^([+-]?[1-9][0-9]*))?)?";
    String wholeExpress = "(([+-]?[1-9][0-9]*)?" + "(\\*?[+-]?x(\\^([+-]?[1-9][0-9]*))?)?)+";
    String constNum = "[+-]?[0-9]+";
    public boolean check() 
    {
        return Pattern.matches(wholeExpress, express);
    }
    public void calculator()
    {
    	if(Pattern.matches(constNum,express))
    	{
    		System.out.println("0");
    		System.exit(0);
    	}
    	Pattern p=Pattern.compile(termExpress);
    	Matcher m=p.matcher(express);//这两句是先把匹配规则制定下来,然后用m把他们一个个匹配好的存储到内存池里然后由下面去调用
    	int flag=0;
    	while(m.find())
    	{
    		ratio=m.group(1);
    		index=m.group(4);
    		if(ratio!=null)
    		{
    			rat=new BigInteger(ratio);
    			if (m.group(2)!=null&&m.group(2).startsWith("-")) 
    			{
                    rat=BigInteger.valueOf(-1);
                }
                else if (m.group(2)!=null&&m.group(2).startsWith("+")) 
                {
                    rat=BigInteger.valueOf(1);
                }
    		}
    		else
    		{
    			 rat=BigInteger.valueOf(1);
    			 if (m.group()!=null&&m.group().startsWith("-")) 
    			 {
                     rat=BigInteger.valueOf(-1);
                 }
                 else if (m.group()!=null&&m.group().startsWith("+")) 
                 {
                     rat=BigInteger.valueOf(1);
                 }
    		}
    		if(index!=null)
    		{
    			ind=new BigInteger(index);
    			rat=rat.multiply(ind);
    			ind=ind.subtract(new BigInteger("1"));
    			if(rat.compareTo(new BigInteger("0"))>0&&flag==1)
    			{
    				System.out.print("+"+(rat.equals(new BigInteger("-1"))?"-x":(rat+"*x"))+(ind.equals(new BigInteger("1"))?"":("^"+ind)));
    			}
    			else
    			{
    				flag = 1;
    				System.out.print((rat.equals(new BigInteger("-1"))?"-x":(rat+"*x"))+(ind.equals(new BigInteger("1"))?"":("^"+ind)));
    			}
    		}
    		else if(m.group(2)!=null)
    		{
    			if(flag==1&&rat.compareTo(new BigInteger("0"))>0)
    				System.out.print(rat);
    			else
    			{
    				flag=1;
    				System.out.print(rat);
    			}
    		}
    		
    	} 
    }
	
}

  

 

 

 看这个就比较大了最大的也就22,其实还好了,if和else还是太多了,需要在强化一下。

正则表达式

正则表达式 – 教程 | 菜鸟教程 (runoob.com)

大家可以去看下这个网站讲解,我就来搞几个例子吧

EG.First

/*我我...我我...我我我我...要要要要...要要要要...
学学学学学...学学编编...编编编编..编..编...程程
...程程程——>我要学编程*/
public class RegexTest
{
public static void main(String[] args){
test();
}

/*
* 1. 治疗口吃:我我...我我...我我我我...要要要要...要要要要...学学学学学...学学编编...编编编编..编..编...程程...程程程
*/

/*
* 1. 治口吃
*/
public static void test(){
String str = "我我...我我...我我我我...要要要要...要要要要...学学学学学...学学编编...编编编编..编..编...程程...程程程";

//1. 将字符串中.去掉,用替换。
str = str.replaceAll("\\.+","");

//2. 替换叠词
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
}

EG.Second

import java.util.TreeSet;
import java.io.PrintStream;

public class RegexTest
{
public static void main(String[] args){
test();
}

/*
* ip地址排序。
* 192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
*/

public static void test(){
String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";

//1. 为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。
//所以,补零,按照每一位所需最多0进行补充,每一段都加两个0。

ip_str = ip_str.replaceAll("(\\d+)","00$1");
System.out.println(ip_str);

//然后每一段保留数字3位。
ip_str = ip_str.replaceAll("0*(\\d{3})","$1");
System.out.println(ip_str);

//1. 将ip地址切出。
String[] ips = ip_str.split(" +");

TreeSet<String> ts = new TreeSet<String>();

for(String ip : ips){
ts.add(ip);
}

for(String ip : ts){
System.out.println(ip.replaceAll("0*(\\d+)","$1"));
}
}
}

这个正则有很多东西的,可以去买本书看看。

三.   采坑心得:对源码的提交过程中出现的问题及心得进行总结

那这个首先第一个就是三角的问题,会没有根号2这个值出现,其次我想讲下第三个求星期几,有一个公式大家可以去学一下,一下就出来了,但要注意的哈,就是1月2月的时候算去年的13月14月,后面几个就没有问题哈,基本上就是类好了就好了,因为这几个题都是第三题延伸的,那就最后一个表达式了,它最后一个输入是有问题的,当输出系数的时候他会没有前面的+,所以大家可以特殊的搞一下,心得就是类太好了,以后大作业那是必须要搞类了,否则那可太难了,牵一发而动全身的感觉太不好了。

四.  总结:对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。

  学到了类,题目和知识点,要深究以后面试的话一问三不知那就太尴尬了,课上作业少一点时间吧,多讲解一下,作业很好,课程这样上很好,非常舒服。

 

posted @ 2021-10-15 12:38  A、Bad.boyづ゛  阅读(79)  评论(1)    收藏  举报
$().ready( function (){ AjaxPost( "/ws/di" + "gg.as" + "mx/di" + "gg" , '{ent' + 'ryId:' + cb_entryId + ',blog' + 'Id:' + cb_blogId + ',digg' + 'Ty' + 'pe:1}' , OnDiggSuccess); });