题目集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) ; //求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下: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的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“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);
}
}
}
错误心得:这次题目也是特别长 看起来复杂 其实并不是复杂 这道题和题目集2的7-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
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“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
结尾无空行
。
不会写呜呜