Proje: C++ ve Nesneye Dayalı Programlama

proje3 proje3   {right}…ve bitti. Senenin son projesinin kontrolünü yaptık bugün. Birazcık maceralı bir başlangıçtan sonra (ödev dosyamın içine .exe de koyup sonra onu bir güzel unutunca, üniversitemizin firewall’ı mailimi bir güzel bloklamış.) projemi kontrol ettirdim. Sözlü kısmında kaynak kod kısmından bir şeyler soracaklar sanıyordum ama C++’a yönelik iki soru cevapladım. Her neyse, programda hata çıkmadı. Puanlar açıklanmasa da 100 aldığımı düşünmekteyim.

Sanırım, bu sene son defa bir proje paylaşıyorum burada. (bir anda duygulandım, cidden.) Koskoca sene bitti. İnanması güç geliyor.

Kaynak kodunu yazının devamında bulabileceksiniz. Ama önce birkaç açıklama yapmak istiyorum:

  • Projede kullandığım kaynak kodunun oldukça büyük bir kısmı Ödev 3’tekinin ya aynısıdır, ya da çok az değiştirilmiş halidir. Onun için bu proje diğer hepsinden çok daha kolaydı ve çok çabuk bitti.

  • Rapor yazmamak çok hoş oldu gerçekten. 😃

  • namescape std ile her printf ve benzeri fonksiyonun başına std:: yazmaktan kurtulmuş bulunmaktayım.

  • Projenin classlarının genel görünümünü header dosyalarında bulabilirsiniz. Header dosyalarının Özgür Gümüş hocamızın bize önerdiğinden az biraz farklı olduğunu göreceksiniz. Böylesi daha kolay geldi, böyle yazdım.

  • Nesne metodlarının girdi ve çıktı tiplerini incelemenizi öneririm.

  • Projede nesne yaratma ve silmeye dair birkaç satır örnek göreceksiniz.

  • Projede yıkıcı (destructor) metod bulunmamaktadır, ancak yapıcı metotlara örnek bulabilirsiniz.

  • Proje tamamen nesneye dayalı mantık kullanmaktadır.Bir nesnenin içindeki hiçbir elemana pointer ile erişilmemiş ve değiştirilmemiştir. Bunun yerine her yerde (istisnasız) Setter ve Getter metotlar kullanılmıştır.

  • Programın içerisinde bolca comment ve bolca da yazım hatası bulmanız mümkün. 😃

  • vs vs.

  • Proje Açıklaması

  • Benim Çözümüm (7670.zip)

Umarım Matematik’ten sınıfı geçerim. Sınıf ortalamasının altında kalmamam şartıyla 😄 hepimize başarılar. 😃 (yok öyle yükseklerde gözüm, geçeyim sınıfı da… 😃 )

İyi günler.

Kaynak kodunu indirmek istemeyenler bir kopyasını aşağıda bulabilirler:

main.cpp [cpp] #include <iostream> #include <conio.h>

#include "Satis.h" #include "Urun.h" #include "Urun_Katalogu.h"

using namespace std;

void beklet() { /* Bu fonksiyonun tek amaci kullaniciyi bir tusa basana kadar bekletmek, ve sonra ekrani silmektir. */ printf("\nDevam etmek icin bir tusa basin."); getch(); system ("cls"); }

