#!在方案中打印值时出现非特定错误

问题描述 投票:1回答:1

我一直得到输出为:

Exam Avg: 50.#!unspecific

[每当我尝试按计划打印程序时。我正在使用两个函数print和secprint,我认为可能正在发生错误:

(define (print cnt List)
    (if (= cnt 1) (printEmp (car List))
        (secprint cnt List )))

(define (secprint cnt List)
    (printEmp (car List))
    (newline)
    (print (- cnt 1) (cdr List)))

(define (printEmp person )
    (define empl (split person))
          (cond ((string=? "pf" (car empl))  
            (display (car (cdr empl))) (display " ") (display (car (cdr (cdr empl))))
            (newline)
            (display "Exam Avg: ") (display (avg person))
            (newline)))

    (cond ((string=? "std" (car empl))  
            (display (car (cdr empl))) (display " ") (display (car (cdr (cdr empl))))
            (newline)
            (display "Exam Avg: ") (display (avg2 person))
            (newline))))

有人可以帮忙吗?我是该计划的新手,似乎无法弄清楚我要去哪里。

编辑:其他可能有用的代码。

(define (start str );(filename)
        (define read (filelines str))
        (define cnt (listlen read))
        (print cnt read)
)

(define (avg List)
  (cond ((string=? "std" (car (split List)))
  (display (/ (examTotals List) 3.0)))
  (else 0))
)

(define (examTotals str)
        (cond ((string=? "std" (car (split str)))
            (+( + (exam1 str) (exam2 str)) (exam3 str)))
           (else 0))
)

(define (exam1 str)
    (string->number (car (cdr (cdr (cdr (split str))))))
)

(define (exam2 str)
    (string->number (car (cdr (cdr (cdr (cdr (split str)))))))
)

(define (exam3 str)
    (string->number (car (cdr (cdr (cdr (cdr (cdr (split str))))))))
)

我正在读取的输入文件的格式如下:

pf Jeremy Greer 80 50 65
std Maria Garcia 70 90 20
std Floyd Jenkins 100 100 90
pf Carlton West 70 70 10

scheme lisp racket mit-scheme
1个回答
0
投票

display过程写入输出,然后返回未指定的值。您将display用于打印数据的副作用,而不是其返回值。

(define (avg List)
  (cond ((string=? "std" (car (split List)))
         (display (/ (examTotals List) 3.0)))
        (else 0)))

avg过程返回最后计算的表达式的值;当display分支求值时,未指定的值将返回给调用方。但是,调用方printEmp不需要avg来显示其结果,它仅需要一个返回值,然后该值将由printEmp过程打印出来。]

通过从display过程中删除avg来解决:

(define (avg List)
  (cond ((string=? "std" (car (split List)))
         (/ (examTotals List) 3.0))
        (else 0)))
© www.soinside.com 2019 - 2024. All rights reserved.