if deyimi, Objective C dilinde şartlı dallanma (conditional branching) adı verilen işlemi gerçekleştiren bir deyimdir. Şartlı dallanma, herhangi bir programlama dili için temel kontrol yapısıdır.
Şartlı dallanma işlemi sayesinde bir program, karar alma olanağına kavuşur. Bir ifadenin sonucuna göre, bir komutlar dizisinin çalıştırılıp çalıştırılamayacağına karar verebilir.
İfadenin değeri bir çalıştırma eyleminden diğerine değişebileceğinden, bu özellik bir programa değişik verilerle farklı şekillerde davranma olanağı sunar. Objective-C dilinde şartlı dallanma if ve else anahtar sözcükleriyle gerçekleştirilir.
if deyiminin en basit şekli için yazılış şekli aşağıdaki gibidir:
if (ifade) deyim1;
deyim2;
Burada ifadenin değeri doğru (true) ise deyim1 çalıştırılır, daha sonra çalıştırma sırası deyim2’ye geçer. İfadenin değeri yanlış (false) ise, bu durumda da doğrudan deyim2’ye geçilir. Yani ifadenin değeri yanlış ise deyim1 çalışmayacaktır.
Aşağıda if yapısını açıklayan bir akış diyagramı verilmiştir:
Objective C’de, doğru ve yanlışın ne anlama geldiğini belirtmekte yarar var.
Objective C ‘de, doğru karşılığı olarak, hem boolean türünde YES hem de sayısal olarak 0’dan farklı bir değer geçerlidir.
İfadenin yanlış (false) olması içinse ya değerinin boolean türünde NO olması ya da sayısal olarak 0 olması gerekir.
if deyimi else ile birlikte kullanılırsa aşağıdaki yazılış biçimi kullanılır:
if (ifade) deyim1 ;
else deyim2;
deyim3;
...
Bu durumda, ifadenin değeri doğru ise deyim1 çalıştırılır ve sonra deyim3’e geçilir. İfadenin değeri yanlış ise, bu durumda da deyim1 atlanarak doğrudan else’i izleyen deyim2’ye geçilerek bu çalıştırıldıktan sonra da deyim3 ile devam edilir.
Bu yapıya ilişkin aşağıdaki akış diyagramına göz atalım:
if deyiminde, ifadenin değeri doğru olduğu zaman sadece deyim1 gibi tek bir deyim değil de bir deyimler grubunun çalıştırılması isteniyorsa, bu durumda bu deyimler grubu { } sembolleri ile blok içine alınmalıdır:
if(ifade)
{ deyim1;
deyim2;
..
deyim_n; }
deyim_x;
..
Bu durumda ifade doğru ise deyim1, deyim2 ... deyim_n ile belirtilen deyimler grubunun tümü çalıştırılarak deyim_x’e geçilir; ifade yanlış ise de bu durumda if’e ait deyimler bloğu atlanarak doğrudan deyim_x’e geçilecektir.
Aynı şey if else yapısı için de söz konusudur:
if(ifade) {
Deyim1;
Deyim2;
..
deyim_n;}
else {
deyim_n+1;
deyim_n+2;
..
deyim_m;
}
deyim_k;
...
Yukarıdaki yapıda ifade doğru ise deyim1, deyim2 ... deyim_n çalıştırılarak deyim_k’ya geçilecek, ifade yanlış ise bu durumda da if içindeki deyimler atlanarak sadece deyim_n+1, deyim_n+2 ... deyim_m çalıştırılarak sıra daha sonra deyim_k’ya gelecektir.
ÖRNEK PROGRAM 1:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int t,c;
t=1;
NSLog(@"\n4>3=%d ", 4>3);
NSLog(@"\n4<3=%d ", 4<3);
if(t)
{
int b=6;
NSLog(@"\nb=%i ", b);
t=0;
}
if(t)
{
c=12;
}
else
{
c=-6;
}
NSLog(@"\nc=%i ", c);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
4>3=1
4<3=0
b=6
c=-6
ÖRNEK PROGRAM 2:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int a;
NSLog(@"BİR SAYI GİRİNİZ.. ");
scanf("%i",&a);
if(a>10)
{
NSLog(@"GIRDIGINIZ SAYI 10'DAN BUYUKTUR");
}
[pool drain];
return 0;
}
Program çalıştığında şu çıktıyı elde ederiz:
Bu çok basit ve kısıtlı programda kullanıcı klavyeden 10’dan daha büyük bir sayı girdiğinde, program yukarıdaki çıktıda görülen mesajı verir; fakat 10 ya da daha küçük bir sayı girerse bu durumda herhangi bir mesaj görüntülenmez.
ÖRNEK PROGRAM 3:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int a;
NSLog(@"BİR SAYI GİRİNİZ.. ");
scanf("%i",&a);
if(a>10)
{
NSLog(@"GIRDIGINIZ SAYI 10'DAN BUYUKTUR");
}
else
{
NSLog(@"GIRDIGINIZ SAYI 10'DAN KÜÇÜK YA DA 10’A EŞİTTİR");
}
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
Bu programda, klavyeden 10’dan büyük bir sayı girilirse, aşağıdaki çıktı elde edilir;
10 ya da daha küçük bir sayı girilirse de aşağıda gördüğümüz gibi bir mesaj elde edilir;
Böylece if-else yapısıyla daha kapsamlı bir kontrol işlemini gerçekleştirilebileceğimizi söyleyebiliriz.
PROBLEM:
f(x) ve g(x) fonksiyonları;
x>0 ise f(x)=5/(3+ln(x)) ve g(x)=6/(3x+ln(x))
x≤0 ise f(x)=2/(4+x2) ve g(x)=4/(5+x+ x2 )
şeklinde tanımlanmaktadır.
Değeri klavyeden girildiğine göre f(x) ve g(x)’i hesaplatan ve yazdıran bir Objective C programı yazalım.
#import <Foundation/Foundation.h>
#include <math.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
double x,f,g;
NSLog(@"x degeri..");
scanf("%lf",&x);
if(x>0)
{
f=5.0/(3+log(x));
g=6.0/(3*x+log(x));
}
else
{
f=2.0/(4.0+x*x);
g=4.0/(5.0+x+x*x);
}
NSLog(@"f(x)=%f", f);
NSLog(@"g(x)=%f", g);
[pool drain];
return 0;
}
Aşağıda iki farklı değer için programın vereceği çıktıları görüyoruz:
log fonksiyonu; e tabanına göre logaritma ya da tabii logaritma hesaplayan Objective C ya da C fonksiyonudur. 10 tabanına göre logaritma içinse, log10 fonksiyonu mevcuttur. Her iki fonksiyon için de program içine <math.h> adlı başlık dosyasını (kütüphanesini) katmamız gerekir.
PROBLEM:
Bir satış elemanının sattığı ürün miktarına göre alacağı günlük ücret aşağıdaki gibi belirleniyor:
Günlük satış miktarı 50’den az ise 40,000,000TL tutarındaki sabit ücrete, satılan ürün başına 500,000 TL değerinde prim eklenerek günlük ücret belirlenir.
Günlük satış miktarı 50 ya da daha fazla ise, bu durumda günlük sabit ücret 5,000,000 TL alınarak satılan ürün başına da ilk 50 ürün için 50,000TL, 50’yi aşan kısım için de 60,000TL prim verilerek günlük ücret belirlenir.
Bir satıcının günlük satış miktarı bilgisayara girildiğinde satıcının alacağı günlük ücreti hesaplayan Objective C programı yazalım.
#import <Foundation/Foundation.h>
#include <math.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int satis;
double ucret;
NSLog(@"GUNLUK SATIS MIKTARI..");
scanf("%i", &satis);
if(satis<50)
{
ucret=4000000.0+satis*50000.0;
}
else
{
ucret=5000000.0+50*50000.0+(satis-50)*60000.0;
}
NSLog(@"GUNLUK UCRET=%f", ucret);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
Gerekli tüm aralıkların kontrolü için program 40, 50 ve 60 satış miktarları için test edildiğinde aşağıdaki sonuçlar elde ediliyor:
PROBLEM:
Bilgisayara negatif olmayan bir sayı girildiğinde bu sayının karekökünü hesaplayan, negatif bir sayı girildiğinde ise kullanıcıyı uyaran bir Objective C programı yazalım.
#import <Foundation/Foundation.h>
#include <math.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
double sayi;
NSLog(@"NEGATIF OLMAYAN BIR SAYI GIR:" );
scanf("%lf",&sayi);
if (sayi<0)
{
NSLog(@"GIRIS HATASI SAYI NEGATIFTIR");
}
else
{
NSLog(@"SAYININ KAREKOKU=%f", sqrt(sayi));
}
[pool drain];
return 0;
}
KAREKÖK PROGRAMININ ÇIKTISI:
Programda, verilen bir sayının karekökünü hesaplayan sqrt fonksiyonu kullanıldı. Bu fonksiyon math.h başlık dosyası içinde tanımlandı.
KARŞILAŞTIRMA İFADELERİ
Doğal olarak, şartlı bir ifadede iki değer arasında karşılaştırma işlemi gerekmektedir. Bazen ilişkisel operatörler (relational operators) adıyla da anılan 6 karşılaştırma operatörü vardır.
Bunlar aşağıdaki tabloda belirtilmiştir:
KARŞILAŞTIRMA OPERATÖRÜ |
İŞLEVİ |
---|---|
< |
den daha küçük |
> |
den daha büyük |
<= |
küçük veya eşit |
>= |
büyük veya eşit |
==(Peşpeşe iki = sembolü) |
-e eşit |
!= |
eşit değil |
Objective C dilinde de karşılaştırma sonucu doğru ise 1 değeri elde edilir; eğer sonucu yanlış ise de 0 değeri elde edilir.
İFADE |
DEĞER |
---|---|
-12<0 |
1 |
0>23 |
0 |
1==1 |
1 |
3!=7 |
1 |
1>= -2 |
1 |
6>8 |
0 |
KARŞILAŞTIRMA İŞLEMLERİNİN SONUÇLARINI YAZDIRAN C++ PROGRAMI:
#import <Foundation/Foundation.h>
#include <math.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"3>5 ifadesinin degeri... ", (3>5));
NSLog(@"3<5 ifadesinin degeri... ", (3<5));
NSLog(@"3!=5 ifadesinin degeri... ", (3!=5));
NSLog(@" 5==5 ifadesinin degeri...", (5==5));
NSLog(@" 5>=4 ifadesinin degeri...", (3>5));
NSLog(@" -1<0 ifadesinin degeri...", (-1<0));
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
DİKKAT EDİLECEK NOKTA:
Karşılaştırma işlemlerinde eşitlik kontrolünü yaparken == sembolü yerine (yani peş peşe iki = sembolü) yanlışlıkla = sembolü kullanmamaya dikkat etmeliyiz.
C dilini öğrenmeye yeni başlayanlar, hatta C uzmanları için müşterek hatalardan biri de eşitlik operatörü == yerine, atama operatörü olan = sembolünü kullanmaktır.
Örneğin;
if(x=7) NSLog(@"girdiginiz sayi 7'dir...");
deyimini göz önüne alalım. Burada deyimin mantığı şudur: x’in değeri 7 ‘ye eşitse, "girdiğiniz sayı 7’dir" mesajı yazdırılmak isteniyor. Fakat yanlışlıkla, eşitlik karşılaştırması için == sembolleri yerine aslında bir atama sembolü olan = sembolü konulmuş. Bu durumda, aşağıdaki program istenmeyen bir çıktı verecektir:
#import <Foundation/Foundation.h>
#include <math.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x;
NSLog(@"x degerini giriniz ... ");
scanf("%i", &x);
if(x=7)
NSLog(@"girdiginiz sayi 7'dir...");
[pool drain]
return 0;
}
PROGRAMIN ÇIKTISI:
x değişkeni yerine 6 girildiği halde 'girdiğiniz sayı 7’dir' şeklinde hatalı bir mesaj alınmıştır. Bunun nedeni şudur: C derleyicisi, x=7 ifadesini bir karşılaştırma olarak değil bir atama olarak algılar. Bu durumda x yerine ne girilirse girilsin x=7 atamasından dolayı x yerine 7 atanacaktır. if deyiminde bu durumda ifadenin değeri 7 olacaktır. İfade 0’dan farklı ise doğru olarak algılanacağı için yukarıdaki programda if koşulu daima doğru olacak ve programda x yerine hangi sayı girilirse girilsin 'girdiğiniz sayı 7’dir' mesajı alınacaktır.
C/C++ dillerinde mantıksal değerler tamsayılarla temsil edildiği için,
if ( x ) deyim ;
şeklinde bir ifade yazmak geçerlidir.
Şayet x sıfır olmayan her hangi bir değerse, deyim çalıştırılır; x sıfıra eşitse, deyim atlanır. Dilin bu özelliği bazı ilginç olanaklar sağlar.
Örneğin şu şekilde bir program yazmak istedik: Klavyeden bir karakter okunacak ve karakter alfabenin bir harfi ise yazılacak, değilse bununla ilgili bir mesaj yazdırılacaktır. isalpha() adlı C standart kütüphanesi fonksiyonunun argümanı bir harf ise, fonksiyon sıfır olmayan bir değer gönderecek. Girişin harf olup olmadığını kontrol eden programı şöyle yazabiliriz:
#import <Foundation/Foundation.h>
#include <ctype.h> /* isalpha() için ilave edildi.*/
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
char kar = '\0';
NSLog(@"Bir karakter giriniz:");
scanf("%c", &kar);
if (isalpha(kar))
{
NSLog(@"girdiginiz harf--> %c ", kar);
}
else
{
NSLog(@" %c bir alfabetik karakter degildir.", kar);
}
[pool drain];
return 0;
}
PROGRAMIN ÇIKTILARI:
if (isalpha(kar)) deyiminin if (isalpha(kar)!=0) ile tamamen eşdeğer olduğunu hatırlayalım.
Bir hata oluştuğunda 0 değeri gönderen fonksiyonlar içinse aşağıdaki yapı çok etkindir.
if (fonk())
devam_et;
else
hata mesajı;
fonk() fonksiyonu, bir hata oluştuğunda 0 değerini gönderen bir C fonksiyonu ise, hata oluştuğunda fonk() fonksiyonu 0 değerini gönderir ve if’in ifadesi yanlış olacağı için else’i izleyen kısıma geçilir. Buraya da ilgili hata mesajının yerleştirilmesi uygun olacaktır.