首页 > 其他 > 详细

PTA4题学习总结

时间:2021-04-04 22:42:22      阅读:25      评论:0      收藏:0      [点我收藏+]

 前言:

  这是我20多年以来第一次写博客了,还是在学校里那可(牛)爱(逼)的Java老师的安(逼)慰(迫)下,含泪写下第一篇博客,大家应该都明白这种含泪写下的佳(废)作(品)是多么的动人的。

  就不开玩笑了,这里是墨语同学的处女作博客,主要是来分析总结一下本人之前写过的一些题目,总结经验和大多教训,来分享给大家。愿Java萌新们,和我这个小菜鸟一样,一起加油!大家共勉,希望少走弯路吧。PS:别走我的破路,走大神的康庄大道!

目录:(java)

  1.PTA题目集2__7-4( 求下一天)

  2.PTA题目集2__7-5(求前N天)

  3.PTA题目集3__7-2(定义日期类)

  4.PTA题目集3__7-3( 一元多项式求导(类设计))


 

1.求下一天

  输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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

部分代码:
//判断输入数据是否有效
    boolean checkInputValidity(int day,int month,int year){
        if((year>=1820&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31))
            return true;
        else
            return false;
    }
//判断闰年
    boolean isLeapYear(int year){
        if(year%400==0||(year%4==0&&year%100!=0))
            return true;
        else
            return false;
    }

  

分析:
  在看见这个题目的第一眼,我就觉得很简单呀,不就是加一天嘛,so easy呀!可事实却偏偏没那么简单啊,我也踩了好多坑,蓝瘦香菇!
  第一坑:在输入数值前,不判断输入的年月日是否符合要求。看题目,年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 
  第二坑:忘记了闰年和平年之分。要判断是否是闰年啊,兄弟们!
  第三坑:知道了闰年平年之分,又忘记了2月的29号。
  第四坑:不记得大小月,不注意7,8月两个大月连在一起,所以大小月之分是很重要的!一三五七八十腊,三十一天永不差!这还是小学时候学过的口诀,(*^▽^*),
所以编写代码的时候,就要注意了,1,3,5,7,8,10,这几个月要和4,6,9,11这几个月区别开来,别问为什么没有2月和
12月,前面一个坑不是刚说了2月最多就29天嘛。而12月
31号过一天就第二年了,也要特别提出来。
于是考虑就如下:
  1,3,5,7,8,10这6个月,先判断day>=1&&day<=30,直接在输入的结果上,year和month不变,day+1;如果day=31,则day=1,month+1;
  4,6,9,11则4个月,
先判断day>=1&&day<=29,直接在输入的结果上,year和month不变,day+1;如果day=30,则day=1,month+1;
  2月,就要分清是否是闰年了,是闰年的话,判断day>=1&&day<=28,在输入的数据上,year和month不变,day+1;若day=29,则day=1,month+1;
平年的话,判断day>=1&&day<=27,在输入的数据上,year和month不变,day+1;若day=28,则day=1,month+1;
  12月,先判断day>=1&&day<=30,在输入的数据上,year和month不变,day+1,;若day=31,则day=1,month=1,year+1。

上面的就是我踩过的一些坑和我对这个题目的总结。
 


2.求N天前

