BLOG-1
1)前言:
刚开始接触Java觉得很难,后面越到后面体会越深,开始应该学会怎样创建一个类,了解Java的语法要求,首先学会了怎样在控制端接收数据,并作了简单的加法运算,这个和C语言的要求一样,怎样在输出计算结果,怎样使用if else语句这些和C语言一样,对数据的强制转换有了最基本的了解,输出怎样控制换行,了解了怎样定义数组并对数组进行基本操作,怎样输出数组所有的值。第一次作业题量比较大,但难度还好,求税率的题感觉不难但很复杂容易出错;第二次作业相对第一次作业比较复杂,且难度也提高了不少;第三次比较复杂且很难做,虽然题量少但我感觉一题能当很多题来做。
(2)设计与分析:重点对题目的提交源码进行分析,可参考SourceMonitor的生成报表内容以及PowerDesigner的相应类图,要有相应的解释和心得(做到有图有真相),本次Blog必须分析题目集1的7-8,题目集2的7-4、7-5以及题目集3的7-2、7-3
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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
分析:首先接收三个数据并判断是否能构成三角形,若可以则进行判断是什么三角形,若有两边的平方和等于第三边再判断这两边是否相等,若相等则是等腰直角三角形,若不等则是直角三角形,若三边相等则是等边三角形,若只有两边相等且不构成直角则是等腰三角形;若不能购车三角形则输出“Wrong Format”
源码:
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>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200) {
if(a + b > c && a + c > b && b + c > a && Math.abs (a - b) < c && Math.abs (a - c) < b && Math.abs (b - c) < a) {
if(a==b&&a==c)
System.out.print("Equilateral triangle");
else if((a * a + b * b - c * c)<0.01 || (a * a + c* c - b * b)<0.01 || (c * c + b * b - a * a)<0.01 ) {
if(a == b || a == c || b == c)
System.out.print("Isosceles right-angled triangle");
else
System.out.print("Right-angled triangle");
}
else if(a==b||a==c||b==c)
System.out.print("Isosceles triangle");
else
System.out.print("General triangle");
}
else
System.out.print("Not a triangle");
}
else
System.out.print("Wrong Format");
}
}



题目集2的7-4:
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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
分析: 先接收三个数据年月日,并判断数据是否合理,先定义一个数组保存每个月一共有多少天,根据是否是闰年来更改二月的天数,判断月份是否是12月日是否等于当月最后一天,若是则年份加一,月份改为一,天数加一 ,就是所求的下一天;若小于12月且日等于当月的最后一天则月份加一,日改为一,年份不变就是所求的下一天;若日在本月当中则月份加一日变为一,就是所求结果。
源码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
if (!checkInputValidity(year, month, day))
System.out.println("Wrong Format");
else {
nextDate(year, month, day);
}
}
public static boolean checkInputValidity(int year, int month, int day) {
boolean hefa;
int[] a = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year))
a[2] = 29;
hefa = (year >= 1820 && year <= 2020 && month > 0 && month <= 12 && day <= a[month] && day > 0);
return hefa;
}
public static boolean isLeapYear(int year) {
boolean isLeapYear;
isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
return isLeapYear;
}
public static void nextDate(int year, int month, int day) {
int[] aa = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year))
aa[2] = 29;
int a = 0, b = 0, c = 0;
if (checkInputValidity(year, month, day)) {
if (month == 12) {
if (day == aa[month]) {
a = year + 1;
b = 1;
c = day + 1;
}
}
if (month < 12) {
if (day == aa[month]) {
a = year;
b = month + 1;
c = 1;
}
if (day > 0 && day < aa[month]) {
a = year;
b = month + 1;
c = 1;
}
if (day > 0 && day < aa[month]) {
a = year;
b = month;
c = day + 1;
}
}
System.out.println("Next date is:" + a + "-" + b + "-" + c);
} 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:年-月-日”
输入样例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
分析:首先接收四个数据年月日和所要求的前N天的天数;判断输入是否合法若不合法则输出Wrong Format;若合法先定义一个数组保存每个月一共有多少天,根据是否是闰年
来更改二月的天数;用日减去N;若日小于等于0;则月减一,若月等于0则月加12,年减一,日加上当月的最大天数结果就是所求的;
若N小于0;
源码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean f=true;
int y=0,m=0,d=0,n=0;
if(input.hasNextInt())
y=input.nextInt();
else
f=false;
if(input.hasNextInt())
m=input.nextInt();
else
f=false;
if(input.hasNextInt())
d=input.nextInt();
else
f=false;
if(input.hasNextInt())
n=input.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 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 hefa=false;
int[] a = new int[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year))
a[1] = 29;
if((year >= 1820 && year <= 2020) && (month >=1 && month <= 12) && (day <= a[month-1] && day > 0))
hefa=true;
return hefa;
}
private static void nextDate(int year, int month, int day, int n) {
int[] a = new int[]{0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year))
a[2] = 29;
day-=n;
if(n>0){
while(day<=0){
month--;
if(month==0){
month+=12;
year--;
}
day+=a[month];
}
}
else if(n<0){
while(day>a[month]){
day-=a[month];
month++;
if(month==13){
month-=12;
year++;
}
}
}
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}
}


