#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include <stdlib.h>
#include <time.h>
using namespace std;
const char* OgrenciIsimleri[] = {"BİRSEN","SERDAR","BÜNYAMİN","ÖZGÜR","FERDİ","REYHAN","İLHAN","GÜLŞAH","NALAN","SEMİH","ERGÜN","FATİH","ŞENAY","SERKAN","EMRE"};
const char* EtkinlikIsimleri[] = {"Satranç","Yüzme","Kamp Yapma","Gezi","Teknoloji"};
const int OgrenciSayisi = 15;
const int EtkinlikSayisi = 5;
struct Ogrenci
{
std::string m_Isim;
std::vector<int> m_Etkinlikler;
};
struct Etkinlik
{
std::string m_Isim;
int m_MinKisi;
int m_MaxKisi;
Etkinlik()
{
m_MinKisi = 0;
m_MaxKisi = 0;
}
std::map<int,Ogrenci*> m_Uyeler;
};
std::vector<Ogrenci*> v_Ogrenciler;
std::vector<Etkinlik*> v_Etkinlikler;
void Hazirla()
{
//Öğrenci listesini hazırla
for (int i = 0; i<OgrenciSayisi;i++)
{
Ogrenci * p = new Ogrenci;
p->m_Isim.assign(OgrenciIsimleri[i]);
v_Ogrenciler.push_back(p);
}
//Etkinlikleri hazırla
for (int j = 0; j<EtkinlikSayisi;j++)
{
Etkinlik * p = new Etkinlik;
p->m_Isim.assign(EtkinlikIsimleri[j]);
v_Etkinlikler.push_back(p);
}
}
void Temizle()
{
for(size_t i = 0; i<v_Ogrenciler.size(); ++i)
{
Ogrenci *pItem = v_Ogrenciler.at(i);
if (pItem)
{
delete pItem;
pItem = NULL;
}
}
for(size_t i = 0; i<v_Etkinlikler.size(); ++i)
{
Etkinlik *pItem = v_Etkinlikler.at(i);
if (pItem)
{
delete pItem;
pItem = NULL;
}
}
v_Ogrenciler.clear();
v_Etkinlikler.clear();
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "Turkish");
Hazirla();
int Islemler = 0;
while (Islemler < EtkinlikSayisi)
{
Etkinlik *pItem = v_Etkinlikler.at(Islemler);
if(pItem)
{
int MinKisi;
int MaxKisi;
std::cout << pItem->m_Isim.c_str() << " Etkinliği için minimum kişi sayısı giriniz ,İzin verilen aralık 1 ve " << OgrenciSayisi << std::endl;
std::cin >> MinKisi;
if(MinKisi < 1 || MinKisi > OgrenciSayisi)
{
std::cerr << "Hatalı bir rakam girdiniz!" << std::endl ;
continue;
}
else
{
pItem->m_MinKisi = MinKisi;
}
std::cout << pItem->m_Isim.c_str() << " Etkinliği için maximum kişi sayısı giriniz ,İzin verilen aralık 1 ve " << OgrenciSayisi << std::endl;
std::cin >> MaxKisi;
if(MaxKisi < MinKisi)
{
std::cerr << "Maximum kişi sayısı minimum kişi sayısından az olamaz!" << std::endl ;
continue;
}
else if(MaxKisi < 1 || MaxKisi > OgrenciSayisi)
{
std::cerr << "Hatalı bir rakam girdiniz!" << std::endl ;
continue;
}
else
{
pItem->m_MaxKisi = MaxKisi;
}
if(pItem->m_MaxKisi != 0 && pItem->m_MaxKisi != 0)
{
Islemler++;
}
}
}
//Oğrecileri Etkinliklere ata
std::srand (static_cast<unsigned int>(time(NULL)));
for(size_t i = 0; i<v_Etkinlikler.size(); ++i)
{
Etkinlik *pEtkinlik = v_Etkinlikler.at(i);
if (pEtkinlik)
{
int EnAz = pEtkinlik->m_MinKisi;
int EnCok = pEtkinlik->m_MaxKisi;
int UstLimit = max(EnAz,std::rand() % EnCok);
for(int j = 0; j<UstLimit ;j++)
{
while(true)
{
int RastgeleUye = std::rand() % (OgrenciSayisi-1);
Ogrenci *pOgrenci = v_Ogrenciler.at(RastgeleUye);
if (pOgrenci)
{
//Rastgele öğrenci eğer eklenmişse kontrol et
std::map<int,Ogrenci*>::iterator it = pEtkinlik->m_Uyeler.find(RastgeleUye);
if(it == pEtkinlik->m_Uyeler.end())
{
//Öğreciyi etkinliğe ata
pEtkinlik->m_Uyeler[RastgeleUye] = pOgrenci;
//Öğrencinin katıldığı etkinliği kaydet
//i etkinliğin listedeki sıra numarası
//Bu sayede öğrecinin katıldığı etkinlikleri bulabileceğiz
pOgrenci->m_Etkinlikler.push_back(static_cast<int>(i));
break;
}
}
}
}
}
}
//Etkinlikleri ve katılan üyeleri listele
std::cout << std::endl;
for(size_t i = 0; i<v_Etkinlikler.size(); ++i)
{
Etkinlik *pEtkinlik = v_Etkinlikler.at(i);
if (pEtkinlik)
{
std::cout << pEtkinlik->m_Isim.c_str() << " Etkinliği için atanan öğrenci sayısı " << pEtkinlik->m_Uyeler.size() << std::endl;
std::cout << "Atanan Öğreciler = {";
for (std::map<int,Ogrenci*>::iterator Uye = pEtkinlik->m_Uyeler.begin(); Uye != pEtkinlik->m_Uyeler.end(); ++Uye)
{
Ogrenci *pOgrenci = Uye->second;
if (pOgrenci)
{
std::cout << " " << pOgrenci->m_Isim.c_str();// << std::endl;
}
}
std::cout << " }" << std::endl << std::endl;
}
}
std::cout << std::endl;
size_t EnCokEtkinligeKatilan = 0;
int EnHit = 0;
//Öğrecileri ve katıldıkları etkinlikleri listele
std::cout << "ÖĞRENCİLER VE KATILDIKLARI ETKİLİKLER" << std::endl << std::endl;
for(size_t i = 0; i<v_Ogrenciler.size(); ++i)
{
Ogrenci *pOgrenci = v_Ogrenciler.at(i);
if (pOgrenci)
{
int EtkinlikSayisi = static_cast<int>(pOgrenci->m_Etkinlikler.size());
if(EtkinlikSayisi > EnHit)
{
//En çok etkinliğe katılan örenciyi belirle , eğer birden fazla öğrenci var ise ilk tespit edilen kabul edilir
EnHit = EtkinlikSayisi;
EnCokEtkinligeKatilan = i;
}
if(EtkinlikSayisi > 0)
{
std::cout << "Öğrenci ( " << pOgrenci->m_Isim.c_str() << " ) " << EtkinlikSayisi << " Etkinliğe katılmıştır" << std::endl;
}
}
}
std::cout << std::endl;
std::cout << "HİÇ BİR ETKİNLİKTE YER ALMAYAN ÖĞRENCİLER" << std::endl << std::endl;
for(size_t i = 0; i<v_Ogrenciler.size(); ++i)
{
Ogrenci *pOgrenci = v_Ogrenciler.at(i);
if (pOgrenci)
{
size_t EtkinlikSayisi = pOgrenci->m_Etkinlikler.size();
if(EtkinlikSayisi == 0)
{
std::cout << "Öğrenci ( " << pOgrenci->m_Isim.c_str() << " ) Hiç Bir Etkinliğe katılmamıştır" << std::endl;
}
}
}
std::cout << std::endl;
std::cout << "EN ÇOK ETKİNLİKTE YER ALAN ÖĞRENCİ" << std::endl << std::endl;
Ogrenci *pOgrenci = v_Ogrenciler.at(EnCokEtkinligeKatilan);
if (pOgrenci)
{
std::cout << "Öğrenci ( " << pOgrenci->m_Isim.c_str() << " ) En Çok Etkinliğe katılmamıştır" << std::endl;
}
std::cout << std::endl;
Temizle();
system("pause");
return 0;
}