Yeditepe Üniversitesi Bilgisayar Topluluğu

Kasım 8, 2008

C’ye giriş (3)

Kategori: C/C++ — shultays @ 5:15 pm
Tags:

C’ye giriş konumuzun 3. ve son bölümünden C’de (ve genel olarak bütün programlama dillerinde) kullanılan basit bir kaç komuttan bahsedeceğim.

if

İlk bahsedeceğim komut if komutu. if komutu sayesinde programımızın istediğimiz bir bölümünü bir şarta bağlı olarak çalıştırabilir veya o kısmın çalışmamasını sağlayabiliriz. if komutunun genel olarak kullanımı şu şekildedir.

if ( … şart … ) {

komutlar

}

Burada eğer şart kısmında belirttiğimiz koşulumuz doğru ise { … } arasında kalan tüm komutlar çalıştırılacaktır, eğer doğru değil iste bu parantezler arasında kalan komutlar görmezden gelinecek, program }’dan sonra gelen satırdan çalışmaya devam edecektir.

şart kısmında belirttiğimiz koşul herhangi bir matematiksel eşitlik olabilir. Örnek olarak

if ( a > b ) {
  ...
}

if içindeki komutlar sadece a değişkeni b’den büyük ise çalışacaktır. a’nın daha küçük veya eşit olma durumlarında … kısmındaki komutlar atlanacaktır. Kullanabileceğimiz diğer şart komutları

a > b (a b’den büyük ise)
a >= b (a b’den büyük veya eşit ise)
a < b (a b’den küçük ise)
a <= b (a b’den küçük veya eşit ise
a == b (a ve b birbirine eşit ise)
a != b (a ve b birbirine eşit değil ise)

Bir örnek program ile daha iyi açıklamaya çalışayım.

#include <stdio.h>

int main(void){ 
  int x;
  scanf("%d", &x);

  if( x > 0 ) {
    printf("X is a positive number!\n");
  }

  if( x < 0 ) {
    printf("X is a negative number!\n");
  }

  if( x == 0 ) {
    printf("X is zero!\n");
  }

  return 0;
}

main fonksiyonumuzu incelediğimizde, ilk satırımızda x isminde bir değişken tanımlıyoruz. Bir sonraki komutta scanf diye bir fonksiyon kullandık. Bu da aynı printf gibi stdio.h kütüphanesinde bulunan bir fonksiyon. İşlevi ise kullanıcının klavye gireceği bir inputu bir değişkene atamak. Bu fonksiyonu kullandığımız yerde program durdurulacak, kullıcıdan bir sayı (veya string) girmesi beklenecektir. Kullanıcı istediği bir değişkeni girip enter’a bastığında girmiş olduğu sayı x değişkenine (veya fonksiyonda hangi değişkeni belirttiysek) atanacaktır. %d kullanmamızın sebebi x in bir integer olması, farklı değişken türleri için farklı harfler kullanılır. Daha fazla bilgi için

http://www.cplusplus.com/reference/clibrary/cstdio/scanf.html

inceleyebilirsiniz. x den önce kullandığımız & işareti ise x değilde x’in adresini gönderdiğimizi gösteriyor, adresler ve pointerlar daha ileri bir konu olduğu için burada bahsetmeyeceğim.

Özet olarak scanf fonksiyonu geldiğinde kullanıcı bir sayı girecek enter a basacak ve bu sayı x e atanmış olacak. Bundan sonra bir if komutu ile karşılaşıyoruz

if( x > 0 ) {
  printf("X is a positive number!\n");
}

Burada { … } içindeki satırlar yani printf fonksiyonumuz eğer if ( … şart …) kısmındaki şart doğru ise çalışacaktır. Yani eğer kullanıcı pozitif bir sayı girmişse ekrana X is a positive number! yazdırılacaktır. Eğer sayı 0 dan büyük değil { … } parantezleri arasındaki bütün komutlar görmezden gelinecek, program } dan sonra gelen ilk satırdan devam etmeye başlayacaktır.

İkinci if komutu yine ilkine benzer bu sefer x in 0′dan küçük olup olmadığını kontrol ediyor, son if komutumuzda x in 0′a eşit olduğu durumları kontrol ediyor.

Yukarda bahsettiğimiz örnekler hep tek bir şarta bağlı olarak çalışıyordu. Eğer gerekiyorsa tek bir if içinde birden fazla şartı kontrol edebilir, tüm bu şartlara bağlı olarak if komutunun içini çalışıp çalıştırabiliriz. İki tip bağlaç ile şartları birbirine bağlayabiliriz. Birincisi && (and) kullanarak, ikincisi || (or) kullanılarak yapılır. Eğer && kullanırsak bütün koşullar doğru olduğunda if çalışacaktır, || kullanır isek herhangi bir koşulun doğru olması yeterli olacaktır. İkisi içinde birer örnek verelim,