int main() {

/* Acilis yazilari BASLANGICI / printf("Umut BENZER\n"); printf("05-06-7670\n"); printf("Ege Universitesi Bilgisayar Muhendisligi 1. Sinif\n"); printf("http://www.ubenzer.com\n"); printf("PROJE: Nesneye Dayali Programlama\n"); printf("Surum: 0.2\n\n"); / Acilis yazilari SONU */

int sag_serbest=-1; char secenek;

int sayac;

int girdi; char girdi2[20]; float girdi3; int girdi4; char girdi5[6]; int girdi6;

/* Girdi degiskenleri main fonksiyonun her bir yerinde farkli farkli bir sürü amaçla kullanıldığı için özel isimler vermedim. */

/* Ürün Kataloğu nesnesi yarat */ URUNKATALOGU dizin;

/* Ana döngü */ while (sag_serbest==-1) {

/* menu BASLANGICI / printf("** Menu *** \n\n"); printf("1. Yeni bir urunun eklenmesi \n"); printf("2. Bir urunun birim alis fiyatinin ve stok miktarinin guncellenmesi \n"); printf("3. Bir urune iliskin satis eklenmesi \n"); printf("4. Bir urune iliskin satisin silinmesi \n"); printf("5. Bir urunun silinmesi \n"); printf("6. Bir urunun bilgilerinin ve o urunden yapilan tum satislarin listelenmesi \n"); printf("7. Belirli bir tarihten bugune hic satis yapilmayan urunlerin listelenmesi\n"); printf("8. Tum urunlerin listelenmesi \n"); printf("9. Belirli bir stok miktarinin altinda urunlerin listelenmesi \n"); printf("0. Tum urunlerden yapilan toplam satislarin listelenmesi \n"); printf("C. Cikis \n");

printf("Lutfen istediginiz islemin numarasini giriniz.\n"); /*menu BITIMI */

secenek=getch(); system ("cls");

/* secenek getche ile alındığı için ASCII koduna göre switch yapısına sokulabilir. */ switch(secenek) { case 49: //1 system ("cls"); printf("Yeni bir urun kodu giriniz: "); scanf("%d",&girdi); system ("cls");

switch (dizin.UrunVarMi(girdi)) {

case 0: /* Yaşasın doğru girmişler. */

for (sayac=0;sayac<20;sayac++) { girdi2[sayac] = 0; }

while (girdi2[0] == 0) { fflush(stdin); printf("Yeni urunun adini giriniz: "); gets(girdi2); }

printf("Urunun alis fiyatini giriniz: "); scanf("%f",&girdi3);

printf("Urunun stok durumunu giriniz: "); scanf("%d",&girdi4);

dizin.UrunEkle(new URUN(girdi,girdi2,girdi3,girdi4)); printf("Islem tamam. 😉\n");

break; case 1: printf("Girdiginiz urun kodu daha once alinmis.\n"); break; } beklet(); break; case 50: //2 system ("cls"); printf("Duzenlenecek urun kodunu giriniz: "); scanf("%d",&girdi); system ("cls");

switch (dizin.UrunVarMi(girdi)) {

case 1: /* Yaşasın doğru girmişler. */

printf("Urunun yeni alis fiyatini giriniz: "); scanf("%f",&girdi3);

printf("Urunun yeni stok durumunu giriniz: "); scanf("%d",&girdi4);

dizin.UrunAdres(girdi)->alisFiyatiYaz(girdi3); dizin.UrunAdres(girdi)->stokMiktariYaz(girdi4);

printf("Islem tamam. 😉\n"); break;

case 0: printf("Aradiginiz urune su anda ulasilamiyor.\n"); printf("Lutfen, daha sonra tekrar deneyin.\n"); printf("The URUN you have called cannot be reached at the moment.\n"); printf("Please try again later.\n"); break; } beklet(); break; case 51: //3 system ("cls"); printf("Satis eklenecek urun kodunu giriniz: "); scanf("%d",&girdi); system ("cls");

switch (dizin.UrunVarMi(girdi)) {

case 1: /* Evet var. */

printf("Fatura no giriniz: "); scanf("%d",&girdi4);

for (sayac=0;sayac<6;sayac++) { girdi5[sayac] = 0; }

while (girdi5[0] == 0) { fflush(stdin); /* Ödevin asıl amacının tarihlerle değil de nesnelerle uğraşmak olduğu bilindiğinden 2000 öncesi yıllar için sıralama sorunu ihmal edildi. */ printf("Satis tarihini giriniz (YYAAGG): "); gets(girdi5); }

printf("Urunun satis miktarini giriniz: "); scanf("%d",&girdi6);

printf("Birim satis fiyatini giriniz: "); scanf("%f",&girdi3);

dizin.UrunAdres(girdi)->satisEkle(new SATIS(girdi4,girdi5,girdi6,girdi3)); printf("Islem tamam."); break;

case 0: /* Hayır, yok */ printf("Boyle bir urun yok."); break; } beklet(); break; case 52: //4 system ("cls"); printf("Satis silinecek urunun kodunu giriniz: "); scanf("%d",&girdi); system ("cls");

switch (dizin.UrunVarMi(girdi)) {

case 1: /* Yaşasın doğru girmişler. */

system ("cls"); printf("Silinecek satisin fatura nosu: "); scanf("%d",&girdi4); system ("cls");

switch (dizin.UrunAdres(girdi)->satisSil(girdi4)) {

case -1: printf("Silinmesi istenen fatura numarasina rastlanamadi.\n"); break; case 0: printf("Sildim bile."); break; }

break; case 0: printf("Boyle bir urun yok ki. 😃\n"); break; }

beklet(); break; case 53: //5 system ("cls"); printf("Silinecek urun kodunu giriniz: "); scanf("%d",&girdi); system ("cls");

switch (dizin.UrunVarMi(girdi)) {

case 1: /* Yaşasın doğru girmişler. */

dizin.UrunSil(girdi); printf("Sildim bile."); break; case 0: printf("Boyle bir urun zaten yok ki. 😃\n"); break; } beklet(); break; case 54: //6 system ("cls"); printf("Satislari listelenecek urun kodunu giriniz: "); scanf("%d",&girdi); system ("cls");

switch (dizin.UrunVarMi(girdi)) {

case 1: /* Yaşasın doğru girmişler. */

dizin.UrunAdres(girdi)->UrunYaz(1); /* Ürün bilgileri getirilir. / dizin.UrunAdres(girdi)->SatislariListele(); / Satis bilgileri ekrana yazilir. */ break; case 0: printf("Aradiginiz urune su anda ulasilamiyor.\n"); printf("Lutfen, daha sonra tekrar deneyin.\n"); printf("The URUN you have called cannot be reached at the moment.\n"); printf("Please try again later.\n"); break; }

beklet(); break; case 55: //7

for (sayac=0;sayac<6;sayac++) { girdi5[sayac] = 0; }

while (girdi5[0] == 0) { fflush(stdin); /* Ödevin asıl amacının tarihlerle değil de nesnelerle uğraşmak olduğu bilindiğinden 2000 öncesi yıllar için sıralama sorunu ihmal edildi. */ printf("Ne zamandan beri? (YYAAGG): "); gets(girdi5); }

dizin.satilmayanlariListele(girdi5); beklet(); break; case 56: //8 dizin.UrunleriListele();

beklet(); break; case 57: //9 girdi = -1; system("cls"); printf("Kactan kucuk olsun istiyorsunuz? "); scanf("%d",&girdi); system("cls");

dizin.UrunleriListele(girdi);

beklet(); break; case 48: // 0 dizin.tumUrunTopSatis(); beklet(); break; case 99: //c case 67: //C /* E e H h ve disinda girdi kabul etmeyen cikmak istiyor musunuz sorusu BASLANGICI / do { printf ("\nCidden cikmak istiyor musunuz? (E/H) "); secenek = getche(); if (secenek == 'E' || secenek == 'e') { sag_serbest = 0; secenek = 'H'; } } while (secenek != 'H' && secenek != 'h'); / E e H h ve disinda girdi kabul etmeyen cikmak istiyor musunuz sorusu SONU / system ("cls"); break; default: / Elleri yanlis tusa basan kullanicilar icin yazilan bolum BASLANGICI / printf("Bir zahmet 1'den 9'a kadar bir secim yapin."); beklet(); / Elleri yanlis tusa basan kullanicilar icin yazilan bolum SONU */ break; } }

printf("O halde hoscakalin. 😃\n\n\n"); return 0; } [/cpp]

Satis.cpp [cpp] #include <iostream> #include <conio.h>

#include "Satis.h" #include "Urun.h" #include "Urun_Katalogu.h"

using namespace std;

SATIS::SATIS(int a,char b[6],int c,float d) { /* Nesne yaratılırken veriler yerli yerine yerleştirilir. */ int sayac;

fatura_no = a;

for (sayac=0;sayac<6;sayac++) { satis_tarihi[sayac] = b[sayac]; }

satis_miktari = c; birim_satis_fiyati = d;

sonraki = NULL; }

int SATIS::faturaNoOku() { return fatura_no; }

char* SATIS::tarihOku() { return satis_tarihi; }

int SATIS::miktarOku() { return satis_miktari; }

float SATIS::birimFiyatOku() { return birim_satis_fiyati; }

SATIS* SATIS::sonrakiOku() { return sonraki; }

void SATIS::sonrakiYaz(SATIS* a) { sonraki = a; } [/cpp]

Satis.h [cpp] #ifndef SATIS_H_INCLUDED #define SATIS_H_INCLUDED

class SATIS {

private: /* Nesne yerel değişkenleri */ int fatura_no; char satis_tarihi[6]; int satis_miktari; float birim_satis_fiyati; SATIS *sonraki;

public: /* Nesne yaratma metodu / SATIS(int,char,int,float);

/* Getter Metodlar */ int faturaNoOku(); char *tarihOku(); int miktarOku(); float birimFiyatOku(); SATIS *sonrakiOku();

/* Setter Metodlar / void sonrakiYaz(SATIS);

};

#endif // SATIS_H_INCLUDED [/cpp]

Urun_Katalogu.cpp [cpp] #include <iostream> #include <conio.h>

#include "Satis.h" #include "Urun.h" #include "Urun_Katalogu.h"

using namespace std;

URUNKATALOGU::URUNKATALOGU() { /* Nesne yaratılırken tüm kayıtlar NULL'u göstersin, sonra sakatlık çıkmasın. */ int sayac; for (sayac = 0;sayac<100;sayac++) { hashTablosu[sayac] = NULL; } }

int URUNKATALOGU::UrunVarMi(int urun_kodu) {

/* 1: Ürün var 0: Ürün yok */

URUN *guncel;

guncel = hashTablosu[hash(urun_kodu)];

while(guncel != NULL) { /* Kayıtlar bitene kadar */

if (guncel->kodOku() == urun_kodu) { return 1; }

guncel = guncel->sonrakiOku(); /* Bir sonraki kayıda uçalım. */ }

return 0; /* Eğer buraya geldiyse eşleşme yok demektir. */ }

URUN* URUNKATALOGU::UrunAdres(int urun_kodu) {

/* Geriye ürünün adresini gönderir. */

URUN *guncel;

guncel = hashTablosu[hash(urun_kodu)];

while(guncel != NULL) { /* Kayıtlar bitene kadar */

if (guncel->kodOku() == urun_kodu) { return guncel; }

guncel = guncel->sonrakiOku(); /* Bir sonraki kayıda uçalım. */ }

return NULL; /* Eğer buraya geldiyse bir sakatlık var demektir, ama gelmez. 😃 */ }

void URUNKATALOGU::UrunEkle(URUN *YeniUrun) {

URUN *gecici;

/* Eğer HashTablosu zaten boşsa yerleştirip geçelim. Yok eğer doluysa bağlantıları da ayarlayalım. */ gecici = hashTablosu[hash(YeniUrun->kodOku())];

hashTablosu[hash(YeniUrun->kodOku())] = YeniUrun; YeniUrun->sonrakiYaz(gecici);

}

int URUNKATALOGU::hash(int urun_kodu) { return (urun_kodu % 100); }

void URUNKATALOGU::UrunleriListele(int stok_limit) {

int sayac; URUN *guncel;

printf("Urun Kodu Urun Adi Stok Miktari Bilim Alis Fiyati\n"); printf("--------- -------------------- ------------ -----------------\n");

for (sayac=0;sayac<100;sayac++) { guncel = hashTablosu[sayac];

while (guncel != NULL) { if (stok_limit == -1 || guncel->stokMiktariOku() < stok_limit) { guncel->UrunYaz(); } guncel = guncel->sonrakiOku(); } } }

void URUNKATALOGU::tumUrunTopSatis() {

int sayac; int satis_urun; int satis_top=0; float ciro_urun; float ciro_top=0L; URUN *guncel; SATIS *gezinti;

printf("Urun Kodu Urun Adi Toplam Satis Miktari Toplam Ciro\n"); printf("--------- -------------------- -------------------- -----------\n");

for (sayac=0;sayac<100;sayac++) { guncel = hashTablosu[sayac];

while (guncel != NULL) {

/* Satışlarla ilgili gerekli hesaplamaları yapalım */ satis_urun = 0; ciro_urun = 0L;

if (guncel->linkOku() != NULL) { /* heheee çökertemezsiniz */ gezinti = guncel->linkOku(); while (gezinti != NULL) { satis_urun += gezinti->miktarOku(); ciro_urun += gezinti->miktarOku() * gezinti->birimFiyatOku();

gezinti = gezinti->sonrakiOku(); } }

printf("%9d %20s %20d %11.4f\n",guncel->kodOku(),guncel->adOku(),satis_urun,ciro_urun);

ciro_top += ciro_urun; satis_top += satis_urun;

guncel = guncel->sonrakiOku(); /* Bir sonraki kayıda uçalım. */

} }

printf("---------------------------------------------------------------\n"); printf("Toplam: %22d %11.4f\n",satis_top,ciro_top); }

void URUNKATALOGU::satilmayanlariListele(char *tarih_limit) {

int sayac; URUN *guncel; SATIS *gezinti;

printf("Urun Kodu Urun Adi \n"); printf("--------- --------------------\n");

for (sayac=0;sayac<100;sayac++) { guncel = hashTablosu[sayac];

while (guncel != NULL) {

if (guncel->linkOku() != NULL) { /* heheee çökertemezsiniz / gezinti = guncel->linkOku(); if(strncmp(gezinti->tarihOku(),tarih_limit,6)<0) { printf("%9d %20s\n",guncel->kodOku(),guncel->adOku()); } } else { / Hiç satış yapılmamış */ printf("%9d %20s\n",guncel->kodOku(),guncel->adOku()); }

guncel = guncel->sonrakiOku(); /* Bir sonraki kayıda uçalım. */ } }

printf("------------------------------\n");

}

int URUNKATALOGU::UrunSil(int girdi) {

/* Bu metotta satışlar silinirken satissil metodu çağırılabilirdi. Ancak bu metot fatura numarası verilen satışı sildikten sonra tüm bağlantıları da teker teker ayarlayacaktır. Halbuki toptan tüm satışları sileğimizden bu ayarlamaları yapmak etkin olmayacaktır. */

SATIS *sil_konum; SATIS *gecici; URUN *gecici2; URUN *dolas;

/* Ürüne bağlı satışları silelim */ sil_konum = UrunAdres(girdi)->linkOku(); while(sil_konum!=NULL) { gecici = sil_konum;; sil_konum = sil_konum->sonrakiOku(); delete (gecici); }

/* Silmeden önce hashtablosu ya da bağlantılarda gerekli hödöleri ayarlamalıyız. */

if (hashTablosu[hash(girdi)] == UrunAdres(girdi)) { /* Durum 1: Ürün Hash tablosuna bağlı ilk ürün. */

/* Ayrıntılı bilgi için commenti kaldırın. */ printf("Urun hash tablosunda.\n");

gecici2 = hashTablosu[hash(girdi)]; hashTablosu[hash(girdi)] = hashTablosu[hash(girdi)]->sonrakiOku(); delete (gecici2);

return 0; /* İşlem tamam, gidiyorum ben. */

}

if (hashTablosu[hash(girdi)]->sonrakiOku() == UrunAdres(girdi)) { /* Durum 2: Ürün hash tablosundaki ilk ürüne bağlı ikinci ürün. */

/* Ayrıntılı bilgi için commenti kaldırın. */ printf("Urun hash tablosundan hemen sonra.\n");

gecici2 = hashTablosu[hash(girdi)]->sonrakiOku(); hashTablosu[hash(girdi)]->sonrakiYaz(UrunAdres(girdi)->sonrakiOku()); delete (gecici2);

return 0;

}

/* Durum 3: Ürün başka diyarlarda. */

/* Ayrıntılı bilgi için commenti kaldırın. */ printf("Urun aralarda bir yerlerde.\n");

dolas = hashTablosu[hash(girdi)]->sonrakiOku();

/* Silinecek üründen bir önceki ürünü bulalım. */ while (dolas->sonrakiOku() != UrunAdres(girdi)) { dolas = dolas->sonrakiOku(); }

/* Buraya gelince silinecek üründen bir önecki ürünün bellek adresi dolas olur. */

gecici2 = UrunAdres(girdi); dolas->sonrakiYaz(UrunAdres(girdi)->sonrakiOku()); delete (gecici2);

return 0;

} [/cpp]

Urun_Katalogu.h [cpp] #ifndef URUN_KATALOGU_H_INCLUDED #define URUN_KATALOGU_H_INCLUDED

class URUNKATALOGU {

private: URUN* hashTablosu[100]; int hash(int); public: URUNKATALOGU(); int UrunVarMi(int); URUN* UrunAdres(int); void UrunEkle(URUN ); / int parametresi stok alt limittir. Parametresiz çağırılırsa tüm ürünler listelenir. */ void UrunleriListele(int=-1); void tumUrunTopSatis();

void satilmayanlariListele(char *);

int UrunSil(int);

};

#endif // URUN_KATALOGU_H_INCLUDED [cpp]

<strong>Urun.h</strong> [/cpp] #ifndef URUN_H_INCLUDED #define URUN_H_INCLUDED

class URUN {

private: /* Nesne yerel değişkenleri */ int urun_kodu; char urun_adi[20]; float birim_alis_fiyati; int stok_miktari; URUN *sonraki; SATIS *link;

public: /* Nesne yaratma metodu / URUN(int, char,float,int=0);

/* Getter Metodlar */ int kodOku(); char *adOku(); float alisFiyatiOku(); int stokMiktariOku(); URUN *sonrakiOku(); SATIS *linkOku();

/* Setter Metodlar */ void alisFiyatiYaz(float); void stokMiktariYaz(int); void sonrakiYaz(URUN *); void linkYaz(SATIS *);

/* Ekrana Yazdırma */ void UrunYaz(int=-1); void SatislariListele();

/* Satis Bilgisini Ürüne İşleme */ int satisEkle(SATIS *);

/* Satış BilgileriniHavaya Uçurma */ int satisSil(int);

};

#endif // URUN_H_INCLUDED [/cpp]

Urun.cpp [cpp] #include <iostream> #include <conio.h>

#include "Satis.h" #include "Urun.h" #include "Urun_Katalogu.h"

using namespace std;

URUN::URUN(int a,char b[20],float c,int d) { /* Nesne yaratılırken veriler yerli yerine yerleştirilir. */ int sayac;

urun_kodu = a; for (sayac=0;sayac<20;sayac++) { urun_adi[sayac] = b[sayac]; } birim_alis_fiyati = c; stok_miktari = d; link = NULL; }

int URUN::kodOku() { return urun_kodu; }

char* URUN::adOku() { return urun_adi; }

float URUN::alisFiyatiOku() { return birim_alis_fiyati; }

int URUN::stokMiktariOku() { return stok_miktari; }

URUN* URUN::sonrakiOku() { return sonraki; }

SATIS* URUN::linkOku() { return link; }

void URUN::alisFiyatiYaz(float a) { birim_alis_fiyati = a; }

void URUN::stokMiktariYaz(int a) { stok_miktari = a; }

void URUN::sonrakiYaz(URUN *a) { sonraki = a; }

void URUN::linkYaz(SATIS *a) { link = a; }

void URUN::UrunYaz(int ayrinti) { if (ayrinti == -1) { printf("%9d %20s %12d %17.2f\n",urun_kodu,urun_adi,stok_miktari,birim_alis_fiyati); } else { printf("*** Urun Bilgileri ***\n"); printf("Urun kodu : %d\n",urun_kodu); printf("Urun adi : %s\n",urun_adi); printf("Stok miktari : %1d\n",stok_miktari); printf("Birim alis fiyati: %.2f\n\n",birim_alis_fiyati); } }

int URUN::satisEkle(SATIS *adres) {

/* Bu metod Ödev 3'deki fonskiyonumun nesneli hale dönüştürülmüş halidir. Ödev 3 teslim edildikten sonra kaynak kodunu İnternet'te yayımladığım için başkaları tarafından kullanılıyor olabilir.

Bu yüzden başka bir ödevde bu koda benzer bir kod kullanılıyor olabilir.

Ödev 3'ün Internet'teki konumu: http://www.ubenzer.com/odev-3-baglacli-listeler/ */

SATIS *gezinti; SATIS *onceki;

/* Durum 1: Daha önce satış eklenmemiş olabilir. */

if (link == NULL) { /* daha önce ürün eklemesi yapılmamış. hemen ekliyoruz. */ adres->sonrakiYaz(NULL); link = adres; } else {

/* Durum 2: Yeni eklenen satış şimdiye kadarkilerin en büyüğü olabilir ki ürünler kısmında değişiklik gerekir. / if(strncmp(adres->tarihOku(),link->tarihOku(),6)>0) { adres->sonrakiYaz(link); link = adres; } else { / Durum 3: Yeni eklenen herhangi bir arada ya da en sonda olabilir. / gezinti = link; / Gezintiye ilk kaydın adresini ata */

do { /* Son kayda kadar */

if(strncmp(adres->tarihOku(),gezinti->tarihOku(),6) > 0) {

adres->sonrakiYaz(gezinti); onceki->sonrakiYaz(adres); return 0; }

onceki = gezinti; gezinti = gezinti->sonrakiOku();

} while (gezinti != NULL);

adres->sonrakiYaz(gezinti); onceki->sonrakiYaz(adres); } } return 0; }

void URUN::SatislariListele() {

SATIS *gezinti; char *tarih;

printf("\n"); printf("FATURA NO SATIS TARIHI SATIS MIKTARI BIRIM SATIS FIYATI\n"); printf("--------- ------------ ------------- ------------------\n");

if (link == NULL) { /* heheee çökertemezsiniz / printf("(satis kaydi yok)\n"); } else { gezinti = link; while (gezinti != NULL) { tarih = gezinti->tarihOku(); / dizi sonunda NULL olamdığından bu şekilde okunmazsa sorun çıkarıyor. */ printf(" %6d %c%c%c%c%c%c %13d %18.4f \n",gezinti->faturaNoOku(),tarih[0],tarih[1],tarih[2],tarih[3],tarih[4],tarih[5],gezinti->miktarOku(),gezinti->birimFiyatOku()); gezinti = gezinti->sonrakiOku(); } } }

