题目集1 毕竟是第一次作业 所以难度偏简单 题目量较多

题目集2 难度相比第一次作业来说难了一些 难度适中  题目量也适中

题目集3 题目量少 只有三道 但是难度增加了 难度较难

 

题目集1   7-8

7-8 判断三角形类型 (20 分)

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

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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”。

输入样例1:

在这里给出一组输入。例如:

50 50 50.0

结尾无空行

输出样例1:

在这里给出相应的输出。例如:

Equilateral triangle

结尾无空行

输入样例2:

在这里给出一组输入。例如:

60.2 60.2 80.56

结尾无空行

输出样例2:

在这里给出相应的输出。例如:

Isosceles triangle

结尾无空行

输入样例3:

在这里给出一组输入。例如:

0.5 20.5 80

结尾无空行

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

结尾无空行

源代码:

import java.util.*;

 

import java.text.DecimalFormat;

public class Main {

//主函数

public static void main(String[] args) {

 Scanner in =new Scanner(System.in);

     

       float a=in.nextFloat();

       float b=in.nextFloat();

       float c=in.nextFloat();

      if(a<1||a>200||b<1||b>200||c<1||c>200)//判断输入数据是否合法

       System.out.print("Wrong Format");

      else

      {

      if(a+b>c&&a+c>b&&b+c>a)//判断输入数据是否构成三角形

      {

       if(a==b&&b!=c||a==c&&b!=c||c==b&&b!=a) //判断是否是等腰三角形

       {

       if(a*a+b*b-c*c<0.0001||a*a+c*c-b*b<0.0001||c*c+b*b-a*a<0.0001)/*等腰条件下判断是否是等腰直角三角形*/   System.out.print("Isosceles right-angled triangle");   

       else

       System.out.print("Isosceles triangle");

       }

       else if(a==b&&b==c)//判断是否为等边三角形

       System.out.print("Equilateral triangle");

       else if(a*a+b*b==c*c&&b!=a&&a!=c&&c!=b||a*a+c*c==b*b&&b!=a&&a!=c&&c!=b||c*c+b*b==a*a&&b!=a&&a!=c&&c!=b)判断是否为直角三角形

       System.out.print("Right-angled triangle");

       else

       System.out.print("General triangle"); //以上条件都不是的话就是普通三角形

  

      }

      else

        System.out.print("Not a triangle");

}

      

}

}

错误心得:

1.等腰直角三角形判断时 之前使用的时 a*2+b*2=c*||c*2+b*2=a*2||a*2+c*2=b*2

pta的时候显示报错 等腰直角三角形那个点过不了  直角三角形判断时用这个方法能过

后面发现 使用 a*a+b*b-c*c<0.0001||a*a+c*c-b*b<0.0001||c*c+b*b-a*a<0.0001 这个

等腰直角三角形这个点就能通过了

因为等腰直角三角形 一般腰长都是无理数 例如 边长为根号2  根号2  2;这个是等腰直角三角形 因为a*2+b*2=c*||c*2+b*2=a*2||a*2+c*2=b*2 这个判断不精确无理数的时候 会有很小的误差 所以必须使用a*2+b*2=c*||c*2+b*2=a*2||a*2+c*2=b*2  才能通过;

 

题目集2 7-4

7-4 求下一天 (30 分)

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

要求:Main类中必须含有如下方法,签名如下:

public static void main(String[] args);//主方法

public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型

public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值

public static void nextDate(int year,int month,int day) ; //求输入日期的下一天

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  1. 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
  2. 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日

输入样例1:

在这里给出一组输入。例如:

2020 3 10

结尾无空行

输出样例1:

在这里给出相应的输出。例如:

Next date is:2020-3-11

结尾无空行

输入样例2:

在这里给出一组输入。例如:

2025 2 10

结尾无空行

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

结尾无空行

源代码:

import java.util.Scanner;

