方案输入和输出

时间:2012-03-13 04:29:10

标签: input scheme

所以我的函数有3个存储数据的变量(x,y,z), 我的函数看起来有点像这样,它是递归的。

 (define (scoreboard)
  (define x (read))
  (define y (read))
  (define z (read))  
  (cond    
   [(eof-object? x) empty] ... (scoreboard)

问题也在告诉我: 为Simon游戏实现记分牌。记分板应从标准输入读取一系列命令,并按命令指定生成输出:

score symbol number 
Record number as the score for the player whose name is symbol. No output is produced. Assume number is an integer between -999999999 and 999999999.

best symbol 
Output a line containing best symbol number where number is the best score recorded so far for the player whose name is symbol. 
Output ? instead of number if no score has been recorded for the player.

highscore 
Output a line containing highscore number where number is the highest score recorded for any player so far. Output highscore ? if no score has been recorded.

Sample Input:

score Fred 10
score Wilma 20
score Fred 20
highscore
score Betty 30
highscore
best Fred
score Fred 25
best Fred
best Barney

Output for Sample Input:

highscore 20
highscore 30
best Fred 20
best Fred 25
best Barney ?

跟踪输入我看到x =得分,y = betty,z = 30,而x =高分,y =最好,z = fred .. 我的问题是,是否有可能在我点击后输入x = best和y = fred,而不是它的方式呢?

1 个答案:

答案 0 :(得分:2)

庵。这个问题背后似乎有一些错误的假设。简短回答"否" (虽然我确定一些聪明的阴谋家可以证明我错了),但让我看看我提到的那些假设。

直接读取本地变量

您通常不想这样做。在像您这样的情况下,您需要复杂的输入,您需要将这些问题分成两个功能。一个用于获取和组织输入,一个用于实际生成记分板派生对象。类似的东西:

(define scoreboard (x y z)
  (cond ((eof-object? x) empty) ...)) 
  ; not sure what returning the function 
  ; at the end was supposed to do

(define scoreboard-input ()
  (let ((x (read)))
    (cond ((string=? x "score") (list x (read) (read)))
          ((string=? x "highscore") x)
          ...)))

取决于用于格式化的用户输入

让用户记住你的电路板使用的格式并不是一个好主意。这是一个事实的症状,即你试图让一个功能做得太多(如果我正确理解它,它会尝试接受新的记分板条目并输出一个已排序的板)。少数国家可能是你的朋友;为了整合一个合适的记分牌,我设置了一个跟踪数据的地方,并为用户提供了一些功能,可以简单而一致地操作它(好吧,我是白天的Common Lisper,所以我&# 39; d使用方法,但仍然)。

(define *board* '())

(define (new-entry scoreboard player score)
  (set! scoreboard (cons (player . score) scoreboard))

(define (show-scores scoreboard)
  (let ((highest (car scoreboard))
        (rest (cdr scoreboard)))
    (printf "High Score: ~a at ~a" (car highest) (cdr highest))
    (map (lambda (entry) 
           (printf "Player: ~a ~n    Score: ~a" (car entry) (cdr entry)))
         (sort scoreboard #:key cdr >))))

以这种方式分解,并不需要读取非结构化输入。您可以使用new-entry函数添加新分数,使用show-scores输出当前的董事会状态。你可能想要比我更进一步地分解它,实际上,分离出一个函数来获得一个排序的板,也可能是为了得到顶级名称。


回复您的修改:

是的,即使更改了参数,我的评论仍然适用。

  • 将输入与内部逻辑分开仍然是一个好主意
  • 尽可能少地依赖用户阅读仍然是个好主意
  • 将问题正确地抽象为您的解决方案所构成的功能仍然是个好主意

你肯定希望以某种方式保留scoreboard(最好的存储方法留给读者练习;我使用上面的alist,但你可以使用哈希,或者树,或对象/对象列表,或者一对序列也是如此),并且你想要为它实现三个函数

  • (defun (record-score! scoreboard name score) ...) => nil将得分添加到记分板
  • (defun (best-score-by scoreboard name) ...) => (list name score)"?"
  • (defun (high-score scoreboard) ...) => score

然后编写一个读取器函数,该函数接受用户输入并根据需要返回其中一个操作的格式化输出。你肯定想写一个巨人cond,除非你因为某种原因喜欢头痛。