2012-10-02 100 views
0

你好,我试图理解mo程序到底是什么问题。我已经为队列中的队列编写了入队,出队,顶部和大小的代码。我还编写了测试用例来在模块中试用我的程序。当我尝试通过输入以下命令“racket run-tests.rkt | less”来运行测试用例时,出现以下错误: “ default-load-handler:预计只有一个module' declaration for队列',但找到额外的表达:#处理队列和队列的测试用例

===背景=== 默认加载/使用编译 “

这里是我的三个文件以及其中的代码

1- queue.rkt

(module queue racket 
    (provide make-queue enqueue dequeue top size queue-tests) 
    (struct queue (front back size) #:mutable #:transparent) 

    (define (make-queue) (queue null null 0)) 

(define (enqueue q elt) 
    (set-queue-back! q (cons elt (queue-back q))) 
    (set-queue-size! q (+ (queue-size q) 1)) 
    ) 
(define (dequeue q) 
    (cond ((eq? (queue-size q) 0) null) 
      ((null? (queue-front q)) 
      (begin 
       (set-queue-front! q (cdr (reverse (queue-back q)))) 
       (set-queue-back! q null) 
       (set-queue-size! q (- (queue-size q) 1)))) 
      (else 
      (begin 
       (set-queue-front! q (cdr (queue-front q))) 
       (set-queue-size! q (- (queue-size q) 1)))) 
      ) 
) 

    (define (top q) 
    (cond ((eq? (queue-size q) 0) null) 
      ((null? (queue-front q)) (last (queue-back q))) 
      (else (car (queue-front q))))) 

    (define (size q) 
    (queue-size q)) 

    ; Test cases Here 
    (include "test-queue.rkt") 
) 

2-测试queue.rkt

#lang racket/base 

(require rackunit) 

(define queue-tests 
    (test-suite 
    "Tests for the Queue" 

    (test-case "Initial Queue Properties" 
    (let ((q (make-queue))) 
     (check-equal? (size q) 0 "Queue initially should have size zero.") 
     (check-equal? (dequeue q) null "Dequeue on an empty queue returns null") 
     (check-equal? (size q) 0 "Dequeue on empty queue leaves size as zero") 
    )) 

    (test-case "One Element queue ---- Functional test" 
     (let ((q (make-queue))) 
     (check-equal? (size q) 0 "Stack initially should be of size zero") 
     (enqueue q 1) 
     (check-equal? (size q) 1 "Added one element to back of queue") 
     (check-equal? (top q) 1 "Take a sneak peak at our first element") 
     (dequeue q) 
     (check-equal? (size 1) 0 "size should now be zero") 
     (check-equal? (dequeue q) null "dequeue on empty queue returns null") 
     )) 

    (test-case "One Element queue --- Internal Test" 
     (let ((q (make-queue))) 
     (check-equal? (size q) 0 "queue initially should have size zero.") 
     (enqueue q 3) 
     (check-equal? (size q) 1 "Added one element.") 
     (check-equal? (queue-back q) '(3) "Is the element in the back list?") 
     (check-equal? (top s) 3 "Look at our one element.") 
     (check-equal? (queue-front q) '(3) "Is the element in the front list?") 
     (dequeue s) 
     (check-equal? (queue-front q) '() "Is the data empty now?") 
     )) 

    (test-case "Multi Element queue --- Functional Test" 
    (let ((q (make-queue)) 
      (elts (list 8 6 7 5 3 0 9)) 
      ) 
     (check-equal? (size q) 0 "queue initially should have size zero.") 
     (for ((i elts) 
      (num (in-range 1 8))) 
      (enqueue q i) 
      (check-equal? (size q) num "Testing size.") 
      (check-equal? (top q) i "Testing top with multiple additions.") 
      ) 
     (for ((i (reverse elts)) 
      (num (reverse (stream->list (in-range 1 8))))) 
      (check-equal? (top q) i "Testing top with multiple deletions") 
      (dequeue q) 
      (check-equal? (size q) (- num 1) "Testing size.") 
      ) 
    )) 

    (test-case "Multi Element queue --- Ebb and Flow Test" 
     (let ((q (make-queue)) 
       (elts (list 8 6 7 5 3 0 9)) 
      ) 
     (check-equal? (size q) 0 "queue initially should have size zero.") 
     (for ((i elts) 
      (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, first flow.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
      ) 
     (for ((i (reverse elts)) 
       (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size, first ebb.") 
      ) 
     (for ((i elts) 
       (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, second flow.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
      ) 
     (for ((i (reverse elts)) 
       (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size, second ebb.") 
      ) 
    )) 

    (test-case "Multi Element queue --- Internal Test" 
    (let ((q (make-queue)) 
      (elts (list 5 8 8 2 3 0 0)) 
      (tmp null) 
      ) 
     (for ((i elts) 
      (num (in-range 1 8))) 
      (enqueue q i) 
      (check-equal? (size q) num "Testing size, second flow.") 
      (set! tmp (cons i tmp)) ; "push" element to a list 
      (check-equal? (queue-front q) tmp "Queue data is in correct form.") 
      ) 
    )) 

    )) 

3-运行tests.rkt

#lang racket/base 

(require "queue.rkt") 

(require rackunit/text-ui) 

(run-tests queue-tests) 

任何一种在点样的bug本帮助将不胜感激。提前致谢。

+0

谁是班级是为了这个? – dyoo

+0

其对于cs 331的数据结构和算法 – Obinna

回答

4

您所指的错误可能是由于在您的“queue.rkt”文件中将语言级别设置错误导致的。尤其是,所有这三种语言都应设置为

“使用源语言声明”。老实说,我真的不知道你为什么把它建造成三个独立的模块;我真的不知道你为什么要把它建造成三个独立的模块。我认为这会给你带来额外的困难,但这样做肯定有可能。

编辑:看起来像你有问题。特别是,在你定义“尺寸”之后,你有三个紧密的距离。 DrRacket在运行时不会突出显示这个问题吗?

编辑2:哦,哦,你正在使用“包含”。不要使用include。

编辑3:好了,在这里我重新格式化你的代码是在一个文件中:

(module queue racket 

    (require rackunit) 

    (provide make-queue enqueue dequeue top size) 
    (struct queue (front back size) #:mutable #:transparent) 

    (define (make-queue) (queue null null 0)) 

    (define (enqueue q elt) 
    (set-queue-back! q (cons elt (queue-back q))) 
    (set-queue-size! q (+ (queue-size q) 1)) 
    ) 
    (define (dequeue q) 
    (cond ((eq? (queue-size q) 0) null) 
      ((null? (queue-front q)) 
      (begin 
       (set-queue-front! q (cdr (reverse (queue-back q)))) 
       (set-queue-back! q null) 
       (set-queue-size! q (- (queue-size q) 1)))) 
      (else 
      (begin 
       (set-queue-front! q (cdr (queue-front q))) 
       (set-queue-size! q (- (queue-size q) 1)))) 
      ) 
    ) 

    (define (top q) 
    (cond ((eq? (queue-size q) 0) null) 
      ((null? (queue-front q)) (last (queue-back q))) 
      (else (car (queue-front q))))) 

    (define (size q) 
    (queue-size q)) 

    (test-case "Initial Queue Properties" 
      (let ((q (make-queue))) 
       (check-equal? (size q) 0 "Queue initially should have size zero.") 
       (check-equal? (dequeue q) null "Dequeue on an empty queue returns null") 
       (check-equal? (size q) 0 "Dequeue on empty queue leaves size as zero") 
       )) 

    (test-case "One Element queue ---- Functional test" 
      (let ((q (make-queue))) 
       (check-equal? (size q) 0 "Stack initially should be of size zero") 
       (enqueue q 1) 
       (check-equal? (size q) 1 "Added one element to back of queue") 
       (check-equal? (top q) 1 "Take a sneak peak at our first element") 
       (dequeue q) 
       (check-equal? (size 1) 0 "size should now be zero") 
       (check-equal? (dequeue q) null "dequeue on empty queue returns null") 
       )) 

    #;(test-case "One Element queue --- Internal Test" 
      (let ((q (make-queue))) 
       (check-equal? (size q) 0 "queue initially should have size zero.") 
       (enqueue q 3) 
       (check-equal? (size q) 1 "Added one element.") 
       (check-equal? (queue-back q) '(3) "Is the element in the back list?") 
       (check-equal? (top s) 3 "Look at our one element.") 
       (check-equal? (queue-front q) '(3) "Is the element in the front list?") 
       (dequeue s) 
       (check-equal? (queue-front q) '() "Is the data empty now?") 
       )) 

    (test-case "Multi Element queue --- Functional Test" 
      (let ((q (make-queue)) 
        (elts (list 8 6 7 5 3 0 9)) 
        ) 
       (check-equal? (size q) 0 "queue initially should have size zero.") 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
       ) 
       (for ((i (reverse elts)) 
        (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size.") 
       ) 
       )) 

    (test-case "Multi Element queue --- Ebb and Flow Test" 
      (let ((q (make-queue)) 
        (elts (list 8 6 7 5 3 0 9)) 
        ) 
       (check-equal? (size q) 0 "queue initially should have size zero.") 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, first flow.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
       ) 
       (for ((i (reverse elts)) 
        (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size, first ebb.") 
       ) 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, second flow.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
       ) 
       (for ((i (reverse elts)) 
        (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size, second ebb.") 
       ) 
       )) 

    (test-case "Multi Element queue --- Internal Test" 
      (let ((q (make-queue)) 
        (elts (list 5 8 8 2 3 0 0)) 
        (tmp null) 
        ) 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, second flow.") 
       (set! tmp (cons i tmp)) ; "push" element to a list 
       (check-equal? (queue-front q) tmp "Queue data is in correct form.") 
       ) 
       )) 



) 

当我运行这段代码,我在你的测试用例一个得到一个非常简单的错误。

更一般地说,我吃了一惊,你会写这么多的测试代码而不运行它:)。我会亲自写一个小测试用例,然后尝试一下,而不是在发现一个更基本的问题之前完成所有这些工作。我很佩服你的韧性,但我认为你需要多一点偏执狂:)

让我知道你是否有更多的麻烦。

编辑:根据您的要求分成两个文件。

文件1:queue.rkt

(module queue racket 

    (provide make-queue enqueue dequeue top size) 
    (struct queue (front back size) #:mutable #:transparent) 

    (define (make-queue) (queue null null 0)) 

    (define (enqueue q elt) 
    (set-queue-back! q (cons elt (queue-back q))) 
    (set-queue-size! q (+ (queue-size q) 1))) 

    (define (dequeue q) 
    (cond ((eq? (queue-size q) 0) null) 
      ((null? (queue-front q)) 
      (begin 
       (set-queue-front! q (cdr (reverse (queue-back q)))) 
       (set-queue-back! q null) 
       (set-queue-size! q (- (queue-size q) 1)))) 
      (else 
      (begin 
       (set-queue-front! q (cdr (queue-front q))) 
       (set-queue-size! q (- (queue-size q) 1)))))) 

    (define (top q) 
    (cond ((eq? (queue-size q) 0) null) 
      ((null? (queue-front q)) (last (queue-back q))) 
      (else (car (queue-front q))))) 

    (define (size q) 
    (queue-size q)) 

) 

文件2:队列测试。rkt,在同一个目录中:

(module test-queue racket 

    (require "queue.rkt" 
      rackunit) 


    (test-case "Initial Queue Properties" 
      (let ((q (make-queue))) 
       (check-equal? (size q) 0 "Queue initially should have size zero.") 
       (check-equal? (dequeue q) null "Dequeue on an empty queue returns null") 
       (check-equal? (size q) 0 "Dequeue on empty queue leaves size as zero") 
       )) 

    (test-case "One Element queue ---- Functional test" 
      (let ((q (make-queue))) 
       (check-equal? (size q) 0 "Stack initially should be of size zero") 
       (enqueue q 1) 
       (check-equal? (size q) 1 "Added one element to back of queue") 
       (check-equal? (top q) 1 "Take a sneak peak at our first element") 
       (dequeue q) 
       (check-equal? (size 1) 0 "size should now be zero") 
       (check-equal? (dequeue q) null "dequeue on empty queue returns null") 
       )) 

    (test-case "One Element queue --- Internal Test" 
      (let ((q (make-queue))) 
       (check-equal? (size q) 0 "queue initially should have size zero.") 
       (enqueue q 3) 
       (check-equal? (size q) 1 "Added one element.") 
       (check-equal? (queue-back q) '(3) "Is the element in the back list?") 
       (check-equal? (top s) 3 "Look at our one element.") 
       (check-equal? (queue-front q) '(3) "Is the element in the front list?") 
       (dequeue s) 
       (check-equal? (queue-front q) '() "Is the data empty now?") 
       )) 

    (test-case "Multi Element queue --- Functional Test" 
      (let ((q (make-queue)) 
        (elts (list 8 6 7 5 3 0 9)) 
        ) 
       (check-equal? (size q) 0 "queue initially should have size zero.") 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
       ) 
       (for ((i (reverse elts)) 
        (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size.") 
       ) 
       )) 

    (test-case "Multi Element queue --- Ebb and Flow Test" 
      (let ((q (make-queue)) 
        (elts (list 8 6 7 5 3 0 9)) 
        ) 
       (check-equal? (size q) 0 "queue initially should have size zero.") 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, first flow.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
       ) 
       (for ((i (reverse elts)) 
        (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size, first ebb.") 
       ) 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, second flow.") 
       (check-equal? (top q) i "Testing top with multiple additions.") 
       ) 
       (for ((i (reverse elts)) 
        (num (reverse (stream->list (in-range 1 8))))) 
       (check-equal? (top q) i "Testing top with multiple deletions") 
       (dequeue q) 
       (check-equal? (size q) (- num 1) "Testing size, second ebb.") 
       ) 
       )) 

    (test-case "Multi Element queue --- Internal Test" 
      (let ((q (make-queue)) 
        (elts (list 5 8 8 2 3 0 0)) 
        (tmp null) 
        ) 
       (for ((i elts) 
        (num (in-range 1 8))) 
       (enqueue q i) 
       (check-equal? (size q) num "Testing size, second flow.") 
       (set! tmp (cons i tmp)) ; "push" element to a list 
       (check-equal? (queue-front q) tmp "Queue data is in correct form.") 
       ) 
       ))) 
+0

oK所以我已经删除了大小声明后的额外的paran,以便最后的parens(在包含“test-queue.rkt”之后)。我现在正在收到标准的测试运行错误。我有一个问题,为什么你拿出“包括......”我试图运行程序测试用例,基于我的教授如何教我的课程,但使用堆栈而不是队列。这就是为什么我有三个文件。你是否删除了包含,因为你想直接从像DrRacket那样的ide运行代码? – Obinna

+0

这里有两个单独的问题:什么时候应该将程序拆分为多个文件,以及您应该使用哪种机制来执行此操作?糟糕...分开的评论来了。 –

+0

在回答第一个问题时:我通常将代码中的测试保存在文件中,直到它增长到几百行;这对我来说比在缓冲区之间来回弹出更容易,而且我可以更好地突出显示和箭头。这是个人喜好的问题。在回答第二个问题时,你一定要使用“require”而不是“include”。 “需求”机制为您提供更好的模块化和更清晰的分离。那么,在这种情况下,你会在你的测试用例模块中“要求”你的队列实现。如果你愿意,我可以用这种方式重写代码。 –