Temel C Programlama -22- Mantık Operatörleri, Birleşik Operatörler ve Operatör Önceliği

Döngü ve kararları bitirmeden önce şu ana kadar anlatmadığımız noktaları sizlere anlatacağız. Önceki yazılarda size aritmetik operatörleri anlatmıştık sonrasında ise döngü ve kararlarda sıkça kullandığımız ilişki operatörlerini anlattık. Bu ikisinden farklı olarak bit tabanlı operatörler ve mantık operatörlerini sayabiliriz. Bit tabanlı operatörler alt seviye programcılığı ilgilendirdiği ve ileri bir seviye olduğu için ilerleyen zamanlarda sizlere anlatacağız. Bit tabanlı operatörleri gömülü sistemler üzerinde çalışırken aşırı derecede fazla kullanırız. Hatta bit tabanlı operatörler olmadan gömülü sistemler üzerinde program yazmak imkansız gibidir. Fakat biz bilgisayar programı yazarken bunlara çok da ihtiyaç duymayız. Ne zaman ileri seviye programcılık algoritmaları yazmaya başlarsak o zaman bit manipulasyonuna ihtiyaç duyarız.

Mantık operatörleri ise bizim döngü ve karar yapılarını birleşik ve karmaşık hale getirme yollarından biridir. Mantık operatörlerini sürekli kullanmasak da muhakkak kullanma ihtiyacı hissederiz. Çünkü ilişkisel operatörler doğru veya yanlış ifadeleri verse de bu ifadeler tek mantık ifadesi şeklinde olmaktaydı. Bu durumda daha karmaşık mantık uygulamaları yapmak için mantık operatörlerinden faydalanırız. Mantık operatörleri sayesinde birden fazla mantık durumu üzerinde işlem yaparız. Bilgisayar programcılığına yeni başlayanlarda yanlış bir algı vardır. Bütün bu programcılık mantığının, yapay zekanın ve karmaşık programların matematik bilgisi tabanlı olduğunu ve iyi matematik bilen birinin iyi program yazacağını düşünürler. Aslında bilgisayar programları matematik değil mantık tabanlıdır. Biz programlama yaparken mantık bilgisini defalarca kullansak da matematik işlemleri sadece aritmetik operatörler ile sınırlı kalmaktadır. Matematik değil mantık ön plandadır.

Şimdi mantık operatörlerine bir göz atalım.

Burada mantık operatörlerinin sadece üç tane olduğunu görebilirsiniz fakat dijital elektronik ve programlanabilir mantıkta anlattığımız üzere bu operatörleri beraber kullanarak istediğiniz mantıksal sonucu elde edebilirsiniz. Örneğin VE DEĞİL işlemi için !(A&&B) ifadesini, VEYA DEĞİL işlemi için !(A||B) işlemini kullanabiliriz. Bu operatörleri yan yana kullanarak giriş sayısını artırabiliriz. Örneğin A, B ve C değerlerini “VE” işlemine tabi tutmak için A && B && C ifadesini kullanabiliriz. İstersek bir parantez içinde iki mantık işleminin sonucunu yine bir mantık işlemine tabi tutabiliriz. Örneğin (A&&B) || (C&&D) gibi bir işlem yazma imkanımız vardır. Şimdi bu operatörleri uygulamada görelim.

