12 Ağustos 2016 Cuma

C++ İLE MENU VE DOSYA İŞLEMLERİ

C++ İLE MENÜ YAPIMI VE DOSYAYA KAYIT İŞLEMLERİ


Merhaba Sevgili dostlar, bildiğiniz üzere C++ Sistem Programcılığı açısından yeri dolmaz bir dildir. Ancak masaüstü uygulamalar söz konusu olduğunda günümüzde pek fazla tercih edilmemektedir. Bunun sebebi olarak arayüz geliştirmenin zorluğu gösterilebilir. Günümüzde C++ tabanlı bir çok kütüphane bu işin eksikliğini kapatmaya yardımcı olmaktadır. 

Ancak bugün burada bir miktar nostalji yapacağız.Yukarıda verilene benzer bir arayüz nasıl geliştirilir ve basit veri giriş çıkış işlemleri konusu bu yazımızda ele alınacaktır. 
NOT: Temel C++ Programlama bilgisine sahip okurlara yöneliktir.

Windows Mesaj Pencereleri imleç konumunun tespiti konsol renginin değiştirilmesi gibi konuların geliştireceğimiz programa dahil edilebilmesi için önceliklle #include "windows.h" dosyasını programımıza eklememiz gerekmektedir.

Türkçe karakter kullanımının sağlanabilmesi içinde yine benzer şekilde farklı bir C++ kütüphanesini, #include <locale.h>  ,programımıza ekliyoruz. 

time.h #include <ctime> ise zaman , tarih-saat, fonksiyonlarını barındırır.


Aşağıda farklı bir konsol rengi örneği verilmiştir. system("color 4"); şeklinde vereceğiniz bir komut ile konsol rengini değiştirmeniz mümkündür. Buradaki olay CMD ile çalıştırdığınız komut satırına komut verme işlemi ile aynıdır. color 1 ya da color 0 olarak komut satırına yazılan komutlar burada system komutu ile birlikte kullanılmaktadır.



Renk Kodları;

Renk kodları CMD ile komut satırından bulunabilir help color yazmanız yeterlidir.



Güzel görünümlü bir menü yapabilmek için sıkça kullanacağımız gotoxy komutunun çalışabilmesi için aşağıda belirtilen tanımlamanın programda yapılması gerekmektedir..

void gotoxy(short x,short y) 


COORD pos={x,y}; 
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 

}

gotoxy kullanımına örnek olarak;

gotoxy(15,4);

komutu verilebilir burada ilk rakam X ekseninde ikinicisi ise Y ekseninde imlecin gideceği nokta tanımlanmaktadır. Burada rakamlar kullanıcıdan alınabilir Renk seçiminde de aynı şekilde kullanıcılardan alınan rakamlar değişkenler aracılığı ile ilgili fonksiyonlarda kullanılabilmektedir. Böylece durağan bir yapıdan ziyade programa hareketlilik kazandırılmış olacaktır.





Bildiğiniz üzere C/C++ dillerinde ekrana yazdırılan mesajlarda Türkçe karakterler gösterilememektedir. Ancak Local tanımlamalarının yapılması halinde Yerel dilin kullanımına yönelik dil desteği sağlanabilmektedir. Ç,Ş,İ,Ü,Ö gibi karakterleri kullanabilmemiz için aşağıda belirtilen tanımlamanın main() fonksiyonu içerisinde yapılması gerekmektedir.

setlocale(LC_ALL,"Turkish");

Bu yazıda örnek uygulamada kullanılan Tüm C++  komutlarına değinilmeyecektir. Ancak standart kullanımın dışında kalanlar veya çok önemli görülenler kısmen açıklanmıştır. Temel giriş çıkış ve dosya işlemlerine yönelik komutların bir kısmı da aşağıda özet olarak verilmiştir.

cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";

cout komutu ekrana yazı yazdırmak için kullanılmaktadır. Burada neden printf kullanmadığımızı soranlar olabilir. cout kullandığımızda tür biçim tanımlamaları otomatik ve daha genel olarak yapılmaktadır.Nesne yönelimli bir yapıya dayandığından printf'e kıyasla kullanımı daha kolaydır.

cout<<"\nÖMÜR BİLGİSİ:"; 
cin>>zaman;

yukarıda kullanıcıdan istenen ömür bilgisi cin komutu ile zaman adlı değişkene aktarılmıştır. Görüldüğü üzere komutun amacı kullanıcıdan alınan verileri değişkenlere aktarmak. Ancak burada verinin türü biçimi muallaktır, scanf komutunu kullanmış olsaydık mutlaka bunları belirtmemiz gerekecekti.

