OOP第二次博客作业

前言:

难度(1-10):
opp-4:6
opp-5:4
opp-6:6
知识点:
(1)类与对象:Java面向对象编程的核心,通过定义类和创建对象,实现大作业中的基本且必要操作。
(2)字符串与数组:处理输入信息的关键,字符数组存储char类型数据,支持信息访问、声明、初始化、对比和转换。
(3)正则表达式:高效处理输入信息,匹配特定字符和截取字符串,结合字符串转换,在大作业中发挥重要作用。
(4)ArrayList应用:数据存储与调用的便捷选择,避免类数组越界问题,提升数据存储安全性与便利性。
(5)抽象与继承:数据类定义时采用继承,优化类整理与操作,统一处理各类电器时仅需调用父类方法。

设计与分析:

opp-4-答题判题程序-4

  • 该题继第三次大作业增加了继承的使用,将原来的问题类写成父类,添加了它的子类填空题类(BlankQuestion),多选题类(MultipleChoiceQuestion),普通题目类(CommonQuestion)。
  • 本次内容和上次相比无太大改动,主要不同点再对答案的判断上,本次大作业答案的判断放在了问题类的judje(String answer)方法里,输入回答的答案,返回判定结果,其他过程与前一次一致。
    代码SourceMontor的生成报表内容:

opp-5-家居强电电路模拟程序-1

类图:

  • 本次是新一轮迭代的第一次作业,该次的类有父类(Electronic),以及它的子类:开关类(Switch)、两种灯类(FluorescentLamp,IncandescentLamp)、两种调速器类(BinningGovernor,ContinuousGovernor)、吊扇类(CeilingFan),还有一个代理类(Agent),该类负责处理输入信息。
  • 每一个类里面都有属性Electronic frontElectronic;Electronic behindElectronic;用于每个电子元件知道前后连接的是谁,方便电压的传递,因为不了解下一次的大作业的形式,所有该次本来打算将Electronic frontElectronic;Electronic behindElectronic;改为Electronic[] frontElectronic;Electronic[] behindElectronic;的形式应对并联,不过最后没用上。
  • 大体运行思路:Agent里有一个Electronic head;属性,即开头的电子元件,设该电子元件传入电压220v,传出看情况,用behindElectronic传入下一个,一直到最后。输出是根据各自的传入电压输出对应的工作状态。
  • 具体细节看类图。
    代码SourceMontor的生成报表内容:

opp-6-家居强电电路模拟程序-2

类图:

  • 相比于上一次大作业的看完题直接写代码,这次大作业花费在设计的时间更多,删除了上次的Electronic frontElectronic;Electronic behindElectronic;属性,本次电子元件的前后关联依靠ArrayList。
  • 本次大作业添加了串联类(Tandem)、并联类(Parallel)、落地扇类(FloorFan),这三都是电子元件类(Electronic)的子类。还增加了一个上次打算写但偷懒没写的排序类(SortPrint)。落地扇类与吊扇、白炽灯类差不多这里不多做说明。串联类和并联类都有一个ArrayList链表。并联类的ArrayList链表的参数化类型是Tandem,存放串联对象。串联类的的ArrayList链表的参数化类型是Electronic,可添加所有电子元件的子类(包括并联类的对象,在这里并联类对象看成一个电子元件)。
  • 和上一次电压传入传出不同,因为迭代添加了电阻,本次电子元件传入的信息为电流,删除了传出。大体计算思路为(在接收全部输入信息后):计算电路总电阻->用220v电压(如果有调速器按调后电压计算)除总电阻得总电流->电子元件通过传入的总电流计算其所分到的电压->依照该电压输出对应的工作状态。
  • 具体细节看类图。
    代码SourceMontor的生成报表内容:

踩坑心得:

opp-4-答题判题程序-4踩坑和心得:

未考虑多选题输入答案乱序
未改前代码:

	public String judje(String answer) {
		boolean flag=true;
		StringTokenizer st = new StringTokenizer(answer," ");
		while(st.hasMoreElements()&&flag)
		{
			if(standardAnswer.contains(st.nextToken()))
				flag=true;
			else
			{
				flag=false;
				break;
			}
		}
		if(answer.equals(standardAnswer))
			return "true";
		else if(answer.equals(""))
			return "false";
		else if(flag)
			return "partially correct";
		else
			return "false";
	}

该处理方法在答案为ABCD情况下,如果输入为ABDC或AABCD,返回partially correct。
改后代码:

	public String judje(String answer) {
        if(answer==null)
			return "false";
		boolean flag=true;
        answer=answer.trim();
        StringTokenizer St = new StringTokenizer(standardAnswer," ");
        int n=0;
        while(St.hasMoreElements())
        {
            St.nextToken();
            n++;
        }
        int m=0;
        String[] ch=new String[10];
		StringTokenizer st = new StringTokenizer(answer," ");
		while(st.hasMoreElements()&&flag)
		{
            ch[m]=st.nextToken();
			if(standardAnswer.contains(ch[m]))
            {
                flag=true;
                m++;
            }
			else
			{
				flag=false;
				break;
			}
		}
        int M=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<m;j++)
                if(i!=j&&(ch[i].equals(ch[j])))
                    M++;
        m=m-M/2;
        if(!flag)
            return "false";
		else if(answer.equals(standardAnswer)||m==n)
			return "true";
		else
			return "partially correct";
	}

