7 Mart 2017 Salı

Standart Kütüphane Fonksiyonları (stdlib.h) - rand()



rand() fonksiyonu rasgele sayı üretmek için kullanılır.
Rasgele sayı üretimi genelde simülasyonlarda ve istatiksel hesaplamalarda kullanılır.
Sembolik sabit RAND_MAX, stdlib.h içinde tanımlanmıştır ve değeri 215-1 dir.





Örnek 2: rand() Fonksiyonu


Standart Kütüphane Fonksiyonları (stdlib.h) - atox()



Katarların(string) Farklı Türlere Dönüşümü


Örnek 1: atox() Dönüşüm Fonksiyonları


C Programlama Hazır Fonksiyonlar

Standart Kütüphane Fonksiyonları (stdlib.h)
Temel Fonksiyon Türleri
Veri dönüşümü
Bazı matematiksel işlemler
Program sonlandırma
Diğer işlemler

Bilgisayarı Kapatma Kodu C



C sistem kaynaklarına direk erişebildiği için C ile farklı mümkündür.
Bu kapsamda kullanılan fonksiyonlardan bir tanesi system dir.

 system("C:\\WINDOWS\\System32\\shutdown /s");



Örnek 4: Dosya Silme



musteri.txt isimli dosya program  tarafından oluşturulacaktır. Daha sonra aşağıdaki ekran çıktısı desteklenecektir.


remove() Fonksiyonu




Bir dosyayı silmek için kullanılır.

int remove (char *dosya-adı);

remove() fonksiyonu dosya-adı parametresi ile gösterilen dosyayı siler.
Başarılı bir şekilde sona erdiğinde 0 değerini, aksi takdirde 0 olmayan bir değer geri verir.

Örnek 3: Rastgele Erişimli Bir Dosyaya Rastgele Veri Yazmak

Aşağıdaki yapıyı tanımlayınız.
typedef struct
{
  int HesapNo;
  char Isim[100];
  float Bakiye;
} stHesap;
musteri.txt isimli dosyaya Hesap No değeri 0 olana kadar Hesap bilgilerinin yazılmasını sağlayın.
Hesap No’ya göre dosyanın konumlanmasını sağlayın. Örn: Hesap No: 4 girilirse ise  kaydı fseek() fonksiyonu ile konumlandırıp,  dosyada 4. sıraya ekleyelim.
Dosyaya yazma işlemi için fwrite() fonksiyonunu kullanın.
Yazma işleminden sonra dosya başına rewind() fonksiyonu kullanarak konumlandırma yapın.
Son olarak dosyadan okuma işlemini fread() fonksiyonu kullanarak gerçekleştirin.




fseek() Fonksiyonu



Şimdiye kadar yazdığımız bütün kodlarda, dosyadan yaptığımız okuma işlemlerini dosyanın başından sonuna doğru bir sıra dahilinde yaptık.
Bu tipte dosya erişimine Sıralı Erişim denilmektedir.
Bunun yanında, fseek() fonksiyonunu kullanarak dosyaların herhangi bir yerindeki bilgi okunabilir.
Bu tipte dosya erişimine Rastgele Erişim denilmektedir.

int fseek (FILE *fp, long ara, int yer);

fp parametresi işlem yapılan dosyayı,
ara parametresi yer ifadesinin gösterdiği değerin tanımladığı dosya konumundan, işlem yapılmak istenen yerin byte olarak uzaklığını verir.
yer parametresi dosyada arama işleminin başlayacağı yeri gösterir.

yer parametresinin alabileceği değerler aşağıdaki gibidir:
SEEK_SET (0) Aramayı dosya başından başlatır.
SEEK_CUR (1) Aramayı aktif konumdan başlatır.
SEEK_END (2) Aramayı dosya sonundan başlatır.

Örnek 2: rewind ve struct Kullanımı

Aşağıdaki yapıyı tanımlayınız.
typedef struct
{
  int HesapNo;
  char Isim[100];
  float Bakiye;
} stHesap;
musteri.txt isimli dosyaya Hesap No değeri 0 olana kadar Hesap bilgilerini yazılmasını sağlayın.
Dosyaya yazma işlemi için fwrite() fonksiyonunu kullanın.
Yazma işleminden sonra dosya başına rewind() fonksiyonu kullanarak konumlandırma yapın.
Son olarak dosyadan okuma işlemini fread() fonksiyonu kullanarak gerçekleştirin.





rewind() Fonksiyonu



Normalde bir dosyaya yazma işlemini tamamladıktan sonra, dosyayı tekrar okumak istediğimizde dosyayı kapatır ve dosyayı okuma modunda tekrar açarız.