Örnek olarak verilen çalışmada amacımız kullanıcıdan aldığımız verileri metin tabanlı bir dosyada saklamak ve gerektiğinde yeniden görüntüleme, kayıtları güncelleme ya da silme gibi işlemlerini hazırladığımız menüden yani kullanıcı arayüzünden kolayca yapabilmek. Burada bir veri tabanı uygulaması yapmasak da yine de metin tabanlı bir dosya üzerinden güzel bir uygulama yapmış olacağız. Örnek verilen program Depo Kayıt Programı olacaktır. Depoya malzeme kaydetme , depodan malzeme görüntüleme, güncelleme ve silme işlemlerini içermektedir.

Yukarıda örnek olarak verilen ekran görüntülerinden de anlaşılacağı üzere 6 seçenekli bir menümüz var.Bunlardan biri sistemden çıkış, bir diğeri sistem ayarları ve geriye kalanları ise kayıt ekleme,silme,güncelleme,vs...

system("CLS");

Bu komut ekran görüntüsünün temizlenmesi için kullanılmaktadır.






Kayıtların dosyaya yazılabilmesi için bir dizi komuta ihtiyaç vardır. Bu komutların kullanılabilmesi için C++ için dosya işlemleri kütüphanesinin yazılıma eklenmesi gerekmektedir.

#include <fstream> kodu yazarken en başa eklenmesi gereken kütüphanedir.

ofstream dosyayayaz("envanter.txt",ios::app); envanter.txt isimli dosyayı yoksa oluşturur,varsa da yazmaya hazır şekilde açar.


if (!dosyayayaz)
{
system("CLS");
cerr<<"Dosya açılamadı.Ana menüye dönmek için bir tuşa basınız.";
getch();
return;
}
else
{...

Bu kısımda dosyanın açılması sırasında oluşabilecek bir hata karşısında yapılması gerekenler tanımlanmaktadır. Bir programda oluşabilecek hatalar için mutlaka bir prosedür oluşturmak gerekir. Aksi durumda donmalar, takılmalar öylece kalakalmalar kaçınılmazdır. 

ifstream dosyaoku("envanter.txt",ios::in); 

Dosyadan okuma yapmak için kullanılır.Dosyadan okunan veriler ekranda aşağıda yer aldığı şekilde gösterilebilir.

while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
}

Yazıyı daha fazla uzatmamak adına konunun tamamını içeren örnek bir uygulama aşağıdakine benzer şekilde verilebilir. Açıklamalar kodun içerisinde yapılmıştır. Yukarıda anlatım göz önüne alındığında kolaylıkla anlaşılabilecektir. Temel C++ fonksiyonları ve C++ programlama dilinin yapısı başka bir yazının konusu olduğundan bunların bilindiği varsayılmıştır.



Kodun Tamamı:


#include <iostream>
#include <iomanip>
#include <conio.h>
#include <locale.h>
#include <ctime>
#include "windows.h"
#include <string>
#include <fstream>
#include <ctype.h>
using namespace std;
string Renk="Geçerli";

void AnaTema(void);
void AnaMenu(void);
void Menu1(void);
void Menu2(void);
void Menu3(void);
void Menu5(void);
void verigir(void);
void oku_hepsini(void);
void oku_id(void);
void oku_rastgele(void);

//<<<<<<<<<<<<<<< gotoxy için koordinat api tanımlaması >>>>>>>>>>>>>>>>>>>>>>>>