opp-5-家居强电电路模拟程序-1踩坑和心得:

1,基本没有设计阶段,因为本次题目简单,直接边敲代码边想,多次删改代码,逻辑混乱。所以在写代码前还是要先设计好,这样才能事半功倍。
2,忽略部分情况,比如开关在后面断开,开关后的电器电压全为零,但开关前的电器电压未清零。解决方法便是添加一个TestFlow()方法判断电路是否为通路,在进行Flow()。
3.对象为空的情况,因为本次用了Electronic behindElectronic,这种类似C语言链表的形式的方法,在处理信息时有behindElectronic或者frontElectronic为空导致错误。我的解决方法是重头理一遍,还是设计的问题,一开始没想好怎么写就直接动手。
4,截尾输出出现问题,不应该使用String.format("%.0f",n),应直接用(int)强制类型转换后输出。

opp-6-家居强电电路模拟程序-2踩坑和心得:

本次作业在完成时主要出现一些细节错误。
1,未接收全部信息就计算线路电阻。在计算电阻的setR()方法里有条件判断(即Test Flow()方法),而如开关在未接受信息#K时电路为断路,并联里该串联线路的电阻不加入计算,如果在串联主线直接全不算,输入电流直接全为零,因此造成结果出错。改正方法便是在接收全部信息后才计算线路电阻。
2,电阻值敲错了。因为部分类长得差不多,直接复制过来不需要改多少,但有些该改的地方没改造成错误,写代码的时候还是得细心点。
3,精度误差。并联电阻的计算原采用方法为:1/R=1/R1+1/R2+1R3.....结果有误差,两个点过不去。改为R=R1*R2/(R1+R2)这种方法才能全过。

改进建议:

对于opp-4-答题判题程序-4:
1.添加更多的注释方便代码阅读。
2.类的划分不够细致,并不是很符合单一职责原则。
对于opp-5-家居强电电路模拟程序-1:
(1) 建议增加排序类,本次通过投机取巧解决输出顺序问题:

ele=agent.getHead();
		while(true)
		{
			ele.flow();
			if(ele.getName().contains("K"))
				ele.display();
			if(ele.getnext()==null)
				break;
			ele=ele.getnext();
		}
		ele=agent.getHead();
		while(true)
		{
			if(ele.getName().contains("K"));
			else
				ele.display();
			if(ele.getnext()==null)
				break;
			ele=ele.getnext();
		}

因为要输出的内容少,需要排序的就那几个,所有投机取巧先输入开关再输入其他就可以解决排序问题,不过后面还是得加上。
(2)

double m=(v-10)*5.0/7.0+50.0;
            int n=(int)m;
            System.out.println(n);

太麻烦
改成
System.out.println(String。format("%d",(int)((v-10)*5.0/7.0+50.0));
(3)删除无关紧要的类,如本次的Vcc,除了令开始电压为220v外没其他作用。
对于opp-6-家居强电电路模拟程序-2:

  • 排序类太过复杂,可以用接口(comparable或compatator)。
`
> public void Sortdisplay7() {
> 		String[] ch=new String[10];
> 		int L=0;
> 		for(FloorFan s:floorFans)
> 		{
> 			ch[L]=s.getName();
> 			L++;
> 		}
> 		for(int i=0;i<L-1;i++)
> 			for(int j=0;j<L-1-i;j++)
> 			{
> 				if(ch[j].compareTo(ch[j+1])>0)
> 				{
> 					String t=ch[j];
> 					ch[j]=ch[j+1];
> 					ch[j+1]=t;
> 				}
> 			}
> 		for(int i=0;i<L;i++)
> 		{
> 			for(FloorFan s:floorFans)
> 			{
> 				if(s.getName().equals(ch[i]))
> 				{
> 					s.display();
> 					break;
> 				}
> 			}
> 		}
> 	}

该代码差不多的内容写了七次,一个排序类差不多三百行,占了总代码行数的三分之一,虽然写起来一直复制粘贴花不了多少功夫,但是不够精简,查错和改起来麻烦。

总结:

第四次大作业除了了继承的使用无太多新东西。新一轮迭代的第五次和第六次大作业让我更好的认识到了设计和注释的重要性,好的设计可以让你事半功倍,至于注释,虽然第五次大作业缺少设计但有大量注释,极大的方便了第六次大作业的书写,不需要向第一轮迭代时一样每次花时间读懂上一次作业的代码。另外就是在遇到有些无法想通的问题时多和其他人讨论,如本人第六次的计算精度问题,有些靠自己一人很难发现并解决,与他人讨论不仅可以节省时间也能了解他人想法,拓宽自己的思路。

posted @   Gaadwd  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示