-
iOS Eğitimlerine Başlarken...
-
Objective-C Dilinde Kütüphaneler
-
Objective-C'de Sınıf Arayüzü (Class Interface) Nasıl Tanımlanır?
-
Objective-C Dilinde Veri Tipleri, İşlem Operatörleri ve Çeşitli İfadeler
-
Objective-C Dilinde Veri Tipleri, İşlem Operatörleri ve Çeşitli İfadeler Giriş
-
Sabitlerden Oluşan İfadeler
-
int Türü İfadeler
-
float Türündeki İfadeler
-
Gösterge İfadeleri
-
Gösterge İfadeleri ve Değerleri
-
Operatörlerin Öncelikleri ve Birleşme Sıraları
-
İkili Aritmetiksel Operatörler
-
Aritmetiksel Atama Operatörleri
-
İlişkisel Operatörler
-
Mantıksal Operatörler
-
Bit Düzeyinde İşlem Gören Operatörler
-
Öteleme Operatörleri
-
Bit Düzeyinde Mantıksal Operatörler
-
Bit Düzeyinde İşlem İçin Bir Örnek: Sınav Değerlendirme Programı
-
Bit Düzeyinde Atama Operatörleri
-
Cast Operatörü
-
sizeof Operatörü ve Bir Örnek Program
-
Tekli Operatörler
-
Koşul Operatörü
-
Bellek Operatörleri
-
Objective-C Dilinde Veri Tipleri, İşlem Operatörleri ve Çeşitli İfadeler Giriş
-
Kontrol Yapıları
-
Döngü (Loop) Oluşturma
-
Miras Alma (Inheritance), Çok Biçimlilik
-
Ön İşlemci Komutları ve Makrolar
-
Ön İşlemci Komutları ve Makrolar Giriş
-
Basit Makro Tanımları
-
Objective-C Ön İşlemcisi
-
Makrolarda Argümanlar
-
Önceden Tanımlanmış Değerlere Referans Verme
-
Gerçek Parametrelerde Bir Dizi İfadenin Kullanılması
-
Makro Tanımlamada # ve ## Operatörleri
-
Makro Tanımın İptal Edilmesi: undef Komutu
-
Dosya İçeriklerini Programa Katma: include Komutu
-
Şarta Bağlı Derleme İşlemi: #if Komutu
-
#ifdef Komutu
-
#ifndef Komutu
-
#error ve #pragma Direktifleri
-
Ön İşlemci Komutları ve Makrolar Giriş
-
Diziler ve Sözlük Nesneleri
-
Diziler ve Sözlük Nesneleri Giriş
-
Bir Dizi Nesnesi Oluşturmak
-
Dizideki Eleman Sayısını Bulmak
-
Bir Dizi Nesnesinin Elemanlarına Erişme
-
Dizi Elemanlarına Hızlı Numaralama (Fast Enumeration) Yöntemi ile Erişmek
-
Dizi Nesnesine Eleman Eklemek
-
Dizi Nesnesinde Araya Eleman Ekleme
-
Dizi Nesnesinin Bazı Elemanlarını Silme
-
Dizi Nesnelerini Sıralama
-
Diziler ve Sözlük Nesneleri Giriş
-
Fonksiyonlar
-
Fonksiyonlar Giriş
-
Objective C Dilinde Bir Fonksiyonun Yapısı
-
Fonksiyonların Tanımlanması
-
Fonksiyonlarla İlişkili Terimler
-
return Deyimi
-
Fonksiyon Çağrıları ile İlgili Örnek C Programları
-
Fonksiyon Çağırma Teknikleri
-
Fonksiyonları Değer ile Çağırma
-
Fonksiyonları Referans ile Çağırma
-
İki Boyutlu Dizinin Argüman Olarak Gönderilmesi
-
C Dilinde Özyineli (Rekürsif) Fonksiyonlar
-
Fonksiyonlar Giriş
-
Dinamik Bağlama, id Veri Tipi
-
Bellek Sınıfları
-
Dosya İşlemleri
-
Nesne Yönelimli Programlama
-
Algoritmaya Giriş
Objective C ön işlemcisi, her direktifi satır bazında işleme soktuğu için, define direktifi içinde daha önceki bir define ile tanımlanmış bir değere referans verilebilir. Örneğin;
#define BIRIM_UCRET 5
#define NORMAL 40
#define FAZL_MES_SAAT_UCR 8
#define HAFTALIK_CALISMA 47
#define UCRET BIRIM_UCRET*NORMAL+\
(HAFTALIK_CALISMA\
-NORMAL)*FAZL_MES_SAAT_UCR
şeklindeki tanımlamalar geçerlidir. Burada, normal saat ücreti NORMAL ve fazla mesai ücreti de FAZL_MES_SAAT_UCR adlı alanlarda saklanıyor.
Personelin haftalık normal çalışma süresi olan 40 saat NORMAL alanında ve haftalık toplam çalışma süresi (fazla mesai ile birlikte) HAFTALIK_CALISMA alanlarında saklanıyor.
Personelin haftalık ücreti ise UCRET adlı alanda saklanıyor ve
UCRET =BIRIM_UCRET*NORMAL+
(HAFTALIK_CALISMA-NORMAL)*
FAZL_MES_SAAT_UCR
şeklinde hesaplanmak isteniyor.
KOD BLOĞU:
#define BIRIM_UCRET 5
#define NORMAL 40
#define FAZL_MES_SAAT_UCR 8
#define HAFTALIK_CALISMA 47
#define UCRET BIRIM_UCRET*NORMAL+\(HAFTALIK_CALISMA\-NORMAL)*FAZL_MES_SAAT_UCR
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSLog(@"\nUCRET=%i",UCRET);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
UCRET=256
AÇIKLAMA:
Burada beklediğimiz gibi bu personele ait haftalık ücret,
40*5+7*8=256
olarak bulunmuştur.
Ancak bazı durumlarda makro tanımında dikkatli olmalıyız. Örneğin; aşağıdaki örnekte, normal ve fazla mesai saat ücreti aynı kabul edilerek SAAT_UCRETI 10 olarak belirlenmiştir ve
TOPLAM_SAAT=NORMAL+FAZLA
UCRET=TOPLAM_SAAT*SAAT_UCRETI
bağıntıları ile toplam ücret belirlenmek isteniyor. Normal olarak sonucun
TOPLAM_SAAT=40+7=47 ve UCRET=47*10=470
olarak hesaplanması beklenir. Oysa, aşağıda görüldüğü gibi sonuç 110 çıkıyor.
KOD BLOĞU:
#define NORMAL 40
#define FAZLA 7
#define SAAT_UCRETI 10
#define TOPLAM_SAAT NORMAL+FAZLA
#define UCRET TOPLAM_SAAT * SAAT_UCRETI
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSLog(@"\nUCRET=%i",UCRET);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
UCRET=110
Bunun nedeni şudur:
#define TOPLAM_SAAT NORMAL+FAZLA
tanımı ile TOPLAM_SAAT alanına,
40+7
stringi aktarılır.
#define UCRET TOPLAM_SAAT * SAAT_UCRETI
tanımı içinde de TOPLAM_SAAT alanı içine bu string yerleştirilir ve
40 + 7 *10
ifadesine erişilir. Bu ifade içinde çarpma öncelikli olduğu için önce çarpma yapılır ve
40+70=110
değeri hesaplanır. Bunu önlemenin yolu uygun parantezler kullanmaktır. Aşağıdaki düzeltilmiş versiyonu dikkatle inceleyelim:
DÜZELTİLMİŞ VERSİYON:
#define NORMAL 40
#define FAZLA 7
#define SAAT_UCRETI 10
#define TOPLAM_SAAT (NORMAL+FAZLA)
#define UCRET TOPLAM_SAAT * SAAT_UCRETI
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSLog(@"\nUCRET=%i",UCRET);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
UCRET=470
Düzeltilmiş versiyonda, TOPLAM_SAAT yerine (40+7) stringi aktarılır. UCRET yerine ise, (40+7)*10 stringi aktarılır ve hesaplama 47*10=470 şeklinde yapılır.
ÖRNEK:
KARE adlı ve KARE(X) şeklinde tek bir argümanı olan ve bu argümanın karesini hesaplayan bir makro oluşturmak isteyelim. Bu durumda:
#define KARE(x) x*x
şeklindeki bir tanım bize çok doğru ve doğal görünür. Oysa bu makroyu KARE(a+3) şeklinde çağırdığımızda, makro ifadesi
a+3 * a+3
şeklinde bir stringe dönüşecektir. Bunun sonucunda ise hesaplanacak olan şey
a+3*a+3 ya da 4a+3
ifadesi olacaktır. Oysa başlangıçta hesaplamak istediğimiz şey (a+3)2 ifadesiydi. Tamamen farklı ve hatalı bir sonuca varılmış oldu.
Burada da çözüm, uygun parantezleri yerleştirmektir. Aşağıdaki C programı KARE adlı makroyu doğru biçimde tanımlıyor ve örnek bir veri ile birlikte kullanıyor:
KOD BLOĞU:
#define KARE(x) (x) *(x)
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int i;
NSLog(@"\SAYI\tKARESİ\n");
for (i=1; i<=5; i++)
NSLog(@"\n%i\t%i ",i,KARE(i));
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
SAYI KARESI
1 1
2 4
3 9
4 16
5 25