2012-10-02 69 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」。 「需求」機制爲您提供更好的模塊化和更清晰的分離。那麼,在這種情況下,你會在你的測試用例模塊中「要求」你的隊列實現。如果你願意,我可以用這種方式重寫代碼。 –