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();
           }

}

原文地址:https://www.cnblogs.com/livingisgood/p/3995879.html