public class Main {

//主函数

public static void main(String[] args) {

Scanner in =new Scanner(System.in);

int year=in.nextInt();

        int month=in.nextInt();

        int day=in.nextInt();

        int k;  

        if(year<1820||year>2020||month<1||month>12||day<1||day>31)//判断输入数据是否合法

{

            System.out.print("Wrong Format");//不合法输出Wrong Format

            return;

 

}

 

 

     if(year>1819&&year<2021&&month>0&&month<13&&day>0&&day<32); //输入数据合法

{

if(year/4==0)//判断年份是否是闰年

      k=1;

else

k=0;

  if(day==31)//如果日期为31时 输入月份是否合法 及处理方式

 {

 if(month==2||month==4||month==6||month==9||month==11)//月份不合法

 {System.out.print("Wrong Format");

 return;}

 else if(month==12)//当月份等于12时

 {

 year=year+1;

 month=1;

 day=1;

 }

 else

 {

 day=1;

 month=month+1;

 }  

 }

 else if(day==30)//如果日期为30时 输入月份是否合法 及处理方式

 

 {

 if(month==2)

 { System.out.print("Wrong Format");

 return;

 }

 

 else if(month==4||month==6||month==9||month==11)//月份为小月份时

 {

 month=month+1;

 day=1;

 }

 else

 {

 day=day+1;

 }

 }

 else if(day==29&&k==0)//如果日期为29时 输入月份是否合法 及处理方式

 

 {

      System.out.print("Wrong Format");

      return;

 }

 else if(day==29&&k==1)//年份时闰年时

 {

 month=month+1;

 day=1;

 }

 else if(day==28&&k==0)

 {

 month=month+1;

 day=1;

 }

 else

 {

 day=day+1;

 }

 

  System.out.print("Next date is:"+year+"-"+month+"-"+day);

}

 

}

}

 

错误心得:题目来讲很多字 看上去就比较复杂的那种 会让人没有思绪 但是当你仔细读题时 就会觉得并不是特别难

有几个需要注意的地方 当号为31时 月份的话不能为小月份 否则会输入数据错误 必须为大月份 大月份也有一种特殊情况 就是当月份为12时 31 +1的话就到下一个月了 月份 12+1就到下一年了 所以年份也要加1  月份和日期都为1 普通的大月份 只需要在原有的月份+1,日期为1就行;

号为30时 月份不能为2月 否则会输出数据不合法 需要判断月份是否为小 为小的话就得进下一个月份;

当号为29时 月份为2时需要判断是否是闰年 不是闰年的话 会输出数据不合法;

当号为28时 月份为2时需要判断是否是闰年 不是闰年的话 月份+1 号为1;

只要把这些特殊情况都考虑清楚 这道题就不会感觉难了

 

7-5

7-5 求前N天 (30 分)

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“n days ago is:年-月-日”

输入样例1:

在这里给出一组输入。例如:

2018  6 19 8

结尾无空行

输出样例1:

在这里给出相应的输出。例如:

8 days ago is:2018-6-11

结尾无空行

输入样例2:

在这里给出一组输入。例如:

2018  6 19 -8

结尾无空行

输出样例2:

在这里给出相应的输出。例如:

-8 days ago is:2018-6-27

结尾无空行

源代码:

import java.util.Scanner;

 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);

     }

     //判断year是否为闰年,返回boolean类型

    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;

    }

     //求输入日期的前n天

    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) {//如果不是1月

                    if(n<day) {//如果几号大于前几天

                        m=month;

                        d=day-n;

                    }

                    else  {//如果几号小于前几天

                        b=n-day;

                        m=month-1;

                        d=a[month-1]-b;

                    }

                }

                else {//如果是1月

                    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) {//如果不是12月

                    if(n+day<a[month]) {//如果几天后小于该月天数

                        m=month;

                        d=day+n;

                    }

                    else {//如果几天后大于该月天数

                        b=n+day;

                        m=month+1;

                        d=b-a[month];

                    }

                }

                else {//如果是12月

                    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");

    }

}

