Kasus 2 tingkat sedang

Deskripsi masalah:

Dalam pelaksanaan perkuliahan mata kuliah Algoritma dan Pemrograman, dosen melakukan penilaian mahasiswa berdasarkan ketentuan yang tercantum dalam Rencana Pembelajaran Semester (RPS). Penilaian terdiri dari tiga komponen utama, yaitu Case Method, Ujian Tengah Semester (UTS), dan Ujian Akhir Semester (UAS), dengan bobot masing-masing sebesar 50%, 25%, dan 25%. Seluruh nilai mahasiswa dimasukkan ke dalam sistem dalam bentuk vektor untuk dihitung secara otomatis, kemudian nilai akhir yang diperoleh digunakan untuk menentukan kategori nilai huruf A, B, C, D, atau E sesuai dengan rentang nilai yang telah ditetapkan. Kategori nilai: A jika nilai akhir ≥ 85 B jika nilai akhir ≥ 71 C jika nilai akhir ≥ 61 D jika nilai akhir ≥ 51 E jika nilai akhir < 51

#Fungsi dalam R
nilai_mahasiswa <- function(nama, case_method, uts, uas){
  n <- length(nama)
  
  nilai_akhir <- numeric(n)
  kategori_nilai <- character(n)
  
  for(i in 1:n){
    nilai_akhir[i] <- 0.5*case_method[i] + 0.25*uts[i] + 0.25*uas[i]
    
    if(nilai_akhir[i] >= 85){
      kategori_nilai[i] <- "A"
    } else if(nilai_akhir[i] >= 71){
      kategori_nilai[i] <- "B"
    } else if(nilai_akhir[i] >= 61){
      kategori_nilai[i] <- "C"
    } else if(nilai_akhir[i] >= 51){
      kategori_nilai[i] <- "D"
    } else {
      kategori_nilai[i] <- "E"
    }
  }
  
  return(data.frame(
    Nama = nama,
    Kategori_Nilai = kategori_nilai,
    Nilai_akhir = nilai_akhir
  ))
}
#Contoh Pemanggilan Fungsi
nilai_mahasiswa(
  nama = c("Fadhil", "Mutiara", "Nadhif"),
  case_method = c(80, 70, 60),
  uts = c(75, 65, 55),
  uas = c(85, 70, 50)
)
##      Nama Kategori_Nilai Nilai_akhir
## 1  Fadhil              B       80.00
## 2 Mutiara              C       68.75
## 3  Nadhif              D       56.25
# a. Membuat dataframe
set.seed(123)

data_mahasiswa <- data.frame(
  Nama = c("Andreas", "Rony", "Wijaya", "Ronaldo", "Messi",
           "Neymar", "Mbappe", "Halland", "Diallo", "Hisyam Fadhil"),
  NIM = c("M0124001", "M0124002", "M0124003", "M0124004", "M0124005",
          "M0124006", "M0124007", "M0124008", "M0124009", "M0725095"), 
  Nilai_UTS = c(85, 60, 90, 55, 75, 72, 70, 80, 65, 90),
  Nilai_Tugas = c(78, 70, 95, 60, 82, 80, 60, 90, 55, 95),
  Nilai_UAS = sample(60:90, 10, replace = TRUE)
)

data_mahasiswa
##             Nama      NIM Nilai_UTS Nilai_Tugas Nilai_UAS
## 1        Andreas M0124001        85          78        90
## 2           Rony M0124002        60          70        74
## 3         Wijaya M0124003        90          95        78
## 4        Ronaldo M0124004        55          60        73
## 5          Messi M0124005        75          82        62
## 6         Neymar M0124006        72          80        69
## 7         Mbappe M0124007        70          60        77
## 8        Halland M0124008        80          90        81
## 9         Diallo M0124009        65          55        70
## 10 Hisyam Fadhil M0725095        90          95        64
# b. Menghitung nilai akhir
data_mahasiswa$Nilai_Akhir <-
  0.30 * data_mahasiswa$Nilai_UTS +
  0.30 * data_mahasiswa$Nilai_Tugas +
  0.40 * data_mahasiswa$Nilai_UAS

