实验报告(二)
1,写一个名为Rectangle的类表示矩形。其属性包括宽width、高height和颜色color,width和height都是double型的,而color则是String类型的。要求该类具有:
(1) 使用构造函数完成各属性的初始赋值
(2) 使用get…()和set…()的形式完成属性的访问及修改
(3) 提供计算面积的getArea()方法和计算周长的getLength()方法
一,实验源码:
1 import java.util.*;
2
3 class Rectangle{
4
5 private double width;
6
7 private double height;
8
9 private String color;
10
11 public void out() {
12
13 System.out.println("宽度:"+width+", 高度:"+height+", 颜色:"+color);
14
15 }
16
17 public Rectangle(double width,double height,String color){
18
19 this.setWidth(width);
20
21 this.setHeight(height);
22
23 this.setColor(color);
24
25 }
26
27 public double getWidth() {
28
29 return width;
30
31 }
32
33 public void setWidth(double width) {
34
35 this.width = width;
36
37 }
38
39 public double getHeight() {
40
41 return height;
42
43 }
44
45 public void setHeight(double height) {
46
47 this.height = height;
48
49 }
50
51 public String getColor() {
52
53 return color;
54
55 }
56
57 public void setColor(String color) {
58
59 this.color = color;
60
61 }
62
63 public double getArea(){
64
65 double area;
66
67 area=getHeight()*getWidth();
68
69 return area;
70
71 }
72
73 public double getLength() {
74
75 double length;
76
77 length=2*(getHeight()+getWidth());
78
79 return length;
80
81 }
82
83
84
85 }
86
87 public class Text1
88
89 {
90
91
92
93 public static void main(String[] args) {
94
95 Rectangle re=new Rectangle(15,20,"black");
96
97 re.out();
98
99 System.out.println("面积:"+re.getArea()+"周长:"+re.getLength());
100
101 }
102
103 }
二,编程思路:
首先建立一个Rectangle类,然后在其中声明width,height,color变量,用于之后的程序步骤,同时将这三个变量封装。在Rectangle中建立构造方法,用于初始化之前声明的三个变量。建立一个out方法用于输出三个变量的值,再然后就是建立三个变量的setter和getter方法,用于取出被封存的三个变量。然后分别建立两个普通方法getArea()和getLength(),用于求出面积和周长。
最后进入主类Text1,首先声明Rectangle的实例对象re,并同时引用构造方法对之前的三个变量初始化。最后用re.out和System.ouy.println()将三个变量的值以及面积,周长输出。
三,实验结果
四,遇到的问题及解决方案:
这道题是很基础的一道题,我在编译过程中没有出现什么问题。但值得一提的是,我在建立构造方法时,其内部的程序语句使用的格式是this.width=width这一种格式。程序并没有报错,所以,我在setWidth()中设置了一个只有width小于10时才会写入width的if语句。结果使用了this.width=width的写法在收到大于10时的值时依然会将其写入width变量中。结论就是这种写法会导致系统跳过setter中的判断直接将值写入相应变量。以下为截图:
1-1,this.width=width的写法直接跳过了setter方法的将值赋给了对应变量
1-2,this.setWidth(width)的写法没有跳过setter方法,大于10的没有赋给对应变量。
2,银行的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,开户日期,账户密码(六位的数字,可以用0开头),当前的余额。银行规定新开一个账户时,银行方面提供一个标识符、账户初始密码123456,客户提供姓名,开户时客户可以直接存入一笔初始账户金额,不提供时初始余额为0。定义该类,并要求该类提供如下方法:存款、取款、变更密码、可以分别查询账户的标识、姓名、开户日期、当前余额等信息。
1,实验源码:
1 import java.util.*;
2 import java.text.DecimalFormat;
3 class Account {
4 private double money; //声明成员属性并封装
5 private String id,key,time,name;
6
7 public void Inoroutmoney() { //存钱与取钱操作
8 int a=0,sum=0;
9 System.out.println("1,存款 2,取款");
10 System.out.print("请输入需要操作的序号:");
11 Scanner input=new Scanner(System.in); //引入Scanner,用于输入操作,对象名input,下同
12 a=input.nextInt();
13 DecimalFormat df=new DecimalFormat("0.00"); //控制输出数额的小数点
14 if(a==1) {
15 System.out.print("请输入需要存入的金额:");
16 double money1=input.nextInt(); //输入存入的金额
17 setMoney(getMoney()+money1); //将存入的金额保存到money变量中
18 System.out.println("存款成功! 当前余额:"+df.format(getMoney())); //输出当前余额,formant()用于控制输出的小数点,下同
19 System.out.println("******************************************************");
20 }
21 if(a==2) {
22 System.out.print("请输入需要取出的金额:");
23 double money2=input.nextInt();
24 if(getMoney()-money2>=0) { //判断取出的金额是否高于原有的金额
25 setMoney(getMoney()-money2);
26 System.out.println("取款成功! 当前余额:"+df.format(getMoney()));
27 System.out.println("******************************************************");
28 }
29 else {
30 System.out.println("取款失败! 当前余额为:"+df.format(getMoney()));
31 System.out.println("******************************************************");
32 }
33 }
34 }
35 public void Changekey() { //修改密码操作
36 String key1,key2; //建立两个变量用于保存两次输入的新密码
37 Scanner input=new Scanner(System.in);
38 System.out.print("请输入原密码:");
39 key1=input.nextLine();
40 if(key1.equals(getKey())) { //判断输入的密码是否与原密码相同
41 System.out.print("请输入新密码:");
42 key1=input.nextLine(); //输入新密码
43 System.out.print("请再次输入新密码:");
44 key2=input.nextLine(); //输入新密码
45 if(key1.equals(key2)) { //比较两次输入的新密码是否相同
46 setKey(key1); //将新密码赋予key变量
47 System.out.println("成功!当前密码为:"+getKey());
48 System.out.println("******************************************************");
49 }
50 else {
51 System.out.println("两次密码不相同!修改失败!");
52 System.out.println("******************************************************");
53 }
54 }
55 else {
56 System.out.println("密码错误!");
57 System.out.println("******************************************************");
58 }
59 }
60 public void Serchinfo() { //查看用户信息操作
61 System.out.println("账户标识:"+getId());
62 System.out.println("姓名:"+getName());
63 System.out.println("开户日期:"+getTime());
64 System.out.println("当前余额:"+getMoney());
65 System.out.println("******************************************************");
66 }
67 public Account(int money,String id,String name,String key,String time) { //声明构造方法用于变量初始化
68 this.setMoney(money);
69 this.setId(id);
70 this.setTime(time);
71 this.setKey(key);
72 this.setName(name);
73 }
74
75 public double getMoney() { //建立getter和setter方法,用于取出封装的函数
76 return money;
77 }
78 public void setMoney(double money) {
79 this.money = money;
80 }
81 public String getId() {
82 return id;
83 }
84 public void setId(String id) {
85 this.id = id;
86 }
87 public String getKey() {
88 return key;
89 }
90 public void setKey(String key) {
91 this.key = key;
92 }
93 public String getTime() {
94 return time;
95 }
96 public void setTime(String time) {
97 this.time = time;
98 }
99 public String getName() {
100 return name;
101 }
102 public void setName(String name) {
103 this.name = name;
104 }
105
106 }
107 public class Text1 {
108 public static void main(String[] args) {
109 int a=0;
110 Account pr=new Account(0,"031925","三玖","123456789","2019.9.19"); //引用构造方法,并使变量初始化
111 while(a!=4) { //建立循环便于用户多次使用
112 System.out.println("1,存款或取款"); //显示操作信息和对应的序号
113 System.out.println("2,变更密码");
114 System.out.println("3,查询信息");
115 System.out.println("4,退出");
116 System.out.print("请输入需要的操作序号:");
117 Scanner input=new Scanner(System.in);
118 a=input.nextInt(); //输入序号
119 if(a==1) { //进入对应序号的方法
120 pr.Inoroutmoney();
121 }
122 if(a==2) {
123 pr.Changekey();
124 }
125 if(a==3) {
126 pr.Serchinfo();
127 }
128 if(a==4) {
129 System.out.println("感谢使用!"); //结束使用
130 break;
131 }
132 }
133 }
134
135 }
2,编程思路:
首先,需要将我将程序的功能分为五个,分别是显示序号界面和选择序号的操作,存款与取款,修改密码,查询信息和用户信息初始化。显示序号界面可以在主类中实现,同时还需要建立while循环以实现重复输入。用户信息初始化的可以建立Account类。然后在其内部声明多个成员变量用于保存用户的各个信息(当然,每个成员变量都是经过封装处理的)。同时在Account中声明构造函数,它可以用在之后的用户信息初始化操作,最后,在主类中创建一个Account的实例化对象pr,同时调用构造函数对Account中的成员变量初始化。
在完成了以上操作后,我们就可以着手程序运行的编程了。首先是选择序号的操作,我们可以在主类中声明一个变量a,并初始化0。在显示完序号选择界面时就输入对应序号至a,然后用if分支结构进行操作的选择,每个if分支中都有一个对应操作的方法。当a为4时就跳出循环并结束使用。
最后的存取款,改密码和查信息的思路就不在此赘述,都在实验源码的注释中。
3,实验结果;
一,存款与取款:
1-1,存款操作成功,初始的余额为5000元。
1-2,取款操作成功,显示相应界面。
1-3,取款失败,取出的金额多于余额,同时显示相应界面。
二,修改密码
2-1,修改密码成功,输入的原密码正确,且两次输入的新密码相同。显示修改成功后的密码。
2-2,密码修改失败,输入的原密码错误。
2-3,密码修改错误,输入的两次新密码不相同。
三,查询信息
3-1,查询信息界面。
四,结束使用
4-1,结束使用界面。
4,遇到的问题及解决方法:
本题就结果来说并不算难,但是由于代码量比较大,容易出现细节问题。我平常由于不怎么做练习,所以在做这题时总是出现细节问题,导致延长了做题时间。因此以后需要安排自己做练习的时间。以上是第一点。
第二点,我在实现存取款功能时出现了两个问题——该如何将存入的钱存入已封装的money变量中和如何在java中控制浮点型变量的小数点后的位数?在参考了网上一些方法后,发现问题一可以用 set变量名1(get变量名1()+变量2+……+变量n) 的格式对已封装的money变量赋值。问题二可以引用DecimalFormat 对象名1=new DecimalFormat(),然后在输出时用 对象名1.format(变量名2) 的格式控制小数点后的位数。
第四周学习总结:
本周主要学习三个知识点:1,String类 2,数组 3,包的运用
一,String类
1,String类的常见操作方法
方法 |
作用 |
语法示例 |
返回值 |
split() |
拆分字符串 |
String.split(" ") |
子串的数组 |
replace() |
将匹配的子串替换为指定的字符串 |
String.replace("hi!","hello!") |
替换后的字符串 |
search() |
查找特定的文本段 |
String.search("hello")
|
子串在字符串中的第一次出现的位置; 未找到返回-1。 |
match() |
匹配文本段 |
String.match("hello") |
包含所有找到的匹配子串的数组 |
toUpperCase() |
转大写 |
String.toUpperCase() |
转换后的字符串 |
toLowerCase() |
转小写 |
String.toLowerCase() |
转换后的字符串 |
charAt() |
获得指定位置的字符 |
String.charAt(0) |
指定位置的字符 |
indexOf() |
获取指定字符串首次出现的位置 |
String.indexOf("Hello") |
字符串首次出现的位置 |
substring() |
提取字符串 |
String.substring(startPos,stopPos) |
提取到的字符串 |
substr() |
提取指定长度的字符串 |
String.substr(startPos,length) |
提取到的字符串 |
charCodeAt() |
获得指定位置的字符的 Unicode 编码 |
"a".charCodeAt(0) |
返回值是 0 - 65535 之间的整数 |
2,String对象的比较
通常有两种比较方法,用“==”或equals()方法。两种方法的区别是:“==”比较双方的地址,equals()方法比较双方的内容。当地址相同时,内容一定相同,而内容相同时,地址不一定相同。由于字符串的地址不好确定,所以当我们在对字符串进行比较时不要使用“==”比较,而是用equals()方法比较。
3,String类对象实例化方式的区别
String有两种实例化方式,一种是通过直接赋值,一种是使用标椎的new调用构造方法完成实例。两种方法的区别是:前者是在堆内存空间中开辟好的空间的使用权给了变量,后者是在堆内存中开辟新的空间并将使用权赋予对象。前者在空间利用率方面优于后者,因此教材建议我们对字符串的操作采用直接赋值的方式。
4,字符串的内容不可改变
这是字符串特别重要的特性,字符串的内容一旦声明则不可改变。
我们在对一个String对象的内容进行的改变实际上是通过内存地址的“断开”和“连接”变化完成的,而字符串中的内容没有任何变化。
二,数组
1,数组的声明
数据类型 数组名称[]=null;
数组名称=new 数据类型[长度];
2,数组的静态初始化
数据类型 数组名[]={初值0,初值1,……,初值n};
三,包
包如同文件夹一样,可以将功能相似的类或接口组织在同一个包中。
语法格式:package pkg1[.pkg2[.pkg3…]];