zoukankan      html  css  js  c++  java
  • oo第二次博客作业

    第五次作业——多线程电梯

    作业概述:第五次作业是在第三次作业的基本上增加多线程的概念,说起来好像挺容易的,但其实真正做起来花费了很多时间,最先开始,我对于多线程的印象只有老师在课堂上讲的概念和简单的例子,所以要上网查找很多关于多线程的知识,然后从简单的实例锻炼开始学习。因为我第三次的电梯事实上是脑补实际情况再执行的,所以多线程的电梯需要重新构造,然后就从输入开始写,实现调度器,电梯,主函数,结束线程,将结果输入到文件中一步步实现功能,最后完成程序。真的是一个很漫长的过程,周一晚上才发现之前写的都不能用,真的很绝望,好在最后还是写出来了。

    各类大致说明:

    Controller 类:调度器类,不断扫描请求队列,按照规定的调度方法将不同的指令分配给合适的电梯。

    Elevator 类:第二次作业的电梯。

    Floor 类:用于提供整个程序所需要使用的多种结构体

    Queue 类:Floor结构的可变数组,用于完成队列增删、get、set等工作。

    Request类:用于判断输入的字符串是否合法并返回一个值。

    ALS类:构造了一个有当前可捎带队列和主请求的结构。

    Scheduler类:第三次作业的电梯类,继承Elevator类,但新生成了一个捎带函数用来完成电梯在捎带过程的工作。

    Interface类:抽象接口,归纳Elevator的所有方法。

    MainClass类:主类,用于开启和关闭调度器线程和三个电梯线程,并不断读入指令。

    Scheduler_new 类:继承第三次作业的电梯,独立的电梯线程,不断刷新判断当前电梯线程有没有被摊派的任务,依照捎带原理,不断地执行已摊派任务,并不断更新当前状态,方便调度器将新的指令分给该电梯线程。

    作业类图:

    优点:

    可以自行安全的结束线程,算法不会出现计算误差,电梯类,调度器类的分工比较合理。

    缺点:

    表面上继承了之前的电梯类,其实全部重写的,其实没有存在的意义,还有即时重写也没有发现Floor类的真实用处,还是用它完成了指令的结构体。

    我的bug

    写了很久的作业,虽然感觉可能存在不安全的线程行为,但是并没有被找到bug,而且readme其实有没有写清楚的部分,也没有被扣分,感激!!!

    别人的bug

    作业代码没有认真看,readme写的超级诚恳,虽然不让立即我输入END(一定要执行完毕这样子),还告诉我会对CPU不友好哈哈哈,公测发现在楼层是0时会出现crash,可能是正则表达式没有筛除吧(有点粗心),还有可能是算法的问题,在执行请求条数比较多时,会出现输出时间有误差的情况。互测发现不输入字符直接回车会有crash的问题(应该还是正则的问题),其实是复制请求不小心复制了一行空的无意发现的,还有就是对于捎带问题的判断存在问题。多线程大家都很不容易,所以后面就没找了。

    第六次作业——IFTTT

    作业概述:第六次作业是要对线程安全的概念理解运用,完成一个IFTTT系统。在写程序之前,我并没有听说IFTTT的威力,然后刚刚完成多线程的电梯,就没有在周末早早开始阅读指导书,只抽出了周日晚上的时间来阅读指导书。看完了,然后在纸上写了应该怎样分成各个类以及每个类的功能,美美睡了一觉。第二天起来,开始写,写到一半,和室友交流以及看issue和微信群的助教回答,发现自己理解错了,推翻架构重新来。虽然说算法并不是很困难的,但是出现了bug很难修复,为了一个bug找好几个小时都是有可能的,最后终于完成了一个能进行基本功能的程序,边界情况就没有考虑了,简直是身心俱疲。

    各类大致说明:

    Input 类:输入监控请求类,进行格式检测和数量监测等功能,同时将合法的监控请求加入队列中。

    struct 类:用于提供监控请求的结构体。

    Messege类:用于提供要输出的detail和summary。

    Safefile类:线程安全类,用于安全的实现对于文件的各种操作。

    Monitor类:监控线程,用于不断扫描目录树,然后进行触发等任务。

    Implemnts类:抽象接口,归纳线程安全类的所有方法。

    MainClass类:主类,用于开启和关闭测试线程和监控线程,并不断读入指令。

    作业类图:

    优点:

    可以自行安全的结束线程,类的分工比较合理。

    缺点:

    线程的创建划分不合理,会出现多线程造成的错误。

    我的bug

    没有在监控对象是目录时,如果删除文件夹,忘记将代码改成可以响应x bytes-> 0 byte的size_changed触发器,和readme不符。然后是如果新建了目录忘记将新建的目录加入我的目录树中。

    别人的bug

    这次分到的是一份完成的很好的作业,学习了一波~

     

    第七次作业——第一次出租车

    作业概述:第六次作业是要完成模拟出租车的乘客呼叫与应答系统。根据课上的PPT先进行了一下需求分析,大致分了几个类,以及各自需要具有的属性和要实现的功能,结果发现实现起来并没有分析起来的那么简单,然后改动一下各类,基本上可以实现出租车的行驶,但是,因为这周其他的工作以及真的不是很知道怎么测自己的bug就没有很认真debug.

    各类大致说明:

    Input 类:从文本文件中读入地图,进行格式检测等功能,同时将获得的地图传给gui生成,并且进行一些初始化的工作。

    queuestruct 类:用于提供乘客请求的结构体。

    Queuestruct类:用于提供乘客请求队列。

    Gui类:课程组提供的一些方法和gui图形界面的生成。

    request类:用于对输入的请求进行格式判断。

    Safefile类:线程安全类,用于安全的实现对于文件的各种操作。

    Controller类:调度器类,不断扫描请求队列,根据一定的规则为合适的出租车派发任务。

    Implemnts类:抽象接口,归纳线程安全类的所有方法。

    Strcut类:地图类,对文件读入的内容进行一些基本判断和操作。

    Taxi类:出租车类,用于实现出租车在各个状态之间的变化以及行驶。

    MainClass类:主类,用于开启调度器线程和出租车线程,并不断读入指令。

    作业类图:

    优点:

    可以自行安全的结束线程,类的分工比较合理。

    缺点:

    忘记使用线程安全的文件操作类,可能会造成不安全的后果。

    我的bug

    没看清指导书,将信用值+1理解为是对接到单的出租车而言,其实是对于所有参与抢单的出租车而言的,本人真滴是超级无敌粗心了,但是感谢测试的小可爱,只给我报了imcomplete。

    别人的bug

    应该是很大佬了,有五个文件包……拿到时我这个菜鸡就觉得不想测了,结果发现大佬没有考虑请求起止位置坐标的范围,公测竟然跪了orz,然后就为了快乐五一,又学习了一波~

    心得体会

    第三次作业都是多线程的,多线程的程序要求我们注意线程安全,这样才能保证执行时不会出现一些奇奇怪怪的问题。通过这几次的作业,通过对分析原则的学习,也尝试着将一些比较冗杂的方法拆解得比较简单。使得修改时不需要花费很多时间,只需要对专门的子方法进行修改就好。在编写程序前,我们需要对自己所写的程序有一个总体的大局观,构建属于自己的结构框架,然后在之后的时间中,不断地丰富内容,实现程序功能。就像绘画一样,需要先勾出底稿,然后用色彩丰富画稿。

  • 相关阅读:
    LeetCode:Multiply Strings
    c/c++ 输入输出缓冲区
    Scala access modifiers and qualifiers in detail
    PUT vs POST in REST
    Redis优化总结
    硬中断和软中断(转)
    Redis监控技巧(转)
    Understanding mysql max_connect_errors
    TCP : two different sockets sharing a port?
    libevent 安装异常
  • 原文地址:https://www.cnblogs.com/mintroy/p/8979819.html
Copyright © 2011-2022 走看看