fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <iomanip>
  5. #include <string>
  6.  
  7. const long long VOL_PER_DONOR = 450;
  8.  
  9. // Struktur Data Esensial
  10. struct DataDonor { int ID_Desa; char GolonganDarah; };
  11. struct HasilGolongan { int Pendonor = 0; long long Volume_ml = 0; };
  12. using HasilDetail = std::unordered_map<char, HasilGolongan>;
  13. using SistemDataDDS = std::unordered_map<int, std::vector<DataDonor>>;
  14.  
  15. // --- FUNGSI INTI SUBPROGRAM ---
  16. void HitungDanTampilkanDDS(int ID_Desa, const SistemDataDDS& DataDDS) {
  17. auto it = DataDDS.find(ID_Desa);
  18. if (it == DataDDS.end()) { std::cout << "Desa ID " << ID_Desa << " tidak ditemukan." << std::endl; return; }
  19.  
  20. HasilDetail hasil;
  21.  
  22. // 1. Iterasi & Kelompokkan (O(D) - Cepat)
  23. for (const auto& donor : it->second) {
  24. char gol = std::toupper(donor.GolonganDarah);
  25. hasil[gol].Pendonor++;
  26. }
  27.  
  28. // 2. Tampilkan Output
  29. std::cout << "\n--- HASIL DESA ID: " << ID_Desa << " ---" << std::endl;
  30. std::cout << std::left << std::setw(10) << "GOL"
  31. << std::setw(12) << "JUMLAH"
  32. << "VOLUME (ml)" << std::endl;
  33. std::cout << "--------------------------------" << std::endl;
  34.  
  35. for (const auto& pair : hasil) {
  36. // Hitung Volume
  37. long long volume = pair.second.Pendonor * VOL_PER_DONOR;
  38.  
  39. // Format Tampilan ('X' -> 'AB')
  40. std::string gol_str = (pair.first == 'X') ? "AB" : std::string(1, pair.first);
  41.  
  42. std::cout << std::left << std::setw(10) << gol_str
  43. << std::setw(12) << pair.second.Pendonor
  44. << volume << std::endl;
  45. }
  46. std::cout << "--------------------------------" << std::endl;
  47. }
  48.  
  49. // --- MAIN DEMONSTRASI ---
  50. int main() {
  51. SistemDataDDS data_sistem;
  52.  
  53. // Simulasi Input Data: Desa 101 dan 202
  54. data_sistem[101] = {{101, 'A'}, {101, 'B'}, {101, 'A'}, {101, 'O'}, {101, 'X'}}; // X=AB
  55. data_sistem[202] = {{202, 'O'}, {202, 'O'}, {202, 'B'}, {202, 'X'}};
  56.  
  57. // Panggil Subprogram
  58. HitungDanTampilkanDDS(101, data_sistem);
  59. HitungDanTampilkanDDS(202, data_sistem);
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
--- HASIL DESA ID: 101 ---
GOL       JUMLAH      VOLUME (ml)
--------------------------------
AB        1           450
O         1           450
A         2           900
B         1           450
--------------------------------

--- HASIL DESA ID: 202 ---
GOL       JUMLAH      VOLUME (ml)
--------------------------------
AB        1           450
O         2           900
B         1           450
--------------------------------