data_mahasiswa
##             Nama      NIM Nilai_UTS Nilai_Tugas Nilai_UAS Nilai_Akhir
## 1        Andreas M0124001        85          78        90        84.9
## 2           Rony M0124002        60          70        74        68.6
## 3         Wijaya M0124003        90          95        78        86.7
## 4        Ronaldo M0124004        55          60        73        63.7
## 5          Messi M0124005        75          82        62        71.9
## 6         Neymar M0124006        72          80        69        73.2
## 7         Mbappe M0124007        70          60        77        69.8
## 8        Halland M0124008        80          90        81        83.4
## 9         Diallo M0124009        65          55        70        64.0
## 10 Hisyam Fadhil M0725095        90          95        64        81.1
# c. Fungsi konversi nilai ke huruf
konversi_nilai <- function(nilai) {
  if (nilai >= 85) {
    c(4.00, "A")
  } else if (nilai >= 80) {
    c(3.70, "A-")
  } else if (nilai >= 75) {
    c(3.30, "B+")
  } else if (nilai >= 70) {
    c(3.00, "B")
  } else if (nilai >= 65) {
    c(2.70, "C+")
  } else if (nilai >= 60) {
    c(2.00, "C")
  } else if (nilai >= 55) {
    c(1.00, "D")
  } else {
    c(0.00, "E")
  }
}


# d. Output
data_mahasiswa$Angka <- NA
data_mahasiswa$Huruf <- NA

# Konversi nilai akhir
for (i in 1:nrow(data_mahasiswa)) {
  hasil <- konversi_nilai(data_mahasiswa$Nilai_Akhir[i])
  data_mahasiswa$Angka[i] <- as.numeric(hasil[1])
  data_mahasiswa$Huruf[i] <- hasil[2]
}

# Dataframe lengkap
df_output <- data.frame(
  Nama = data_mahasiswa$Nama,
  NIM = data_mahasiswa$NIM,
  Nilai_UTS = data_mahasiswa$Nilai_UTS,
  Nilai_Tugas = data_mahasiswa$Nilai_Tugas,
  Nilai_UAS = data_mahasiswa$Nilai_UAS,
  Nilai_Akhir = data_mahasiswa$Nilai_Akhir,
  Konversi_Huruf = data_mahasiswa$Huruf
)

jumlah_nilai <- table(df_output$Konversi_Huruf)
jumlah_lulus <- sum(df_output$Konversi_Huruf %in% c("A","A-","B+","B","C+","C"))
jumlah_tidak_lulus <- sum(df_output$Konversi_Huruf %in% c("D","E"))

# Output 
output_akhir <- list(
  Dataframe_Nilai = df_output,
  Jumlah_Nilai_Huruf = jumlah_nilai,
  Jumlah_Lulus = jumlah_lulus,
  Jumlah_Tidak_Lulus = jumlah_tidak_lulus
)
output_akhir
## $Dataframe_Nilai
##             Nama      NIM Nilai_UTS Nilai_Tugas Nilai_UAS Nilai_Akhir
## 1        Andreas M0124001        85          78        90        84.9
## 2           Rony M0124002        60          70        74        68.6
## 3         Wijaya M0124003        90          95        78        86.7
## 4        Ronaldo M0124004        55          60        73        63.7
## 5          Messi M0124005        75          82        62        71.9
## 6         Neymar M0124006        72          80        69        73.2
## 7         Mbappe M0124007        70          60        77        69.8
## 8        Halland M0124008        80          90        81        83.4
## 9         Diallo M0124009        65          55        70        64.0
## 10 Hisyam Fadhil M0725095        90          95        64        81.1
##    Konversi_Huruf
## 1              A-
## 2              C+
## 3               A
## 4               C
## 5               B
## 6               B
## 7              C+
## 8              A-
## 9               C
## 10             A-
## 
## $Jumlah_Nilai_Huruf
## 
##  A A-  B  C C+ 
##  1  3  2  2  2 
## 
## $Jumlah_Lulus
## [1] 10
## 
## $Jumlah_Tidak_Lulus
## [1] 0
# e. Menampilkan baris ke-10
print(df_output[10, ])
##             Nama      NIM Nilai_UTS Nilai_Tugas Nilai_UAS Nilai_Akhir
## 10 Hisyam Fadhil M0725095        90          95        64        81.1
##    Konversi_Huruf
## 10             A-