Biz switch konusunda bir rol yapma oyununa ait boş bir harita tasarlamıştık ve WASD tuşlarıyla bu haritada geziyorduk. Fakat bu harita bomboş olduğu için herhangi bir heyecanı kalmıyordu. Biz bu haritanın belli bir kordinatına hazine, bir kordinatına da ejderha ekleyelim. Böylelikle biraz heyecan katalım.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main() {

// KARŞILAMA YAZISI
for (int i=0; i < 50; i++ )
printf("*");
printf("\n");
printf("ROL YAPMA OYUNUNA HOS GELDINIZ \n");
printf("WASD TUSLARI ILE HARITADA ILERLEYINIZ \n");
for (int i=0; i < 50; i++ )
printf("*");
printf("\n");
// KARŞILAMA YAZISI BITIS
int x = 0, y = 0; // kordinatlar
while (1)
{
char yon;
yon = getche();
switch(yon)
{
case 'w':
	y++;
	break;
case 's':
	y--;
	break;
case 'a':
	x--;
	break;
case 'd':
	x++;
	break;
default:
printf("\n Lutfen Dogru Tusa Basiniz \n");
break;
}
printf(" X : %i   Y : %i  \n", x, y);
if( (x==15) && (y==2))
{
printf("\n Tebrikler!! \n Hazineyi Buldunuz!");
printf("\n GAME OVER!");
break;
}
if( (x==12) && (y==3))
{
printf("\n Tebrikler!! \n Ejderhayi Buldunuz Gecmis Olsun :))!");
printf("\n GAME OVER!");
break;
}
} // sonsuz döngü sonu


system("PAUSE");
 } // Main Sonu

Yazdığımız program önceki programın aynısı olsa da biz buraya iki adet if yapısı ekledik. If karar yapıları hem x değerini ve hem y değerini değerlendiriyor ve ikisi de istenilen şartı karşılarsa karar yapısını çalıştırıyor.

if( (x==15) && (y==2))

Böyle bir komutun Türkçe karşılığı EĞER X 15’e Eşitse VE Y 2’ye Eşitse şeklindedir. Görüldüğü gibi koordinat sisteminde bir noktayı böylelikle belirliyoruz. Oyunda hem hazineyi hem de ejderhayı bulmamız mümkün. Ejderhayı bilerek hazinenin yakınına koyduk. Maksadımız ejderhaya yem olmadan hazineyi bulabilmek. İkisinde de break; komutu ile kapsamdan (sonsuz döngüden) çıkıyoruz ve system(“PAUSE”) fonksiyonu işletilerek beklemeye alınıyor. Programın bir çıktısı şu şekilde olabilir. Siz isterseniz hazinenin nerede olduğuna dair bir ipucunu programın başında kullanıcıya bildirebilirsiniz.

Bizim burada bir sıkıntımız haritanın oldukça geniş olmasıdır. x ve y değerleri integer tipinde olduğundan + milyarlardan – milyarlara kadar gitmektedir. Bu durumda oyuncu belki hazineyi bulmak için yıllarını harcaması gerekebilir. O yüzden haritayı sınırlarını aştığını oyuncuya bildirmek için bir komut yazmamız lazımdır.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main() {

// KARŞILAMA YAZISI
for (int i=0; i < 50; i++ )
printf("*");
printf("\n");
printf("ROL YAPMA OYUNUNA HOS GELDINIZ \n");
printf("WASD TUSLARI ILE HARITADA ILERLEYINIZ \n");
for (int i=0; i < 50; i++ )
printf("*");
printf("\n");
// KARŞILAMA YAZISI BITIS
int x = 0, y = 0; // kordinatlar
while (1)
{
char yon;
yon = getche();
switch(yon)
{
case 'w':
	y++;
	break;
case 's':
	y--;
	break;
case 'a':
	x--;
	break;
case 'd':
	x++;
	break;
default:
printf("\n Lutfen Dogru Tusa Basiniz \n");
break;
}
printf(" X : %i   Y : %i  \n", x, y);
if( (x==15) && (y==2))
{
printf("\n Tebrikler!! \n Hazineyi Buldunuz!");
printf("\n GAME OVER!");
break;
}
if( (x==12) && (y==3))
{
printf("\n Tebrikler!! \n Ejderhayi Buldunuz Gecmis Olsun :))!");
printf("\n GAME OVER!");
break;
}

if ((y>50) || (x>50) || (y<-50) || (x<-50) )
	printf("\n Harita Sinirlarini Astiniz!");
} // sonsuz döngü sonu


system("PAUSE");
 } // Main Sonu