fopen("w");
dosyaYazmaIslemleri();
fclose(fp);
fopen("r");
dosyaOkumaIslemleri();
fclose(fp);


Dosya açma kapatma işlemi yerine, bir dosyanın aktif konumunu dosya başına almak için rewind() fonksiyonunu kullanabilir.
    void rewind (FILE *fp);
fp parametresi ile gösterilen dosyanın aktif konum göstergesini dosyanın başına alır.
Bu fonksiyon herhangi bir değer geri vermez. Çünkü, başarılı bir şekilde açılan dosyanın aktif konumu başa alınabilir.

Örnek 1: fread ve fwrite Kullanımı



int veri türünde dizi isimli 5 elemanı bir dizi tanımlayınız.
Dizinin elemanları klavyeden girilerek bir döngü içerisinde doldurulacaktır.
Dizi değerleri deneme.txt isimli bir dosyaya fwrite() fonksiyonu kullanılarak yazılıp ve dosya kapatılacaktır.
Dizi elemanlarının değerlerine bir döngü içerisinde 0 değeri atanıp dizi elemanları ekrana yazdırılacaktır.
Daha sonra deneme.txt dosyasındaki dizi elemanları fread() fonksiyonu  kullanılarak bir döngyşe diziye aktarılır.
Dizi elemanları ekrana yazdırılır.








Diziden veriler dosyaya yazılırken ve dosyadan okunurken işlemleri döngü içerisinde değil tek seferde tamamlayalım.

 



fread() ve fwrite() Fonksiyonları



Verileri dosyaya yazma ve dosyadan okuma işlemlerinde fwrite() ve fread() fonksiyonları da kullanılabilir.
Daha önce kullandığımız fprintf() ve fscanf() fonksiyonları dosyadan veri okuma ve dosyaya veri yazma işlemlerinde veriler üzerinde değişim yaparak çalıştığından, fread() ve fwrite() fonksiyonlarını kullanmak daha pratiktir.


fprintf() fonksiyonunu kullanarak bir dosyaya sayı (int) yazarken, sayının dosyanın ASCII metnine çevrilmesi gerekir.
    fprintf(fptr ,"%d", sayi );

Yine fscanf() fonksiyonu ile bir dosyadan bir sayı okurken, sayının fscanf() fonksiyonunun dahili format yapısına çevrilmesi gerekir.
    fscanf (fptr,"%d", &sayi);


size_t fread ( void *tampon-bellek,
            size_t boyut,
            size_t id1,
            FILE *fp);
fp ile gösterilen dosyadan okunan boyut yapısında id1 kadar değeri tampon-bellek ile gösterilen belleğe atar.
Burada, boyut ifadesi okunan verinin byte olarak değerini, id1 ifadesi ise kaç adet veri okunduğunu belirler.
fread() fonksiyonu okunan veri sayısını geri verir. Bu değer 0 ise, herhangi bir veri okunmamış demektir. Bu durumda, ya bir hata olmuştur ya da dosya sonu gelmiştir.

size_t fwrite (void *tampon-bellek,
            size_t boyut,
            size_t id1,
            FILE *fp);
fwrite() fonksiyonu, fread() fonksiyonunun yaptığı işlemin tam tersini yapar. fwrite() fonksiyonu, tampon-bellek ile gösterilen bellekte bulunan boyut yapısında id1 kadar değeri fp ile gösterilen dosyaya yazar. Burada, boyut parametresi yazılan byte olarak değerini, id1 parametresi ise kaç adet veri yazıldığını belirler.
fwrite() fonksiyonu yazılan veri sayısını geri verir. Sadece bir hata meydana geldiğinde bu değer id1 değerinden az olur.

Örnek 3: Karakter Dizisinin Alt Parçalarını Bulma (substring)


Girilen bir karakter dizisinin istenilen pozisyondan itibaren istenilen karakter sayısı kadar kopyalanmasını sağlayan C programını yazınız.
100 elemanlı dizi isimli bir karakter dizisi tanımlanacaktır.
İlk olarak klavyeden bir karakter dizisi girilecektir. Burada gets() fonksiyonu kullanılarak dizi doldurulacaktır.
Daha sonra dizinin hangi karakterden itibaren kopyalanacağı bilgisi okunaraksayısal pozisyon değişkenine atanacaktır.
Daha sonra kopyalanacak karakter sayısı girilecek ve sayısal uzunluk değişkenine atanacaktır.

