20165334实验二 面向对象程序设计
20165334 实验二《Java面向对象程序设计》
实验内容
一、实现百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能
1、产品代码
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成绩小于0,转成“错误”
if ((grade < 0))
return "错误";
//如果成绩小于60,转成“不及格”
else if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade < 101)
return "优秀";
//如果成绩大于100,转成“错误”
else
return "错误";
}
}
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class MyUtilTest extends TestCase {
@Test
public void testNormal() {
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("优秀", MyUtil.percentage2fivegrade(95));
}
@Test
public void testExceptions() {
assertEquals("错误", MyUtil.percentage2fivegrade(-50));
assertEquals("错误", MyUtil.percentage2fivegrade(110));
}
@Test
public void testBoundary() {
assertEquals("不及格", MyUtil.percentage2fivegrade(0));
assertEquals("及格", MyUtil.percentage2fivegrade(60));
assertEquals("中等", MyUtil.percentage2fivegrade(70));
assertEquals("良好", MyUtil.percentage2fivegrade(80));
assertEquals("优秀", MyUtil.percentage2fivegrade(90));
assertEquals("优秀", MyUtil.percentage2fivegrade(100));
}
}
二、以TDD的方式研究学习StringBuffer
1、产品代码
public class StringBufferDemo {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer(20);
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
System.out.println(buffer.length());
}
}
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer a=new StringBuffer("StringBuffer");
StringBuffer b=new StringBuffer("StringBufferStringBuffer");
StringBuffer c=new StringBuffer("StringBufferStringBufferStringBuffer");
@Test
public void testcharAt() throws Exception{
assertEquals('S',a.charAt(0));
assertEquals('g',a.charAt(5));
assertEquals('r',a.charAt(11));
}
@Test
public void testcapacity() throws Exception{
assertEquals(28,a.capacity());
assertEquals(40,b.capacity());
assertEquals(52,c.capacity());
}
@Test
public void testlength() throws Exception {
assertEquals(12,a.length());
assertEquals(24,b.length());
assertEquals(36,c.length());
}
@Test
public void testindexOf() throws Exception {
assertEquals(0,a.indexOf("Str"));
assertEquals(5,a.indexOf("gBu"));
}
}
三、对MyDoc类进行扩充,让其支持Long类,初步理解设计模式
面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导:
- SRP(Single Responsibility Principle,单一职责原则)
- OCP(Open-Closed Principle,开放-封闭原则)
- LSP(Liskov Substitusion Principle,Liskov替换原则)
- ISP(Interface Segregation Principle,接口分离原则)
- DIP(Dependency Inversion Principle,依赖倒置原则)
20165335%6=0
所以我做的题目是
0: 让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
1、代码如下
abstract class Data{
public abstract void DisplayValue();
}
class Integer extends Data {
int value;
Integer(){
value=100; }
public void DisplayValue(){
System.out.println(value);
}
}
class PaseByte extends Data {
byte value;
PaseByte(){
value=-13;
}
public void DisplayValue(){
System.out.println(value);
}
}
class Document {
Data pd;
Document() {
pd=new PaseByte() ;
}
public void DisplayData(){
pd.DisplayValue();
}
}
public class MyDoc {
static Document d;
public static void main(String[] args) {
d = new Document();
d.DisplayData();
}
}
四、以TDD的方式开发一个复数类Complex
由于这个程序比较大,所以需要伪代码整理思路
//伪代码如下
(1)属性:复数包含实部和虚部两个部分,
double RealPart;复数的实部
double ImagePart;复数的虚部
getRealPart():返回复数的实部
getImagePart();返回复数的虚部
setRealPart():设置复数的实部
setImagePart();设置复数的虚部
输出形式:a+bi
(2)方法:
①定义构造函数
public Complex()
public Complex(double R,double I)
②定义公有方法:加减乘除
Complex ComplexAdd(Complex a):实现复数加法
Complex ComplexSub(Complex a):实现复数减法
Complex ComplexMulti(Complex a):实现复数乘法
Complex ComplexDiv(Complex a):实现复数除法
③Override Object
public String toString():将计算结果转化为字符串形式并输出
1、产品代码
class Complex {
private double r;
private double i;
public Complex(double r, double i) {
this.r = r;
this.i = i;
}
public static double getRealPart(double r) {
return r;
}
public static double getImagePart(double i) {
return i;
}
public Complex ComplexAdd(Complex a) {
return new Complex(r + a.r, i + a.i);
}
public Complex ComplexSub(Complex a) {
return new Complex(r - a.r, i - a.i);
}
public Complex ComplexMulti(Complex a) {
return new Complex(r * a.r - i * a.i , r * a.i + i * a.r);
}
public Complex ComplexDiv(Complex a) {
return new Complex((r * a.i + i * a.r) / (a.i * a.i + a.r * a.r), (i * a.i + r * a.r) / (a.i * a.i + a.r * a.r));
}
public String toString() {
String s =" ";
if (i > 0)
s =r +"+"+ i +"i";
if (i == 0)
s =r+"";
if (i < 0)
s = r +" "+ i+"i";
return s;
}
}
2、测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex a=new Complex(1,2);
Complex b=new Complex(1,-4);
Complex c=new Complex(0,0);
Complex d=new Complex(5,0);
Complex e=new Complex(0,8);
@Test
public void testgetRealPart() throws Exception{
assertEquals(1.0,Complex.getRealPart(1.0));
assertEquals(-1.0,Complex.getRealPart(-1.0));
assertEquals(55.0,Complex.getRealPart(55.0));
assertEquals(0.0,Complex.getRealPart(0.0));
}
@Test
public void testgetImagePart() throws Exception{
assertEquals(1.0,Complex.getImagePart(1.0));
assertEquals(-1.0,Complex.getImagePart(-1.0));
assertEquals(0.0,Complex.getImagePart(0.0));
assertEquals(65.0,Complex.getImagePart(65.0));
}
@Test
public void testComplexAdd() throws Exception{
assertEquals("2.0 -2.0i",a.ComplexAdd(b).toString());
assertEquals("1.0 -4.0i",b.ComplexAdd(c).toString());
assertEquals("5.0",c.ComplexAdd(d).toString());
assertEquals("5.0+8.0i",d.ComplexAdd(e).toString());
}
@Test
public void testComplexSub() throws Exception{
assertEquals("0.0+6.0i",a.ComplexSub(b).toString());
assertEquals("0.0 -8.0i",c.ComplexSub(e).toString());
}
@Test
public void testComplexMulti() throws Exception{
assertEquals("9.0 -2.0i",a.ComplexMulti(b).toString());
assertEquals("0.0",c.ComplexMulti(d).toString());
}
@Test
public void testComplexDiv() throws Exception{
assertEquals("-0.4 -1.4i",b.ComplexDiv(a).toString());
}
}
实验截图
实验1截图
实验2截图
实验3截图
实验4截图
实验中遇到的问题
- 问题1:在配置好Junit后
@Test
任然是是红色 - 解决办法:点解
@Test
旁的灯泡修正后即可。 - 问题2:在做第4个小实验时遇到如图问题
解决办法:根据错误提示已经修改,但想让它能兼容多空格或少空格,不知道如何修改
实验总结
本次实验最大的收获是体会到用junit测试代码的灵活性,以及在实验MyDoc类扩展中体会到抽象编程、抽象和继承、面向接口编程的理解。
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 15min | 20% |
设计 | 32min | 32% |
代码实现 | 20min | 25% |
测试 | 15min | 19% |
分析总结 | 10min | 4% |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端