输入年月日的值(均为整型数),同时输入一个取值范围在[-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
 if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month== 8) || (month == 10)) {        //n<0
                    if (day + Math.abs(n) <= 31) {
                        day = day - n;
                    } else {
                        month += 1;
                        day = day - n - 31;
                    }

  

if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
                    if (day - n <= 30) {
                        day = day - n;
                    } else {
                        day = day - n - 30;
                        month += 1;
                    }

  

if ((month == 12) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10)) {            //n>0
                    if (day - Math.abs(n) >= 1) {
                        day = day - n;
                    } else {
                        month -= 1;
                        day = day - n + 31;
                    }

  

if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
                    if (day - n >= 1) {
                        day = day - n;
                    } else {
                        day = day - n + 30;
                        month -= 1;
                    }

  

分析:
  这四段代码呢,是为了告诉大家,分别在n<0和n>0这两种情况下,大月和小月的日期加减的情况,至于2月和12月,第一题的分析就说明了一下注意事项,也
就是2月的28天或29天,12月的跨年问题。大家可以自己分析一下,或者根据我第一题和下面这题的代码来自己总结一下,我就不重复分析了,这3题都是日期的加减问题,
用四个字成语来形容就是大同小异。我的语文还是不错的吧,(#^.^#)
  我再补充几点。
  第一,1月前10号(n给的范围是[-10,10]),加减要注意year要不要-1这个问题。
  第二,每个月的后十号也是要注意month是否+1



3.定义日期类

定义一个类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

package date;

import java.util.Date;
import java.util.Scanner;

public class Main {
    int day;
    int month;
    int year;

    public Main(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }

    public static void main(String[] args) {
        class Date {
            private int day;
            private int month;
            private int year;

            Date() {
                this.day = day;
                this.month = month;
                this.year = year;
            }

            //设置日期
            void setDay(int day) {
                this.day = day;
            }

            void setMonth(int month) {
                this.month = month;
            }

            void setYear(int year) {
                this.year = year;
            }

            //判断日期是否正确
            boolean checkInputValidity(int day, int month, int year) {
                if ((day > 0 && day < 32) && (month > 0 && month < 13) && (year > 1899 && year < 2001))
                    return true;
                else
                    return false;
            }

            //日期变为第二天
            void getNextDate() {
                if (month == 1 || month == 3 || month == 5 || month == 8 || month == 10) {  //大月
                    if (++day <= 30)
                        this.day = day++;
                    else {
                        this.month = ++month;
                        this.day = 1;
                    }
                } else if (month == 2) {      //2月
                    if (day <= 27)
                        this.day = day++;
                    else {
                        this.month = month++;
                        this.day = 1;
                    }
                } else if (month == 4 || month == 6 || month == 9 || month == 11) {    //小月
                    if (day <= 29) {
                        this.day = day++;
                    } else {
                        this.month = month++;
                        this.day = 1;
                    }
                } else if (month == 12) {            //12月过年
                    if (day <= 30)
                        this.day = day++;
                    else {
                        this.year = ++year;
                        this.month = 1;
                        this.day = 1;
                    }
                }else if (month == 7) {            //12月过年
                    if (++day <= 30)
                        this.day = ++day;
                    else {
                        this.month = ++month;
                        this.day = 1;
                    }

                }
            }

            int getYear() {
                return year;
            }

            int getMonth() {
                return month;
            }

            int getDay() {
                return day;
            }

        }

        Date a= new Date();
        Scanner input = new Scanner(System.in);
        int day = input.nextInt();
        a.setDay(day);
        int month = input.nextInt();
        a.setMonth(month);
        int year = input.nextInt();
        a.setYear(year);
        //输出
        if (a.checkInputValidity(day, month, year)) {
            a.getNextDate();
            System.out.println("Next day is:" + a.getYear() + "-" + a.getMonth() + "-" + a.getDay());

        } else
            System.out.println("Date Format is Wrong");

    }

}

分析:
  这是我当时做题的一次写的源码,你如果认真看了源码的话,肯定会发现一个问题,如果没发现,说明你还有很大的提升空间,不是代码方面的,是常识方面的提升(狗头保命)。
  可以很明显的发现,这段代码里面,少了一段代码,那段代码就是判断是否是闰年的代码。没错,在不考虑闰年的情况下,就是上面的代码那样。
  首先,定义day(日),month(月),year(年)类,在定义了这些对象后,就要考虑输入的数值是否符合年月日的要求,因此这里直接使用if-else的判断语句进行了,
(day > 0 && day < 32) && (month > 0 && month < 13) && (year > 1899 && year < 2001),这就是判断年月日的范围了(根据题意来的范围哟)。再输入正确后,当然是在输入的基础上,
使日期推后一天喽,再输出第二天的日期,这样一说是不是很简单啊。但真的是这么简单吗?这里就详细的说一下啦。
你要完成这个代码,必须先了解日期的变化啦。具体的我就不说了,别问为什么,问就是和第一题一样,
(#^.^#)
为什么要多写这个题目呢?是不是多此一举?nonono,PS:老师要求必须写这几个题目的,o(╥﹏╥)o。另外呢,这个题目也比第一题要多一些东西,也就是在第一题的基础上多了一点点。
 

4.一元多项式求导

题目要求:

  编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 

   https://images.ptausercontent.com/a6146210-4a98-4a95-9e7b-a5df3ee89ee4.pdf

 

(1)相关概念说明

? 带符号整数:前导不为 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.2 程序功能需求

1)实现功能

? 判定输入表达式是否为正确的表达式;

? 若输入为正确表达式,则计算其导函数并按要求输出。

(2)输入输出规则

①输入规则

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

②输出规则

? 如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。

? 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点:

? 结果不需要排序,也不需要化简;

? 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”;

? 当输出结果第一项系数符号为“+”时,不输出“+”;

? 当指数符号为“+”时,不输出“+”;

? 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。 

输入格式:

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

输出格式:

  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

分析:
  这题怎么说呢,我不会呀,毕竟我是初学者,一个小菜鸟,在班上也是属于菜鸟的行列,能够分析出上面3个题目,我也是用光了我的才华,古有巧妇难为无米之炊,今有菜鸡难写导数java。
不知不觉也写了这么多了,求导的数学问题还是很简单的,但是用java来完成,请放过我这只菜鸟吧,求大神有空闲时间能教教我。

 

结语
  虽然有点讨厌老师要求我们写博客这个作业,但是,讨厌写作业一直都是学生们的共同点(狗头保命)。
好啦,不开玩笑了,好好写个结语吧。
  很感谢老师布置这个作业,我也能通过这个作业,通过这个blog,在博客园这个平台上能够结交各位大神级人物,也希望我以后能够成为在座的各位大神中个一位,成为一位资深码农。
  可以说是刚刚接触java,接触这个专业也没多久,java也是刚刚入门,或者说门还只是跨入了半步,提升的空间还有很多很多,愿能够看到这篇博客的萌新们,大家一起加油!共勉吧!
  饭一口一口吃,总有吃饱的时候;路一步一步走,只有无尽的路途!学海无涯,希望能够在java的海洋里面,能够慢慢欣赏java的魅力!
  加油加油加油!!!
  墨语同学祝大家学业有成,前途似锦!

PTA4题学习总结

原文:https://www.cnblogs.com/zhang1018/p/14616608.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!