- C++ dilinde rastgele yazı ve rakam oluiturmak için fonksiyonlar,
- Bir işlem yapılırken harcanan cpu zamanını gösterebilen bir kronometre,
- Bir örnek personel yapısı ve bunu istream'den okuyan ve ostream'e yazan birer aşırı yüklenmiş işleç
Program eğer hazırda yoksa bir dosya açıp rastgele veriler yazar, sonra dosyayı kapatıp açıp içinden belirli yaşa sahip personeli arayıp bir depoya kaydeder, (deque veri tipi) sonra kaydettiklerini ekrana yazar.
#include <iostream> // cout, cin
#include <iomanip> // fixed, setprecision
#include <ostream> // ostream &operator<<
#include <istream> // istream &operator>>
#include <fstream> // ifstream, ofstream
#include <ctime> // clock, clock_t
#include <cstdlib> // rand
#include <deque> // deque
#include <string> // string, getline
class Kronometre
{
private:
std::clock_t baslangic;
public:
Kronometre(): baslangic(std::clock()) {}
std::clock_t fark() const { return std::clock()- baslangic; }
void yaz(std::ostream &o) const { o<< std::showpoint<< std::fixed<< std::setprecision(2)<< double(fark())/ CLOCKS_PER_SEC<< " s"<< std::endl; }
void sifirla() { baslangic= std::clock(); }
};
int rastgele(int baslangic, int bitis)
{
static bool karistirildi= false;
if(!karistirildi)
{
std::srand(static_cast<unsigned>(std::time(0)));
karistirildi= true;
}
return
baslangic+ static_cast<int>((bitis- baslangic+ 1.)* std::rand()/ (RAND_MAX+ 1.));
}
std::string rastgele_isim()
{
std::string::size_type ad_uzunluk= rastgele(4, 12);
std::string isim;
for(std::string::size_type defa= ad_uzunluk; defa-- ; isim.push_back(rastgele('a', 'z')));
return isim;
}
struct Personel
{
Personel()
: isim(rastgele_isim())
, yas(rastgele(18, 60))
, boy_cm(rastgele(145, 210))
{}
std::string isim;
unsigned short yas, boy_cm;
};
std::ostream &operator<< (std::ostream &o, Personel const &p)
{
return o<< p.isim<< '\n'<< p.yas<< '\n'<< p.boy_cm<< '\n';
}
std::istream &operator>> (std::istream &i, Personel &p)
{
return (std::getline(i, p.isim)>> p.yas>> p.boy_cm).ignore(1);
}
bool dosya_var(std::string const &d)
{
return std::ifstream(d.c_str()).is_open();
}
int main()
{
if(dosya_var("personel.db"))
std::cout<< "Personel dosyasi bulundu."<< std::endl;
else
{
unsigned long personel_sayisi= 200000;
std::cout<< personel_sayisi<< " personel dosyaya kaydediliyor... "<< std::flush;
std::ofstream dosya("personel.db");
for(unsigned long her= personel_sayisi; her--; dosya<< Personel());
std::cout<< "[OK]"<< std::endl;
}
std::cout<< "Dosyada yasa gore arama yapilabilir. Kac yasindakileri listelemek istersiniz? "<< std::flush;
int aranan_yas;
std::cin>> aranan_yas;
std::cin.ignore(1);
std::cout<< "Istediginiz ozellikteki personel araniyor... "<< std::flush;
std::deque<Personel> db;
Kronometre kronometre;
std::ifstream dosya("personel.db");
for(Personel her; dosya>> her;) if(her.yas== aranan_yas) db.push_back(her);
kronometre.yaz(std::cout<< "Toplam arama suresi: ");
std::cout<< "Bulunan personel sayisi: "<< db.size()<< std::endl;
std::cout<< "Bulunan verileri yazmak icin [ENTER] tusuna basiniz."<< std::flush;
std::cin.get();
for(std::deque<Personel>::const_iterator her= db.begin(); her!= db.end(); ++ her)
std::cout<< *her;
}