Prototipi aşağıdaki gibi olan bir fonksiyon yazılarak kopyalanan değer ekranda gösterilecektir.

char *SubString(char *dizikopya, int pozisyon, int uzunluk)


Örnek 2: malloc() ve calloc() Farkı


Örnek 1: Dinamik Dizi Ortalama Hesabı

Sayısal türde boyutu dinamik olarak dışarıdan girilecek bir dizi tanımlanacaktır (int *dizi).
Dizinin boyutu (n değişkeni) klavyeden kullanıcıya girdirilmeli ve dinamik dizi malloc fonksiyonu kullanılarak oluşturulmalıdır.
Dizi boyutu girildikten sonra dizinin her bir için değerler klavyeden girilmelidir.
Son olarak dizi elemanlarının toplamı ve ağırlıklı ortalamaları yazdırılacaktır.




EKLENTİ
Uygulamanın bir döngü içerisinde çalışması sağlanacaktır.
Dizi boyutu olan n değeri 0 girilmediği sürece uygulama çalışmaya devam etmelidir.

malloc() ve calloc() Farkı



malloc() fonksiyonu tahsis ettiği bellekteki bölgelere herhangi bir ilk değer atama işlemi uygulamaz.
Yani bellekteki değerleri ile beraber size tahsis eder, ilk değer atama işlemi yazılımcıya kalmıştır.
calloc() fonksiyonu bellek tahsisatı yaparken malloc() fonksiyonunu kullanır.
Farklı olarak ayırdığı bellek bölgesini sıfırlamaktadır.


Statik Dizi ve Dinamik Dizi

Statik Dizi
Bir C programı içerisinde, dizilerin boyutu ve kaç elemanlı olduğu program başında belirtilirse, derleyici o dizi için gereken bellek alanını (bölgesini) program sonlanıncaya kadar saklı tutar ve bu alan başka bir amaç için kullanılamaz.
Bu türdeki diziler statik dizi olarak adlandırılırlar.
Statik dizinin boyutu programın çalışması esnasında (run time) değiştirilemez.


Dinamik Dizi

Programın çalışırken bir dizinin boyutu ve eleman sayısı bazı yöntemler kullanılarak değiştirilebilir.
Bu tür dizilere dinamik dizi denir.
Dinamik diziler için gereken bellek bölgesi, derleyici tarafından
işletim sisteminden istenir,
kullanılır ve
daha sonra istenirse bu bölge boşaltılır.

Örneğin:
char ad[20];

İfadesinde derleyici, bellekten 20 byte boyutunda sürekli bir alan tahsis edecektir.
Bu yer tahsisi, program başlatılmadan önce yapılmaktadır.
Yani program çalışırken bu dizinin boyutunu değiştirmeniz mümkün değildir.
Fakat bazı durumlarda (genelde ?) bellekten boyutu sabit olmayan ve sürekli değişebilen yerler tahsis etmemiz gerekecektir.


Örneğin:
Telefon rehberi yazılımı geliştirmek için bellekten tahsis edeceğiniz bölgenin boyutunu önceden tahmin edebilir misiniz?
Her yeni telefon eklentisinde bellekte ayırdığınız yeri büyüterek belleği en verimli şekilde kullanmak durumundasınız.
Yani dinamik bellek yönetimi ile programın çalışma zamanı sırasında (Run-Time)-işletim sistemine danışarak- sürekli bellek bölgeleri tahsis ederiz.



int *dizi; /* dinamik dizi bildirimi */
scanf("%d",&n); /* eleman saysını belirle */

/* n tane bellek bloğu isteniyor */
dizi = (int *) malloc( sizeof(int)*n );

/* Boş yer varmı sorgulanıyor */
if( dizi == NULL )
  printf("Yetersiz bellek alanı\n"), exit(1);
     ...
/* dizi burada kullanılıyor */
/* bellek bloğu boşaltılıyor */
free(dizi);

Dinamik Bellek Yönetimi

Bellek ve Adresleme

Bilgisayarın ana belleği (RAM) sıralı kaydetme gözlerinden oluşmuştur.
Her göze bir adres atanmıştır.
Bu adreslerin değerleri 0 ila belleğin sahip olduğu üst değere bağlı olarak değişebilir.
Örneğin 1GB bir bellek,
1024*1024*1024 = 1073741824 adet gözden oluşur.

Değişken türlerinin bellekte kapladığı alanlar:


Bir programlama dillinde, belli bir tipte değişken tanımlanıp ve bir değer atandığında, o değişkene dört temel özellik eşlik eder:

değişkenin adı
değişkenin tipi
değişkenin sahip olduğu değer (içerik)
değişkenin bellekteki adresi


Örnek:
    int tam = 33;

Bu değişken için, int tipinde bellekte (genellikle herbiri 1 bayt olan 4 bayt büyüklüğünde) bir hücre ayrılır ve o hücreye 33 sayısı ikilik (binary) sayı sitemindeki karşılığı olan 4 baytlık (32 bitlik) karşılığı aşağıdaki gibi yazılır.
    00000000 00000000 00000000 00100001



Örnek:
    int tam = 33;


Bellek adresleri genellikle onaltılık (hexadecimal) sayı sisteminde ifade edilir.
0x3fffd14 sayısı onluk (decimal) sayı sisteminde 67108116 sayına karşılık gelir. Bunun anlamı, tam değişkeni, program çalıştığı sürece, bellekte 67108116. - 67108120. numaralı gözler arasındaki 4 baytlık hücreyi işgal edecek olmasıdır.


tam adlı değişkenin bellekteki gerçek konumu ve ikilik düzendeki içeriği aşağıdaki gibidir:



 
 Yazılım geliştiricinin dikkat etmesi gereken en önemli noktalardan birisi ürettiği yazılımın sistemin kaynaklarını en verimli şekilde kullanması gerekliliğidir.
Nasıl sınırsız kullanıcı talebi olamazsa sınırsız sistem kaynağı da olamaz.
En önemli sistem kaynaklarından birisi de istemci / sunucu tarafında kullanılan BELLEK tir
CPU Türü ve Gücü, Disk Türü, Disk Alanı Boyutu, Toplam Sunucu Sayısı, network bandwidth vb.

Eğer yazılımcı bellek yönetimini iyi yapamıyorsa doğal olarak daha fazla belleğe ihtiyaç duyar.
Daha fazla belleğe ihtiyaç duymak belli başlı birkaç sorunu beraberinde getirir.
Fazla maliyet,
Programın yavaş çalışması
bunların en önemlileridir.

6 Mart 2017 Pazartesi

feof() Fonksiyonu

feof() fonksiyonu yapısı aşağıdaki gibidir:
    int feof (FILE *fp);
Eğer fp ile gösterilen dosyanın sonuna gelinmişse, feof() fonksiyonu 0 olmayan bir değer, aksi takdirde 0 değerini geri verir.

fgetc() fonksiyonu, aşağıda belirtilen 2 farklı durumda, EOF değerini geri verir.
Bir hata meydana geldiğinde
Dosya sonuna gelindiğinde

DİKKAT: feof fonksiyonunu kullanırken sonsuz döngü durumuna düşebilirsiniz. Döngü içerisinde mutlaka ekstra kontrol yapmalısınız.

Örnek 3: feof() Kullanımı


Sizler Oluşturun

 Dosyada harf arama ve kaç tane olduğunu bulma.
Dosyadaki bir harfi başka bir harf ile değiştirme.
Bir dosyanın içeriğini başka bir dosyaya kopyalama.
Dosyada her harfin kaç defa geçtiğini bulup, çoktan aza doğru sıralama.
Dosyanın şifrelenmesi, şifresinin çözülmesi.

Örnek 2: fputc ve fgetc Kullanımı



Klavyeden girilen bir karakter dizisini önce dizi adlı bir karakter dizisine atalım.
Sonra, dizi içeriğini (w) modu ile açtığı dosya1.txt adlı bir metin dosyasına yazıp ve dosyayı kapatalım.
Dosyayı bu kez sadece okumak için (r) modunda açıp, dosya içeriğini okuyup ekrana yazdıktan sonra tekrar dosyayı kapatalım.

Örnek 2: fputc ve fgetc Kullanımı - 1

Örnek 2: fputc ve fgetc Kullanımı - 2


Örnek 1: fputc ve fgetc Kullanımı

fputc() fonksiyonunu kullanarak, her defasında bir karakter olmak üzere, 10 adet 'a' harfini (w) modunda açılan dosyaya yazar.
Bu işlemi bitirdikten sonra, dosyayı kapatır.
Dosyayı (r) modunda açtıktan sonra, her karakteri birer birer dosyadan okuyarak ekrana yazar.


Örnek 1: fputc ve fgetc Kullanımı



Dosya İşlemleri - Bölüm 2


fgetc() ve fputc() Fonksiyonları

Genel yapıları aşağıdaki gibidir:
int fgetc (FILE *fp);
int fputc (int id, FILE *fp);