if ( a > b && a > 0) {
  printf("a is greater than b and it is a positive number!\n");
}

Burada a sayısı b sayısından büyük olduğunda ve a sayısı 0′dan büyük olduğunda if komutu içinde ki kodlar çalışacaktır, eğer iki koşuldan en az birisi yanlış ise görmezden gelineceklerdir. or için bir örnek:

if ( a == 0 || b == 0 ) {
  printf("a*b is zero!\n");
}

Yukarıdaki örnekte de a veya b sayılarından herhangi birinin 0 olup olmadığını kontrol ediyoruz, eğer bu sayılardan biri 0 ise bunların çarpımlarının sonucu da 0 olacağı için a*b is zero! yazısını ekrana yazdırıyoruz.

2 den fazla şartıda bir birine bağlayabiliriz, hatta bu grupladığımız şartları parantez içine alarak yine başka bir şart ilede birbirine bağlayabiliriz. Bir örnek ile göstermeye çalışayım.

if ( (a > 0 && b > 0) || (a < 0 && b < 0) ){ 
  printf("a*b is a positive number!\n");
}

Yukarıdaki örnekte eğer a ve b değişkenlerinin ikiside 0 dan büyük veya ikiside 0 dan küçük ise printf komutu çalışacaktır.

else, else if

else komutu if komutundan sonra kullanılır. Eğer bir if komutunun şartı doğru değil ise, ve bundan sonra bir else geliyorsa else içindeki kodlar çalışacaktır. Eğer if komutu doğru ise çalışmayacaktır.

if ( a > 0 ) {
  printf("a is a positive number!");
} else {
  printf("a is not a positive number!");
}

Yukarıdaki örnekte ilk önce a değişkeni 0′dan büyük mü diye kontrol ettik, eğer büyük ise if komutundan sonra gelen { … } parantezlerinin içi çalışacaktır, eğer yanlış ise else komutundan sonra gelen { … } parantezlerinin içi çalışacaktır. Yani a sayısı 0 dan büyük ise “a is a positive number!” yazısı ekrana yazdırılacak, değil ise “a is not a positive number!” yazısı ekrana yazdırılacaktır.

else if komutu yine else e benzer bir şekilde bir if komutundan sonra kullanılır fakat bu sefer else den farklı olarak else kısmının içini de bir şarta bağlı olarak çalışmasını sağlayabiliriz.

if ( a > 0 ) {
  printf("a is a positive number!");
} else if ( a < 0 ) {
  printf("a is a negative number!");
} else {
  printf("a is zero!");
}

Yukarıdaki örnekte önce a > 0 şartı kontrol edilecektir. Eğer doğru ise “a is a positive number” ekrana yazılacak, else kısmına hiç bakmadan en son } parantezinden sonraki komuta geçilecektir. Eğer a > 0 şartı yanlış ise else kısmının şartı yani a < 0 kontrol edilecek ve eğer doğru ise ekrana “a is a negative number!” ekrana yazdırılacaktır. Eğer bu şartta doğru değil ise en sonda gelen else kısmı çalışacaktır.

if, else, else if konusunda bilmemiz gerek bir diğer şey de, eğer {…} parantezleri arasında sadece tek satırlı bir komut varsa eğer istersek bu parantezleri kullanmayabiliriz. Mesela

if ( a > b ) {
  printf("a is greater than b!");
}

ile

if ( a > b )
  printf("a is greater than b!");

arasında hiç bir fark yoktur. Fakat eğer if komutu içinde birden fazla satır kullanıyorsak bu şekilde bir  kısaltma yapamayız. Aynı durumu else veya else if içinde kullanılabilir.

Kasım 3, 2008

C’ye giriş (2)

Kategori: C/C++ — shultays @ 3:05 pm
Tags:

Fonksiyonlar

C’deki fonksiyonlar matematik fonksiyonlarına benzer. Bir sayı alırlar onun üzerinde işlem yaparlar ve bir sayı geri döndürürler. Örnek olarak sin(x) fonksiyonu bir açı alır ve bu açının sinüs değerini geri döndürür. C’de bir fonksiyonu kullanmak için öncelikle onu tanımlarız. Mesela bir sayının karesini döndüren bir fonksiyon:

int square(int x)
{
 int y = x*x;
 return y;
}

