zoukankan      html  css  js  c++  java
  • cs106a编程方法学作业解答 (1)

       cs106s是斯坦福一门叫做编程方法学的课的编号。这门课面向初学编程者,使用的语言是java。课程资源网上都有,我决定把附带的作业自己动手做一下贴在这里。有错漏不足之处欢迎读者指正。

      Assignment 1

      problem #1

      这是个简单的移动Karel的问题。问题很简单,就是移动Karel到方框外的“报纸”处,捡起,然后回到原地。代码如下:

      

      import stanford.karel.*;

      public class CollectNewspaperKarel extends SuperKarel {
           public void run(){
              move();
              move();
              turnRight();
              move();
              turnLeft();
              move();
              pickBeeper();
              turnLeft();
              turnLeft();
              move();
              move();
              move();
              turnRight();
              move();

        }
    }

     problem #2

     这个问题也很简单,就是要求Karel能够使得图中每隔4列的列中都填满beeper(已经有的地方不可重复),起始位置是(1,1)。

    import stanford.karel.*;

    public class StoneMasonKarel extends SuperKarel {

               public void run(){
                           repair();
                           comeback();
                           while (frontIsClear()){
                                   for(int i=0;i<4;i++){
                                       move();
                                   }
                                   repair();
                                   comeback();
                           }


               }
               private void repair(){
                         turnLeft();
                         while (frontIsClear()){
                                        if (noBeepersPresent()){
                                               putBeeper();
                                        }
                                        move();
                          }
                         if (noBeepersPresent()){
                                        putBeeper();
                         }

               }
               private void comeback(){
                         turnLeft();
                         turnLeft();
                         while (frontIsClear()){
                                   move();
                         }
                         turnLeft();
               }
    }

    problem #3

    第三个题要求Karel在任意给定的矩形地图里间隔放置beeper,我的思路是:

    首先建立几个private方法:放置奇数号码行,放置偶数号码行,返回该行第一格,进入下一行。其中前两者的区别在于beeper的位置错开了。

    程序结构如下:

    放置奇数号码行

    返回

    判定是否继续(用while循环),循环操作:进入下一行,放置偶数号码行,返回,判定是否继续(用if),进入下一行,放置奇数号码行,返回

     具体代码如下:

    import stanford.karel.*;

    public class CheckerboardKarel extends SuperKarel {

                        public void run(){
                                    creatSingleColumn();
                                    back();
                                    while(rightIsClear()){
                                              goNext();
                                              creatEvenColumn();
                                              back();
                                              if(rightIsClear()){
                                                          goNext();
                                                          creatSingleColumn();
                                                          back();
                                              }
                                    }
                        }
                        private void creatSingleColumn(){
                                   putBeeper();
                                   while(frontIsClear()){
                                             move();
                                             if (frontIsClear()){
                                                       move();
                                                       putBeeper();

                                             }
                                   }
                        }
                        private void creatEvenColumn(){

                                   while(frontIsClear()){
                                             move();
                                             putBeeper();
                                             if (frontIsClear()){
                                                       move();
                                             }
                                   }
                        }
                        private void back(){
                                   turnLeft();
                                   turnLeft();
                                   while(frontIsClear()){
                                             move();

                                   }

                        }
                        private void goNext(){
                                   turnRight();
                                   move();
                                   turnRight();

                        }
    }

    problem #4

    这个问题要求karel能够到达一行(长度任意)的中点并在其上放置一枚beeper。注意程序结束时要求其余地方不能有beeper存在。

    这个题有些难度,因为除了给定的几个指令,你不能使用其他任何东西 。(比如设置一个变量作为计数器)。昨晚遇到此题时毫无思路,没想到一觉起来马上意识到可以利用自己所在格子的beeper数来标示。

    方法如下:先放置一枚。走过去时,先把当前格子的beeper都搬运到下一格,并额外放置一个beeper。回来时,也这样搬运,不同的是到达下一格后不放置,而是取走两个beeper。

    代码如下:

    import stanford.karel.*;

    public class MidpointFindingKarel extends SuperKarel {

                public void run(){
                             putBeeper();
                             while(frontIsClear()){
                                         if(beepersPresent()){
                                                 pickBeeper();
                                                 move();
                                                 putBeeper();
                                                 back();
                                                 if(noBeepersPresent()){
                                                         move();
                                                         putBeeper();
                                                }
                                         }
                             }

                             turnLeft();
                             turnLeft();
                             while(beepersPresent()){
                                         pickBeeper();
                                         move();
                                         putBeeper();
                                         back();
                                         if(noBeepersPresent()){
                                                       move();
                                                       pickBeeper();
                                                       if(beepersPresent()){
                                                                  pickBeeper();
                                                       }
                                         }
                              }
                              back();
                              putBeeper();
               }
               private void back(){
                              turnLeft();
                              turnLeft();
                              move();
                              turnRight();
                              turnRight();
               }

    }

  • 相关阅读:
    directX视频播放------手动连接 分类: DirectX 2014-10-28 09:50 515人阅读 评论(0) 收藏
    DirectX:函数可以连接任意两个filter 分类: DirectX 2014-10-27 19:20 466人阅读 评论(0) 收藏
    查找IFileSourceFilter上的Pin 分类: DirectX 2014-10-27 18:19 433人阅读 评论(0) 收藏
    DirectShow基础编程 最简单transform filter 编写步骤 分类: DirectX 2014-10-25 15:03 462人阅读 评论(0) 收藏
    如何给filter添加自定义接口及调用 分类: DirectX 2014-10-24 14:47 455人阅读 评论(0) 收藏
    如何给filter添加自定义接口 分类: DirectX 2014-10-24 08:59 499人阅读 评论(0) 收藏
    虚拟串口--杂记 分类: windows驱动程序WDM 2014-10-21 15:56 672人阅读 评论(1) 收藏
    cpci热插拔信号 分类: 浅谈PCI 2014-10-21 08:20 603人阅读 评论(0) 收藏
    解决 安装驱动程序后设备管理器中显示黄色问号 分类: VC++ 浅谈PCI 2014-10-20 15:05 474人阅读 评论(0) 收藏
    Code Snippet
  • 原文地址:https://www.cnblogs.com/livingisgood/p/3995879.html
Copyright © 2011-2022 走看看