• Sonuç bulunamadı

C Programlama DR. ŞAFAK KAYIKÇI

N/A
N/A
Protected

Academic year: 2022

Share "C Programlama DR. ŞAFAK KAYIKÇI"

Copied!
90
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

C Programlama

DR. ŞAFAK KAYIKÇI

(2)

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.

(3)

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.

(4)

C Program Evreleri

(5)

Örnek – Hello World

(6)

C Keywords

bu kelimeler değişken adları olarak kullanılamaz !

(7)

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.

(8)

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

(9)

İ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

(10)

Mantıksal Operatörler

Operator Açıklama

&& VE

|| VEYA

! DEĞİL

(11)

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

(12)

Veri Tipleri (Data Types)

(13)

tip dönüştürme

(14)

boyut ve limitler (sisteme göre değişir)

Örnek : boyut.c

(15)

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.

(16)

C Programlama

DR. ŞAFAK KAYIKÇI

(17)

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

(18)

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

(19)

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");

} }

(20)

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");

} }

(21)

İç içe if....else ifadesi ve else if ifadesi

iç içe if....else else if

(22)

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

(23)

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.

(24)

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

(25)

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.

(26)

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.

(27)

Örnekler

1. Math.h fonksiyonları

2. İkinci dereceden köklerin hesaplanması 3. Ödev

(28)

C Programlama

DR. ŞAFAK KAYIKÇI

(29)

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.

(30)

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ü

(31)

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ı

(32)

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ü

(33)

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.

(34)

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.

(35)

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)

(36)

Döngülerden Atlama

2) continue deyimi

Denetimin doğrudan test koşuluna gitmesine ve döngü işlemine devam etmesine neden olur.

(37)

sonsuz döngüler

for(; ;) {

// birseyler }

while(1) { // birseyler

}

do {

// birseyler }while(1);

(38)

Ö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]

(39)

C Programlama

DR. ŞAFAK KAYIKÇI

(40)

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.

(41)

ö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

(42)

local, global, scope

(43)

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ı

(44)

C Programlama

DR. ŞAFAK KAYIKÇI

(45)

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

(46)

İ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

(47)

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

(48)

Ç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

(49)

C Programlama

DR. ŞAFAK KAYIKÇI

(50)

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);

(51)

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

(52)

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

(53)

C Programlama

DR. ŞAFAK KAYIKÇI

(54)

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

(55)

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.

(56)

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.

(57)

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 */

(58)

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.

(59)

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

(60)

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.

(61)

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)

(62)

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

(63)

C Programlama

DR. ŞAFAK KAYIKÇI

(64)

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

(65)

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.

(66)

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.

(67)

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

(68)

C Programlama

DR. ŞAFAK KAYIKÇI

(69)

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

(70)

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

(71)

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;

(72)

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

(73)

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

(74)

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

(75)

C Programlama

DR. ŞAFAK KAYIKÇI

(76)

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);

(77)

Dosya Açma Modları

(78)

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.

(79)

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).

(80)

Dosya Fonksiyonları

(81)

Ö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

(82)

C Programlama

DR. ŞAFAK KAYIKÇI

(83)

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));

(84)

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.

(85)

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.

(86)

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

(87)

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

(88)

C Programlama

DR. ŞAFAK KAYIKÇI

(89)

Ç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 .

(90)

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

Referanslar

Benzer Belgeler

Interpreter Pattern Iterator Pattern Mediator Pattern Memento Pattern Observer Pattern State Pattern Strategy Pattern Template Pattern Visitor Pattern...

3 lamba otomatik olarak 15,30,45 dakikada bir sinyal vermektedir. Çevreleri 48 metre ve 160 metre olan tarlaların ke- narlarına meyve ağaçları dikilecektir. Boyutları 40

2 RR Döndürme Yeni düğüm, kritik düğümün sağ alt ağacının sağ alt ağacına ekleniyorsa 3 LR Döndürme Yeni düğüm, kritik düğümün sol alt ağacının sağ alt ağacına

E) Yer altından gelen sular içinde çözülmüş halde bulunan kalsiyum karbonatın çökelmesiyle Pamukkale travertenlerinin oluşması.. Yer kabuğunu oluşturan bütün

 «Açıklanan nedenlerle, …ihlal iddiasının konusunun, Anayasa’da güvence altına alınmış ve AİHS kapsamında yer alan temel hak ve özgürlüklerin koruma

Yazilim Güvenliği Sızma Belirleme Güvenlik Araçları.. Biyometrik Güvenlik

Dersin İçeriği Bu ders, ebelik mesleğinde karşılaşılan adli konulara ilişkin genel teorik bilgiyi ve konulara ilişkin vaka örnekleri analizlerini içermektedir.. Dersin

Ama ilerleyen zamanda, Kuantum Fiziði ve onun açtýðý yoldan gidecek olan belki daha baþka bilim dallarý, insanýn ve evrenin maddeden ibaret olmadýðý gerçe- ðini, inkar