Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الطالب المتفوق

جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 26 من 64.

challenge icon

التحدي

متوسط

أضف الأمر TOP. حافظ على عمل كل أمر من الخطوات السابقة تمامًا كما كان من قبل.

  • TOP: أرجِع Top: متبوعًا بالطالب ذي المتوسط الأعلى، وذلك المتوسط بمنزلة عشرية واحدة بين قوسين، مثل Top: ada (92.0). يتم تخطي الطلاب الذين لا يملكون درجات. عند تعادل المتوسطات، اختر الطالب الذي يأتي اسمه أولًا أبجديًا. عندما لا يملك أي طالب درجات، أرجِع Top: none.

يمرّر الكود المزوَّد كل سطر إدخال إلى gradebook() باعتباره أمرًا واحدًا، ويطبع كل رد مُعاد في سطر مستقل. الاسم عبارة عن كلمة واحدة بأحرف إنجليزية صغيرة، ويحتوي الإدخال فقط على الأوامر الموضحة حتى الآن.

جرّب بنفسك

average_text <- function(scores) {
  if (length(scores) == 0) "no grades" else sprintf("%.1f", mean(scores))
}

gradebook <- function(commands) {
  grades <- list()
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    name <- parts[2]
    if (parts[1] == "ADD") {
      if (name %in% names(grades)) {
        replies <- c(replies, paste(name, "already exists"))
      } else {
        grades[[name]] <- numeric(0)
        replies <- c(replies, paste("added", name))
      }
    } else if (parts[1] == "GRADE") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        score <- as.numeric(parts[3])
        grades[[name]] <- c(grades[[name]], score)
        replies <- c(replies, paste("recorded", score, "for", name))
      }
    } else if (parts[1] == "AVG") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        replies <- c(replies, paste0(name, ": ", average_text(grades[[name]])))
      }
    } else if (parts[1] == "REPORT") {
      for (student in sort(names(grades))) {
        replies <- c(replies, paste0(student, ": ", average_text(grades[[student]])))
      }
      replies <- c(replies, paste("Class average:", average_text(unlist(grades))))
    }
  }
  replies
}

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم R عبر الإنترنت