cs61b project1

Debug到死系列,感觉每一个方法都查了了好几遍。。。感觉完成project1之后对List和Array的理解加深了不少,而且debug的能力明显增强23333 。

代码很多写的也比较繁琐就不贴了,挑几个写的少的贴上吧,debug到最后自己经常都搞晕了,简单说下思路

part1: 设置了一个pixel的private class其中包含Red,Green,Yellow三个颜色的值,然后建立一个pixel的矩阵,就是基本的数据结构了。

Blur和Sobel方法:最好将原矩阵外扩一圈0,便于简化代码,还是注意扩大后矩阵width和height分别为width+2和height+2而不是+1(看组长的博客才意识到这点),

其余的就是多次用loop和recur改动矩阵的元素就好,细心一些避免出现OutOfBoundException。

测试结果:

part2-4:

其实并没有搞明白part2最开始让建立的那两个构造函数是干什么用的,感觉只需要part3那个构造函数就行了啊。

Run的构建是采用DoubleList(有一个head和tail),不过感觉用circularList(就是只有一个sentinel对象作为头和尾)更简化一些,List的node存放一个三个short值分别存放red,green和blue,还有一个int值(名字为num)用来表示其中包含重复pixel的个数。

part3:我是将自己的DoubleList的insert方法做了点改动,就是在insert进一个pixel的时候判断下是否和当前队尾(tail)元素的颜色值相同,若相同则tail的num加一并不增加node,若不同则新增一个num为1的node,这样就能保证list里面无重复元素。

 1 void insert(DListNode d){
 2             if(size==0){
 3                 head=new DListNode(d);
 4                 tail=head;
 5                 size=1;
 6             }
 7             else{
 8                 if(d.red==tail.red&&d.green==tail.green&&d.blue==tail.blue){
 9                     tail.num++;
10                 }
11             else{18                 DListNode node=new DListNode(d);
19                 tail.next=node;
20                 node.prev=tail;
21                 tail=node;
22                 size++;
23                 }24             }
25         }
26 public RunLengthEncoding(PixImage image) {
27       this.width=image.getWidth();
28       this.height=image.getHeight();
29       for(int j=0;j<image.getHeight();j++){
30           for(int i=0;i<image.getWidth();i++){
31               DListNode node=new DListNode(image.getRed(i, j),image.getGreen(i, j),image.getBlue(i, j),1);
32               list.insert(node);
33           }

part2(c)可以利用part2(b)产生的Runiterator遍历List,code(最开始直接remove List的首元素,后来发现把list中的node全remove走了导致part4没法实现了。。。):

public PixImage toPixImage() {
    PixImage image=new PixImage(this.width,this.height);
    int i=0;
    int j=0;
    RunIterator runiterator=iterator();
    while(runiterator.hasNext()){
        int[]a=runiterator.next();
        DListNode node=new DListNode(a[0],a[1],a[2],a[3]);
        for(int k=0;k<node.num;k++){
            image.setPixel(i, j, node.red, node.green, node.blue);
            if(i<this.width-1){
                i++;
            }else{
                i=0;
                j++;
            }
        }
    }
    return image;
  }

part4:

part4感觉很麻烦,主要是得考虑很多种情况,我考虑的大致是是否是首尾元素,该node的num是否为一,如果不为一是在node中的首还是尾还是中间,然后再检查和前面的node是否一致,检查和后面的node是否一致。。。好麻烦的感觉:

后来想到个偷懒点的办法,就是可以先不管和前后重复不重复先插入一个新的node,最后再统一调整一遍,code:

public void prevcheck(){
      DListNode node=list.head;
      while(node.next!=null){
          if(node.red==node.next.red&&node.green==node.next.green&&node.blue==node.next.blue){
              node.num++;
              node.next.next.prev=node;
              node.next=node.next.next;
          }
          node=node.next;
      }
  }

不过即便这样还是得判断插入node的位置,所以前面的分类还是避免不了要考虑到很多种情况(num是否为一?若不为一位于node中具体哪个位置(首位,中间,末位?)还有是否为head或tail。。),如果哪位大佬有更简单的办法跟麻烦告诉我一声,我感觉这个代码写的特别长。。。

运行结果:

时间: 2024-11-11 21:49:59

cs61b project1的相关文章

复习CS61B project1之前的题目

lab 1 考点: substring/concat/equals/equalsIgnoreCase/indexOf all index from 0 not 1. homework 1 考点: opencommerical是老师上课讲过的例子,现学现卖/怎样读取网页检查元素/readline()会自动向下一个进行读取 1 class OpenCommerical { 2 3 /** Prompts the user for the name X of a company (a single s

Android问题-XE5提示&quot;[DCC Fatal Error] Project1.dpr(1): F1027 Unit not found: &#39;System.pas&#39; or binary equivalents (.dcu/.o)&quot;

问题现象:Checking project dependencies...Compiling Project1.dproj (Debug, Android)dcc command line for "Project1.dpr"[DCC Fatal Error] Project1.dpr(1): F1027 Unit not found: 'System.pas' or binary equivalents (.dcu/.o)FailedElapsed time: 00:00:00.1

Pintos Project1的同步问题

Pintos的官方文档很明显假设这个OS是运行在单cpu上,从sema_up等函数是通过禁止中断来保证原子性和解决竞争问题中也能看到这点. 因为在多cpu上是不能通过禁止中断来解决同步问题,多个线程在多个cpu上仍有可能在临界区改变同一个共享变量. 通过禁止中断是可以解决所有竞争问题,但是可能会带来很多问题: ①如果一个线程陷入死循环,占用了整个cpu,其它线程就不可能获得cpu了. 当然一个线程占用太长时间,对于其它线程来说也不公平. ②中断请求被屏蔽.例如IO设备的读写请求完成后发出的中断信

[致命错误] Project1.dpr(1): Unit not found: &#39;System.pas&#39; or binary equivalents (DCU,DPU)

问题现象:[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU) 问题原因:由于删除DCU出现的.在D:\delphi\Borland\Delphi7\Lib;下有DCU,删除就会出现上面的错误 问题处理:找个D7的电脑,复制所有的DCU到上面的目录中,就可以了. [致命错误] Project1.dpr(1): Unit not found: 'System.pas' or bina

Pintos-斯坦福大学操作系统Project详解-Project1

前言:  本实验来自斯坦福大学cs140课程,只限于教学用途,以下是他们对于Pintos系统的介绍:  Pintos is a simple operating system framework for the 80x86 architecture. It supports kernel threads, loading and running user programs, and a file system, but it implements all of these in a very s

CS61b homework1

Programe1:根据输入建立URL,读取其网站前五行内容并输出,代码: import java.io.*;import java.net.URL;public class programe1{ public static String reverse(String s){ int len=s.length(); StringBuffer sb=new StringBuffer(len); for(int i=(len-1);i>=0;i--){ sb.append(s.charAt(i));

CS61b lab1代码实现及运行结果

task1:程序是已经给好的,放到编译器里找出了几处错误就能运行了,运行结果如图: task2:不知道它这个lab中说的EMAC是什么,只能在eclipese上简单的写了个排序的程序,任务的要求是根据surname排序,不过鉴于surnname是先出现的,简化起见就 没有区分surnname和Given Name,把两个合在一个String里一起排序了.代码如下: import java.io.*;import java.util.ArrayList;import java.util.Array

CS61b lab3 分享一个bug,足足找了一个多小时,希望各位别入坑哈

part1: 写一个测试程序,比较简单就不贴代码啦,运行结果: part2: 改进InserEnd method,我是按照课上讲的把原来的singlyList变成doubleList,在SListNode中多加入一个prev变量,修改后SListNode: class SListNode { Object item; SListNode next; SListNode prev; SListNode(Object obj) { item = obj; next = null; prev=null

CS61b lab5

part1:父类reference可以指向子类的Object,但子类reference不能指向父类Object,因为子类可能存在更多的method和filed. part2:(a)可以(b,c)不行 (d)可以 interface和superclass的method名称相同,若返回类型和接受参数类型均相同,则不产生歧义可以通过编译,否则则不能通过编译. part3: 接口和父类中的constant会产生歧义,在子类中使用可标明class类型: package lab; class a{ publ