2015-04-26 30 views
1

我正在做一個方案項目,並在編碼方面存在一些問題。 對於我的項目,我們必須保留班級名單(作爲列表實施)並能夠執行不同的操作。我有兩個問題:方案編程I/O並刪除

  1. 我寫名冊功能打開通過的文件名,但不寫列表文件和林不知道爲什麼?你可以在執行任務函數中找到這個函數,當n = 2時。

  2. 和我的刪除函數...當我去測試它時,我得到錯誤: ;程序#[編譯過程13 (「list」#x3)#x14#x11a2714]已經被4個參數調用;它只需要2個參數。 我remove函數被調用removestu

這裏是我的代碼:

(define performtask 
    (lambda (n roster) 
    (cond ((= n 0) (begin 
        (display "\n\tResetting roster...\n\n") 
        (menu '()) 
       )) 
     ((= n 1) (begin 
        (display "\n\tLoad roster from file: ") 
        (read (open-input-file (read-line))) 
        (menu roster) 
        )) 
     ((= n 2) (begin 
        (display "\n\tStore roster to file: ") 
        (write roster (open-output-file (read-line))) 
        (menu roster) 
        )) 
     ((= n 3) (begin 
        (display "\n\tDisplaying roster, sorted by ID:\n") 
        (printroster (select-sort roster)) 
        (menu roster) 
       )) 
     ((= n 4) (begin 
        (display "\n\tDisplaying roster, sorted by ID:\n") 
        (printroster (select-sort-name roster)) 
        (menu roster) 
       )) 
     ((= n 5) (begin 
        (display "\n\tDisplaying roster, sorted by ID:\n") 
        (printroster (select-sort-grade roster)) 
        (menu roster) 
       )) 
     ((= n 6) (begin 
        (display "\n\tEnter student name or ID: ") 
        (studentinfo roster (read-line)) 
        (menu roster) 
       )) 
     ((= n 7) (begin 
        (display "\n\tAdd a student to the class roster:\n\n") 
        (cond ((null? roster) (menu (read-3-items 0 '()))) 
        (else (menu (list (read-3-items 0 '()) roster)))) 
       )) 
     ((= n 8) (begin 
        (display "\n\tEnter student name or ID: ") 
        (removestu roster (read-line)) 
        (menu roster) 
       )) 


     ((= n 9) (begin 
        (display "\n\tExiting program...\n\n") 
         #t 
       )) 
     (else (begin 
        (display "\n\tTask no. ") 
        (display n) 
        (display " does not exist.\n\n") 
        (menu roster) 
       ) 
      ) 
    ) 
    ) 
) 

(define studentinfo 
    (lambda (lst value) 
     (cond ((null? lst) (display "\n\tStudent is not found in roster.\n")) 
       ((equal? (car (car lst)) value) (printrecord (car lst))) 
        ((equal? (car (cdr (car lst))) value) (printrecord (car lst))) 
         (else (studentinfo (cdr lst) value)) 
    ) 
    ) 
) 


(define printroster 
    (lambda (billy) 
     (cond ((null? billy) (newline)) 
       (else (begin 
          (printrecord (car billy)) 
            (printroster (cdr billy)) 
            ) 
         ) 
    ) 
    ) 
) 

(define printrecord 
    (lambda (lst) 
     (begin 
     (display "\tID=") 
     (display (car lst)) 
     (display ", Name=") 
     (display (car (cdr lst))) 
     (display ", Grade=") 
     (display (car (cdr (cdr lst)))) 
     (newline) 
    ) 
    ) 
) 

(define select-sort 
    (lambda (roster) 
     (cond ((null? roster) '()) 
      (else (cons (smallest roster (car roster)) (select-sort (remove roster (smallest roster (car roster)))))) 
    ) 
    ) 
) 

(define select-sort-name 
    (lambda (roster) 
     (cond ((null? roster) '()) 
      (else (cons (smallest-name roster (car roster)) (select-sort (remove roster (smallest-name roster (car ro\ 
ster)))))) 
    ) 
    ) 
) 

(define select-sort-grade 
    (lambda (roster) 
     (cond ((null? roster) '()) 
       (else (cons (smallest-grade roster (car roster)) (select-sort (remove roster (smallest-grade roster (\ 
car roster)))))) 
    ) 
    ) 
) 

(define smallest 
    (lambda (roster record) 
     (cond ((null? roster) record) 
       ((< (car (car roster)) (car record)) (smallest (cdr roster) (car roster))) 
        (else (smallest (cdr roster) record)) 
    ) 
    ) 
) 

(define smallest-name 
    (lambda (roster record) 
     (cond ((null? roster) record) 
      ((< (car (cdr (car roster))) (car (cdr record))) (smallest-name (cdr roster) (car roster))) 
      (else (smallest-name (cdr roster) record)) 
    ) 
    ) 
) 

(define smallest-grade 
    (lambda (roster record) 
     (cond ((null? roster) record) 
      ((< (cdr (cdr (car roster))) (cdr (cdr record))) (smallest-grade (cdr roster) (car roster))) 
      (else (smallest-grade (cdr roster) record)) 
    ) 
    ) 
) 

(define removestu 
    (lambda (roster item) 
     (cond ((null? roster) '()) 
      ((equal? item (car roster)) (cdr roster)) 
      (else (cons (car roster) removestu (cdr roster) item)) 
    ) 
    ) 
) 

(define read-3-items 
    (lambda (n l) 
     (cond ((= n 0) (begin 
         (display "\tStudent ID: ") 
         (read-3-items 1 (list (read))) 
          )) 
       ((= n 1) (begin 
          (display "\n\tStudent name: ") 
          (read-3-items 2 (list (car l) (read-line))) 
             )) 
((= n 2) (begin 
           (display "\n\tGrade: ") 
           (list (car l) (car (cdr l)) (read)) 
            )) 
    ) 
    ) 
) 


(define menu 
    (lambda (roster) 
     (begin 
     (display "\n\tClass roster management system\n") 
      (display "\t============================\n") 
      (display "\t MENU\n") 
      (display "\t============================\n") 
      (display "\t0. Reset roster\n") 
       (display "\t1. Load roster from file\n") 
       (display "\t2. Store roster to file\n") 
       (display "\t3. Display roster sorted by ID\n") 
       (display "\t4. Display roster sorted by name\n") 
        (display "\t5. Display roster sorted by grade\n") 
        (display "\t6. Display student info\n") 
        (display "\t7. Add a student to roster\n") 
(display "\t8. Remove a student from roster\n") 
         (display "\t9. Exit\n\n") 
         (display "\tEnter your choice: ") 
         (performtask (read) roster) 
    ) 
    ) 
    ) 

回答

1
  1. (write roster (open-output-file (read-line)))似乎確定。但是你不關閉你從open-output-file得到的端口。也許你應該使用with-output-to-file

  2. cons用4個參數(cons (car roster) removestu (cdr roster) item)調用。只需要兩個來做一對!

我注意到在閱讀文件時,你不用它。尾部呼叫是(menu roster),並且(read (open-input-file (read-line)))的結果被讀取並返回,並且由於未使用而被刪除。