#include <iostream>
#include <vector>
#include <unordered_map>
#include <iomanip>
#include <string>
const long long VOL_PER_DONOR = 450; // volume darah per donor dalam ml
// Struktur data penyimpan data donor: desa dan golongan darah
struct DataDonor {
int ID_Desa;
char GolonganDarah;
};
// Struktur hasil per golongan darah: jumlah pendonor dan volume total
struct HasilGolongan {
int Pendonor = 0;
long long Volume_ml = 0;
};
// Tipe data hasil detail per golongan darah (map golongan darah ke hasil)
using HasilDetail = std::unordered_map<char, HasilGolongan>;
// Tipe data sistem data donor darah sosial per desa
using SistemDataDDS = std::unordered_map<int, std::vector<DataDonor>>;
// Fungsi hitung dan tampilkan hasil untuk satu desa
void HitungDanTampilkanDDS(int ID_Desa, const SistemDataDDS& DataDDS) {
auto it = DataDDS.find(ID_Desa);
if (it == DataDDS.end()) {
std::cout << "Desa ID " << ID_Desa << " tidak ditemukan." << std::endl;
return;
}
HasilDetail hasil;
// Hitung jumlah pendonor per gol darah
for (const auto& donor : it->second) {
char gol = std::toupper(donor.GolonganDarah);
hasil[gol].Pendonor++;
}
// Tampilkan hasil
std::cout << "\n--- HASIL DESA ID: " << ID_Desa << " ---" << std::endl;
std::cout << std::left << std::setw(10) << "GOL"
<< std::setw(12) << "JUMLAH"
<< "VOLUME (ml)" << std::endl;
std::cout << "--------------------------------" << std::endl;
for (const auto& pair : hasil) {
long long volume = pair.second.Pendonor * VOL_PER_DONOR;
std::string gol_str = (pair.first == 'X') ? "AB" : std::string(1, pair.first);
std::cout << std::left << std::setw(10) << gol_str
<< std::setw(12) << pair.second.Pendonor
<< volume << std::endl;
}
std::cout << "--------------------------------" << std::endl;
}
// Program utama demonstrasi penggunaan
int main() {
SistemDataDDS data_sistem;
// Contoh data desa 101 dan 202
data_sistem[101] = {{101, 'A'}, {101, 'B'}, {101, 'A'}, {101, 'O'}, {101, 'X'}}; // X = AB
data_sistem[202] = {{202, 'O'}, {202, 'O'}, {202, 'B'}, {202, 'X'}};
// Tampilkan hasil per desa
HitungDanTampilkanDDS(101, data_sistem);
HitungDanTampilkanDDS(202, data_sistem);
return 0;
}