错误心得:这个题目需挺复杂的 需要考虑挺多的 首先n 是一个变量 它可以是-10到10之间的任意数  不像上一道题一样 只需要求下一天就行了

首先还是得像之前一样考虑 输入的数据合法不合法 可以参考上一道题的心得。 如何n也可以为负数 负数的话就是这天的后几天 ;如何就需要考虑 月份大月小月 日期加上n 如果不会到下个月或上个月的话是比较简单的

特殊情况就是考虑 月份大小 闰年 二月这类 日期减去n 是不是会到下个月或者上个月 这种情况

题目集3

7-2

7-2 定义日期类 (28 分)

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

输入样例1:

在这里给出一组输入。例如:

1912 12 25

结尾无空行

输出样例1:

在这里给出相应的输出。例如:

Next day is:1912-12-26

结尾无空行

输入样例2:

在这里给出一组输入。例如:

2001 2 30

结尾无空行

输出样例2:

在这里给出相应的输出。例如:

Date Format is Wrong

结尾无空行

源代码:

import java.util.Scanner;

public class Main {

 

public static void main(String[] args) {

Scanner in =new Scanner(System.in);

int year=in.nextInt();

        int month=in.nextInt();

        int day=in.nextInt();

        int k;  

        if(year<1900||year>2000||month<1||month>12||day<1||day>31)

{

            System.out.print("Date Format is Wrong");

            return;

 

}

 

 

     if(year>1819&&year<2021&&month>0&&month<13&&day>0&&day<32);

{

if(year%4==0)

      k=1;

else

k=0;

  if(day==31)

 {

 if(month==2||month==4||month==6||month==9||month==11)

 {System.out.print("Date Format is Wrong");

 return;}

 else if(month==12)

 {

 year=year+1;

 month=1;

 day=1;

 }

 else

 {

 day=1;

 month=month+1;

 }  

 }

 else if(day==30)

 {

 if(month==2)

 { System.out.print("Date Format is Wrong");

 return;

 }

 

 else if(month==4||month==6||month==9||month==11)

 {

 month=month+1;

 day=1;

 }

 else

 {

 day=day+1;

 }

 }

 else if(day==29&&k==1)

 {

    month=month+1;

 day=1;

 }

 else if(day==29&&k==0)

 {

 System.out.print("Date Format is Wrong");

      return;

 }

 else if(day==28&&k==0)

 {

 month=month+1;

 day=1;

 }

 else

 {

 day=day+1;

 }

 

  System.out.print("Next day is:"+year+"-"+month+"-"+day);

}

 

}

}

错误心得:这次题目也是特别长 看起来复杂 其实并不是复杂 这道题和题目集27-4很像 只要稍微改进就行 所以说这个题目并不是很难有几个需要注意的地方 当号为31时 月份的话不能为小月份 否则会输入数据错误 必须为大月份 大月份也有一种特殊情况 就是当月份为12时 31 +1的话就到下一个月了 月份 12+1就到下一年了 所以年份也要加1  月份和日期都为1 普通的大月份 只需要在原有的月份+1,日期为1就行;

号为30时 月份不能为2月 否则会输出数据不合法 需要判断月份是否为小 为小的话就得进下一个月份;

当号为29时 月份为2时需要判断是否是闰年 不是闰年的话 会输出数据不合法;

当号为28时 月份为2时需要判断是否是闰年 不是闰年的话 月份+1 号为1;

7-3

7-3 一元多项式求导(类设计) (50 分)

编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf

输入格式:

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

输出格式:

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

输出格式见输入输出示例。

输入样例1:

在这里给出一组输入。例如:

-2*     x^-2+  5*x^12-4*x+       12

结尾无空行

输出样例1:

在这里给出相应的输出。例如:

4*x^-3+60*x^11-4

结尾无空行

输入样例2:

在这里给出一组输入。例如:

2*x^6-0*x^7+5

结尾无空行

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

结尾无空行

 

不会写呜呜