2015-04-20 49 views
0

所以我現在已經完成了我的全部任務,但有一個問題令我困惑(即使我覺得答案很簡單)。計劃輸出格式

問3.5:

寫一個程序,你的結果轉換爲所需的輸出格式。

的期望是輸出和格式如下:

((0) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 
((0) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 
((1) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0) 
((1) 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0) 
((1) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1) 
((0) 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1) 

其中,所述第一元件是所述進位輸出相加的。如果進位是(1),則表示加法器溢出。列表中的其餘元素是總和。

現在我得到的輸出是這樣的:

(0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 
(0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 
(1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0) 
(1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0) 
(1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1) 
(0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1) 

有誰知道我能正常得到這個格式化?我一直在想,不知道該怎麼做。

編輯 -

這是產生輸出的代碼:

(define binaryadd (lambda(L1 L2) 
    (let ((len1 (length L1)) (len2 (length L2))) 
     (if (> len1 len2) 
      (binaryadd L2 L1) 
      (if (< len1 len2) 
       (binaryadd (append '(0) L1) L2) 
       (recursiveAdd (append '(0) L1) (append '(0) L2) 0) 
)) ) )) 

(define recursiveAdd (lambda(L1 L2 carry) 
    (if (null? L1) 
     '() 
     (let ((t (+ (tail L1) (tail L2) carry))) 
      (append (recursiveAdd (rmtail L1) 
             (rmtail L2) 
             (quotient t 2)) 
         (list (remainder t 2)) 
)) ) ) ) 

(define n-bit-adder (lambda(A B n) 
         (binaryAdd A B) 
        )) 
(define X1 '(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) 
(define X2 '(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)) 
(define X3 '(0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)) 
(define X4 '(1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0)) 
(define X5 '(0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1)) 
(define X6 '(1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1)) 
(n-bit-adder X1 X2 32) 
(n-bit-adder X3 X4 32) 
(n-bit-adder X5 X6 32) 
(n-bit-adder X2 X3 32) 
(n-bit-adder X4 X5 32) 
(n-bit-adder X1 X6 32) 
+0

你在哪裏面臨的煩惱?你只是將列表中的列表轉換爲列表中的每個列表的第一個元素(包含進位),其餘是表示總和的數字列表? – HyperZ

+0

您沒有向我們展示任何代碼,所以我們不知道是否有任何問題。作爲一個快速解決方案,請注意'(list 0 1 1 1)'產生'(0 1 1 1)'和'(list(list 0)1 1 1)'產生'((0)1 1 1)''。 –

+0

另請注意,'(append'(A)B))'相當於'(cons'A B)'。 (我懷疑,如果n-bit-adder的參數是分配的要求,那麼忽略其中的一個參數將被視爲不完美。) – molbdnilo

回答

2

讓我們做一個full adder

#lang racket 

(define (adder-output S Cout) 
    (hash 'S S 
      'Cout Cout)) 

;; bit bit bit -> bit bit 
;; A B Cin -> S Cout 
(define (full-adder inputs) 
    (match (hash-values inputs) 
    ['(0 0 0) (adder-output 0 0)] 
    ['(1 0 0) (adder-output 1 0)] 
    ['(0 1 0) (adder-output 1 0)] 
    ['(0 0 1) (adder-output 1 0)] 
    ['(1 1 0) (adder-output 0 1)] 
    ['(1 0 1) (adder-output 0 1)] 
    ['(0 1 1) (adder-output 0 1)] 
    ['(1 1 1) (adder-output 1 1)] 
    [ _ (error "binary-adder: bad input")])) 

也許寫一些測試吧:

(module+ test 
    (require rackunit 
     rackunit/text-ui) 

    (define bit-values '(0 1)) 

    (define inputs 
    (map 
    (lambda (x) 
     (hash 'A (first x) 
      'B (second x) 
      'Cin (third x))) 
    (for*/list ([A bit-values] 
       [B bit-values] 
       [Cin bit-values]) 
     (list A B Cin)))) 

    (define outputs 
    (map (lambda (x) 
      (hash 'S (first x) 
       'Cout (second x))) 
    '((0 0) 
     (1 0) 
     (1 0) 
     (0 1) 
     (1 0) 
     (0 1) 
     (0 1) 
     (1 1)))) 

    (define (unit-test in out) 
    (check-equal? (full-adder in) 
        out)) 

    (define (test-harness ins outs) 
    (if (or (null? ins) 
      (null? outs)) 
    'test-complete 
    (begin 
     (unit-test (first ins) 
       (first outs)) 
     (test-harness (rest ins) 
        (rest outs))))) 

    (define-test-suite 
    full-adder-tests 
    (test-harness inputs outputs)) 

    (run-tests full-adder-tests)) 

現在所有的作品我們只是將全加器串入一個ripple-carry-adder,其中遞歸內部定義使用蹦牀,並將big-bit-endinian值轉換成little-bit-endian值,所以更容易忽略輸出。

(define (ripple-adder value1 value2) 

    (define v1 (reverse value1)) 
    (define v2 (reverse value2)) 

    (define (add v1 v2 previous-result output) 

    (define carry-bit (hash-ref previous-result 'Cout)) 
    (define out-bit (hash-ref previous-result 'S)) 

    (if (or (null? v1) 
      (null? v2)) 
     (cons (list carry-bit) (cons out-bit output)) 
     (let 
     ([next-add-input 
      (hash 'A (first v1) 
       'B (first v2) 
       'Cin carry-bit)]) 

     (add (rest v1) 
      (rest v2) 
      (full-adder next-add-input) 
      (cons out-bit output))))) 

    (add (rest v1) 
     (rest v2) 
     (full-adder (hash 'A (first v1) 
         'B (first v2) 
         'Cin 0)) 
     null)) 

然後,如果這些測試工作:

(module+ test 
    (define-test-suite 
    ripple-adder-tests 

    (test-equal? 
    "two bit 0 + 0" 
    (ripple-adder '(0 0) '(0 0)) 
    '((0) 0 0)) 

    (test-equal? 
    "three bit 0 + 0" 
    (ripple-adder '(0 0 0) '(0 0 0)) 
    '((0) 0 0 0)) 

    (test-equal? 
    "three bit 1 + 0" 
    (ripple-adder '(0 0 1) '(0 0 0)) 
    '((0) 0 0 1)) 

    (test-equal? 
    "two bit 1 + 1" 
    (ripple-adder '(0 1) '(0 1)) 
    '((0) 1 0)) 

    (test-equal? 
    "two bit 2 + 2" 
    (ripple-adder '(1 0) '(1 0)) 
    '((1) 0 0))) 

    (test-equal? 
    "three bit 2 + 2" 
    (ripple-adder '(0 1 0) '(0 1 0)) 
    '((0) 1 0 0)) 

(run-tests ripple-adder-tests)) 

我們也許可以在風險把這個功課。課程當然是學術誠信的要求。

+0

有趣的測試方法。我有問題的解決方案,但有點怕發佈它。 – cosmoonot

+0

@cosmoonot當時,我想我對Racket的測試設備感興趣並且正在進行學習。 –

+0

記住在我的代碼下面的高峯。我不是專家,但會喜歡你的想法。 – cosmoonot

0

如果你還需要一個完整的加法器以及其餘部分,這將產生你需要的輸出。您需要一種方法來反轉列表。檢查下面代碼中的最後一個程序reverseList

如果使用硬件代碼,請小心。

(define and-gate 
    (lambda (a b) 
    (if (= a b 1) 
     1 
     0))) 

(and-gate 0 0) 
(and-gate 0 1) 
(and-gate 1 0) 
(and-gate 1 1) 

(newline) 

(define (or-gate a b) 
    (if (not (= 0 (+ a b))) 
     1 
     0)) 

(or-gate 0 0) 
(or-gate 0 1) 
(or-gate 1 0) 
(or-gate 1 1) 

(newline) 

(define xor-gate 
    (lambda (a b) 
    (if (= a b) 
     0 
     1))) 

(xor-gate 0 0) 
(xor-gate 0 1) 
(xor-gate 1 0) 
(xor-gate 1 1) 

(newline) 

(define (bitAdder x a b) 
    (cons (sum-bit x a b)  
    (carry-out x a b))) 

(define (sum-bit x a b) 
    (xor-gate x (xor-gate a b))) 

(define (carry-out x a b) 
    (or-gate (and-gate a b) 
      (or-gate (and-gate x a) 
        (and-gate x b)))) 

(bitAdder 0 0 0) 
(bitAdder 0 0 1) 
(bitAdder 0 1 0) 
(bitAdder 0 1 1) 
(bitAdder 1 0 0) 
(bitAdder 1 0 1) 
(bitAdder 1 1 0) 
(bitAdder 1 1 1) 

(newline) 

(define (tail lst) 
    (if (null? (cdr lst)) 
     (car lst) 
     (tail (cdr lst)))) 

(define (rmtail lst) 
    (if (null? (cdr lst))  
     '() 
     (cons (car lst) 
      (rmtail (cdr lst))))) 

(define (recursiveAdd a b c) 
    (if (null? a)  
     (list (list c))  
     (cons (car (bitAdder (tail a) (tail b) c))    
      (recursiveAdd (rmtail a) (rmtail b) (cdr (bitAdder (tail a) (tail b) c)))))) 

(define (n-bit-adder a b n) 
    (reverseList (recursiveAdd a b 0))) 

(define (reverseList lst) 
    (if (null? lst) 
     '() 
     (append (reverseList (cdr lst)) (list (car lst))))) 

;; Test cases 
(define X1 '(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)) 
(define X2 '(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)) 
(define X3 '(0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)) 
(define X4 '(1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0)) 
(define X5 '(0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1)) 
(define X6 '(1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1)) 

(n-bit-adder X1 X2 32) 
(n-bit-adder X3 X4 32) 
(n-bit-adder X5 X6 32) 
(n-bit-adder X2 X3 32) 
(n-bit-adder X4 X5 32) 
(n-bit-adder X1 X6 32) 

輸出:(這應該符合您的預期輸出)

((0) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 
((0) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 
((1) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0) 
((1) 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0) 
((1) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1) 
((0) 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1)