总结
7-1 电信计费系列3-短信计费 分数 50 作者 蔡轲 单位 南昌航空大学 实现一个简单的电信计费程序,针对手机的短信采用如下计费方式: 1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。 2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。 输入: 输入信息包括两种类型 1、逐行输入南昌市手机用户开户的信息,每行一个用户。 格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐 3-手机短信计费) 例如:u-13305862264 3 座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。 手机号码由11位数字构成,最高位是1。 本题只针对类型3-手机短信计费。 2、逐行输入本月某些用户的短信信息,短信的格式: m-主叫号码,接收号码,短信内容 (短信内容只能由数字、字母、空格、英文逗号、英文句号组成) m-18907910010 13305862264 welcome to jiangxi. m-13305862264 18907910010 thank you. 注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。 输出: 根据输入的详细短信信息,计算所有已开户的用户的当月短信费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。 每条短信信息均单独计费后累加,不是将所有信息累计后统一计费。 格式:号码+英文空格符+总的话费+英文空格符+余额 每个用户一行,用户之间按号码字符从小到大排序。 错误处理: 输入数据中出现的不符合格式要求的行一律忽略。 本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码、自己给自己打电话等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。 本题只考虑短信计费,不考虑通信费用以及月租费。 建议类图: 参见图1、2、3: image.png
图1中User是用户类,包括属性:
userRecords (用户记录)、balance(余额)、chargeMode(计费方式)、number(号码)。
ChargeMode是计费方式的抽象类:
chargeRules是计费方式所包含的各种计费规则的集合,ChargeRule类的定义见图3。
getMonthlyRent()方法用于返回月租(monthlyRent)。
UserRecords是用户记录类,保存用户各种通话、短信的记录,
各种计费规则将使用其中的部分或者全部记录。
其属性从上到下依次是:
市内拨打电话、省内(不含市内)拨打电话、省外拨打电话、
市内接听电话、省内(不含市内)接听电话、省外接听电话的记录
以及发送短信、接收短信的记录。
image.png
![]()
图2中CommunicationRecord是抽象的通讯记录类:
包含callingNumber拨打号码、answerNumber接听号码两个属性。
CallRecord(通话记录)、MessageRecord(短信记录)是它的子类。
image.png
![]()
图3是计费规则的相关类,这些类的核心方法是: calCost(ArrayList callRecords)。 该方法针根据输入参数callRecords中的所有记录计算某用户的某一项费用;如市话费。 输入参数callRecords的约束条件:必须是某一个用户的符合计费规则要求的所有记录。 SendMessageRule是发送短信的计费规则类,用于计算发送短信的费用。 LandPhoneInCityRule、LandPhoneInProvinceRule、LandPhoneInLandRule三个类分别是座机拨打市内、省内、省外电话的计费规则类,用于实现这三种情况的费用计算。 (提示:可以从UserRecords类中获取各种类型的callRecords)。 注意:以上图中所定义的类不是限定要求,根据实际需要自行补充或修改。 输入样例: 在这里给出一组输入。例如: u-18907910010 3 m-18907910010 13305862264 aaaaaaaaaaaaaaaaaaaaaaa end 输出样例: 在这里给出相应的输出。例如: 18907910010 0.3 99.7 ### 输入样例1: 在这里给出一组输入。例如: u-18907910010 3 m-18907910010 13305862264 aaaaaaaaaaaa m-18907910010 13305862264 aaaaaaa. m-18907910010 13305862264 bb,bbbb end 输出样例1: 在这里给出相应的输出。例如: 18907910010 0.5 99.5 代码长度限制 20 KB 时间限制 400 ms 内存限制 64 MB
| 1 | 1 |
| 1 | 1 |
(1)前言:蔡老师题目还是一如既往的难,虽说有许多人说比以前的简单。但我还是对那漫长的类图望而生畏,导致本题整体也是直接丢掉。
再说自己似乎有些东西没学明白,从而让题目难度再上一层楼。
这些电信计费的题目是主要核心题,偏偏这些题最让人劝退。
回想之前的信誓旦旦,到现在的不忍直视,实在没法令人同情。
当时这个时候堆垒土概念并不特别清晰,这也是放弃的原因之一。
不过,这些都只是摆烂的理由罢了。
(2)设计与分析:
7-2 编写一个类Shop(商店)、内部类InnerCoupons(内部购物券) 分数 30 作者 吴光生 单位 新余学院 编写一个类Shop(商店),该类中有一个成员内部类InnerCoupons(内部购物券),可以用于购买该商店的牛奶(假设每箱牛奶售价为50元)。要求如下: (1)Shop类中有私有属性milkCount(牛奶的箱数,int类型)、公有的成员方法setMilkCount( )和getMilkCount( )分别用于设置和获取牛奶的箱数。 (2)成员内部类InnerCoupons,有公有属性value(面值,int类型),一个带参数的构造方法可以设定购物券的面值value,一个公有的成员方法buy( )要求输出使用了面值为多少的购物券进行支付,同时使商店牛奶的箱数减少value/50。 (3)Shop类中还有成员变量coupons50(面值为50元的内部购物券,类型为InnerCoupons)、coupons100(面值为100元的内部购物券,类型为InnerCoupons)。 (4)在Shop类的构造方法中,调用内部类InnerCoupons的带参数的构造方法分别创建上面的购物券coupons50、coupons100。 在测试类Main中,创建一个Shop类的对象myshop,从键盘输入一个整数(大于或等于3),将其设置为牛奶的箱数。假定有顾客分别使用了该商店面值为50的购物券、面值为100的购物券各消费一次,分别输出消费后商店剩下的牛奶箱数。 输入格式: 输入一个大于或等于3的整数。 输出格式: 使用了面值为50的购物券进行支付 牛奶还剩XX箱 使用了面值为100的购物券进行支付 牛奶还剩XX箱 输入样例: 在这里给出一组输入。例如: 5 输出样例: 在这里给出相应的输出。例如: 使用了面值为50的购物券进行支付 牛奶还剩4箱 使用了面值为100的购物券进行支付 牛奶还剩2箱 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
像这种代码就是我能接受的范围,因此能很快得出答案
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int i = input.nextInt(); Shop myshop = new Shop(); myshop.setMilkCount(i); Shop.InnerCoupons my = myshop.new InnerCoupons(); my.buy(); } } class Shop { private int milkCount; public int getMilkCount() { return milkCount; } public void setMilkCount(int milkCount) { this.milkCount = milkCount; } public class InnerCoupons { public int value; int coupons50 = 50; int coupons100 = 100; public int value(int i) { return milkCount-i/50; } public void buy() { System.out.printf("使用了面值为%d的购物券进行支付\n",coupons50); System.out.printf("牛奶还剩%d箱\n", value(coupons50)); milkCount-=coupons50/50; System.out.printf("使用了面值为%d的购物券进行支付\n",coupons100); System.out.printf("牛奶还剩%d箱\n", value(coupons100)); milkCount-=coupons100/100; } } }
之后就是期中考试了。
7-1 点与线(类设计)
分数 20
作者 段喜龙
单位 南昌航空大学
设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format
设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:
```
The line's color is:颜色值
The line's begin point's Coordinate is:
(x1,y1)
The line's end point's Coordinate is:
(x2,y2)
The line's length is:长度值
```
其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。
设计类图如下图所示。
1641304523(1).jpg
** 题目要求:在主方法中定义一条线段对象,从键盘输入该线段的起点坐标与终点坐标以及颜色,然后调用该线段的display()方法进行输出。**
以下情况为无效作业
无法运行
设计不符合所给类图要求
未通过任何测试点测试
判定为抄袭
输入格式:
分别输入线段的起点横坐标、纵坐标、终点的横坐标、纵坐标以及颜色,中间可用一个或多个空格、tab或者回车分隔。
输出格式:
The line's color is:颜色值
The line's begin point's Coordinate is:
(x1,y1)
The line's end point's Coordinate is:
(x2,y2)
The line's length is:长度值
输入样例1:
在这里给出一组输入。例如:
5
9.4
12.3
84
Red
输出样例1:
在这里给出相应的输出。例如:
The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
输入样例2:
在这里给出一组输入。例如:
80.2356
352.12
24.5
100
Black
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
这应是基础题,可却怎么也无法得分。这我就不知道是什么原因了。
import java.util.Scanner;
public class Main {
public void main(String[] args) {
Line s= new Line();
Scanner in=new Scanner(System.in);
double x1= in.nextDouble();
s.p1.setX(x1);
double x2= in.nextDouble();
s.p2.setX(x2);
double y1= in.nextDouble();
s.p1.setY(y1);
double y2= in.nextDouble();
s.p2.setY(y2);
String color=in.next();
s.setColor(color);
s.setPoint1(s.getPoint1());
s.setPoint2(s.getPoint2());
s.display();
}
static class Point {
private double x;
private double y;
void setX(double x){
this.x=x;
}
double getX(){
return x;
}
void setY(double y){
this.y=y;
}
double getY(){
return y;
}
void display(){
System.out.println("The line's begin point's Coordinate is:" );
System.out.printf("(%.2f,%.2f)\n",x,y);
}
}
static class Line {
private Point p1= new Point();
private Point p2= new Point();
private String color;
Point getPoint1(){
return p1;
}
void setPoint1(Point point1){
this.p1=point1;
}
Point getPoint2(){
return p2;
}
void setPoint2(Point point2){
this.p2=point2;
}
void setColor(String color){
this.color=color;
}
String getColor(){
return color;
}
double getDistance(){
double a1= p1.getX();
double a2= p2.getX();
double b1= p1.getY();
double b2= p2.getY();
return Math.sqrt(Math.abs(Math.pow(a1,2)-Math.pow(a2,2)+(Math.pow(b1, 2)-Math.pow(b2, 2))));
} void display() {
double distance = getDistance();
if (p1.getX() > 0 && p1.getX() <= 200 && p1.getY() > 0 && p1.getY() <= 200 && p2.getX() > 0 && p2.getX() <= 200 && p2.getY() > 0 && p2.getY() <= 200) {
System.out.println("The line's color is:" + getColor());
p1.display();
p2.display();
System.out.printf("The line's length is:%.2f", distance);
} else {
System.out.println("Wrong Format");
}
}
}
}
后面两题也没时间做。
7-2 点线面问题重构(继承与多态)
分数 40
作者 段喜龙
单位 南昌航空大学
在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。
对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色
在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。示例代码如下:
element = p1;//起点Point
element.display();
element = p2;//终点Point
element.display();
element = line;//线段
element.display();
element = plane;//面
element.display();
类结构如下图所示。
1641340607(1).jpg
其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。
以下情况为无效作业
无法运行
设计不符合所给类图要求
未通过任何测试点测试
判定为抄袭
输入格式:
分别输入线段的起点横坐标、纵坐标、终点的横坐标、纵坐标以及颜色,中间可用一个或多个空格、tab或者回车分隔。
输出格式:
(x1,y1)
(x2,y2)
The line's color is:颜色值
The line's begin point's Coordinate is:
(x1,y1)
The line's end point's Coordinate is:
(x2,y2)
The line's length is:长度值
The Plane's color is:颜色值
输入样例1:
在这里给出一组输入。例如:
5
9.4
12.3
84
Red
输出样例1:
在这里给出相应的输出。例如:
(5.00,9.40)
(12.30,84.00)
The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
The Plane's color is:Red
输入样例2:
在这里给出一组输入。例如:
5
9.4
12.3
845
Black
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
7-3 点线面问题再重构(容器类)
分数 40
作者 段喜龙
单位 南昌航空大学
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList<Element>类型的对象(若不了解泛型,可以不使用<Element>)
增加该类的add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象
在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:
1:向容器中增加Point对象
2:向容器中增加Line对象
3:向容器中增加Plane对象
4:删除容器中第index - 1个数据,若index数据非法,则无视此操作
0:输入结束
示例代码如下:
choice = input.nextInt();
while(choice != 0) {
switch(choice) {
case 1://insert Point object into list
...
break;
case 2://insert Line object into list
...
break;
case 3://insert Plane object into list
...
break;
case 4://delete index - 1 object from list
int index = input.nextInt();
...
}
choice = input.nextInt();
}
输入结束后,按容器中的对象顺序分别调用每个对象的display()方法进行输出。
类图如下所示:
classdiagram.jpg
以下情况为无效作业
无法运行
设计不符合所给类图要求
未通过任何测试点测试
判定为抄袭
输入格式:
switch(choice) {
case 1://insert Point object into list
输入“点”对象的x,y值
break;
case 2://insert Line object into list
输入“线”对象两个端点的x,y值
break;
case 3://insert Plane object into list
输入“面”对象的颜色值
break;
case 4://delete index - 1 object from list
输入要删除的对象位置(从1开始)
...
}
输出格式:
Point、Line、Plane的输出参考题目2
删除对象时,若输入的index超出合法范围,程序自动忽略该操作
输入样例:
在这里给出一组输入。例如:
1
3.4
5.6
2
4.4
8.0
0.98
23.888
Red
3
Black
1
9.8
7.5
3
Green
4
3
0
输出样例:
在这里给出相应的输出。例如:
(3.40,5.60)
The line's color is:Red
The line's begin point's Coordinate is:
(4.40,8.00)
The line's end point's Coordinate is:
(0.98,23.89)
The line's length is:16.25
(9.80,7.50)
The Plane's color is:Green
(5)总结:总之就是非常不满意



浙公网安备 33010602011771号