Yine bu fonksiyonun ne yaptığını satır satır inceleyelim. Burada ilk satırda önce int yazıp fonksiyonumuzun bir integer döndüreceğini belirtiyoruz. Daha sonra yazdığımız “square” fonksiyonumuzun adı oluyor. Son olarak bu satırda fonksiyonumuzun alacağı değerleri yazıyoruz. Bizim square fonksiyonumuz x adında bir integer alıyor, daha sonrada bu x in karesini gene integer olarak bize geri verecek.

Sonraki kısımda fonksiyonumuzun ne yapacağını yazacağız. Bu işlemler { … } parantezleri arasında yapılmalıdır. Şu anki örneğimiz de y isminde bir değişken tanımlıyoruz ve buna x*x (x in karesi) ni atıyoruz. Daha sonrada return y; diyerek y değişkenini geri döndürüp fonksiyonumuzu bitirmiş oluyoruz. Bu fonksiyonu içerecek örnek bir program yazalım

#include <stdio.h>
int square(int x)
{
  int y = x*x;
  return y;
}
int main(void)
{
  int a, b, c;
  a = 2;
  b = square(5);
  c = square(a);
  printf("b is equal to %d.\n", b); 
  printf("c is equal to %d.\n", c);
  return 0;
}

Yukarıda ki örneğimiz de yine önce stdio.h kütüphane mizi yükledik. Daha sonra square fonksiyonu nu tanımladık. main fonksiyonumuz da a, b, c isminde 3 tane integer tanımladık ve bundan sonra a ya 2 değerini atadık.

Bir sonraki satırda (b = square(5);) daha önceden tanımlamış olduğumuz square fonksiyonuna 5 değerini yollayıp, bu fonksiyonun döndürdüğü değeri (25) b ye eşitlemiş oluyoruz. Burada square(5) dediğimizde square fonksiyonu 5′i alıyor x e eşitliyor, y değerini hesaplıyor ve y değerini geri döndürmüş oluyor. Geri döndürdüğü bu değer de b sayısına eşitleniyor.

Bir sonraki adımda bu sefer direk 5 gibi bir tam sayı yollamıyoruz da bir değişken yolluyoruz. square(a) dediğimiz de a değerinin değişkeni (yani 2) square fonksiyonuna yollanıyor, bu değerin karesi hesaplanıp c ye yazılıyor.

Bir sonraki satırımızda b ve c değerlerini ekrana yazmış oluyoruz. Burada Hello world örneğinden farklı olan %d ifadesini kullanmamız. Eğer ekrana bir integer yazmak istiyorsak tırnak içindeki bölümde, integer ın yazılmasını istediğimiz yere %d yazıyoruz, tırnak işaretlerini kapadıktan sonra da virgül ile ayırıp değişkenimizi yazıyoruz. Tırnak içinde yazdığımız \n ise sayır atlanacağını gösteriyor.

Sonuç olarak bizim programımızın çıktısı:

b is equal to 25.
c is equal to 4.

oluyor.

Bu örnekte dikkat ederseniz main de aynı square gibi bir fonksiyon. Hiç bir değer almıyor (void yazdığımızda bir değer almadığını belirtmiş oluyoruz) ve integer döndürüyor. Döndürdüğü integer ise en sonda return 0; ile döndürdüğümüz 0 değeri oluyor. Fonksiyonumuz hiç bir değer döndürmesini istemiyorsak yine başına int değil de void koyarak belirtebiliriz.

void printHello(void)
{
  printf("Hello world!\n");
}

Yukarıdaki örnekte hiç bir şey almayan ve döndürmeyen printHello isminde bir fonksiyon yazdık. Bu fonksiyonu şu şekilde çağırdığımızda

printHello();

ekrana yine Hello world! yazdırmış oluyoruz.

C’ye giriş (1)

Kategori: C/C++ — shultays @ 3:04 pm
Tags:

C’ye yeni başlayacaklar için bir kaynak olsun dedim. İlk önce basit olarak C programları nedir nasıl çalışır ondan bahsedeceğim değişkenler nelerdir onlardan bahsetmeye çalışacağım. Diğer derslerde de fonksiyonlar nasıl tanımlanır ve kullanılır, if, while, switch gibi komutları ne işe yararlar, nasıl kullanılırlar ondan bahsedeceğim.

Hello world!

Giriş olarak basit bir uygulamanın adım adım nasıl çalıştığını anlatacağım. Aşağıdaki program ekrana Hello world! yazısını yazdıracaktır.

