Fonksiyonlar #2 – C Programlama Dili

C programlama dili serisinin bir önceki dersinde fonksiyonlar konusuna giriş yapmıştık. Bir fonksiyonda bulunan elemanlardan bahsedip kullanıcı tarafından yazılan fonksiyonların kullanımı için neler yapılması gerektiğine değindik.
Fonksiyon bildiriminin aslında bir fonksiyonun prototipi olduğunu da ifade ettikten sonra bugünün dersine başlayabiliriz.
Fonksiyon bildirimlerinde eğer kullanılan fonksiyon kullanacak fonksiyondan önce getirilirse bu bildirime ihtiyaç kalmamaktadır.
Recursive Fonksiyonlar ( Kendi kendini çağıran fonksiyonlar)
Fonksiyonlarla alakalı yaptığımız uygulamalarda programın herhangi bir satırında istediğimiz fonksiyonu çağıran işlemler yaptık.
C dilinde bunların dışında bir fonksiyonun kendini çağırması gibi uygulamalar da mevcuttur. Bunlara recursive ya da öz yineli fonksiyonlar denir.
Şimdi recursive fonksiyonlarla alakalı en klasik örneği yaparak başlayalım: Faktoriyel Hesaplama
Uygulamanın recursive olmayan hali aşağıdaki gibidir :
Uygulama en genel haliyle kullanıcıdan aldığı int sayının faktoriyel hesabını farklı bir fonksiyon aracılığı ile yapmaktadır. Çıktısı ise aşağıdaki gibidir :
Şimdi bu uygulamanın recursive halini görelim :
Uygulamadaki fact() fonksiyonunda bir if yapısı dikkatimizi çekiyor. if sorgusunda faktoriyeli hesaplanacak olan sayı sıfır(0) ise 1 değeri döndürecektir. Bunun sebebi matematikte 0! = 1 olmasıdır. else kısmına geldiğimizde ise
return a * fact(a-1); // n! = n.(n-1)!
koduna rastlıyoruz. Burada fonksiyonun kendi içinde kendini çağırdığını görüyoruz. Mesela bize gelen sayı 4 olsun. İlk olarak
4 * fact(3) döndürülecektir. Burada fact(3) ise 3 * fact(2) ile döneceğinden fact(3) yerine 3* fact(2) yazabiliriz. fact(2) ise 2 * fact(1) ile döneceğinden fact(2) yerine de 2 * fact(1) yazabiliriz. fact(1) ise 1* fact(0) ile döneceğinden fact(1) yerine de 1 * fact(0) yazabiliriz. fact(0) = 1 dir. Bunları yerine koyarsak :
4* (3*2*1*fact(0))
işleminin sonucu zaten bize 4 faktoriyeli verecektir.
Görüldüğü gibi sanki bir döngü varmışçasına işlem yapıldı. Zaten recursive fonksiyonlar döngülerin alternatifidir.
Özyineli fonksiyonlara her yerde rastlamazsınız. Tipik kullanım alanları mevcuttur, faktoriyel hesaplama gibi.
Şimdi de daha farklı ama anlamlı bir uygulamasını görelim :
Uygulamamızın başında carrayad[20] ve carraysoyad[20] adında char tipinde iki dizi tanımladık. Ayrıca cvar adında char tipinde bir değişken tanımladık.
conio.h kütüphanesi getch() fonksiyonundan dolayı,
ctype.h kütüphanesi toupper() fonksiyonundan dolayı koda dahil edildi.
Sonrasında kullanıcıdan ad ve soyad bilgisini girmesi istenilmektedir ve girilen bilgiler gets() fonksiyonu ile bu dizilere alınmaktadır. Sonraki printf() fonksiyonları ile ise kullanıcının girdiği bilgiler kullanıcıya gösterilmekte ve girdiği bilgilerin doğru olup olmadığı sorulmaktadır.
Kullanıcıdan bir karakter girmesi beklenilmektedir. Girilen karakter getch() fonksiyonu ile alındığından enter a basılmasını beklememektedir. getch() fonksiyonu ile alınan karakter toupper() fonksiyonu ile büyük harfe dönüştürülüp cvar değişkenine atanmaktadır.
Sonrasında gelen if sorguları ise cvar değişkeninin içeriğini sorgulamaktadır. Girilen karakter 'H' ise bu fonksiyon tekrar kendini çağıracak ve bu bilgileri baştan girmesi istenecektir.
Girilen karakter 'E' ise "Bilgileriniz alındı.. Teşekkürler" yazısı gözükecektir.
Eğer kullanıcı bu karakterler dışında bir karakter girdiyse "Hatalı bir karakter girdiniz. Program sonlandırılıyor" yazısı ile uygulama sonlandırılacaktır.
Uygulamamızın işleyişi bu şekildedir. Çıktımız aşağıdaki gibidir :
Hazır uygulamada da kullanmışken ctype.h kütüphanesi hakkında biraz bilgi verelim. İçeriğinde çokça kullanabileceğimiz fonksiyonları bulundurmaktadır.
ctype.h kütüphanesi C kütüphaneleri içinde bulunan ve karakterler üzerinde işlem yapmaya yarayan fonksiyonları barındıran bir kütüphanedir. Zaten ismi de buradan gelmektedir : char + type = ctype
Karakterler üzerinde işlem yaptığı için özellikle karakter dizilerinde sıklıkla kullanılabilecek fonksiyonlara sahiptir. İçeriğinde fonksiyonları kullanabilmek için bu kütüphaneyi kaynak koda dahil etmek gerekir.
#include <ctype.h>
Bu önemli fonksiyonlar aşağıdaki gibidir :
- toupper : Girilen karakteri büyük harfe çevirir.
- tolower : Girilen karakteri küçük harfe çevirir.
- toascii : Girilen sayısal değerin ASCII tablosundaki karşılığını verir. toascii(c) verilen numerik değerin ASCII toplasındaki karakter karşılığını verir. toascii(65) : A
- isascii : Girilen karakterin ASCII karakter olup olmadığını sorgular. isascii(c) fonksiyonunda c; ASCII karakter ise sıfırdan farklı değilse 0 döndürür.
- isupper : Girilen karakterin büyük harf olup olmadığını sorgular. isupper(c) fonksiyonunda c; A-Z arasında ise sıfırdan farklı, değilse 0 döndürür.
- islower : Girilen karakterin küçük harf olup olmadığını sorgular. islower(c) fonksiyonunda c; a-z arasında ise sıfırdan farklı, değilse 0 döndürür.
- isdigit : Girilen karakterin sayı olup olmadığını sorgular. isdigit(c) fonksiyonunda c; bir rakam ise 0'dan farklı değilse 0 döndürür.
- isxdigit : Girilen karakterin onaltılık tabanda bir sayı olup olmadığını sorgular.
- isspace : Girilen karakterin boşluk karakteri olup olmadığını sorgular.
- ispunct : Girilen karakterin imla karakteri olup olmadığına bakar.
- iscntrl : Girilen karakterin kontrol karakteri olup olmadığını sorgular.
- isgraph : Girilen karakterin yazıcıdan basılabilen bir karakter olup olmadığını sorgular. Ancak bu karakter boşluk olamaz.
- isprint : Girilen karakterin basılabilir bir karakter olup olmadığını sorgular.
- isalpha : Girilen karakterin alfabetik bir karakter olup olmadığını sorgular. isalpha(c) fonksiyonunda c; bir harf ise 0'dan farklı bir değer, değilse 0 değerini döndürür. Ör kullanımı : isalpha('a')
- isalnum : Girilen karakterin alfa numerik bir karakter olup olmadığını sorgular. isalnum(c) fonksiyonunda c; A-Z, a-z veya 0-9 arasında bir karakter ise 0'dan farklı değilse 0 döndürür. Ör kullanımı : isalnum('a')
- isblank : Girilen karakterin boşluk karakteri olup olmadığını sorgular.
Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.
Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.
Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.
Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/29/03/2019/fonksiyonlar-2-c-programlama-dili/
Fonksiyonlar dersi toplamda 3 dersten oluşacaktır. Son dersimizde fonksiyonlara parametre olarak dizi ve pointer nasıl verilir bunlardan bahsedeceğiz. Ayrıca fonksiyonlara argüman geçirmenin yollarına değineceğiz. Anlaşılmayan noktaları sorarsanız sevinirim.
Hi, @etasarim!
You just got a 1.86% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.
Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.
If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.