C Programlama
DR. ŞAFAK KAYIKÇI
C Dili
C, Dennis Ritchie tarafından 1973 yılında Bell laboratuvarlarında geliştirilen yapılandırılmış bir programlama dilidir.
Başlangıçta UNIX işletim sistemini yazmak için geliştirilmiştir. Daha
sonra gömülü sistemler, text editörleri, derleyiciler, aygıt sürücüleri gibi birçok alanda kullanılmıştır.
Diğer programlama dilleri için temel olarak kabul edilir, bu yüzden ana dil olarak bilinir.
C, hem düşük düzey hem de yüksek düzey dillerin özelliğini
desteklediğinden orta düzey bir dil ( mid- level) olarak kabul edilir.
Düşük Düzey (low-level) : Bir makineye özel olarak geliştirilmiş dillerdir.
Makine bağımlıdır. Hızlı çalışır ancak anlaşılması zordur.
Yüksek Düzey (high-level) : Bir makineden bağımsız olarak geliştirilmiş dillerdir. Kolay anlaşılabilir.
C Tarihi
C dili üç farklı yapılandırılmış dilden gelişmiştir:
ALGOL, BCPL ve B Dili.
1989'da dil Amerikan Ulusal Standart Enstitüsü (ANSI) tarafından resmileştirildi. 1990 yılında, C dilinin C89 versiyonu Uluslararası Standart Örgütü (ISO) tarafından onaylandı. C dilinin mevcut en son sürümü 2011'de tanıtılan C11 ‘dir.
C Program Evreleri
Örnek – Hello World
C Keywords
bu kelimeler değişken adları olarak kullanılamaz !
Değişkenler
Yanlızca alfanumerik karakterler (az, AZ, 0-9) ve alt çizgi ( _ ) içerebilir. Türkçe karakterler içermez.
İlk karakteri yalnızca alfabe (az, AZ) veya alt çizgi ( _ ) içerebilir. Değişken adı bir rakamla başlamamalıdır.
Değişken adında boşluk veya boşluklara izin verilmez.
C büyük / küçük harfe duyarlıdır (case sensitive). Örneğin, alan ve Alan C'de iki farklı değişkendir.
Anahtar kelimelerin değişken olarak kullanılmasına izin verilmez.
Noktalı virgül, nokta, beyaz boşluklar, eğik çizgi veya virgül gibi özel karakterlerde değişken içerisinde kullanılmaz.
Aritmetik Operatörler
Operator Açıklama
+ toplama
- çıkarma
* çarpma
/ bölme
% mod (kalan)
++ arttırma operatorü – tamsayı değerini bir (1) arttırır
-- azaltma operatorü –tamsayı değerini bir (1) azaltır
İlişkisel Operatörler
Operator Açıklama
== eşit
!= eşit değil
> büyük
< küçük
>= büyük eşit
<= küçük eşit
Mantıksal Operatörler
Operator Açıklama
&& VE
|| VEYA
! DEĞİL
Bitwise Operatörler
Operator Description
& bitsel VE
| bitsel VEYA
^ bitsel ÖZEL VEYA (XOR)
<< sola kaydırma
>> sağa kaydırma
Bitwise operatörler float veya double veri tipleri için kullanılmazlar !
a b a & b a | b a ^ b
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
Veri Tipleri (Data Types)
tip dönüştürme
boyut ve limitler (sisteme göre değişir)
Örnek : boyut.c
I/O – printf() – scanf()
format açıklama
%d Tamsayıları için
%f Reel sayılar için
%c Karakterler için
%s Katar (String) için. Boşluk karakterine kadar alır.
C Programlama
DR. ŞAFAK KAYIKÇI
Koşullu ifadeler
Belirli şartlara göre ifadelerin yürütme sırasına karar vermek veya belirli kurallar sağlanana kadar bir grup ifadeyi tekrarlamakla ilgilidir.
C dilinde koşullu ifadeler aşağıdaki şekillerde gösterilir:
• if değimi
• switch değimi
• koşullu operatör ifadesi ( ? : operatör )
• goto değimi
If koşulu
if ifadesi, test edilecek koşulların karmaşıklığına bağlı olarak farklı şekillerde uygulanabilir.
1) Basit if ifadesi 2) if....else ifadesi
3) İç içe if....else ifadesi 4) else if ifadesi
Basit if ifadesi
İfade geçerli ise (değeri true), içerideki ifade çalışır, değilse yalnızca dış deyim çalışır.
#include <stdio.h>
void main( ) { int x, y;
x = 15; y = 13;
if (x > y ) {
printf("x y’den buyuk");
} }
if...else ifadesi
İfade dogru ise , block1 çalıştırılır değilse block2 çalıştırılır.
#include <stdio.h>
void main( ) { int x, y;
x = 15; y = 18;
if (x > y ) {
printf("x y’den buyuk");
else { }
printf("y x’den buyuk");
} }
İç içe if....else ifadesi ve else if ifadesi
iç içe if....else else if
Hatırlanacak noktalar
if deyiminden sonra tek bir ifade varsa süslü parantez içine alınmadan kullanılabilir.
int a = 5; if(a > 4) printf("dogru");
‘==‘ if koşulununda karşılaştırma için kullanılmalıdır. ‘=‘ kullanırsanız ifade her zaman doğru değerini döndürür, çünkü karşılaştırma değil atama gerçekleşir.
0 (sıfır) dışında , diğer tüm değerler doğru olarak kabul edilir.
if(27) printf("merhaba");
Örnek : üçlüSayı.c
switch değimi
Switch verilen birçok seçenek arasından yalnızca bir seçim seçmemizi sağlayan bir kontrol
deyimidir. Her seçenekle bir değerin ilişkilendirildiği ve her seferinde yalnızca bir tane seçmeniz gereken menü benzeri bir yapıdır.
switch deyimini kullanma kuralları
1. İfade (switch kelimesinden sonraki) bir tamsayı değeri vermelidir. Yani ifade bir tamsayı veya bir değişken veya bir tamsayı olarak değerlendirilen bir ifade olmalıdır. Karakterde kullanılabilir.
2. case değerleri benzersiz olmalıdır.
3. case değeri iki nokta üst üste ile bitmelidir (:)
4. case ‘den sonraki ifade geçerli herhangi bir C ifadesi olabilir.
Örnek : haftaninGunleri.c
Hatırlanacak noktalar
Karşılaştırma ifadeleri için reel sayılar, stringler kullanmayınız.
break ifadeleri case bloklarından çıkmak için kullanılır. Her bloktan sonra break kullanmak gerekli değildir, ancak kullanmazsanız eşleşen tüm blok ve ondan sonraki bloklar calıştırılır.
default durumu switch case durumlarından hiçbirisi eşleşmediğinde çalışır. switch’ten sonra herhangi bir yere yazılabilir (genellikle en sona yazılır). default durumu yazılmasa bile switch deyimi çalışır.
switch ifadeleri başka bir switch bloğunun içinde olabilir. Ancak, programı daha karmaşık ve daha az okunabilir hale getirdiği için iç içe switch ifadelerinden kaçınılmalıdır.
switch ile if arasındaki fark
if deyimleri float koşullarını değerlendirebilir. switch deyimleri float koşullarını değerlendiremez.
if ifadesi ilişkisel operatörleri değerlendirebilir. switch deyimi ilişkisel operatörleri değerlendiremez, yani switch deyiminde izin verilmez.
Örnekler
1. Math.h fonksiyonları
2. İkinci dereceden köklerin hesaplanması 3. Ödev
C Programlama
DR. ŞAFAK KAYIKÇI
Döngüler
Döngüler, belirli bir koşul sağlanana kadar birtakım işlemleri tekrar tekrar yapmayı sağlar.
Yandaki şemaya göre, Koşulu doğruysa, döngü yürütülür ve yanlışsa yürütme döngüden çıkar. Döngü başarıyla yürütüldükten sonra yürütme tekrar döngü girişinden başlar ve tekrar Test koşulunu kontrol eder ve bu tekrarlamaya devam eder.
Döngüler
C dilinde 3 tip döngü vardır:
1. while döngüsü 2. for döngüsü
3. do while döngüsü
while döngüsü
while döngüsünde kontrol döngüye girmeden önce yapılır. Üç adımda ele alınabilir:
1. değişkene ilk değeri verme (örn: int x = 0; ) 2. koşul (örn: while(x <= 10) )
3. değişken artış veya azalış ( x++ veya x-- veya x = x + 2 )
örn : sayıların 1’den 10’a kadar yazdırılması
for döngüsü
for döngüsü, belirli bir koşul sağlanana kadar bir dizi ifadeyi tekrar tekrar yürütmek için kullanılır.
1. İlk olarak başlangıç değerini değerlendirir.
2. sonra koşul ifadesini kontrol eder.
3. doğruysa, for-loop gövdesini yürütür.
4. daha sonra artış / azalma durumunu değerlendirir ve yine 2. adıma 5. koşul ifadesi yanlış ise döngüden çıkar.
iç içe for döngüsü
do..while döngüsü
Bazı durumlarda, koşul sağlamadan önce önce işlem yapmak gerekir. Bu
durumda koşul yanlış bile olsa, döngü içerisinin en az bir kez çalıştırılacağı anlamına gelir.
Döngülerden Atlama
1) break deyimi
Döngü içinde break deyimiyle karşılaşıldığında, döngüden hemen çıkılır ve program, döngüyü hemen takip eden deyimle devam eder.
increment (arttırma) – decrement (azaltma)
• a++ (a’nın şimdiki değerini denklemde kullan, sonra arttır)
• ++a (önce a’nın değerini arttır, sonra denklemde kullan)
• b-- (b’nın şimdiki değerini denklemde kullan, sonra azalt)
• --b (önce b’nın değerini azalt, sonra denklemde kullan)
Döngülerden Atlama
2) continue deyimi
Denetimin doğrudan test koşuluna gitmesine ve döngü işlemine devam etmesine neden olur.
sonsuz döngüler
for(; ;) {
// birseyler }
while(1) { // birseyler
}
do {
// birseyler }while(1);
Örnek : sayi tahmin oyunu
#include <time.h>
#include <stdlib.h>
srand(time(NULL)); // bir kere çağırılmalı int r = rand();
int between 0 and <RAND_MAX>
16 bit 32767
GNU gcc 2,147,483,647 rand() %6 integers [0,5]
C Programlama
DR. ŞAFAK KAYIKÇI
Fonksiyonlar
Fonksiyonlar belirli bir görevi yerine getiren kod bloklarıdır. Programınızın yapısına modülerlik sağlar, yeniden kullanılabilir hale getirir. Programı daha okunaklı ve anlaşılması kolay kılar. Binlerce kod satırına sahip büyük programlarda, fonksiyonların kullanımı debug ve düzenlemeyi kolaylaştırır.
dönüş tipi fonksiyon ismi giriş parametreleri ( tip1 parametre1, tip2 parametre2,……)gi
fonksiyonun ne tip değer döndüreceğini belirtir.
döndürelecek değer fonksiyon sonunda return ile belirtilir.
herhangi bir değer döndürmemesi durumunda dönüş türü void kullanılır yada boş bırakılır.
fonksiyonun adı olup değişken ismi tanımlamadaki kurallar burada da geçerlidir.
fonksiyona gönderilen
parametrelerin tip ve isimleri belirtilit. Parametre almayanlarda void gönderilir yada boş bırakılır.
örnek
aynı değişken tanımlamalarında oluğu gibi fonksiyonlarında
önceden tanımlanması gerekir. Bu işleme prototip denir.
örn: dört işlem ve kendi header dosyamız
local, global, scope
Recursive (Özyinelemeli) Fonksiyonlar
Rekürsif fonksiyon, içerisinde yada dolaylı olarak kendini çağıran fonksiyondur.
Rekürsif fonksiyonlar, tasarımı kolaylaştırır; ancak, fonksiyon çağırma sayısı ve parametre aktarımı artacağı için bellek alanı gereksinimi de artar.
Çünkü her fonksiyonun çağrılmasında ve parametrelerin aktarılmasında yığın (stack) olarak adlandırılan bellek alanı kullanılmaktadır.
örn : faktöriyel hesabı
C Programlama
DR. ŞAFAK KAYIKÇI
Diziler (Arrays)
Sonlu sayıdaki aynı türde verilerin bitişik hafıza adreslerinde depolanmasıyla oluşturulur.
veri_tipi dizi_adi [eleman_sayisi];
int arr [10];
C dilinde dizi indeksleri 0 ‘dan başlar. İlk elaman arr[0] , son eleman arr[9]
başlangıç indeks: 0 bitiş indeks : n-1
İlk değer verilmesi
//compile time (derleme zamanı) int sonuclar[3] = { 25, 72, 94 };
double a[4] = { 12.0, 6.2, 9.5, 10.0};
//run time (çalışma zamanı) int dizi[10];
for(i=0; i<10; i++) scanf("%d",&dizi[i]);
örnek: aritmetik ortalama ve min max
Karakter Diziler (String - Katar)
String ifadeler karakterlerden oluşan dizilerdir.
char dizi[7] = {'d','e','n','e','m','e','\0'};
char dizi[7] = "deneme";
String ifadeler scanf("%s") yada gets() fonksiyonu ile klavyeden okunabilir. Ancak scanf ile okuma boşluk karakterine kadar olacaktır, sonrasını almaz. gets() tamamını alır.Aynı şekilde ekranda yazdırmak için printf("%s") yada puts() fonksiyonları kullanılabilir.
Tek karakter okumak için scanf("%c") yada getchar() fonksiyonu ile klavyeden okunabilir. Ekranda yazdırmak için printf("%c") yada putchar() fonksiyonları kullanılabilir.
örnek: karakterleri ters yazdırma
Çok boyutlu diziler
Örneğin 3 satır ve 4 sütünlu(3x4=12 elemanlı) bir x matrisinin elemanları şöyle tanımlanabilir:
intx[3][4] = {11,34,42,60, 72,99,10,50, 80,66,21,38};
yadaintx[3][4] = {11,34,42,60, /* 1. satır elemanları */
72,99,10,50, /* 2. satır elemanları */
80,66,21,38}; /* 3. satır elemanları */
örnek: matris çarpım
C Programlama
DR. ŞAFAK KAYIKÇI
String (Katar)
Stringler (katar) yada metin ifadeler, karakterlerden oluşan dizilerdir (character array).
Karakterler tek tırnak ‘ ’ arasında gösterilirken, string ifadeler çift tırnak " " arasında gösterilir.
//gösterim char ad[10];
char *ad;
//ilk değer
char s[5] = {‘i’, ’z’, ’m’, ‘i’, ‘r’, ‘\0’}
char s[5] = "izmir";
char s[] = "Ankara";
char *s = "Ankara";
char cümle[40];
printf("Cumle giriniz: \n");
gets(cumle);
printf("girdiğiniz cümle : \n ");
puts(cumle);
string fonksiyonları
#include<string.h>
strlen(s) s katarın boyutunu döndürür
strcpy(hedef, kaynak) kaynak katarı hedefe katara kopyalar
strncpy(hedef, kaynak,n) kaynak katardan hedefe katara n karakter kadarını kopyalar strcat(hedef, kaynak) kaynak katarı hedef katarın sonuna ekler
strncat(hedef, kaynak,n) kaynak katardan n karakter kadarını hedef katarın sonuna ekler strcmp(s1, s2) iki katarı alfabetik sıraya göre karşılaştırır.
< 0 s1 s2’den küçüktür
> 0 s1 s2’den büyüktür
= 0 s1 s2’ye eşittir
strncmp(s1, s2,n) iki katarın ilk n karakterini alfabetik sıraya göre karşılaştırır
string fonksiyonları
#include<string.h>
strrev(s) s katarının tersini döndürür
strlwr(s) s katarının küçük harfe çevrilmişini döndürür strupr(s) s katarının büyük harfe çevrilmişini döndürür
strstr(s1,s2) s2 katarını s1 katarı içerisinde arar, bulduğu adresi döndürür. (bulamazsa NULL döner) strchr(s,c) c karakterinin s katarı içerisinde ilk geçtiği adresi döndürür. (bulamazsa NULL döner) strrchr(s,c) c karakterinin s katarı içerisinde son geçtiği adresi döndürür. (bulamazsa NULL döner)
örn: StringUygulamalar.c
C Programlama
DR. ŞAFAK KAYIKÇI
Pointer (Gösterici, İşaretçi)
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:
1.değişkenin adı 2.değişkenin tipi
3.değişkenin sahip olduğu değer (içerik) 4.değişkenin bellekteki adresi
Bellek adresi
Bellek adresleri genellikle onaltılık (hexadecimal) sayı sisteminde ifade edilir. 0x3fffd14 sayısı onluk (decimal) sayı sisteminde 67108116 sayına karşıkgelir. 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.
adres %p
Değişkenin saklı olduğu adres, & karakteri ile tanımlı adres operatörü ile öğrenilebilir. Bu operatör bir değişkenin önüne konursa, o değişkenin içeriği ile değil adresi ile ilgileniliyor anlamına gelir.
int tam = 33;
printf("icerik: %d\n",tam);
printf("adres : %p\n",&tam);
çıktısı:
icerik: 33
adres : 3fffd14
Burada birinci satır tam değişkeninin içeriği, ikinci ise adresidir.
Adres yazdırılırken %p tip belirleyicisinin kullanıldığına dikkat ediniz.
Pointer
Göstericilere veriler (yani değişkenlerin içeriği) değil de, o verilerin bellekte saklı olduğu hücrenin başlangıç adresleri atanır. Kısaca gösterici adres tutan bir değişkendir.
tip_adı *gösterici_adı;
char *kr; /* tek bir karakter için */
int *x; /* bir tamsayı için */
float *deger, sonuc; /* değer gösterici tipinde, sonuç sıradan bir gerçel değişkenler */
Pointer
Bir göstericiye, bir değişkenin adresini atamak için adres operatörünü kullanılır.
int *ptam, tam = 33;
.
ptam= &tam;
ptam göstericisinin tam değişkeninin saklandığı adresi tutacaktır.
Pointer
ptam = &tam atamasıyla:
• *ptam ve tam, tam adlı değişkenin içeriği ile ilgilidir.
• ptam ve &tam, tam adlı değişkenin adresi ile ilgilidir.
• *yönlendirme ve & adres operatörüdür.
Örnek: Pointer.c
Gösterici Aritmetiği
Göstericiler kullanılırken, bazen göstericinin gösterdiği adres taban alınıp, o adresten önceki veya sonraki
adreslere erişilmesi istenebilir. Bu durum, göstericiler üzerinde, aritmetik işlemcilerin kullanılmasını gerektirir.
Göstericiler üzerinde yalnızca toplama (+), çıkarma (-), bir arttırma (++) ve bir eksiltme (--) operatörleri işlemleri yapılabilir.
Gösterici Aritmetiği
Aşağıdaki gibi üç tane gösterici bildirilmiş olsun:
char *kar;
int *tam;
double *ger;
Bu göstericiler sırasıyla, bir karakter, bir tamsayı ve bir reel sayının bellekte saklanacağı adreslerini tutar.
Herhangi bir anda, tuttukları adresler de sırasıyla 10000 (0x2710), 20000 (0x4e20) ve 30000 (0x7530) olsun.
Buna göre aşağıdaki atama işelemlerinin sonucu:
kar++;
tam++;
ger++;
sırasıyla 10001 (0x2711), 20004 (0x4e24) ve 30008 (0x7538) olur.
(Not :sisteme göre bu değerler değişebilir)
Gösterici Aritmetiği
Genel olarak, bir göstericiye n sayısını eklemek (veya çıkarmak), bellekte gösterdiği veriden sonra (veya önce) gelen n. elemanın adresini hesaplamaktır.
Buna göre aşağıdaki atamalar şöyle yorumlanır.
kar++; /* kar = kar + sizeof(char) */
tam = tam + 5; /* tam = tam + 5*sizeof(int) */
ger = ger -3; /* ger = ger - 3*sizeof(double) */
Örn: GöstericiAritmetigi.c
C Programlama
DR. ŞAFAK KAYIKÇI
Pass(Call) By Value – Pass(Call) By Reference
Pass-by-reference demek parametrenin gerçek adresini göndermek anlamına gelirken pass-by-value ise sadece değerini bir göndermek ile geçmek şeklinde tanımlanabilir.
Örn: cubeByValueAndByReference
Pointer ile Dizi İlişkisi
C dilinde göstericiler ve diziler arasında yakın bir ilişki vardır. Bir dizinin adı, dizinin ilk
elemanının adresini saklayan bir göstericidir. Bu yüzden, bir dizinin herhangi bir elemanına gösterici ile de erişilebilir. Örneğin:
int dizi[5], *p, *q;
şeklinde bir bildirim yapılsın. Buna göre aşağıda yapılan atamalar geçerlidir:
p = &dizi[0]; /* birinci elemanın adresi p göstericisine atandı */
p = dizi; /* birinci elemanın adresi p göstericisine atandı */
q = &dizi[4]; /* son elemanın adresi q göstericisine atandı */
İlk iki satırdaki atamalar aynı anlamdadır. Dizi adı bir gösterici olduğu için, doğrudan aynı tipteki bir göstericiye atanabilir.
Pointer ile Dizi İlişkisi
i bir tamsayı olmak üzere,
dizi [i] ile *(p+i) aynı anlamdadır.
Bunun sebebi, p göstericisi ile dizinin başlangıç adresini tutmuş olmasıdır.
p+i ile i+1. elemanın adresi ve *(p+i) ile de bu adresteki değer hesaplanır.
Pointer ile Dizi İlişkisi
Bir dizinin, i. elemanına erişmek için *(p+i) işlemi yapılması zorunludur. Yani
*p+i; /* p nin gösterdiği değere (dizinin ilk elemanına) i sayısını ekle */
*(p+i); /* p nin gösterdiği adresten i blok ötedeki sayıyı hesapla */
anlamındadır. Çünkü, * operatörü + operatörüne göre işlem önceliğine sahiptir.
Örnekler : PointerDizi , StringUygulama
C Programlama
DR. ŞAFAK KAYIKÇI
Yapılar (Struct)
C dilinde kullanıcı tanımlı bir veri tipidir ve farklı türdeki verileri bir araya getirmemizi sağlar.
Üyelerin oluşturduğu bir bütündür ve üyelerin her biri farklı veri tipinde olabilir Veriler kayıt şeklinde saklanır .
struct yapı_adı{
tip değişken1;
tip değişken2;
... };
Örn : Struct1.c
Struct Pointer
Yapılarda da gösterici tanımlanabilir. Ancak, bir yapı gösteren göstericinin, gösterdiği yere yönlendirme operatörü, ->, ile erişilir.
Örn: Struct2.c
Struct Gösterimleri
struct Ogrenci { char isim[25];
int yas;
char okul[10];
char gender;
};struct Ogrenci O1, O2;
struct Ogrenci { char isim[25];
int yas;
char okul[10];
char gender;
}O1, O2;
typedef struct { char isim[25];
int yas;
char okul[10];
char gender;
}Ogrenci;
Ogrenci O1;
Struct Dizileri ve İç içe Yapılar
Tıpkı int, float diziler gibi struct dizilerde tanımlanabilir. Dizinin her elamanı bir struct değişkeninden oluşur.
Bir struct içinde bir başka struct tanımlanabilir.
Örn : Calisanlar.c
Union(Birlikler)
Birlikler yapılara göre seyrek kullanılır. Bir programda veya fonksiyonda değişkenlerin aynı bellek alanını paylaşması için ortaklık bildirimi union deyimi ile yapılır. Bu belleğin daha verimli
kullanılmasına imkan verir.
Örn : Union.c
enum
Değişkenin alabileceği değerlerin belli (sabit) olduğu durumlarda programı daha okunabilir hale getirmek için kullanılır.
enumtip_adı{değer_1, değer_2, ..., değer_n} değişken_adı;
hiç değer verilmezse 0’dan başlar
enum renkler {kirmizi, mavi, sari} renk;
Orn: Enum
C Programlama
DR. ŞAFAK KAYIKÇI
Dosya Yönetimi
Genel olarak, dosya açma kapama adımları şu şekildedir:
FILE *dosya; /* dosya göstericisi */
dosya = fopen(const char dosya_adı, const char mod);
... dosya işlemleri ...
fclose(dosya);
Dosya Açma Modları
Path
Dosya ile ana program aynı dizin içinde olmalıdır. Aksi halde, dosyanın tam yolu bildirilmelidir.
Örneğin dosyanın yolu: C:\WINDOWS\DESKTOP\deneme.dat ise dosya açılırken yaz = fopen("C:\\WINDOWS\\DESKTOP\\deneme.dat", "w");
şeklinde açık yol bildirilmelidir. Aynı işlem Linux ortamında da geçerlidir.
yaz = fopen("/home/SAFAK/deneme.dat","w");
gibi.
Metin (text) ve ikili (binary)Dosyalar
•İşletim sistemlerinde genelde iki çeşit dosya kullanımına rastlanmaktadır. Bunlar metin (text) ve ikili (binary) dosyalar olmak üzere ikiye ayrılır. Dosyanın hangi türden olduğu açılırken fopen() fonksiyonu ile belirtilebilir.
•Açılış modunda metin dosyaları için t, binary dosyalar için b eklenir. Örneğin "r+t" şeklinde bir açılış modu var olan bir dosyanın okuma yazma ve metin olarak açılacağı anlamına gelir. Benzer olarak "wb" açılış modudosyanın binary modda oluşturulacağını gösterir. Fakat bu belirleme yapılmamışsa, varsayılan açılış modu metindir (yani t).
Dosya Fonksiyonları
Örnek
Dosyaya veri yazma : Ornek: DosyaYazma.c
Kitap dosyası daha önce oluşturulmuşsa önceki verileri silip yerine yeni verileri yazacaktır. Bu dosyaya yeni bir veri eklemek için fopen() fonksiyonunu 'a' moduile kullanılmalıdır.
Dosyadan veri okuma:
Ornek: DosyaOkuma.c
C Programlama
DR. ŞAFAK KAYIKÇI
Dinamik Bellek Yönetimi
int array[10]; //Compile Time
Bazı durumlarda, boyutları önceden bilmek zordur, limitler az gelebilir vs.
Dinamik Bellek Yönetimi ile çalışma anında (Run Time), bellek arttırılabilir yada kullanılmayan bellek boşaltılabilir.
int* array= malloc(10 * sizeof(int));
malloc()
malloc= "memory allocation"
ptr=(cast-type*)malloc(byte-size) ptr=(int*)malloc(100*sizeof(int));
Integer boyutuna (4 byte) göre hafızada 400 byte yer ayıracak ve ilk byte değerinin adresini dönecektir. Bellek tahsisi gerçekleşmemişse, NULL döner.
calloc()
calloc= " contiguous allocation "
ptr=(cast-type*)calloc(n,element-size);
ptr=(float*)calloc(25,sizeof(double));
Hafızada 25 elemanlık, her birinin boyutu double( 8 byte) olacak şekilde bir dizi ayıracaktır.
calloc fonksiyonu kullanıldığı anda, dizinin tüm elemanları sıfıra eşitlenir.
free()
malloc() yada calloc() ile ayıran belleklerin, kullanımı bittikten sonra boşaltılması amacıyla kullanılır.
free(ptr);
Örnek : Memory.c
realloc()
Eğer daha önceden ayrılan bellek yeterli değilse yada gereğinden fazlaysa, realloc kullanılarak yeniden boyutlanabilir.
ptr=realloc(ptr,yeniboyut);
• Eğer ptr işaretçisi NULL ise, realloc malloc ile aynı işlevi görecektir.
• Eğer boyut 0 ise ve ptr NULL değilse, ptr’nin işaret ettiği bellek alanı serbest bırakılır.
Örnek : Realloc.c
C Programlama
DR. ŞAFAK KAYIKÇI
Çalıştırma Parametreleri
Program çalıştığında aktarılan bir parametrelerdir. Çoğunlukla programınızı dışarıdan kontrol etmeniz gerektiğinde kullanılır. Komut satırı bağımsız değişkenleri main() fonksiyonuna iletilir .
int main(int argc, char *argv[])
argc komut satırındaki bağımsız değişken sayısıdır.
argv[ ] char dizi tipinde parametreleri gösteren işaretçidir.
argv[0] programın adını tutar
argv[1] ilk parametreyi tutar
Herhangi bir argüman sağlanmazsa argc değeri 1 olacaktır.
Örn : Paramatreler.c