标签:int System BLOG 刘世越 year date public out
面向对象程序设计第一次BLOG总结
前言:三次PTA的作业着重练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。学习使用工具对代码进行跟踪调试。理解抽象类与子类的关系,在这三次PTA作业中,本人发现了java与C语言的不同,并按照上学期学习C的基础,进行了使用java实现简单代码的编写,学习过程如下:
第一次PTA作业: 得分98分 班级 48名 题量 9 难度:
错误题目:在一个字符串中提取出其中的二进制数值序列,。
原因:判断不了‘-1’的存在性当时只会charAt函数循环读取
第二次PTA作业: 得分100分 班级 1名 题量 3 难度:
错误题目:无
原因:无
第二次PTA作业: 得分100分 班级 1名 题量 3 难度:
错误题目:无
原因:无
设计与分析
本模块重点对题目提交的源码进行分析
1.7-1 身体质量指数(BMI)测算 (10 分)
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。
输入格式:
两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;
输出格式:
输入数值超出范围:输出“input out of
range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。
输入样例0:
在这里给出一组输入。例如:
-2 8
输出样例0:
在这里给出相应的输出。例如:
input out of range
输入样例1:
在这里给出一组输入。例如:
70 1.75
输出样例1:
在这里给出相应的输出。例如:
fit
错误原因:边界值错误
源代码:
import
java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double weight = sc.nextDouble();
double high = sc.nextDouble();
if(high>=0.00&&high<=2.72&&weight>=0.00&&weight<=727.00)
{
double bmi=weight/(high*high);
if(bmi<18.5)
System.out.println("thin");
else if(bmi>=18.5&&bmi<24.05)
System.out.println("fit");
else if(bmi>=24.05&&bmi<28.05)
System.out.println("overweight");
else if(bmi>=28.05)
System.out.println("fat");
}
else{
System.out.println("input out of range");
}
}
}
设计思想
大方向:利用BMI公式算出bmi利用给定的BMI边界进行判断
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。
问题:边界
解决方法:把边界值+0.05得以解决
7-9 二进制数值提取 (10 分)
在一个字符串中提取出其中的二进制数值序列,。
输入格式:
一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1
输出格式:
将输入的序列去掉非0、1字符以及结尾符的数据内容,
注:结束符-1之后的0\1字符忽略不计。
例如:00011。
输入样例:
在这里给出一组输入。例如:
abc00aj014421-1
输出样例:
在这里给出相应的输出。例如:
00011
输入样例1:
在这里给出一组输入。例如:
a0571-1k001y
输出样例1:
在这里给出相应的输出。例如:
01
源代码:
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String c =scanner.next();
int x=0;
int b=0;
int y=c.length();
String a="";
String str="";
for(;x<y-1;x++)
{
if(c.charAt(x)=='-'&&c.charAt(x+1)=='1')
{
for(int d=0;d<x;d++)
{
while(c.charAt(d)==' '||c.charAt(d)==47||c.charAt(d)==92)
continue;
a+=c.charAt(d);
}
for(int p=0;p<a.length();p++)
{
if(a.charAt(p)=='0'||a.charAt(p)=='1')
str+=a.charAt(p);
}
break;
}
else
b++;
}
if(b==y-1)
System.out.println("Wrong Format");
else
System.out.println(str);
}
}
设计思想:用charAt函数逐个读取
问题,-1为两个字符,如字符串前两个为-1,则无法判断
解决方法:用sqlit函数切,当时没有研究字符串长度而盲目做题
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
输入样例:
在这里给出一组输入。例如:
1111011101011111111111
输出样例:
在这里给出相应的输出。例如:
1:11101011
输入样例1:
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
输出样例1:
在这里给出相应的输出。例如:
1:11101011
2:01001101
3:validate error
输入样例2:
输入数据不足11位。例如:
111101
输出样例2:
在这里给出相应的输出。例如:
null data
输入样例3:
输入数据全1没有起始位。例如:
1111111111111111
输出样例3:
在这里给出相应的输出。例如:
null data
输入样例4:
输入数据全1没有起始位。例如:
111101110101111111101111111101
输出样例4:
在这里给出相应的输出。例如:
1:11101011
2:parity check error
输入样例5:
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
输出样例5:
在这里给出相应的输出。例如:
1:validate error
2:validate error
输入样例6:
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
输出样例6:
在这里给出相应的输出。例如:
1:00000000
2:01110000
源代码
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String c =scanner.next();
int y=c.length();
int a=0;
int o=0;
int n=0;
for(int x=0;x<y;x++){
if(c.charAt(x)=='1')
a++;
}
if(y<11||a==y)
System.out.println("null data");
else{
for(int z=0;z<y-10;z++)
{
if(c.charAt(z)=='0')
{
o++;
for(int m=1;m<10;m++){
if(c.charAt(z+m)=='1')
n++;
}
if(n%2==0&&c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else if(n%2==0)
System.out.println(o+":parity check error");
else if(c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else{
System.out.println(o+":"+c.charAt(z+1)+c.charAt(z+2)+c.charAt(z+3)+c.charAt(z+4)+c.charAt(z+5)+c.charAt(z+6)+c.charAt(z+7)+c.charAt(z+8));
}
z=z+10;
n=0;
}
}
}
}
}
设计思想
输入的数据流由1开始,读到0时后面八位为有效数据
1如果数据流都为1或者长度小于11个数,则输出null data
2若这断有效数据后第两位数不为1则输出valiable error
3若有效数据后第一位数和有效数据的1的个数不为奇数则输出parity check error
4若2.3都成立则输出valiable
5若次有效数据1234均不成立则按循序输出
1;xxxxxxxx
2; xxxxxxxx
3;xxxxxxxx
问题:题目的规则没读懂,一开始没办法判断解决问题的先后措施。
解决方式:多次提交,确定解决问题的先后循序,
定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。main方法源码:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double a = Double.parseDouble(input.next());
double b = Double.parseDouble(input.next());
double c = Double.parseDouble(input.next());
if(a == 0){
System.out.println("Wrong Format");
System.exit(0);
}
//create a QuadraticEquation object
QuadraticEquation equation = new QuadraticEquation(a, b, c);
//get value of b * b - 4 * a * c
double discriminant = equation.getDiscriminant();
System.out.println("a=" + equation.getA() +
",b=" + equation.getB() +
",c=" + equation.getC()+":");
if (discriminant < 0) {
System.out.println("The equation has no roots.");
}
else if (discriminant == 0)
{
System.out.println("The root is " +
String.format("%.2f", equation.getRoot1()));
}
else // (discriminant >= 0)
{
System.out.println("The roots are " +
String.format("%.2f", equation.getRoot1())
+ " and " + String.format("%.2f", equation.getRoot2()));
}
}
}
class QuadraticEquation{
//your code
}
注意:须提交完整源码,包括Main类。
输入格式:
在一行中输入a、b、c的值,可以用一个或多个空格或回车符分开。
输出格式:
- 当输入非法时,输出“Wrong Format”
- 当有一个实根时,输出(2行):
- a=值,b=值,c=值:
- The root is 值(保留两位小数)
- 当有两个实根时,输出(2行):
- a=值,b=值,c=值:
- The roots are 值1 and 值2(均保留两位小数)
输入样例1:
在这里给出一组输入。例如:
1 84 -6653
输出样例1:
在这里给出相应的输出。例如:
a=1.0,b=84.0,c=-6653.0:
The roots are 49.74 and -133.74
输入样例2:
在这里给出一组输入。例如:
1.00 -2.000 1
输出样例2:
在这里给出相应的输出。例如:
a=1.0,b=-2.0,c=1.0:
The root is 1.00
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double a = Double.parseDouble(input.next());
double b = Double.parseDouble(input.next());
double c = Double.parseDouble(input.next());
if(a == 0){
System.out.println("Wrong Format");
System.exit(0);
}
//create a QuadraticEquation object
QuadraticEquation equation = new QuadraticEquation(a, b, c);
//get value of b * b - 4 * a * c
double discriminant = equation.getDiscriminant();
System.out.println("a=" + equation.getA() +
",b=" + equation.getB() +
",c=" + equation.getC()+":");
if (discriminant < 0) {
System.out.println("The equation has no roots.");
}
else if (discriminant == 0)
{
System.out.println("The root is " +
String.format("%.2f", equation.getRoot1()));
}
else // (discriminant >= 0)
{
System.out.println("The roots are " +
String.format("%.2f", equation.getRoot1())
+ " and " + String.format("%.2f", equation.getRoot2()));
}
}
}
class QuadraticEquation{
private double a;
private double b;
private double c;
public QuadraticEquation(double a, double b, double c) {
this.a = a;this.a
this.b = b;
this.c = c;
}
public double getDiscriminant() {
return (double)(b * b - 4 * a * c);
}
public double getRoot1() {
return (double)( (-b+Math.sqrt(b*b-4*a*c)) /2*a);
}
public double getRoot2 () {
return (double)((-b-Math.sqrt(b*b-4*a*c))/2*a);
}
public double getA() {
return a;
}
public double getB() {
return b;
}
public double getC() {
return c;
}
}
设计思想按照MAIN函数的函数建造函数
作为第一道封包类型的题目,本人做此题时有很多错误和许多疑问,这个题目也让我知道了java库函数之多,长路漫漫,道阻且长,行则将至,我相信凭我的努力,大学四年里室友的鼎力相助,我一定会成为一个优秀的Java软件工程师的!!!
7-2 日期类设计 (30 分)
参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:
public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
程序主方法如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { //test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format - 当第一个数字为1且输入均有效,输出格式如下:
· year1-month1-day1 next n days is:year2-month2-day2
- 当第一个数字为2且输入均有效,输出格式如下:
· year1-month1-day1 previous n days is:year2-month2-day2
- 当第一个数字为3且输入均有效,输出格式如下:
· The days between year1-month1-day1 and year2-month2-day2 are:值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
The days between 2014-2-14 and 2020-6-14 are:2312
输入样例2:
在这里给出一组输入。例如:
2 1834 2 17 7821
输出样例2:
在这里给出相应的输出。例如:
1834-2-17 previous 7821 days is:1812-9-19
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
1999-3-28 next 6543 days is:2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { //test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
class DateUtil{
private int year;
private int month;
private int day;
public int[] vis=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
public DateUtil(DateUtil d){
this.day = d.getDay();
this.month = d.getMonth();
this.year = d.getYear();
}
public DateUtil(int y, int m, int d){
year = y;
month = m;
day = d;
}
public boolean isLeapYear(int year){
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public boolean checkInputValidity(){
int[] rui=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int[] frui=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year>=1820&&year<=2020)
{
if(month>0&&month<=12)
{
if(isLeapYear(year))
{
if(day<=rui[month]&&day>0)
return true;
}
else
{
if(day<=frui[month]&&day>0)
return true;
}
}
}
return false;
}
public DateUtil getNextNDays(int n){
while(n > 365){
if(this.isLeapYear(year) && month <= 2){
if(month == 2 && day == 29){
day = 1;
month = 3;
}
year++;
n = n - 366;
}
else if(this.isLeapYear(year+1) && month > 2){
year++;
n = n - 366;
}
else{
year++;
n = n - 365;
}
}
for (int i = 0; i < n; i++) {
day++;
if(this.isLeapYear(year) && month == 2){
if(day > 29){
month++;
day = 1;
}
}
else if(day > vis[month]){
month++;
day = 1;
if(month > 12){
month = 1;
year++;
}
}
}
return this;
}
public DateUtil getPreviousNDays(int n){
DateUtil d = new DateUtil(this);
while(n > 365){
if(d.isLeapYear(d.getYear()) && d.getMonth() > 2){
n-= 366;
d.setYear(d.getYear() - 1);
}
else if(d.isLeapYear(d.getYear() - 1) && d.getMonth() <= 2){
n-=366;
d.setYear(d.getYear() - 1);
}
else{
n-=365;
d.setYear(d.getYear() - 1);
}
}
for(int i = 0; i < n; i++){
d.setDay(d.getDay() - 1);
if(d.getDay() <= 0){
d.setMonth(d.getMonth() - 1);
if(d.getMonth() <= 0){
d.setMonth(12);
d.setYear(d.getYear() - 1);
}
if(isLeapYear(d.getYear()) && d.getMonth() == 2)
d.setDay(29);
else
d.setDay(d.vis[d.getMonth()]);
}
}
return d;
}
public boolean compareDates(DateUtil date){
if(this.year > date.getYear())
return true;
else if(this.year == date.getYear() && this.month > date.getMonth())
return true;
else if(this.year == date.getYear() && this.month == date.getMonth() && this.day > date.getDay())
return true;
else
return false;
}
public boolean equalTwoDates(DateUtil date){
if(this.year != date.getYear())
return false;
else if(this.day != date.getDay())
return false;
else if(this.month != date.getMonth())
return false;
else
return true;
}
public int getDaysofDates(DateUtil date){
int dc = 0;
boolean b = this.compareDates(date);
DateUtil d = new DateUtil(this);
if(b){
while(d.getYear() - date.getYear() >= 2){
if(d.isLeapYear(d.getYear()) && d.getMonth() > 2)
dc+=366;
else if(d.isLeapYear(d.getYear() - 1) && d.getMonth() <= 2)
dc+=366;
else
dc+=365;
d.setYear(d.getYear() - 1);
}
while(true){
if(d.equalTwoDates(date))
break;
dc++;
d.setDay(d.getDay() - 1);
if(d.getDay() <= 0){
d.setMonth(d.getMonth() - 1);
if(d.getMonth() <= 0){
d.setMonth(12);
d.setYear(d.getYear() - 1);
}
if(isLeapYear(d.getYear()) && d.getMonth() == 2)
d.setDay(29);
else
d.setDay(d.vis[d.getMonth()]);
}
}
}
else{
while(date.getYear() - d.getYear() >= 2){
if(d.isLeapYear(d.getYear()) && d.getMonth() <= 2)
dc+=366;
else if(d.isLeapYear(d.getYear() + 1) && d.getMonth() > 2)
dc+=366;
else
dc+=365;
d.setYear(d.getYear() + 1);
}
while(true){
if(d.equalTwoDates(date))
break;
dc++;
d.setDay(d.getDay() + 1);
if(isLeapYear(d.getYear()) && d.getMonth() == 2){
if(d.getDay() > 29){
d.setMonth(d.getMonth() + 1);
d.setDay(1);
}
}
else if(d.getDay() > d.vis[d.getMonth()]){
d.setMonth(d.getMonth() + 1);
d.setDay(1);
if(d.getMonth() > 12){
d.setMonth(1);
d.setYear(d.getYear() + 1);
}
}
}
}
return dc;
}
public String showDate(){
return year + "-" + month + "-" + day;
}
public void setDay(int day) {
this.day = day;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
public void setMonth(int month) {
this.month = month;
}
public void setYear(int year) {
this.year = year;
}
}
设计思路:观察Main函数实现
public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值
以及get set的代换
问题:在main函数中,因为自身能力不足,写public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
函数没思路,忘记使用之前写的public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
联系起来。
解决方法:
跟同学,网友沟通,以及查看相关知识的书籍,完善我的编程思想,以及函数和函数在逻辑上的链接。
(3)采坑心得
在做
在一个字符串中提取出其中的二进制数值序列,。
时因为自己没有好好看书,并且C语言学习的不怎么好并且语言和语言之间有些函数不一
样或者不通用,所以在解决切‘-1’之前成为一个有效的字符串时,方法有错误
因为charAt函数遇到空格就跳过,所以要用contains()函数先判断空格的有无,转义符\n\s在字符串输入有歧义,写程序时应该好好思考一下从输入到输出能不能正常运行,判断结束后再进行代码的编写。
改进建议:,
在编写RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。时本人使用c语言的逻辑硬解决该问题的
这导致了该题的源代码可读性极差,并且代码面向的是过程而不是对象
源代码:
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String c =scanner.next();
int y=c.length();
int a=0;
int o=0;
int n=0;
for(int x=0;x<y;x++){
if(c.charAt(x)=='1')
a++;
}
if(y<11||a==y)
System.out.println("null data");
else{
for(int z=0;z<y-10;z++)
{
if(c.charAt(z)=='0')
{
o++;
for(int m=1;m<10;m++){
if(c.charAt(z+m)=='1')
n++;
}
if(n%2==0&&c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else if(n%2==0)
System.out.println(o+":parity check error");
else if(c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else{
System.out.println(o+":"+c.charAt(z+1)+c.charAt(z+2)+c.charAt(z+3)+c.charAt(z+4)+c.charAt(z+5)+c.charAt(z+6)+c.charAt(z+7)+c.charAt(z+8));
}
z=z+10;
n=0;
}
}
}
}
该程序跟C的区别就是使用了charAt函数进行逐个读取,并且如果测试点有空格非法输入,满分也不能实现,此程序存在很大的缺陷,并且可读性差,应该用java其他函数,如split等更好的对字符串切割,加工,处理。
总结
通过这三次的作业效果来看,我编写的代码对于老师设定的测试节点通过率不高,而且设计的代码在细节上还是很繁琐的,整体结构不够简洁,代码的可阅读性不高,我的编写能力在这几方面还有待提高。通过这几次作业强化我在类的构造方法、方法的调用、参数传递;练习循环结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。学习使用工具对代码进行跟踪调试。但在这三次作业及两次课前作业看来,我也认识到我的编码水平不高和java库函数之多,长路漫漫,道阻且长,行则将至,我相信经我一学期的学习,我的编码水平及对编程思维理解的程度一定会越来越强的,也希望在后期的讲解中找到更适合我的待解决问题的解决方法。
面向对象程序设计第一次BLOG总结
前言:三次PTA的作业着重练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。学习使用工具对代码进行跟踪调试。理解抽象类与子类的关系,在这三次PTA作业中,本人发现了java与C语言的不同,并按照上学期学习C的基础,进行了使用java实现简单代码的编写,学习过程如下:
第一次PTA作业: 得分98分 班级 48名 题量 9 难度:
错误题目:在一个字符串中提取出其中的二进制数值序列,。
原因:判断不了‘-1’的存在性当时只会charAt函数循环读取
第二次PTA作业: 得分100分 班级 1名 题量 3 难度:
错误题目:无
原因:无
第二次PTA作业: 得分100分 班级 1名 题量 3 难度:
错误题目:无
原因:无
设计与分析
本模块重点对题目提交的源码进行分析
1.7-1 身体质量指数(BMI)测算 (10 分)
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。
输入格式:
两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;
输出格式:
输入数值超出范围:输出“input out of
range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。
输入样例0:
在这里给出一组输入。例如:
-2 8
输出样例0:
在这里给出相应的输出。例如:
input out of range
输入样例1:
在这里给出一组输入。例如:
70 1.75
输出样例1:
在这里给出相应的输出。例如:
fit
错误原因:边界值错误
源代码:
import
java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double weight = sc.nextDouble();
double high = sc.nextDouble();
if(high>=0.00&&high<=2.72&&weight>=0.00&&weight<=727.00)
{
double bmi=weight/(high*high);
if(bmi<18.5)
System.out.println("thin");
else if(bmi>=18.5&&bmi<24.05)
System.out.println("fit");
else if(bmi>=24.05&&bmi<28.05)
System.out.println("overweight");
else if(bmi>=28.05)
System.out.println("fat");
}
else{
System.out.println("input out of range");
}
}
}
设计思想
大方向:利用BMI公式算出bmi利用给定的BMI边界进行判断
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。
问题:边界
解决方法:把边界值+0.05得以解决
7-9 二进制数值提取 (10 分)
在一个字符串中提取出其中的二进制数值序列,。
输入格式:
一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1
输出格式:
将输入的序列去掉非0、1字符以及结尾符的数据内容,
注:结束符-1之后的0\1字符忽略不计。
例如:00011。
输入样例:
在这里给出一组输入。例如:
abc00aj014421-1
输出样例:
在这里给出相应的输出。例如:
00011
输入样例1:
在这里给出一组输入。例如:
a0571-1k001y
输出样例1:
在这里给出相应的输出。例如:
01
源代码:
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String c =scanner.next();
int x=0;
int b=0;
int y=c.length();
String a="";
String str="";
for(;x<y-1;x++)
{
if(c.charAt(x)=='-'&&c.charAt(x+1)=='1')
{
for(int d=0;d<x;d++)
{
while(c.charAt(d)==' '||c.charAt(d)==47||c.charAt(d)==92)
continue;
a+=c.charAt(d);
}
for(int p=0;p<a.length();p++)
{
if(a.charAt(p)=='0'||a.charAt(p)=='1')
str+=a.charAt(p);
}
break;
}
else
b++;
}
if(b==y-1)
System.out.println("Wrong Format");
else
System.out.println(str);
}
}
设计思想:用charAt函数逐个读取
问题,-1为两个字符,如字符串前两个为-1,则无法判断
解决方法:用sqlit函数切,当时没有研究字符串长度而盲目做题
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
输入样例:
在这里给出一组输入。例如:
1111011101011111111111
输出样例:
在这里给出相应的输出。例如:
1:11101011
输入样例1:
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
输出样例1:
在这里给出相应的输出。例如:
1:11101011
2:01001101
3:validate error
输入样例2:
输入数据不足11位。例如:
111101
输出样例2:
在这里给出相应的输出。例如:
null data
输入样例3:
输入数据全1没有起始位。例如:
1111111111111111
输出样例3:
在这里给出相应的输出。例如:
null data
输入样例4:
输入数据全1没有起始位。例如:
111101110101111111101111111101
输出样例4:
在这里给出相应的输出。例如:
1:11101011
2:parity check error
输入样例5:
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
输出样例5:
在这里给出相应的输出。例如:
1:validate error
2:validate error
输入样例6:
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
输出样例6:
在这里给出相应的输出。例如:
1:00000000
2:01110000
源代码
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String c =scanner.next();
int y=c.length();
int a=0;
int o=0;
int n=0;
for(int x=0;x<y;x++){
if(c.charAt(x)=='1')
a++;
}
if(y<11||a==y)
System.out.println("null data");
else{
for(int z=0;z<y-10;z++)
{
if(c.charAt(z)=='0')
{
o++;
for(int m=1;m<10;m++){
if(c.charAt(z+m)=='1')
n++;
}
if(n%2==0&&c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else if(n%2==0)
System.out.println(o+":parity check error");
else if(c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else{
System.out.println(o+":"+c.charAt(z+1)+c.charAt(z+2)+c.charAt(z+3)+c.charAt(z+4)+c.charAt(z+5)+c.charAt(z+6)+c.charAt(z+7)+c.charAt(z+8));
}
z=z+10;
n=0;
}
}
}
}
}
设计思想
输入的数据流由1开始,读到0时后面八位为有效数据
1如果数据流都为1或者长度小于11个数,则输出null data
2若这断有效数据后第两位数不为1则输出valiable error
3若有效数据后第一位数和有效数据的1的个数不为奇数则输出parity check error
4若2.3都成立则输出valiable
5若次有效数据1234均不成立则按循序输出
1;xxxxxxxx
2; xxxxxxxx
3;xxxxxxxx
问题:题目的规则没读懂,一开始没办法判断解决问题的先后措施。
解决方式:多次提交,确定解决问题的先后循序,
定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。main方法源码:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double a = Double.parseDouble(input.next());
double b = Double.parseDouble(input.next());
double c = Double.parseDouble(input.next());
if(a == 0){
System.out.println("Wrong Format");
System.exit(0);
}
//create a QuadraticEquation object
QuadraticEquation equation = new QuadraticEquation(a, b, c);
//get value of b * b - 4 * a * c
double discriminant = equation.getDiscriminant();
System.out.println("a=" + equation.getA() +
",b=" + equation.getB() +
",c=" + equation.getC()+":");
if (discriminant < 0) {
System.out.println("The equation has no roots.");
}
else if (discriminant == 0)
{
System.out.println("The root is " +
String.format("%.2f", equation.getRoot1()));
}
else // (discriminant >= 0)
{
System.out.println("The roots are " +
String.format("%.2f", equation.getRoot1())
+ " and " + String.format("%.2f", equation.getRoot2()));
}
}
}
class QuadraticEquation{
//your code
}
注意:须提交完整源码,包括Main类。
输入格式:
在一行中输入a、b、c的值,可以用一个或多个空格或回车符分开。
输出格式:
- 当输入非法时,输出“Wrong Format”
- 当有一个实根时,输出(2行):
- a=值,b=值,c=值:
- The root is 值(保留两位小数)
- 当有两个实根时,输出(2行):
- a=值,b=值,c=值:
- The roots are 值1 and 值2(均保留两位小数)
输入样例1:
在这里给出一组输入。例如:
1 84 -6653
输出样例1:
在这里给出相应的输出。例如:
a=1.0,b=84.0,c=-6653.0:
The roots are 49.74 and -133.74
输入样例2:
在这里给出一组输入。例如:
1.00 -2.000 1
输出样例2:
在这里给出相应的输出。例如:
a=1.0,b=-2.0,c=1.0:
The root is 1.00
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double a = Double.parseDouble(input.next());
double b = Double.parseDouble(input.next());
double c = Double.parseDouble(input.next());
if(a == 0){
System.out.println("Wrong Format");
System.exit(0);
}
//create a QuadraticEquation object
QuadraticEquation equation = new QuadraticEquation(a, b, c);
//get value of b * b - 4 * a * c
double discriminant = equation.getDiscriminant();
System.out.println("a=" + equation.getA() +
",b=" + equation.getB() +
",c=" + equation.getC()+":");
if (discriminant < 0) {
System.out.println("The equation has no roots.");
}
else if (discriminant == 0)
{
System.out.println("The root is " +
String.format("%.2f", equation.getRoot1()));
}
else // (discriminant >= 0)
{
System.out.println("The roots are " +
String.format("%.2f", equation.getRoot1())
+ " and " + String.format("%.2f", equation.getRoot2()));
}
}
}
class QuadraticEquation{
private double a;
private double b;
private double c;
public QuadraticEquation(double a, double b, double c) {
this.a = a;this.a
this.b = b;
this.c = c;
}
public double getDiscriminant() {
return (double)(b * b - 4 * a * c);
}
public double getRoot1() {
return (double)( (-b+Math.sqrt(b*b-4*a*c)) /2*a);
}
public double getRoot2 () {
return (double)((-b-Math.sqrt(b*b-4*a*c))/2*a);
}
public double getA() {
return a;
}
public double getB() {
return b;
}
public double getC() {
return c;
}
}
设计思想按照MAIN函数的函数建造函数
作为第一道封包类型的题目,本人做此题时有很多错误和许多疑问,这个题目也让我知道了java库函数之多,长路漫漫,道阻且长,行则将至,我相信凭我的努力,大学四年里室友的鼎力相助,我一定会成为一个优秀的Java软件工程师的!!!
7-2 日期类设计 (30 分)
参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:
public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
程序主方法如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { //test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format - 当第一个数字为1且输入均有效,输出格式如下:
· year1-month1-day1 next n days is:year2-month2-day2
- 当第一个数字为2且输入均有效,输出格式如下:
· year1-month1-day1 previous n days is:year2-month2-day2
- 当第一个数字为3且输入均有效,输出格式如下:
· The days between year1-month1-day1 and year2-month2-day2 are:值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
The days between 2014-2-14 and 2020-6-14 are:2312
输入样例2:
在这里给出一组输入。例如:
2 1834 2 17 7821
输出样例2:
在这里给出相应的输出。例如:
1834-2-17 previous 7821 days is:1812-9-19
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
1999-3-28 next 6543 days is:2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) {//test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
class DateUtil{
private int year;
private int month;
private int day;
public int[] vis=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
public DateUtil(DateUtil d){
this.day = d.getDay();
this.month = d.getMonth();
this.year = d.getYear();
}
public DateUtil(int y, int m, int d){
year = y;
month = m;
day = d;
}
public boolean isLeapYear(int year){
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public boolean checkInputValidity(){
int[] rui=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int[] frui=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year>=1820&&year<=2020)
{
if(month>0&&month<=12)
{
if(isLeapYear(year))
{
if(day<=rui[month]&&day>0)
return true;
}
else
{
if(day<=frui[month]&&day>0)
return true;
}
}
}
return false;
}
public DateUtil getNextNDays(int n){
while(n > 365){
if(this.isLeapYear(year) && month <= 2){
if(month == 2 && day == 29){
day = 1;
month = 3;
}
year++;
n = n - 366;
}
else if(this.isLeapYear(year+1) && month > 2){
year++;
n = n - 366;
}
else{
year++;
n = n - 365;
}
}
for (int i = 0; i < n; i++) {
day++;
if(this.isLeapYear(year) && month == 2){
if(day > 29){
month++;
day = 1;
}
}
else if(day > vis[month]){
month++;
day = 1;
if(month > 12){
month = 1;
year++;
}
}
}
return this;
}
public DateUtil getPreviousNDays(int n){
DateUtil d = new DateUtil(this);
while(n > 365){
if(d.isLeapYear(d.getYear()) && d.getMonth() > 2){
n-= 366;
d.setYear(d.getYear() - 1);
}
else if(d.isLeapYear(d.getYear() - 1) && d.getMonth() <= 2){
n-=366;
d.setYear(d.getYear() - 1);
}
else{
n-=365;
d.setYear(d.getYear() - 1);
}
}
for(int i = 0; i < n; i++){
d.setDay(d.getDay() - 1);
if(d.getDay() <= 0){
d.setMonth(d.getMonth() - 1);
if(d.getMonth() <= 0){
d.setMonth(12);
d.setYear(d.getYear() - 1);
}
if(isLeapYear(d.getYear()) && d.getMonth() == 2)
d.setDay(29);
else
d.setDay(d.vis[d.getMonth()]);
}
}
return d;
}
public boolean compareDates(DateUtil date){
if(this.year > date.getYear())
return true;
else if(this.year == date.getYear() && this.month > date.getMonth())
return true;
else if(this.year == date.getYear() && this.month == date.getMonth() && this.day > date.getDay())
return true;
else
return false;
}
public boolean equalTwoDates(DateUtil date){
if(this.year != date.getYear())
return false;
else if(this.day != date.getDay())
return false;
else if(this.month != date.getMonth())
return false;
else
return true;
}
public int getDaysofDates(DateUtil date){
int dc = 0;
boolean b = this.compareDates(date);
DateUtil d = new DateUtil(this);
if(b){
while(d.getYear() - date.getYear() >= 2){
if(d.isLeapYear(d.getYear()) && d.getMonth() > 2)
dc+=366;
else if(d.isLeapYear(d.getYear() - 1) && d.getMonth() <= 2)
dc+=366;
else
dc+=365;
d.setYear(d.getYear() - 1);
}
while(true){
if(d.equalTwoDates(date))
break;
dc++;
d.setDay(d.getDay() - 1);
if(d.getDay() <= 0){
d.setMonth(d.getMonth() - 1);
if(d.getMonth() <= 0){
d.setMonth(12);
d.setYear(d.getYear() - 1);
}
if(isLeapYear(d.getYear()) && d.getMonth() == 2)
d.setDay(29);
else
d.setDay(d.vis[d.getMonth()]);
}
}
}
else{
while(date.getYear() - d.getYear() >= 2){
if(d.isLeapYear(d.getYear()) && d.getMonth() <= 2)
dc+=366;
else if(d.isLeapYear(d.getYear() + 1) && d.getMonth() > 2)
dc+=366;
else
dc+=365;
d.setYear(d.getYear() + 1);
}
while(true){
if(d.equalTwoDates(date))
break;
dc++;
d.setDay(d.getDay() + 1);
if(isLeapYear(d.getYear()) && d.getMonth() == 2){
if(d.getDay() > 29){
d.setMonth(d.getMonth() + 1);
d.setDay(1);
}
}
else if(d.getDay() > d.vis[d.getMonth()]){
d.setMonth(d.getMonth() + 1);
d.setDay(1);
if(d.getMonth() > 12){
d.setMonth(1);
d.setYear(d.getYear() + 1);
}
}
}
}
return dc;
}
public String showDate(){
return year + "-" + month + "-" + day;
}
public void setDay(int day) {
this.day = day;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
public void setMonth(int month) {
this.month = month;
}
public void setYear(int year) {
this.year = year;
}
}
设计思路:观察Main函数实现
public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值
以及get set的代换
问题:在main函数中,因为自身能力不足,写public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
函数没思路,忘记使用之前写的public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
联系起来。
解决方法:
跟同学,网友沟通,以及查看相关知识的书籍,完善我的编程思想,以及函数和函数在逻辑上的链接。
(3)采坑心得
在做
在一个字符串中提取出其中的二进制数值序列,。
时因为自己没有好好看书,并且C语言学习的不怎么好并且语言和语言之间有些函数不一
样或者不通用,所以在解决切‘-1’之前成为一个有效的字符串时,方法有错误
因为charAt函数遇到空格就跳过,所以要用contains()函数先判断空格的有无,转义符\n\s在字符串输入有歧义,写程序时应该好好思考一下从输入到输出能不能正常运行,判断结束后再进行代码的编写。
改进建议:,
在编写RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。时本人使用c语言的逻辑硬解决该问题的
这导致了该题的源代码可读性极差,并且代码面向的是过程而不是对象
源代码:
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String c =scanner.next();
int y=c.length();
int a=0;
int o=0;
int n=0;
for(int x=0;x<y;x++){
if(c.charAt(x)=='1')
a++;
}
if(y<11||a==y)
System.out.println("null data");
else{
for(int z=0;z<y-10;z++)
{
if(c.charAt(z)=='0')
{
o++;
for(int m=1;m<10;m++){
if(c.charAt(z+m)=='1')
n++;
}
if(n%2==0&&c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else if(n%2==0)
System.out.println(o+":parity check error");
else if(c.charAt(z+10)!='1')
System.out.println(o+":validate error");
else{
System.out.println(o+":"+c.charAt(z+1)+c.charAt(z+2)+c.charAt(z+3)+c.charAt(z+4)+c.charAt(z+5)+c.charAt(z+6)+c.charAt(z+7)+c.charAt(z+8));
}
z=z+10;
n=0;
}
}
}
}
该程序跟C的区别就是使用了charAt函数进行逐个读取,并且如果测试点有空格非法输入,满分也不能实现,此程序存在很大的缺陷,并且可读性差,应该用java其他函数,如split等更好的对字符串切割,加工,处理。
总结
通过这三次的作业效果来看,我编写的代码对于老师设定的测试节点通过率不高,而且设计的代码在细节上还是很繁琐的,整体结构不够简洁,代码的可阅读性不高,我的编写能力在这几方面还有待提高。通过这几次作业强化我在类的构造方法、方法的调用、参数传递;练习循环结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。学习使用工具对代码进行跟踪调试。但在这三次作业及两次课前作业看来,我也认识到我的编码水平不高和java库函数之多,长路漫漫,道阻且长,行则将至,我相信经我一学期的学习,我的编码水平及对编程思维理解的程度一定会越来越强的,也希望在后期的讲解中找到更适合我的待解决问题的解决方法。
标签:int,System,BLOG,刘世越,year,date,public,out 来源: https://www.cnblogs.com/liushiyue666/p/16124759.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。