fputc() fonksiyonu id değişken değeri olan byte'ı fp ile gösterilen dosyaya char olarak yazar. id değişkeni int bir değer olarak tanımlandığı halde, char bir değer olarak çağırabilirsiniz.
Dosyaya yazma işlemi başarılıysa, fputc() fonksiyonu yazılan karakteri değilse EOF değerini geri verir.


fgetc() fonksiyonu, fp ile tanımlanan dosyadaki bir sonraki byte'ı char olarak okur ve int bir değer olarak geri verir.
fgetc() fonksiyonu bir hata durumunda ve dosya sonuna geldiğinde int bir değer olan EOF değerini geri verdiği için, geri verilen değerin kontrolü amacıyla fgetc() fonksiyonu int bir değer geri verir.
Ancak, fgetc() fonksiyonunun geri verdiği değeri int bir değişkene atamanız şart değildir. Geri verilen değeri bir karakter değişkene de atayabilirsiniz.

HTML Örnek ve Sonucu






Web Ticaret Başarısı (Brochureware: Robin's Limousine)



Robin's Limousine web sayfası; 1994 yılında bir ISP'den 16.95 $'a açılan bir web sayfasıdır. (Domain ve Hosting dahil). Bu 16.95$'lık yatırım. Robin'e 1 Milyon $ kazandırmıştır. Bu inanılmaz yatırım mucizesinin 3 temel nedeni vardır.

  • Sitenin basit olmasına rağmen ihtiyaçlara karşılık veriyor olması.
  • Modemle bağlanan bir insanın bile kısa zamanda siteyi açması.
  • O güne kadar görülmemiş bir şekilde kendi ürününü tanıtması. (Tekel)


 Robin's Limousine web sayfası

Genel Dosya Komutları

Bir dosyaya okuma ve yazma yapmak için ilk işlem dosyayı açmaktır.
Dosya açmak için fopen()
Kapatmak için fclose()
Bu fonksiyonlar stdio.h kütüphanesi içerisinde tanımlanmıştır.

Genel olarak dosya açma ve kapatma adımları şu şekildedir.

FILE *pDosya; /* dosya işaretçisi*/
pDosya = fopen(const char dosya_adı,
              const char mod);


fclose(pDosya);



FILE *pDosya; /* dosya işaretçisi*/

ifadesi, pDosya’nın FILE yapısını gösteren bir işaretçi olduğunu belirtmektedir.
C  programı, her dosyayı ayrı bir FILE yapısıyla yönetir.
Yazılımcı dosyaları kullanabilmek için FILE yapısının özelliklerini bilmelidir.


Dosya açma işlemi için kullanılan fopen() fonksiyonundaki mod değişkeni için değişkenler ve tanımları aşağıdaki tabloda belirtilmiştir.











Bir dosyaya erişmek ve üzerinde işlem yapabilmek için ise o dosyanın açılıp açılmadığını test etmek gerekir.




Örnek: Dosyaya Veri Yazma

Kaynak kod üzerinden uygulama
fprintf ve fscanf kullanımı

Dosyalara Giriş



Değişkenler ve diziler içinde depolanan veriler bellekte tutulurlar ve geçicidirler.
Bu türde veriler program sonlandığında bellekten kaybolurlar.
Dosyalar büyük miktarda veriyi kalıcı olarak tutmak için kullanılır.
Bilgisayarlar dosyaları ikincil depolama cihazlarında, özellikle de disk depolama cihazlarında tutarlar.

Dosya ve Akışlar (Stream)


C, her dosyayı basit olarak bitlerin ard arda geldiği bir akış olarak görür.
Her dosya ya dosya sonu belirteci (end-of-file) ya da sistemde yönetici veri yapısı tarafından belirlenmiş özel bir byte sayısı ile sonlanır.
Bir dosya açıldığında, dosya ile ilgili bir akış ilişkilendirilir. Program çalışmaya başladığında, üç dosya ve bu dosyalarla ilişkili akışlar;
standart giriş (standart input)
standart çıkış (standart output)
standart hata (standart error)



Akışlar, dosyalar ile program arasında haberleşme kanalları oluşturur. Örneğin, sta







Standart kütüphane, dosyalardan okuma yapmak ve dosyalara veri yazmak için bir çok fonksiyon sunmaktadır.
fgetc fonksiyonu, getchar gibi, dosyadan bir karakter okur.
fputc fonksiyonu, putchar gibi dosyadan okunan karakteri output olarak ortaya koyar.
fgets ve fputs fonksiyonları dosyadan bir satır okumak ya da dosyaya bir satır yazdırmak için kullanılır.