void gotoxy(short x,short y)
{
COORD pos={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

//################################# Ana Fonksiyon ##############################

int main()
{
char selection;
setlocale(LC_ALL,"Turkish");

AnaMenu();
           
while(1)
            {          
selection=getch();
            switch(selection)
            {
            case '1':
            Menu1();
break;
            case '2':
            Menu2();
break;
            case '3':
            Menu3();
break;
            case '4':
AnaTema();
gotoxy(18,6);
cout<<"Bu Menü Aktif değildir."<<endl;
gotoxy(18,8);
cout<<"Ana Menüye dönmek için bir tuşa basınız.";
getch();
AnaMenu();
break;
            case '5':
            Menu5();
break;
            case 'X':
                        /*system("EXIT");*/
            exit(1);
break;
                       
            }          
            }
            return 0;
}

//<<<<<<<<<<<<<<<<<< C++ EKRAN TEMASI >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void AnaTema()
{
system("CLS");
/*cout<<system("echo %date%")<<endl;*/
time_t now=time(0);
cout<<ctime(&now)<<endl;
gotoxy(57,0);
cout<<"Console Colour:"+Renk;
gotoxy(30,3);
cout<<"DEPO KAYIT PROGRAMI"<<endl;
gotoxy(15,4);
cout.width(50);
cout.fill('=');
cout<<" ";


for (int y=3;y<20;y++)
{
gotoxy(15,y);
cout<<"|";
gotoxy(64,y);
cout<<"|";
}
for(int x=15;x<65;x++)
{
gotoxy(x,20);
cout<<"+";
}
for(int x=16;x<64;x++)
{
gotoxy(x,18);
cout<<"=";
}
}

//<<<<<<<<<<<<<<<<<<<<<<<<<<< Ana Menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void AnaMenu()
{
AnaTema();
string MenuItem[6];
MenuItem[0]="[1] Yeni Kayıt Ekleme";
MenuItem[1]="[2] Kayıt Görüntüleme";
MenuItem[2]="[3] Kayıt Güncelleme";
MenuItem[3]="[4] Kayıt Silme";
MenuItem[4]="[5] Sistem Ayarları";
MenuItem[5]="[X] Programı Kapat";

for (int menu=0;menu<=5;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
}

// <<<<<<<<<<<<<<<<<<< Menu1 / Yeni Kayıt Oluşturma >>>>>>>>>>>>>>>>>>>>>>

void Menu1()
{
char islem;
AnaTema();
string MenuItem[7];
MenuItem[0]="1-] Malzeme ID no:";
MenuItem[1]="2-] Malzeme İsim:";
MenuItem[2]="3-] Malzeme Miktarı:";
MenuItem[3]="4-] Satış Fiyatı:";
MenuItem[4]="5-] Saklama Süresi:";
MenuItem[5]="Sonlandır [S] / Eklemeye devam et [E]:[ ]";
gotoxy(17,19);
cout<<"[Y] Yeni  [M] Ana Menü  [X] Kapat";
for (int menu=0;menu<=5;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
islem=getch();
switch(islem)
{
case 'Y':          
verigir();
AnaMenu();
break;
case 'M':
AnaMenu();
            return;
            break;
case 'X':
            exit(1);
            break;
default:
AnaMenu();
            return;
break;
}
}

// <<<<<<<<<<<<<<< Menu2 / Dosyadan verileri okuma >>>>>>>>>>>>>>>>>>>>>>>

void Menu2()
{
char menusec;
AnaTema();
string MenuItem[3];
MenuItem[0]="1-] Tüm Kayıtları göster";
MenuItem[1]="2-] ID Numarası verilen kaydı göster.";
MenuItem[2]="3-] Rastgele erişim.";
gotoxy(17,19);
cout<<"[M] Ana Menü  [X] Kapat";
for (int menu=0;menu<=2;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
menusec=getch();
switch(menusec)
{
case '1':
oku_hepsini();
break;
case '2':
oku_id();
break;
case '3':
oku_rastgele();
break;
case 'M':
            AnaMenu();
            return;
break;
case 'X':
            exit(1);
break;
                       
}
AnaMenu();
}

//<<<<<<<<<<<<<<<<<<<< Menu3 / Kayıt güncelleme >>>>>>>>>>>>>>>>>>>>>>>>>>

void Menu3()
{
string U_id;
system("CLS");
cout<<"Güncelenecek kaydın ID'sini giriniz:";
cin>>U_id;
fstream dosyaoku("envanter.txt",ios::in|ios::out);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;  
}
else
{
string id,isim,miktar,fiyat,zaman;
string n_id,n_isim,n_miktar,n_fiyat,n_zaman;
ofstream dosya("gecici.txt",ios::app);
system("CLS");
while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;

if(id==U_id)
{
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
cout<<"\n\nGüncel Satır verilerini giriniz."<<endl;
cout<<"\nID:";
cin>>n_id;
cout<<"\nMALZEME:";
cin>>n_isim;
cout<<"\nMİKTARI:";
cin>>n_miktar;
cout<<"\nFİYATI:";
cin>>n_fiyat;
cout<<"\nÖMRÜ:";
cin>>n_zaman;
id=n_id;
isim=n_isim;
miktar=n_miktar;
fiyat=n_fiyat;
zaman=n_zaman;

}
dosya<<id<<"\t"<<isim<<"\t"<<miktar<<"\t"<<fiyat<<"\t"<<zaman<<endl;
}

cout<<"\nAna Menüye dönmek için herhangi bir tuşa basınız...";
dosyaoku.close();
dosya.close();
system("del envanter.txt");

rename("gecici.txt","envanter.txt");
getch();
}

AnaMenu();
return;
}

//<<<<<<<<<<<<<<<<<<<< Konsol Yazı Rengi Ayarları >>>>>>>>>>>>>>>>>>>>>>>>>>

void Menu5()
{
char colorcode;
AnaTema();
string MenuItem[5];
MenuItem[0]="Lütfen Renk Seçimizi yapınız.";
MenuItem[1]="1-] Kırmızı";
MenuItem[2]="2-] Mavi";
MenuItem[3]="3-] Yeşil";
MenuItem[4]="4-] Beyaz";
for (int menu=0;menu<=4;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
colorcode=getch();
switch(colorcode)
{
case '1': system("color 4");
Renk="Kırmızı";
break;
case '2': system("color 1");
Renk="Mavi";
break;
case '3': system("color 2");
Renk="Yeşil";
break;  
case '4': system("color 7");
Renk="Beyaz";
break;             
}
AnaMenu();
}

//<<<<<<<<<<<<<<<<<<<< Veri giriş alt fonksiyonu >>>>>>>>>>>>>>>>>>>>>>>>

void verigir()
{

struct malzeme
{
string id,isim,miktar,fiyat,sure;
}yeniM;
char x='E';
try
{
ofstream dosyayayaz("envanter.txt",ios::app);
if (!dosyayayaz)
{
system("CLS");
cerr<<"Dosya açılamadı.Ana menüye dönmek için bir tuşa basınız.";
getch();
return;
}
else
{
while(x=='E')
{
gotoxy(38,6);
cin>>yeniM.id;
gotoxy(37,8);
cin>>yeniM.isim;
gotoxy(40,10);
cin>>yeniM.miktar;
gotoxy(37,12);
cin>>yeniM.fiyat;
gotoxy(39,14);
cin>>yeniM.sure;
gotoxy(59,16);
cin>>x;
dosyayayaz<<yeniM.id<<"\t"<<yeniM.isim<<"\t"<<yeniM.miktar<<"\t"<<yeniM.fiyat<<"\t"<<yeniM.sure<<endl;
}
dosyayayaz.close();
}
}
catch(exception& e)
{
system("CLS");
cout<<"Bilinmeyen bir hata oluştu.Ana menüye dönmek için bir tuşa basınız.";
getch();
return;
}
return;
}

//<<<<<<<<<<<<<<<<<<<<< Hepsini okuma >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void oku_hepsini()
            {
ifstream dosyaoku("envanter.txt",ios::in);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;
}
else
{
string id,isim,miktar,fiyat,zaman;
system("CLS");
while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
}

}
cout<<"\nAna Menüye dönmek için herhangi bir tuşa basınız...";
getch();
dosyaoku.close();
return;
}

//<<<<<<<<<<<<<<<<<<<< ID ye göre okuma >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void oku_id()
{
string M_id;
system("CLS");
cout<<"Malzeme ID numarasını giriniz:";
gotoxy(30,0);
cin>>M_id;
ifstream dosyaoku("envanter.txt",ios::in);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;  
}
else
{
string id,isim,miktar,fiyat,zaman;
system("CLS");
while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;
if(id==M_id)
{
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
}
}
cout<<"\nAna Menüye dönmek için herhangi bir tuşa basınız...";
getch();
}
dosyaoku.close();
return;
}

//<<<<<<<<<<<<<<<<<<<<<<< Rastgele okuma >>>>>>>>>>>>>>>>>>>>>>>>>>>>

void oku_rastgele()
{
int pozisyon;
int okunacak;
system("CLS");
cout<<"Okumaya başlanılacak pozisyon bilgisini giriniz:";
cin>>pozisyon;
cout<<endl;
cout<<"Okunacak karakter sayısını giriniz:";
cin>>okunacak;
cout<<"\n"<<endl;
fstream dosyaoku("envanter.txt",ios::in);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;  
}
else
{

char okunan[okunacak];


dosyaoku.seekp(pozisyon,ios::beg);
dosyaoku.read(okunan,okunacak);
cout<<okunan<<endl;
cout<<"\n\nAna Menüye dönmek için bir tuşa basınız.";
getch();
}
}

2 yorum:

  1. çok iyi bir örnek, menu4() >>' Kayıt Silme ' yi de ben ekledim çalışıyor.

    YanıtlaSil
  2. selamlar silme örneğinize bakmamda sakınca yoksa paylaşırsanız sevinirim

    YanıtlaSil