#include <stdio.h>
int main(void)
{
  printf("Hello world!");
  return 0;
}

Adım adım kodumuzu inceleyecek olursak:

#include <stdio.h>

Bu satırda stdio.h isimli kütüphaneyi programıza eklemiş olduk. Kütüphaneler içinde programlarımızda kullanabileceğimiz fonksiyonlar ve değişken içeren .h dosyalarıdır. Bir kütüphaneyi ekledikten sonra o kütüphane ile birlikte gelen herhangi bir fonksiyonu artık programımızda kullanabiliriz. stdio.h kütüphanesi kullanıcı ile etkileşime geçebileceğimiz temel fonksiyonları (örnek olarak programımızda kullandığımız printf fonksiyonu) içerir. Fonksiyonlar nedir, nasıl kullanılır ilerde biraz daha fazla değineceğim.

int main(void)
{
  printf("Hello world!");
  return 0;
}

Bu kısım da bizim main fonksiyonumuz. Bir c programı bir çok fonksiyondan oluşur, main fonksiyonu ise bir c programı çalıştırıldığında çağrılan ilk ana fonksiyondur. main fonksiyonu içindeki ilk satırında kullandığımız printf fonksiyonu ekrana bir şey yazdırmak için kullanılır. Bizim örneğimizde de Hello world! yazısı ekrana yazılacaktır.

Son satırımızda da return 0; ile main fonksiyonumuzun başarılı bir şekilde bittiğini söylüyor ve programımızı sonlandırmış oluyoruz.

Değişkenler (Variables)

Bir programda tüm bilgiler değişkenlerde tutulur. Mesela bu bilgi bir öğrencinin numarası, sınav notu veya ismi olabilir. Bir değişkeni fonksiyonun başında bir kez tanımladıktan sonra artık ona herhangibir değer atayabilir, üzerinde matematik işlemleri yapabiliriz. Mesela örnek olarak x isimli bir değişken tanımlayalım.

int x;

Burada önce değişkenin türünü yazıyoruz. Yazdığımız “int” değişkenimizin bir integer (tam sayı) olduğunu belirtiyor. Değişken tipini belirttikten sonra ismini belirtiyoruz. Yani yukarıdaki satırda x isminde bir integer tanımlamış olduk. Daha sonradan bu x e bir değer atamak istediğimizde

x = 5;

gibi bir ifade kullanırız. Yukarıdaki örnekte x i 5′e eşitlemiş olduk. Eğer istersek bu işlemi tanımlama sırasında da yapabiliriz. Mesela örnek bir toplama işlemi yapalım.

int a;
int b;
int c;
a = 5;
b = 3;
c = a + b;

Yukarıdaki örnekte  önce a, b ve c isiminde 3 tane integer tanımlıyoruz. Daha sonradan a ya 5 değerini, b ye 3 değerini atıyoruz. En son adımda da c = a + b; ile a ve b nin toplamını (yani 8′i) c ye atamış oluyoruz.

Eğer istersek bir değişkene tanımlama aşamasında bir değer atayabiliriz. Mesela yukarda önce x i tanımlamış, sonradan ona 5 değerini atamıştık. Bunların hepsini tek adımda yapmak için

int x = 5;

de diyebilirdik. Burada x isminde bir integer tanımlıyoruz ve 5 değerini atıyoruz.

Ayrıca aynı türden birden fazla değişkeni yine bu şekilde tek bir satırda yapabiliriz. Yukarıda ki toplama işlemini şu şekilde de gösterebilirdik.

int a = 5, b = 3, c;
c = a + b;

ilk satırda a, b, c değişkenlerimizi tanımladık ve a ve b ye 5 ve 3 değerlerini atadık. İkinci satırda da c değişkenin a ve b nin toplamını atamış olduk.

Daha önceden bahsettiğim gibi integer sadece tam sayıları (-1, 5, 0 vs) tutabilir. Küsuratlı sayıları tutmak için double veya float kullanmalıyız.

double a = 1.5;
float b = 2.5;

double ve float arasındaki fark double hafızada iki kat daha fazla yer tutar, bu yüzden çok daha büyük sayıları double da tutabiliriz. Eğer çok büyük sayılarla uğraşmayacaksak sadece float kullanabiliriz.

Diğer bir değişken türümüz ise char (character) türüdür. Yine integer gibi sadece tam sayı tutabilen bu değişkenler hafızada tek byte yer kaplar ve sadece -127 ve +127 arasındaki değerleri alırlar. Genel olarak tek bir karakteri tutmak icin kullanılırlar.

WordPress.com'dan blog alın.