Burada if ((y>50) || (x>50) || (y<-50) || (x<-50) ) yapısını kullanarak 100×100 bir harita ortaya çıkardık. Yani x değeri -50’den +50’ye y değeri de +50’den -50’ye kadar gidebilir. Eğer harita sınırları aşılırsa kullanıcıya uyarı verilir. Bu komutun Türkçe’si EĞER Y 50’den büyükse VEYA X 50’den Büyükse VEYA Y -50’den küçükse VEYA X -50’den küçükse demektir. Programın çıktısı şu şekilde olacaktır.

Mantık operatörleri gömülü sistemlerde sıkça kullandığımız operatörler olmaktadır. Özellikle ! operatörünü 1’i 0 yapmak için 0’ı da 1 yapmak için kullanmaktayız. Bit bazlı operatörler ile mantık operatörlerini birbirine karıştırmamak gereklidir. O yüzden bit bazlı operatörleri anlatmayı daha sonraya bırakıyoruz.

Operatör Önceliği

Daha önceden aritmetik operatörleri anlattığımızda çarpma ve bölme işleminin toplama ve çıkarma işlemine önceliği olduğunu söylemiştik. Fakat işin içerisine farklı operatörler girince öncelik değerini daha iyi hesaplamak gerekiyor. Ben bu öncelik meselesini farkında olmadan gözetir oldum ve hiç tabloya bakma ihtiyacı hissetmedim. Çok kafa karıştırmayacak şekilde işlemleri yazdığınızda sizin de bu tabloyu ezberlemenize pek gerek kalmıyor. Parantezleri bol bol kullanmanız daha okunur bir program ortaya çıkardığı gibi öncelik konusunda sıkıntı çıkmasına da engel olmaktadır.

Birleşik Operatörler

Biz programlamada aritmetik operatörleri kullanırken tek bir değişken üzerinde işlem yapmak için a = a + b ya da a = a / b; gibi komutları aşırı derecede fazla kullanırız. Bu yüzden bu komutları uzun uzun yazmak yerine kısaca yazmak için C dilinde birleşik operatörler diye tabir edilen operatör kategorisi vardır. Bu operatörler şu şekildedir.

Bundan başka bit bazlı operatörler için de kullanılan birleşik operatörler vardır fakat biz bit bazlı operatörler konusunu ayrı bir konu olarak ele alacağız.

goto komutu

Assembly programlarında döngü yapıları yani yordamlar ve alt yordamlar while, for gibi yapıları içermemektedir. Biz program akışında istediğimiz bir noktaya etiket ekleriz ve goto komutuyla program bu etikete sıçrama yapar. etiket ve goto yapısını kullanmak bir dönem programcıların başına bela olmuştur ve o yüzden yapısal programlama dillerinde yerini fonksiyonlara ve döngülere bırakmıştır. Yine de goto komutuyla ileri seviye noktalarda etkili programlar yazabilirsiniz. C dilinde normalde goto komutuna hiç ihtiyaç olmasa da performans istenilen noktalarda kullanılabilir. goto üzerinden örnek yapmayacağız fakat söz diziminden bahsedeceğiz.

Etiket:

komutlar;
komutlar;
komutlar;
goto etiket; // Etiket: noktasına git

Buraya kadar döngü ve kararlardan itibaren öğrenmemiz gereken hemen her noktayı öğrenmiş olduk. Temel komutların hepsini bildiğimiz için artık kendi programlarımızı yazıp bunları parçalara bölebiliriz. Bu yüzden fonksiyonları anlatarak konumuza devam edeceğiz. Gelişmiş veri tiplerini ise fonksiyonlardan itibaren anlatacağız ve bu arada işaretçileri de anlatmayı ihmal etmeyeceğiz.

Last updated