int URUN::satisSil(int fatno) {

/* Dikkat: Bu metot bir ürüne ait satışlardaki tüm fatura numaralarının farklı olacağı öngörülerek yazılmıştır. */

SATIS *gezinti; SATIS *onceki;

/* Durum 1: Liste zaten boş olablir. / if (link == NULL) { return -1; } else { / Durum 2: Silinecek kayıt ilk kayıt olabiir ki ürünler kısmında değişiklik gerekir. */ if(fatno == link->faturaNoOku()) {

gezinti = link; link = link->sonrakiOku(); delete (gezinti);

} else { /* Durum 3: Silinecek herhangi bir arada ya da en sonda olabilir. / gezinti = link; / Gezintiye ilk kaydın adresini ata */

/* Burada onceki = gezinti'ye ihtiyacım yok, çünkü do while'daki şart ilk girişte KESİNLİKLE sağlanmayacak. */

do { /* Son kayda kadar */

if(fatno == gezinti->faturaNoOku()) {

onceki->sonrakiYaz(gezinti->sonrakiOku()); delete (gezinti); return 0; }

onceki = gezinti; gezinti = gezinti->sonrakiOku();

} while (gezinti != NULL);

/* Buraya kadar geldiyse silinecek eleman bulunamamıştır. */ return -1; } } return 0;

} [/cpp]