Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 对象不适用于我的方案程序_List_Sorting_Scheme - Fatal编程技术网

List 对象不适用于我的方案程序

List 对象不适用于我的方案程序,list,sorting,scheme,List,Sorting,Scheme,我正在scheme中编写一个程序,该程序允许我管理与学生有关的信息列表。此列表的每个元素都是另一个列表,包含关于学生的3项:ID(数字字符串)、学生姓名(字符字符串)和成绩(整数)。我目前正试图编写一个函数,按ID按升序对我的学生列表进行排序 名为“minimate”的排序列表的我的helper函数应该返回传递给它的列表的最小ID。 当我在条件(=N3)下调用“执行任务”函数中的“最小”时,我尝试在我的最小函数中打印出基本情况下的ID,以查看其是否工作,它显示最小ID,但随后给我一个错误:“对象

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

名为“minimate”的排序列表的我的helper函数应该返回传递给它的列表的最小ID。 当我在条件(=N3)下调用“执行任务”函数中的“最小”时,我尝试在我的最小函数中打印出基本情况下的ID,以查看其是否工作,它显示最小ID,但随后给我一个错误:“对象#!非特定不适用”。我想不出来,继续假设这是因为我将“记录”返回到一个与ID无关的位置

当我调用“remove”helper函数时,这个逻辑被证明是错误的。这应该删除具有最小ID的student元素。我在条件(=n2)下的“执行任务”中进行测试调用,以显示remove应该返回的新花名册,但我得到一个错误:“对象“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)
        )
  )
)

到处都是错误的括号,缩进可以改进。例如,请注意这段代码中的错误:

(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)))))

请注意,在
表达式周围不能有一对
),如果
表达式,在Scheme中,一对
表示“应用函数”,则不能像在其他编程语言中使用一对
{}
那样使用它们(定义代码块)。

“有错误的括号”至少在这里尝试了压痕;p@leppie看起来我把所有错误的括号都去掉了吗?@SasheemSnell:不知道你在问什么,但基本规则是永远不要用开括号结束一行,也不要用右括号开始一行。这不是问题的原因,但你应该打开一个REPL并将
(list(cdr'(1 2 3))
(cdr'(1 2 3))
,和
(1 2 3))
(1 2 3)
。这是“读取-评估打印循环”-您的交互式“提示”。(不,它们不是。)@molbdnilo哦,我知道了,我用了一个。我想这可能是以下问题的原因。当我打电话到(显示(移除花名册)(最小花名册(car(car花名册))))),我得到一个错误,表示“;作为参数传递给string->number的对象(“4”“lini”“94”)不是字符串。”进行此调用时的当前列表是:((5 me 95)(4 lini 94)(3 rudy 93)(2 mark 92)(1 silas 91)).我使用字符串->数字函数进行>比较,所以我认为它在这里也可以工作,但我也没有得到我想要的列表中的正确元素compare@molbdnilo我想我可能看到了我的问题。当我递归调用remove时,我传入(list(cdr花名册)(car花名册))作为第一个要删除的参数。我认为(cons(cdr花名册)(汽车花名册))会是合适的电话吗?