💻 Bilgisayar, 💾 Programlama

Ödev 4: Doğrudan Erişimli Dosyalarda Hashing ve Bağlaçlı Liste Yaklaşımı

14 Nisan 2008 tarihinde aldığımız, daha adından acılı bir ödev olacağı belli olan Doğrudan Erişimli Dosyalarda Hashing ve Bağlaçlı Liste Yaklaşımı ödevi için teslim ettiğim kaynak kod. Ödevde Vecdi Hoca’nın Ayrık’ta anlattığı Recursive (kendini çağıran fonksiyon) Algorithm kullanmayı denedim. Ödev zaten karışıktı, iyice karıştı ve ben programın yazarı olarak bile neyin ne işe yaradığını bazen anlayamıyorum. Ama buna rağmen programda hata göremedim, sorunsuz gibi gibi geldi bana.

Not: Ödevim içinde kaç tane fseek, fwrite fread var ben bile sayamadım. =)
Not 2: Ne zaman algoritma ödev kağıtlarındaki

“Ödevin değerlendirmesinde; programın doğru ve eksiksiz çalışmasının yanında etkinlik, yapısal ve modüler programlama ilkelerine uygunluk ta dikkate alınacaktır. Global değişken kullanılmaması ve fonksiyon kullanımı özellikle önemlidir.”

ta kelimesi (?) fark edilip düzeltilecek bir buçuk dönemdir heyecanla beklemekteyim.

Kaynak kodunu incelemek ve fikir sahibi olmak amacıyla kullanabilirsiniz. Ama lütfen kaynak kodunu kopyala yapıştır yapmayalım, kendimize mal etmeyelim. Onun yerine nasıl çalıştığını inceleyip kavrama yoluna gidelim.

Sınav dönemine geldik. Haydi hayırlısı.

Kaynak kodunu indirmek istemezseniz, bir kopyasına aşağıdan ulaşabilisiniz.

#include
#include

#define URUN_NO_MIN 1
#define KAYIT_SAY 100
#define STOK_LIMIT_MIN 0
#define ALIS_FIYAT_MIN 0
#define LINK_AYNI -2
#define LINK_GONDER -3

/* Sabitler ve Anlamlari */
/* ——————— */
/* URUN_NO_MIN : Ürün numarasının alabileceği en düşük değer. (negatif değeler özel parametre-
lere karşılık gelebileceği için tercih edilmemelidir.)
KAYIT_SAY : Hash fonksiyonu ile gidilecek, ilk başta yaratılan kısım. Bu değer oynanarak
ilk başta ne kadar boş kayıt olacağı değiştirilebilir.
DİKKAT: Dosyalar yaratıldıktan sonra bunu değiştirmeniz sorun çıkartır.
STOK_LIMIT_MIN : Stok değerinin alabileceği minimum değerdir. Programda depoda olmayan bir ürünün
satılamayacağı düşünülerek bu sabit 0 alınmıştır. Ancak stok değerinin – değer-
lere de düşmesi isteniyorsa bu değer değiştirilebilir.
ALIS_FIYAT_MIN : Birim alış/satış fiyatlarının alabileceği minimum değeri belirler. Bir ürünün
en fazla bedava satılacağı (o da nedense) düşünülmüş ve programda 0 ayarlanmıştır.
Ama eğer ürünü satıp üstüne de para verilmesi isteniyorsa bu değişken her türlü
sayı yapılabilir.
LINK_AYNI : urun_duzenle fonksiyonuna değiştirilen girdideki link değerinin değiştirilmemesi
gerektiğini söyleyen sembolik sabittir.
LINK_GONDER : urun_duzenle fonksiyonuna gönderildiğinde fonksyinonun urun_kodu ile gönderilen
ürüne ait link değerini geri döndürmesini sağlar.

*/

/* Yapılar */
struct URUN_YAPI {
int urun_kodu;
char urun_adi[20];
float birim_alis_fiyati;
int stok_miktari;
int sonraki;
int link;
};

struct SATIS_YAPI {
char fatura_no[6];
char satis_tarihi[6];
int satis_miktari;
float birim_satis_fiyati;
int sonraki;
};

/* Kullanıcı tanımlı tipler */
typedef struct URUN_YAPI URUN;
typedef struct SATIS_YAPI SATIS;

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

int hash(int urun_kodu) {
return (urun_kodu % KAYIT_SAY) + 1;
}

int urun_var_mi(int urun_kodu,int kayit_no, int link_yolla) {

/* Ürünün olup olmadığını kontrol eder. Aşağıdaki değerlerden birini dönüdürür. */

/* 0: Urun yok. */
/* -1: Dosya açılamadı. */
/* -2: Urun var. */

FILE *fp;
URUN oku;

if ((fp=fopen (“urunler.dat”,”rb+”))== NULL) {
printf(“Urunler.dat acilamadi. Gidiyorum ben.”);
return -1;
}

if (kayit_no == -1) { /* Eğer fonksiyona ilk defa geldiysek hash ile asıl kaydı kontrol etmeliyiz. */
fseek(fp,(hash(urun_kodu) – 1) * sizeof(URUN),0);
} else {
fseek(fp,(kayit_no) * sizeof(URUN),0); /* Eğer fonksiyon kendini çağırdıysa dosya sonuna gidip bağlayacağız. */
}

fread(&oku,sizeof(URUN),1,fp);

if (oku.urun_kodu == urun_kodu) {

fclose(fp);
if (link_yolla == 0) { /* Eğer link numarasını gönderme parametresiyse çağrıldıysa */
return oku.link;
} else {
return -2;
}
}

if (oku.urun_kodu == -1) {
fclose(fp);
return 0;
} else {
if (oku.sonraki == -1) {
fclose(fp);
return 0;
} else {
fclose(fp);
return urun_var_mi(urun_kodu, oku.sonraki, link_yolla);
}
}
}

int urun_ekle(int urun_kodu, char urun_adi[20], float birim_alis_fiyati, int stok_miktari, int kayit_no) {

/* Adı üstünde: Ürün ekler */
/* 0: Başarılı. */
/* -1: Dosya açılamadı. */

FILE *fp;
URUN oku;
int sayac;
int gecici_konum;

if ((fp=fopen (“urunler.dat”,”rb+”))== NULL) {
printf(“Urunler.dat acilamadi. Gidiyorum ben.”);
return -1;
}

if (kayit_no == -1) { /* Eğer fonksiyona ilk defa geliysek hash ile asıl kaydı kontrol etmeliyiz. */
fseek(fp,(hash(urun_kodu) – 1) * sizeof(URUN),0);
} else {
fseek(fp,kayit_no * sizeof(URUN),0); /* Eğer fonksiyon kendini çağırdıysa dosya sonuna gidip bağlayacağız. */
}

fread(&oku,sizeof(URUN),1,fp);

if (oku.urun_kodu == -1) {
/* Burası boş, yazabiliriz. */

/* Gerekli atamalar */
oku.urun_kodu = urun_kodu;

for (sayac=0;sayac= 0 && strncmp(oku.satis_tarihi,ust_limit,6)

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

Ödev 4: Doğrudan Erişimli Dosyalarda Hashing ve Bağlaçlı Liste Yaklaşımı 4 yorum aldı.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir