前三次作业blog
一:前言
这学期才接触java,面向对象其实是没怎么听过,也不是很理解的词,对于初学者来说怎么写,java语法有点不太适应。好在Java的入门并不是想象的那么复杂,在一番网课的学习以及老师的讲解后,对Java有了初步的了解,对一些简单的代码能够读懂并且解决一些题目,这是前三次的主要收获了。
前三次作业主要涉及了java的一些基础应用,如简单加减运算,字符的输入,对应的输出,格式的判断,整型浮点型字符串等的输入,简单的排序和判断,二进制转化为十进制,Java中数组的合并,年份日期的判断,正则表达式等。
三次作业难度慢慢变大,第一次非常基础,第二次稍稍难度上升,第三次难度更大但是总体来说还需要像我这样的初学者慢慢提升,慢慢适应Java面向对象。
二:题目分析
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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”。
设计与分析:拿到这题首先没注意到字符的类型,简单的以为是整型,导致出现点过不去。之后是三角形判断的顺序,必须按照最特殊的再到普通的进行判断,不然也会有一些特别的情况出错,之后是在判断直角三角形的时候,由于有浮点数产生的误差,导致无法相等,找了很久也没也没有找出错误,上网找了一下发现浮点数误差的问题。改成
else if ( (a==b&&a*a+b*b-c*c<0.0001) || (c==b&&c*c+b*b-a*a<0.0001) || (a==c&&a*a+c*c-b*b<0.0001) )
问题解决
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner (System.in);
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
if(a<=200&&1<=a&&b<=200&&1<=b&&c<=200&&1<=c) {
if(a+b<=c || a + c <= b || b + c <= a) {
System.out.println("Not a triangle");
}
else if(a==b&&b==c) {
System.out.println("Equilateral triangle");
}
else if ( (a==b&&a*a+b*b-c*c<0.0001) || (c==b&&c*c+b*b-a*a<0.0001) || (a==c&&a*a+c*c-b*b<0.0001) ) {
System.out.println("Isosceles right-angled triangle");
}
else if (a==b||b==c||a==c) {
System.out.println("Isosceles triangle");
}
else if (a*a+c*c==b*b||b*b+a*a==c*c||a*a+b*b==c*c) {
System.out.println("Right-angled triangle");
}
else {
System.out.println("General triangle");
}
}
else System.out.println("Wrong Format");
}
}
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:年-月-日
设计与分析:这题要注意判断日期是否合法,是否为闰年,每个月的实际天数。其他的就是主要一下输入的格式什么的。
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();
nextDate(year,month,day);
}
//判断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) {
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);
return checkInputValidity;
}
//求输入日期的下一天
public static void nextDate(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(!isLeapYear(year))//如果不是闰年
a[2] = 28;
if(checkInputValidity(year,month,day)) {//如果输入的数字合法
if(month==12) {//如果是12月
if(day==a[month]) {//如果是12月的最后一天
year = year+1;
m = 1;
d=1;
}
else{//如果不是12月的最后一天
m=month;
d =day +1;
}
}
else {//如果不是12月
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,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。 其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。 注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
当输入数据合法时,输出“n days ago is:年-月-日”
设计与分析:
首先是要符合实际情况,前n天要主要是否在前一个月,前一年。存在特殊情况要另外处理。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean f=true;
int y=0,m=0,d=0,n=0;
if (sc.hasNextInt())
y= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
m= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
d= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
n= sc.nextInt();
else
f=false;
if (checkInputValidity(y,m,d,n)&&f){
nextDate(y,m,d,n);
}else
System.out.println("Wrong Format");
}
public static boolean isLeapYear(int year) {
boolean ret=false;
if ((year%100!=0&&year%4==0)||(year%400==0)){
ret=true;
}
return ret;
}
public static boolean checkInputValidity(int year,int month,int day,int n){
boolean ret=false;
int[] mm={31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[1]=29;
if ((year>=1820&&year<=2020)&&(month>=1&&month<=12)&&(day>=1&&day<=mm[month-1])){//此处的month-1用来判断不同年份的不同月份的数据是否合法
ret=true;
}
return ret;
}
public static void nextDate(int year,int month,int day,int n) {
int[] mm={0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[2]=29;
day-=n;
if (n>0){
while (day<=0){
month--;
if (month==0){//这边因为是mm有0的索引,因此要提前判断是否等于0
month+=12;
year--;
}
day+=mm[month];
}
}else if (n<0){
while (day>mm[month]) {
day-=mm[month];
month++;
if (month==13){
month-=12;
year++;
}
}
}
System.out.printf("%d days ago is:%d-%d-%d\n",n,year,month,day);
}
}
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
设计与分析:这题从面向过程转变为面向对象,依旧是要注意边界的问题,跨月或者跨年都要考虑。