题目集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
分析:先接收三个数据并判断是否合法,不合法则输出Date Format is Wrong;先定义一个数组存每个月的天数,通过判断是否是闰年来更改二月的天数;
源码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
int sum=0;
for(int i=0;i<20;i++)
sum+=i;
if(!checkInputValidity(year,month,day))
System.out.print("Date Format is Wrong");
else
nextDate(year,month,day);
}
public static boolean checkInputValidity(int year,int month,int day) {
int sum1=0;
for(int i1=0;i1<20;i1++)
sum1+=i1;
if(year>=1900&&year<=2000&&month>=1&&month<=12&&day>=1&&day<=31) {
if(isLeapYear(year)==false&&month==2&&day>28) {
return false;
}
else if(isLeapYear(year)==true&&month==2&&day>29)
return false;
if(month==4||month==6||month==9||month==11) {
int sum2=0;
for(int i2=0;i2<20;i2++)
sum2+=i2;
if(day==31)
return false;
}
return true;
}else
return false;
}
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0) {
return true;
}
else
return false;
}
public static void nextDate(int year,int month,int day) {
int ji=0;
for(int j=0;j<20;j++)
ji*=j;
int[] maxnum=new int[] {0,31,0,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)==true) {
maxnum[2]=29;
}
else if(isLeapYear(year)!=true) {
maxnum[2]=28;
}
int ji1=0;
for(int j1=0;j1<20;j1++)
ji1*=j1;
day=day+1;
while(day>maxnum[month]) {
day=day-maxnum[month];
month++;
if(month==13) {
month=1;
year++;
}
}
System.out.print("Next day is:"+year+"-"+month+"-"+day);
}
}


编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 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
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.print("Wrong Format");
}
}
(3)采坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
总是将类名写错,pta中的总是Main而自己建立的不是,答案出现格式错误,没注意题目要求,将其修改正确即可。
(4)改进建议:对相应题目的编码改进给出自己的见解,做到可持续改进
题目集1的7-4计算税率我觉得可以进行改进,所用的知识点的不多但很繁琐;
(5)总结:对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。
学到了首先学会了怎样在控制端接收数据,并作了简单的加法运算,这个和C语言的要求一样,怎样在输出计算结果,怎样使用if else语句这些和C语言一样,对数据的强制转换有了最基本的了解,输出怎样控制换行,了解了怎样定义数组并对数组进行基本操作,怎样输出数组所有的值。老师上课可进行一些语法讲解,讲解一些解题思路,让同学知道不同的解题思路。
3.在截止时间之前将发布的Blog正文网址链接(非编辑网址链接)直接发到超星系统即可

浙公网安备 33010602011771号