Схема ввода и вывода - PullRequest
       18

Схема ввода и вывода

0 голосов
/ 13 марта 2012

Итак, моя функция имеет 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 = бетти, z = 30, чем x = рекорд и y = лучший результат, z = Фред .. У меня вопрос, возможно ли сделать так, чтобы после того, как я нажал, введите x = best и y = fred, вместо того, как он это делает?

1 Ответ

2 голосов
/ 13 марта 2012

Um. Кажется, за этим вопросом стоит пара ошибочных предположений. Короткий ответ «Нет» (хотя я уверен, что какой-то достаточно умный интриган может доказать, что я не прав), но позвольте мне взглянуть на те предположения, которые я упомянул.

Чтение непосредственно в локальные переменные

Как правило, вы не хотите этого делать. В такой ситуации, как ваша, когда вам нужен сложный ввод, вы хотите разделить эти проблемы на две функции. Один для получения и организации ввода, а другой - для создания объекта, полученного на табло. Что-то вроде:

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

В зависимости от пользовательского ввода для форматирования

Предоставление пользователю информации о том, какой формат использует ваша доска, не кажется хорошей идеей. Это признак того факта, что вы пытаетесь заставить одну функцию выполнять слишком много (если я правильно понимаю, она пытается принять новые записи на табло и вывести отсортированную доску). Небольшое количество государства может быть вашим другом здесь; для того, чтобы составить правильное табло, я бы назначил место для отслеживания данных и предоставлял пользователю некоторые функции для простого и последовательного манипулирования ими (хорошо, я обыкновенный Лиспер по дням, поэтому я бы использовал методы , но все же).

(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, если только по какой-то причине вам не нравятся головные боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...