对象不适用于我的计划程序

时间:2015-04-17 20:17:49

标签: list sorting scheme

我正在编写一个程序中的程序,这将允许我管理与学生有关的信息列表。该列表的每个元素是另一个列表,其中包含有关学生的3个项目:ID(数字串),学生姓名(字符串)和成绩(整数)。我目前正在尝试编写一个函数来按ID按升序对学生列表进行排序。

我的名为'smallest'的排序列表的辅助函数应该返回传递给它的列表的最小ID。 当我在条件(= n 3)中的'执行任务'功能中调用'最小'时,我尝试在我的最小函数中打印出我的基本情况下的ID以查看它是否正常工作,并显示最小的ID但后来给我一个错误说“;对象#!unspecific不适用”。我无法理解并继续假设这是因为我正在将“记录”返回到一个不对ID做任何事情的地方。

当我调用我的'remove'辅助函数时,这个逻辑被证明是错误的。这应该删除ID最小的student元素。我在条件(= n 2)下的'执行任务'中进行测试调用,以显示删除应该返回的新名单,但我得到一个错误说“;对象”1“不适用”。 '1'表示我测试它的列表中的最小ID,所以这让我相信我的'最小'功能正在工作但也给我一个错误...如果有人能指出我正确的方向来解决这个问题我将不胜感激!

我是计划的新手,对于这个项目,我的教授指出我们不允许使用任何一套!函数,do循环或任何内置排序函数。

(define smallest
  (lambda (roster record)
          (if (null? roster)
              (begin (display record) record)
              (if (> (string->number record) (string->number (car (car roster))))
                  (smallest (cdr roster) (car(car roster)))
                  (smallest (cdr roster) record)))
         ))

(define remove
  (lambda (roster record)
     (if (equal? (string->number record) (string->number (car(car roster))))   
          (cdr roster)
          (remove (list (cdr roster) (car roster)) record) 
    )))

(define performtask
  (lambda (n roster)
        (cond ((= n 0) (begin
                        (display "\n\tOption 0.")
                        (display "\nReset Roster")
                        (menu '())
                        ))
              ((= n 1) (begin
                        (display "\n\tOption 1.")
                        (display "\nLoad Roster From File")
                        (menu roster)
                        ))
              ((= n 2) (begin                                   
                        (display "\n\tOption 2.")
                        (display "\nStore Roster To File")
                        (display (list (remove roster (smallest roster (car(car roster))))))
                        (menu roster)
                        ))
              ((= n 3) (begin                                   
                        (display "\n\tOption 3.")
                        (display "\nDisplay Roster by ID")
                        (display "\nsmallest record is: ")
                        (smallest roster (car (car roster)))
                        (menu roster)
                        ))
              ((= n 4) (begin                                   
                        (display "\n\tOption 4.")
                        (display "\nDisplay Student Info")
                        (menu roster)
                        ))
              ((= n 5) (begin                                   
                        (display "\n\tOption 5.\n")
                        (display roster)
                        (newline)
                        (menu (cons (ano-read-3-items 0 '()) roster))
                        ))
              ((= n 6) (begin                                   
                        (display "\n\tOption 6.")
                        (display "\nRemove a student from Roster")
                        (menu roster)
                        ))
              ((= n 7) (begin(display "\n\tOption 7. Exit\n")
                        #t
                        ))
              (else (begin
                        (display "\n\tTask No. ")
                        (display n)
                        (display " does not exit.\n\n")
                        (menu roster)
                    )
              )
        )
  )
)

(define menu
  (lambda (roster)
        (begin
           (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 student information\n")
           (display "\t5. Add a student to roster\n")
           (display "\t6. Remove a student from roster\n")
           (display "\t7. Exit\n")
           (display "\tEnter your choice: ")
           (performtask (read) roster)
        )
  )
)

1 个答案:

答案 0 :(得分:2)

整个地方都有错误的括号,并且可以改进缩进。例如,请注意此代码段中的错误:

(define smallest
  (lambda (roster record)
    ( ; this is wrong!
     (if (null? roster)
         (begin(display record) (record)) ; this is wrong, too
         (if (> (string->number record) (string->number (car (car roster))))
             (smallest (cdr roster) (let ((record (car(car roster)))) record))
             (smallest (cdr roster) record)))
     )))

应该是:

(define smallest
  (lambda (roster record)
    (if (null? roster)
         (begin
           (display record)
           record)
         (if (> (string->number record) (string->number (car (car roster))))
             (smallest (cdr roster) 
                       ; `let` is not really needed here
                       (let ((record (car (car roster))))
                         record))
             (smallest (cdr roster) record)))))

请注意,()表达式周围不能有if对,在Scheme中,一对()表示"应用函数",它们是,因为您在其他编程语言中使用一对{}(用于定义代码块)。