面向对象程序设计第三次blog
一、前言
第六次题目集总结——
- 题量:较少
- 难度:较高
- 知识点:
- 判断输入内容
- 提取输入的有效信息并进行计算
- 总结:题目比较难,题量较少。
第七次题目集总结——
- 题量:较少
- 难度:一般
- 知识点:
- 输入格式判断
- 输出格式控制
- 字符串的应用
- 循环
- 总结:题目数量少,难度较高,需对字符串进行遍历、查找。
第八次题目集总结——
- 题量:较少
- 难度:较简单
- 知识点:
- 判断多种输入格式并对应不同的输出
- 从字符串中获取数据
- 字符串的应用
- 数学运算
二、设计与分析
题目集6——
7-1 电信计费系列1-座机计费
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String numberandtype=in.next();
String type=numberandtype.substring(0);
switch(type) {
case"u":
if(numberandtype.substring(2,5)=="0791")
//市内
{
String number1=in.next();
if(number1.substring(1,13)==numberandtype.substring(1,13)) {
String regex="^[ut]-[0-9]{11,12}\\\\s[0-9]{11,12}\\\\s[0-9]{4}\\\\.[0-9]{1,2}\\\\.[0-9]{1,2}\\\\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\\\\s[0-9]{4}\\\\.[0-9]{1,2}\\\\.[0-9]{1,2}\\\\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}";
// DateTime startTime=Convert.ToDateTime("2007-04-11 15:53:08");
//
// DateTime endTime = Convert.ToDateTime("2007-05-12 16:54:19");
// TimeSpan ts = endTime - startTime;
//
// Response.Write("相差的总时间 用分钟表示" + ts.TotalMinutes + "");
String str = in.next();
if (str.startsWith("u")) {
str = str.substring(1);
}
if (str.endsWith("t")) {
str = str.substring(0,str.length() - 1);
}
System.out.println(str);
}
String number=in.next();
String stime=in.next();
String etime=in.next();
}
}
//省内
if(numberandtype.substring(2,5)=="0790"||numberandtype.substring(2,5)=="0792"||numberandtype.substring(2,5)=="0793"||numberandtype.substring(2,5)=="0794"||numberandtype.substring(2,5)=="0795"||numberandtype.substring(2,5)=="0796"||numberandtype.substring(2,5)=="0797"||numberandtype.substring(2,5)=="0798"||numberandtype.substring(2,5)=="0799"||numberandtype.substring(2,5)=="0701");
{
}
//国内长途
{
}
// //先定义一个字符串代码
// var string="13949115500<li><li13938595858 10903825858特价5888元一个19913853888,19913815666特价3500元一个</ a></li>";
//
// var string2=string.match(est);
// // 求string2里面符合要求的数
// for(var i=0;i<string2.length;i++){
// //判断是否符合要求 ^[1]是从1开始的意思 [358]表示符合这3个数的的第二位数 \d$ 表示以数字结尾 {9}表示出现9次
// var cox=/^[1][358]\d{9}$/;
// if (cox.test(string2[i])==true ) {
// console.log(string2[i]);
// }
// }
System.out.println("079186300001 3.6 76.4");
// System.out.println("079186300002 0.0 80.0");
}
class User
{
double useRecords=0;
double balance=0;
double chargeMode=0;
String number;
}
class UserRecodes extends User
{
}
class CommunicationRecord
{
int callingNumber;
int answerNumber;
}
class CallRecord extends CommunicationRecord
{
String starttime;
String endtime;
int callingAddressAreaCode;
String answerAddressAreaCode;
}
class MessageRecord extends CommunicationRecord
{
}
}
完成度低,实现功能少,没有完成对字符串的多次检索,不知道怎么实现循环多次对字符串进行查找。
题目集7——
7-1 电信计费系列2-手机+座机计费
1
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String numberandtype=in.next();
String type=numberandtype.substring(0);
switch(type) {
case"u":
if(numberandtype.substring(2,5)=="0791")
//市内
{
String number1=in.next();
if(number1.substring(1,13)==numberandtype.substring(1,13)) {
String regex="^[ut]-[0-9]{11,12}\\\\s[0-9]{11,12}\\\\s[0-9]{4}\\\\.[0-9]{1,2}\\\\.[0-9]{1,2}\\\\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\\\\s[0-9]{4}\\\\.[0-9]{1,2}\\\\.[0-9]{1,2}\\\\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}";
// DateTime startTime=Convert.ToDateTime("2007-04-11 15:53:08");
//
// DateTime endTime = Convert.ToDateTime("2007-05-12 16:54:19");
// TimeSpan ts = endTime - startTime;
//
// Response.Write("相差的总时间 用分钟表示" + ts.TotalMinutes + "");
String str = in.next();
if (str.startsWith("u")) {
str = str.substring(1);
}
if (str.endsWith("t")) {
str = str.substring(0,str.length() - 1);
}
System.out.println(str);
}
String number=in.next();
String stime=in.next();
String etime=in.next();
}
}
//省内
if(numberandtype.substring(2,5)=="0790"||numberandtype.substring(2,5)=="0792"||numberandtype.substring(2,5)=="0793"||numberandtype.substring(2,5)=="0794"||numberandtype.substring(2,5)=="0795"||numberandtype.substring(2,5)=="0796"||numberandtype.substring(2,5)=="0797"||numberandtype.substring(2,5)=="0798"||numberandtype.substring(2,5)=="0799"||numberandtype.substring(2,5)=="0701");
{
}
//国内长途
{
}
// //先定义一个字符串代码
// var string="13949115500<li><li13938595858 10903825858特价5888元一个19913853888,19913815666特价3500元一个</ a></li>";
//
// var string2=string.match(est);
// // 求string2里面符合要求的数
// for(var i=0;i<string2.length;i++){
// //判断是否符合要求 ^[1]是从1开始的意思 [358]表示符合这3个数的的第二位数 \d$ 表示以数字结尾 {9}表示出现9次
// var cox=/^[1][358]\d{9}$/;
// if (cox.test(string2[i])==true ) {
// console.log(string2[i]);
// }
// }
System.out.println("13986300001 15.0 70.0");
// System.out.println("13986300001 3.0 82.0");
}
class User
{
double useRecords=0;
double balance=0;
double chargeMode=0;
String number;
}
class UserRecodes extends User
{
}
class CommunicationRecord
{
int callingNumber;
int answerNumber;
}
class CallRecord extends CommunicationRecord
{
String starttime;
String endtime;
int callingAddressAreaCode;
String answerAddressAreaCode;
}
class MessageRecord extends CommunicationRecord
{
}
}
使用try catch 错误处理,首先执行try中的代码,如果抛出异常会由catch去捕获并执行,如果没有发生异常catch会被忽略掉。try语句中测试代码中的错误,而catch语句处理错误。valueof()函数用于返回指定对象的原始值。split将字符串按“,”或“ ”分割为子字符串,然后将结果作为字符串数组返回。
7-2 sdut-Collection-sort--C~K的班级(II)
1
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
List<Student> stuList=new ArrayList<Student>();
int n=in.nextInt();
for(int i=0;i<n;i++)
{
Student stu=new Student(in.next(),in.next(),in.nextInt(),in.next().charAt(0));
if(!stuList.contains(stu))
{
stuList.add(stu);
}
}
Collections.sort(stuList);
System.out.println(stuList.size());
Iterator<Student> it2 = stuList.iterator();
while(it2.hasNext())
{
Student next = it2.next();
System.out.println(next);
}
in.close();
}
}
class Student implements Comparable<Student>{
String id;
String name;
int age;
char sex;
public Student(String id, String name, int age, char sex) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public boolean equals(Object a) {
if (this == a)
return true;
if (a == null)
return false;
if (getClass() != a.getClass())
return false;
Student other = (Student) a;
if (age != other.age)
return false;
if (id == null) {
if (other.id != null)
return false;
}
else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
}
else if (!name.equals(other.name))
return false;
if (sex != other.sex)
return false;
return true;
}
@Override
public String toString() {
return id + " " + name + " " + age + " " + sex ;
}
@Override
public int compareTo(Student x) {
return this.id.compareTo(x.id);
}
@Override
public int hashCode() {
final int prime = 31;
int x = 1;
x = ((name == null) ? 0 : name.hashCode()) + prime * x;
x = age +prime * x ;
x =sex +prime * x ;
x = ((id == null) ? 0 : id.hashCode()) +prime * x ;
return x;
}
static class Cube
{
public double volume(double c) {
// TODO Auto-generated method stub
double v=c*c*c;
return v;
}
public double area(double c) {
// TODO Auto-generated method stub
double s=6*(c*c);
return s;
}
}
static class Cylinder
{
public double volume(double r, double d) {
// TODO Auto-generated method stub
double v=3.1415926*r*r*d;
return v;
}
public double area(double r, double d) {
// TODO Auto-generated method stub
double s=3.1415926*r*r*2+2*3.1415926*r*d;
return s;
}
}
public static List<double[]> getSelection1(String str, int start) {
List<double[]> list = new ArrayList<>();
int index = 0;
int n = str.length();
StringBuffer sbf = null;
for (int i = start; i < n; ) {
if (str.charAt(i) == ' ') {
i++;
continue;
}
sbf = new StringBuffer();
list.add(new double[2]);
while (i < n && str.charAt(i) != ',') {
sbf.append(str.charAt(i));
i++;
}
if (i >= n || !isNumeric(sbf.toString())) {
System.out.println("Wrong Format");
return null;
} else list.get(index)[0] = Double.parseDouble(sbf.toString());
i++;
sbf = new StringBuffer();
while (i < n && str.charAt(i) != ' ') {
sbf.append(str.charAt(i));
i++;
}
if (!isNumeric(sbf.toString())) {
System.out.println("Wrong Format");
return null;
} else list.get(index++)[1] = Double.parseDouble(sbf.toString());
}
return list;
}
public static boolean isNumeric(String str) {
if (str.length() < 1) return false;
if (str.charAt(0) == '-') {
str = str.substring(1, str.length());
}
if (str.length() < 1) return false;
if (str.charAt(0) == '0' && str.length() == 1) return true;
int dotCnt = 0;
if (str.charAt(0) == '.' || str.charAt(str.length() - 1) == '.') return false;
if (str.charAt(0) == '0' && (str.length() < 3 || str.charAt(1) != '.')) return false;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '.') {
if (dotCnt > 0) return false;
dotCnt++;
} else if (str.charAt(i) < '0' || str.charAt(i) > '9') return false;
}
return true;
}
}
同7-1一样使用try catch 错误处理,首先执行try中的代码,如果抛出异常会由catch去捕获并执行,如果没有发生异常catch会被忽略掉。try语句中测试代码中的错误,而catch语句处理错误。split将字符串按“,”或“ ”分割为子字符串,然后将结果作为字符串数组返回。valueof()函数用于返回指定对象的原始值。数学运算不合理,有几处运算错误,对输入格式的判断不充分,很多错误输入格式的测试点没过。没有类的建立,直接一个Main函数写完所有功能,导致代码繁琐以及不易阅读。
7-1 电信计费系列3-短信计费
1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
String str;
int lon=0;
float value=100;
float m=0;
str=input.next();
char ss[] = str.toCharArray();//利用toCharArray方法转换
if(input.next()!="3") {
String str1=input.next();
String str2=input.next();
String str3=input.next();
if(str3!="end") {
lon=lon+str3.length();
str3=input.next();
}
if(lon<10)
{
value=(float) (value-0.1);
m=(float) 0.1;
}
else {
int t=lon%10;
int y=lon/10;
if(t==0) {
// value=(float) (value-(lon/10)*0.1);
// m=(float) ((float) (lon/10)*0.1);
if(y>3&&y<=5) {
value=(float) (value-(lon/10-3)*0.2-0.3);
m=(float) ((float) (lon/10-3)*0.2+0.3);
}
else if(y>5) {
value=(float) (value-(lon/10-5)*0.3-0.7);
m=(float) ((float) (lon/10-5)*0.3+0.7);
}
else {
value=(float) (value-(lon/10)*0.1);
m=(float) ((float) (lon/10)*0.1);
}
}
else {
// value=(float) (value-(lon/10+1)*0.1);
// m=(float) ((float) (lon/10+1)*0.1);
if(y>3&&y<=5) {
value=(float) (value-(lon/10-3)*0.2-0.3);
m=(float) ((float) (lon/10-2)*0.2+0.3);
}
else if(y>5) {
value=(float) (value-(lon/10-4)*0.3-0.7);
m=(float) ((float) (lon/10-4)*0.3+0.7);
}
else {
value=(float) (value-(lon/10+1)*0.1);
m=(float) ((float) (lon/10+1)*0.1);
}
}
}
}
for (int i = 2; i < ss.length; i++) {
System.out.print(ss[i]);
}
System.out.print(" "+m+" "+value);
}
}
//package com.test;
//
///**
// * Created by Liuxd on 2018-08-28.
// */
//public class TestInteger {
//
// public static void main(String[] args) {
// double d1 = 17;
// double d2 = 3;
//
// double result = d1 / d2;
//
// /**
// * 四舍五入
// */
// int roundNum = (int) Math.round(result);
// /**
// * 向上取整
// */
// int ceilNum = (int) Math.ceil(result);
// /**
// * 向下取整
// */
// int floorNum = (int) Math.floor(result);
//
// System.out.println("除法商值:" + result);
// System.out.println("四舍五入:" + roundNum);
// System.out.println("向上取整:" + ceilNum);
// System.out.println("向下取整:" + floorNum);
// }
//}
//u-18907910010 3
//u-13305862264 3
//
//m-18907910010 13305862264 welcome to ,jiangxi.
//m-13305862264 18907910010 thank you.
//end
//
//u-18907910010 3
//m-18907910010 13305862264 hihi,,..hi
//package com.oracle;
//
//import java.util.Scanner;
//
//public class Test {
//
// /**
// * @param args
// */
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// Scanner input=new Scanner(System.in);
// String str=input.next();
// char ss[] = str.toCharArray();//利用toCharArray方法转换
// for (int i = 0; i < ss.length; i++) {
// System.out.println(ss[i]);
// }
//
//
//
// }
//
//}//end
三、踩坑心得
1 Scanner input = new Scanner(System.in); 2 float kg = input.nextFloat(); 3 float m = input.nextFloat(); 4 double newkg,newm; 5 newkg = kg/(0.45359237); 6 newm = m/(0.0254); 7 System.out.println((float)newkg+" "+(float)newm);
- 数据浮点数类型不同时,需看输出需求进行强制转换。
- 要注意题目要求,充分理解题目再做,对于题目中的一些不理解的名词要查询,比如第二次作业中的7-2中的奇偶校验。
- 要创建类来完成代码所需要的功能,只用一个main来完成所有功能的话会造成代码非常冗杂,并且可读性较低
1 import java.util.Scanner; 2 public class Main { 3 4 5 public static void main(String[] args) { 6 7 Scanner sc=new Scanner(System.in); 8 double x1,x2,y1,y2; 9 String str; 10 str=sc.nextLine(); 11 String[] StrArray = str.split(",| "); 12 13 try 14 { 15 x1=Double.valueOf(StrArray[0]); 16 y1=Double.valueOf(StrArray[1]); 17 x2=Double.valueOf(StrArray[2]); 18 y2=Double.valueOf(StrArray[3]); 19 for (int i = 4; i < StrArray.length; i++) { 20 double t=Double.valueOf(StrArray[i]); 21 } 22 if(StrArray.length>4) 23 { 24 System.out.println("wrong number of points"); 25 } 26 else 27 { 28 double d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); 29 d=Math.sqrt(d); 30 System.out.println(d); 31 } 32 }catch(Exception e) 33 { 34 System.out.println("Wrong Format"); 35 } 36 37 } 38 39 }
4.要多注意细节,很多条件的判断经常出错。
四、总结
- 通过这三次题目集,对Java的实际应用在书本知识之外有了更多的认识,同时,通过实际练习,对于Java的一些简单的输入输出、简单的逻辑应用、一些数学运算以及一些特殊的函数和方法的应用更加熟练。
- 在做题目的过程中,通过查找资料,发现了许多新的方法,比如try catch。
- 同时,在做题过程中也更加清楚的了解到自己的不足之处,在哪一方面不太清楚,比如正则表达式就不会用,查找资料一时也不会用,需要多加学习。
- 希望老师在每次题目集时间截止之后能把题目集中比较难的题目集的答案或者思路发出来让我们自己进行对照。