proje3
💻 Bilgisayar, 💾 Programlama

Proje: C++ ve Nesneye Dayalı Programlama

proje3…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.

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

#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("https://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;
}

Satis.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;
}

Satis.h

#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

Urun_Katalogu.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;

}

Urun_Katalogu.h

#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>

#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

#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:
        https://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;

}
👋 🚨 Yeni yazılardan haberdar olmak ister misiniz? 👇

Proje: C++ ve Nesneye Dayalı Programlama 10 yorum aldı.

  1. “Proje” TDK nın dediğine göre Fransızca kökenli olup İngilizcede de kullanılıyor. Büyük ihtimalle Türkçemize İngilizceden girdi. Esası “Project” . Türkçesi de “tasarı” veya “düşünce” denebilir. En azından başlıkalrda duyarlılık gösterelim 🙂

  2. Tasarı ya da düşünce dersem, bize Proje adı altında verilen bu programın bize verilen program olduğunu Ege’liler anlamakta zorluk çekecekler. Çok sık kullanılan bir kelime olduğu için kullandım ve geçtim. Türkçe sözlükte de yer aldığına göre sorun yok diye düşünüyorum. 🙂

  3. Allah bu benim yapmadığım proje değil mi? 🙂 Hocada açık açıkda söyledi projeyle ilgili finalde soru gelir diğe.Hoş söylemesede geliceğini biliyorum.Çok işime yarıyacak bu teşekkürederim.

  4. Dosyaları rar ya da zip yapıp verene kadar her birini tek tek verirsen google indekslediği zaman yardım arayan birinin ulaşması daha kolay olur…

    .pdf, .doc, .txt, .c, .cpp dosyalarının içini bile indeksliyor nasıl olsa google amca…

  5. Mantıklı. Bundan sonraki kod paylaşımlarımda, abartılı dosya büyüklüğü ve aşırı sayıda dosya olmadığı sürece hem zip’li hem de ayrı ayrı sunacağım.

    Hem Google amca (ve buna bağlı olarak ben [oooh gelsin pageranklar 😀 ]) mutlu olur(uz), hem de insanlar hala tek tıkla dosyaları çekmeye devam eder.

    Önerin için teşekkür ettim, işime yarayacak.

    =)

  6. s.a. kolay gelsin ..
    7 dosya var gördüğüm kadarıyla , main dosyasını açıp .h uzantılarını da include dosyasını içine atıp çalıştır dediğim zaman neden aynı hatayı veriyor sürekli :s
    yardımcı olabilir misiniz ,dev c++ 4.9.2.2

  7. Ben bunu visual studio da çalıştıramıyorum nedendir acaba? ayrıca bu programda kullanıcı ara yüzü var mı?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir