Genel Programlama II

Benzer belgeler
Genel Programlama I Ders 5

Döngü yapıları, (for, do while, while),

Bu yazımızda, fonksiyonları açıklayacağız. main( ) Fonksiyonu

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Genel Programlama I Ders 6

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

C Programlama Dilininin Basit Yapıları

HSancak Nesne Tabanlı Programlama I Ders Notları

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya

Akış Kontrol Mekanizmaları

PROGRAMLAMAYA GİRİŞ DERS 2

HSancak Nesne Tabanlı Programlama I Ders Notları

Fonksiyonlar (Altprogram)

if (ad == "Sabri") Console.WriteLine("Merhaba Sabri. Ne zamandır gözükmüyodun...");

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

BÖLÜM 4 FONKSİYONLAR. Fonksiyonlar programların etkinliğini, kolay yazılmasını, anlaşılmasını ve bellekte daha az yer kaplamasını sağlayan bloklardır.

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

C dilinde if-else yapısı

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

ALGORİTMA VE PROGRAMLAMA I

Diziler (Arrays) Çok Boyutlu Diziler

Döngüler - Loops 4/9/2010. ENF-102 Jeoloji Giriş. Sayaç kontrollü bir döngüdeki temel öğeler. Sayaç (counter) Kontrollü Döngüler.

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Döngü (Loop) Deyimleri / Veri Belirleyicileri / Matematiksel Fonksiyonlar

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

MTK467 Nesneye Yönelik Programlama. Hafta 4 - Döngüler Zümra Kavafoğlu

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Algoritma ve Programlama: Karar Yapıları ve Döngüler

Sunum İçeriği. Programlamaya Giriş

Döngü Komutları. Komutu. while Komutu Diğer Operatörler Bileşik Komut for Komutu. İçiçe Döngüler break ve continue Komutları

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Genel Programlama II

Döngüler - Loops 4/13/2011. ENF-102 Jeoloji Sayaç kontrollü bir döngüdeki temel öğeler. Sayaç (counter) Kontrollü Döngüler.

NESNEYE YÖNELİK PROGRAMLAMA

Bölüm 2 - C ile Programlamaya Giriş

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

ELN1001 BİLGİSAYAR PROGRAMLAMA I

BÖLÜM 6: KARŞILAŞTIRMALI KONTROL YAPILARI

JAVA DÖNGÜ DEYİMLERİ. For Döngüsü

for döngüsü for (başlangıç değeri; şart; artım) ifade; for (başlangıç değeri; şart; artım) { ifadeler; }

C#(Sharp) Programlama Dili

Giris {\} /\ Suhap SAHIN Onur GÖK

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ALGORİTMA VE PROGRAMLAMA I

Yrd. Doç. Dr. Caner ÖZCAN

HSancak Nesne Tabanlı Programlama I Ders Notları

Hafta 9 C Dilinde Kontrol ve Döngü Yapıları

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Sınav tarihi : Süre : 60 dak. c) En başta #include<stdio.h> yazılmamıştır. c) zt d) Pi e) X0

BİLGİSAYAR PROGRAMLAMA. Algoritma ve Akış Şemaları

2. Dereceden Denklemin Köklerini Bulan Program

BİLİNİRLİK ALANI ve ÖMÜR, KONTROL DEYİMLERİ

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Temel Bilgisayar Bilimleri Ders Notu #4-1. kısım

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Dr. Fatih AY Tel:

ALGORİTMA VE PROGRAMLAMA I

Döngü ve Koşul Deyimleri

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

ALGORİTMA VE PROGRAMLAMA II

Yrd. Doç. Dr. Caner ÖZCAN

KONTROL YAPILARI JAVADA UC TURLU KONTROL YAPISI VARDIR BUNLAR İF ELSE İF ELSE İF SWİTCH YAPILARIDIR. IF ELSE YAPISI if (deger) { }else {

Pythonda değişkenlerin türlerini tanımlamaya gerek yoktur

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

Hafta 13 Fonksiyonlar

C++ Dersi: Nesne Tabanlı Programlama

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

Bir C programı C fonksiyonlarından oluşur. Bunlar arasında main() adı verilen ana fonksiyon daima olmalıdır. C fonksiyonları programı oluşturan

Genel Programlama II

Bigisayar Programlama

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

Sınav tarihi : Süre : 60 dak.

ALGORİTMA VE PROGRAMLAMA I

Algoritma ve Programlamaya Giriş

Python Programlama Dili

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

Dr. Fatih AY Tel: fatihay@fatihay.net

ALGORİTMA VE PROGRAMLAMA I

BİLGİSAYAR PROGRAMLAMA

VERİ TABANI ve YÖNETİMİ

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Adım Adım C-II. Eksik kalmış konular

C PROGRAMLAMA YRD.DOÇ.DR. BUKET DOĞAN PROGRAM - ALGORİTMA AKIŞ ŞEMASI

C PROGRAMLAMA D İ L İ

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

BBS515 Nesneye Yönelik Programlama. Ders 3 Zümra Kavafoğlu

Fonksiyonlar. Yrd.Doç.Dr.Bülent Çobanoğlu

Ders 7: Döngüler. Giriş. 7.1 while Döngüsü

Transkript:

Genel Programlama II 22.02.2011 1

C de döngüler Döngü Kavramı Programlama konusunda en kritik yapılardan biri döngülerdir. Döngüler, bir işi, belirlediğiniz sayıda yapan kod blokları olarak düşünülebilir. Ekrana 10 kere "Merhaba Dünya" yazan bir programda, "Merhaba Dünya" yazdıran kodu aslında tek bir defa yazarsınız, döngü burada devreye girip, sizin için bu kodu istediğiniz sayıda tekrarlar. Bütün döngüler temelde iki aşamayla özetlenebilir. Aşamalardan biri, döngünün devam edip etmeyeceğine karar verilen mantıksal sorgu kısmıdır. Örneğin, ekrana 10 kere "Merhaba Dünya" yazdıracaksanız, kaçıncı seferde olduğunu, koşul kısmında kontrol edersiniz. Diğer aşama, döngünün ne yapacağını yazdığınız kısımdır. Yani ekrana "Merhaba Dünya" yazılması döngünün yapacağı iştir. Döngünün devam edip etmeyeceğine karar verilen aşamada, hatalı bir mantık sınaması koyarsanız, ya programınız hiç çalışmaz ya da sonsuza kadar çalışabilir. C programlama diline ait bazı döngüler; while, do while, for yapılarıdır. Bunlar dışında, goto döngü elemanı olmasına rağmen, kullanılması pek tavsiye edilmemektedir. 2

while Döngüsü while döngüsü, en temel döngü tipimizdir. Bir kontrol ifadesiyle döngünün devam edilip edilmeyeceği kontrol edilirken, scope içinde ( yani ayraç işaretleri arasında ) kalan bütün alan işleme sokulur. İşleme sokulan kod kısmı döngü yapılacak adet kadar tekrar eder. while döngüsünün genel yapısını ve akış şemasını aşağıda görebilirsiniz: 3

while döngüsü kullanarak, ekrana 10 kere "Merhaba Dünya" yazan program aşağıdaki gibidir: Yukardaki program aslında son derece basit. i değişkenine ilk değer olarak 0 atıyoruz. Daha sonra, while döngüsüne başlıyoruz. İfadenin doğruluğu ( yani i'nin 10'dan küçük olup olmadığı) kontrol ediliyor. Eğer doğruysa, döngü içindeki kodların çalışması başlatılıyor. Kodların başlamasından bir önceki adımda, i değişkeni arttırılıyor. Bu yapı toplamda 10 kere tekrar ediyor ve en sonunda i'nin degeri 10'a eşit olunca, döngü sonlandırılıyor. 4

Aşağıdaki işlem basit bir toplama ifadesidir. Bu ifade de, n değerini kullanıcıdan alacağımızı düşünerek bir program yazalım. Bu program, alacağı n değerine göre, kendisine kadar olan sayıların karelerinin toplamını gösterecektir. Bu programı yazarsak: 5

do while Döngüsü Göreceğimiz ikinci döngü çeşidi, do while döngüsüdür. Yaptığı iş, while ile hemen hemen aynıdır; verilen işi, döngü koşulu bozulana kadar sürdürür. Ancak while 'a göre önemli bir farkı vardır. while döngülerinde, döngü içersindeki işlem yapılmadan önce, sunulan koşul kontrol edilir. Şayet koşul sağlanmıyorsa, o while döngüsünün hiç çalışmama ihtimali de bulunmaktadır. do while döngülerindeyse, durum böyle değildir. İlk çalışmada koşul kontrolü yapılmaz. Dolayısıyla, her ne şartta olursa olsun, döngünüz -en azından bir kere- çalışacaktır. Bazı durumlarda, döngü bloğu içersindeki kodların en azından bir kere çalışması gerektiğinden, do while yapısı kullanılır. do while ile ilgili genel yapıyı ve akış şemasını aşağıda bulabilirsiniz: 6

do while'in kullanılmasının uygun olacağı bir program yapalım. Kullanıcıdan iki sayı alınsın. Bu iki sayı toplandıktan sonra, sonucu ekrana yazdırılsın. Yazdırma sonunda "Devam etmek istiyor musunuz?" sorusu sorulsun ve klavyeden 'E' veya 'e' karakterlerinden birisi girilirse, program devam etsin. Yok farklı birşey girilirse, program sonlandırılsın. 7

for Döngüsü while ve do while dışında, üçüncü bir döngü tipi olarak, for yapısı bulunmaktadır. Diğer iki döngüden farklı olarak, for yapısı, yenilemeli-tekrarlamalı yapılarda kullanıma daha uygundur. Örneğin birbirini, sürekli tekrar eden işlemlerin yapıldığı Nümerik Analiz gibi alanlar, for döngüsü için iyi bir örnek olabilir. Programlarda, diğer iki döngüden çok daha fazla for kullanırsınız. Çünkü for sadece matematiksel hesaplama işlemlerinde değil, diziler ( array ) gibi konularda sürekli kullanılan bir yapıdır. Yazımı diğerlerine nazaran daha sadedir. Aşağıda for döngüsünün genel yazımını ve akış diyagramını göreceksiniz: 8

İlk atacağımız adım; elbette ki ekrana 10 kere "Merhaba Dünya" yazdırmak olacak. Gördüğünüz gibi çok daha sade ve açık gözükür bir kod oldu. for altında tek satır komut olduğundan, küme parantezleri koymamız opsiyoneldi ama ne yaptığınızı karıştırmamak için, her zaman koymanızı öneririm. 9

break Komutu Bazı durumlarda, döngüyü aniden sonlandırmak isteriz. Bunun için 'break' komutunu kullanırız. Döngüyü aniden sonlandırmak veya döngüyü kırmak işlemini, zaten daha önce switch case'lerde kullanmıştık. break komutu her döngü içersinde kullanılabilir. Bitişinin nerede olacağını bilmediğimiz bir döngüyü ancak, break komutuyla sonlandırabiliriz. Şartlar sağlandığında, break komutu devreye girer ve döngü sonlandırılır. Bir örnekle açıklayalım. 10

continue Komutu İşlem yapmadan döngüyü devam ettirmek gibi durumlara da ihtiyacımız vardır. Bunun içinde continue ( Türkçe: devam ) komutunu kullanırız. Program bir for döngüsü çalıştırmaktadır. Her defasında i değişkenin 2'ye göre modu alınır. Eğer sonuç 0'sa, bu sayının çift olduğunu gösterir. Dolayısıyla, bunun ekrana yazdırılmaması gerekir. Bu yüzden, döngü içersindeki işlemleri sürdürmek yerine, altta kalan kodları atlarız. Burada continue komutu kullanılır ve kullanıldığı noktadan itibaren olan işlemler yapılmaz. Döngü başa döner, aynı işlemleri yapar. Bu sefer i tek sayı olacağından continue komutu çalışmaz ve sayıyı ekrana bastırırız. 11

Fonksiyonlar Bir işlemin birden fazla yapıldığı durumlarda her seferinde aynı işlemi yapan kodu yazmak oldukça zor bir iş olacaktır. Fonksiyonlar bu soruna çözüm olarak oluşturulmuşlardır. Sadece bir kereye mahsus yapılacak işlem tanımlanır. Sonra da dilediğiniz kadar bu fonksiyonu çağırırsınız. Bunların dışında; fonksiyonlar modülerlik sağlar. Program içerisinde yazdığınız bir fonksiyonda yanlışlık yaptığınızı fark ettiğinizde bütün programı değiştirmeniz gerekmez, sadece yanlış fonksiyonu düzeltmeniz yeterli olacaktır ve artık programınız doğru şekilde çalışacaktır. Üstelik yazdığınız fonksiyonlara ait kodu, başka fonksiyonlara taşımakta oldukça basittir. Fonksiyonlar, çalışmayı kolaylaştırır. Bir program binlerce satıradan oluşabilir, hem yazmayı hem de okumayı kolaylaştırmak için izlenecek en iyi yöntem, programı fonksiyon parçalarına bölmektir. Örneğin, diskten okuma işlemini disten_oku( ) isimli bir fonksiyon yaparken; grafik çizdirme işini grafik_ciz( ) fonksiyonu ve diske yazdırma görevini de diske_yaz( ) fonksiyonu yapabilir. Yarın öbür gün, yazdığınız kodu birileri incelediğinde, sadece ilgilendiği yapıya göz atarak, aradığını çok daha rahat bulabilir. Binlerce satır içinde çalışmaktansa, parçalara ayrılmış bir yapı herkesin işine gelecektir. 12

Fonksiyon Tanımlama Şimdiye kadar yazdığımız bütün kodlarda, main( ) şeklinde bir notasyon kullandık. Bu kullandığımız ifade, aslında main( ) fonksiyonudur. C programlama dilinde, bir kodun çalışması main( ) fonksiyonun içersinde olup olmamasına bağlıdır. Bir nevi başlangıç noktası olarak düşünebiliriz. Her programda sadece bir tane main( ) fonksiyonu bulunur. Başka fonksiyonların, kütüphanelerin, kod parçalarının çalıştırılması main( ) içersinde direkt veya dolaylı referans edilmesiyle alakalıdır. Bir fonksiyonun genel olarak yapısı şu şekildedir. Dönüş_tipi fonksiyon tarafından döndürülen değerin tipini belirtir. Bu, int, double gibi bir aritmetik tip veya gösterge olabilir. Bir fonksiyon için varsayılan dönüş tipi int tir, bu da geniş bir alanı kapsar, çünkü genelde mantıksal değerler (doğru/yanlış değerleri) ve karakterler için de int kullanırız. Ancak, her durumda (yani int bile olsa) dönüş tipinin açıkça belirtilmesi önerilir. Dönüş_tipi olarak void anahtar sözcüğü kullanıldığında, fonksiyondan hiçbir değer döndürülmeyeceği belirtilmiş olur. 13

Fonksiyon_ismi bir tanıtıcı sözcüktür. Eğer fonksiyon, ayrıca derlenen başka bir kaynak dosyadan çağrılacaksa, fonksiyon isminin belirli sayıdaki ilk karakteri sadece anlamlıdır, bu da bağlayıcı tarafından konulan sınırlamadan dolayıdır. Parametre_bildirimleri virgülle ayrılmış ve önüne tipleri yazılmış biçimsel argüman veya parametre isimleri listesidir. Diğer bir fonksiyon tarafından çağrıldığında bu fonksiyona geçirilecek olan argümanların sayısını, sırasını ve tipini belirtir. Aynı zamanda, parametrelere, sadece fonksiyonun gövdesini oluşturan blok un içinde anlamlı olan, isimler verir. Hiç parametresi olmayan bir fonksiyon da olabilir. Bu durum, parantezler içine void yazılarak açıkça gösterilir. Örneğin, Bir fonksiyon başka bir fonksiyon içinde tanımlanamaz. Diğer bir değişle bir fonksiyon tanımı diğer bir fonksiyon tanımının bitmesinden sonra başlar. Fonksiyon tanımlamalarının sırası önemsizdir, 14

Şimdi bir programla bir fonksiyonun nasıl tanımlandığını ve nasıl çağrıldığını görelim: 15

Fonksiyonun nasıl tanımlandığına bakacak olursak. parametre adı fonksiyon adı parametre tipi Geriye dönen değer tipi (void değer dönmeyeceğini gösterir) Bu fonksiyon adı sayi olan ve tipi int olan bir parametre kullanıyor ve fonksiyon geriye bir değer döndürmüyor sadece ekrana girilen sayının tek mi çift mi olduğunu yazdırıyor. Değer döndürmeyen bir fonksiyon olduğunu void kullanarak gösterdik. 16

Değer döndüren bir fonksiyona örnek: 17

Değer döndüren bir fonksiyonun nasıl tanımlandığına bakacak olursak. parametre adı fonksiyon adı parametre tipi Geriye dönen değer tipi (geriye dönen değerin float olacağını gösterir) Bu fonksiyon adı yaricap olan ve tipi int olan bir parametre kullanıyor ve fonksiyon geriye alan_degeri adında float bir değer döndürüyor. 18

Yukarıdaki programlarda return adında bir deyim görmekteyiz. return kontrolün çağırana geri dönmesini sağlar. return deyiminden sonra gelen deyimler yerine getirilmez ve fonksiyon hemen çağrıldığı yere geri döner. Şeklinde kullanıldığında yararlı hiç bir değer döndürülmez. Geri döndürülen değer tanımsız olduğu için, çağıran fonksiyon bunu kullanmaya çalışmamalıdır. Şeklinde kullanıldığında ifade nin değeri fonksiyonun değeri olarak geri döndürülür. Eğer ifadenin değerinin tipi fonksiyonun dönüş tipiyle aynı değilse, otomatik tip dönüşümü yapılır. Dönüş tipi void olan fonksiyonlar için ikinci şeklin kullanılamaz. 19

return İfadesi Bir fonksiyonun geriye değer döndürüp döndürmemesi, o fonksiyonu genel yapı içersinde nasıl kullanacağınıza bağlıdır. Eğer hazırlayacağınız fonksiyonun, çalışıp, üreteceği sonuçları başka yerlerde kullanmayacaksanız, fonksiyondan geriye değer dönmesi gerekmez. Ancak fonksiyonun ürettiği sonuçları, bir değişkene atayıp kullanacaksanız, o zaman fonksiyonun geriye değer döndürmesi gerekir. Bunun için 'return' ifadesini kullanırız. Geriye değer döndürmeyen fonksiyonları tanımlarken, başına void koyuyorduk. Geriye değer döndüren fonksiyonlar içinse, hangi tipte değer dönecekse, onu fonksiyon adının başına koyuyoruz. Diyelim ki fonksiyonumuz bir tamsayı döndürecekse, int; bir karakter döndürecekse char diye belirtiyoruz. Fonksiyon içersinden neyin döneceğine gelince, burada da return ifadesi devreye giriyor. Fonksiyonun neresinde olduğu farketmez, return sonuç döndürmek üzere kullanılır. Döndüreceği sonuç, elle girilmiş veya değişkene ait bir değer olabilir. Önemli olan döndürülecek değişken tipiyle, döndürülmesi vaad edilen değişken tipinin birbirinden farklı olmamasıdır. Yani int kup_hesapla( ) şeklinde bir tanımlama yaptıysanız, double tipinde bir sonucu döndüremezsiniz. Daha doğrusu döndürebilirsiniz ama program yanlış çalışır. Tip uyuşmazlığı genel hatalardan biri olduğu için, titiz davranmanız gerekir. 20

21

Dikkat edilmesi gereken bir diğer konu; return koyduğunuz yerde, fonksiyonun derhâl sonlanmasıdır. Fonksiyonun kalan kısmı çalışmaz. Geriye değer döndürmeyen fonksiyonlar için de aynı durum geçerlidir, onlarda da return ifadesini kullanabilirsiniz. Değer döndürsün, döndürmesin yazdığınız fonksiyonda herhangi bir yere 'return;' yazın. Fonksiyonun bu noktadan itibaren çalışmayı kestiğini fark edeceksiniz. Bu fonksiyonu çalıştırmanın uygun olmadığı şartlarda, kullanabileceğiniz bir yöntemdir. Bir kontrol ekranında, kullanıcı adı ve/veya şifresini yanlış girildiğinde, programın çalışmasını anında kesmek isteyebilirsiniz. Böyle bir durumda 'return;' kullanılabilir. 22

Fonksiyon Çağrıları Bir fonksiyonu çağırmak için fonksiyon ismini ve virgülle ayrılıp parantez içine alınmış argümanların bir listesini belirtin. Fonksiyonun argümanları olmasa dahi parantezler bulunmalıdır, böylece derleyici ismin bir değişkeni değil de bir fonksiyonu gösterdiğini anlayabilecektir. Fonksiyon tarafından geri döndürülen değer kullanılabilir veya kullanılmayabilir. Örneğin, Fonksiyonu için, bir fonksiyon çağrısıdır. Bu noktada kontrol, çağıran fonksiyondan çağrılan fonksiyona aktarılır. -10 değeri abs fonksiyonunun n parametresine atanır. Çağrılan fonksiyon, ya bir return deyiminin yerine getirilmesi yada fonksiyon gövdesinin sağ çengelli parantezine ulaşılması sonucu bittiğinde, kontrol çağıran fonksiyondaki kaldığı yere geri döner. Fonksiyon tarafından bir değer döndürülüyorsa, bu değer çağrının yerini alır. 23

Örneğin, x in değerini 127 yapacaktır; oysa daha yukarıda aynı fonksiyona yapılan ilk çağrıda geri döndürülen değer (10) kullanılmamıştı, bu yüzden bu değer kaybolmuştu. Dönüş tipi void olan bir fonksiyonun bir ifade içinde kullanılmaması gerekir. Bir argüman istenildiği kadar karmaşık bir ifade olabilir. Argüman değerinin tipi fonksiyon tanımındaki karşılık gelen parametre için beklenen tipe uymalıdır, aksi takdirde, bulunması zor olan bazı hatalar meydana çıkabilir. Fonksiyonlar kullanılmadan önce bildirilmelidirler. Bu kural bazı hataların önlenmesi için titizlikle uygulanmalıdır. C derleyicisi, bildirimi yapılmayan bir fonksiyon kullanımı ile karşılaştığında dönüş tipinin int olduğunu varsayar. Eğer fonksiyonun dönüş tipi void, double vs. ise programın sonucu yanlış çıkacaktır. 24

Fonksiyon bildirimleri Örneğin, aşağıdaki gibi dabs adında bir fonksiyon tanımlayalım. Double n değerinin mutlak değerini alan bir fonksiyon. Bu fonksiyonu şeklinde çağırdığımızı düşünelim. 25

Bu durumda üç olasılık vardır: 1.dabs ın tanımı aynı kaynak dosyada deneme nin tanımından önce gelir. Bu durumda dabs ın tanımı etkisini deneme nin içinde de sürdüreceği için hiç bir sorun çıkmayacaktır. Derleyici, yukarıdaki ifadede dabs tarafından beklenen ve geri döndürülen değerin tipinin double olduğunu bilecek ve gerekli tip dönüşümlerini yapacaktır. 26

2.dabs ın tanımı deneme nin tanımından sonra gelir. Derleyici code>dabs ın bir fonksiyon çağrısı olduğunu tanıyacak, ancak, henüz dönüş tipinin ne olduğunu bilemeyeceği için, int döndüren bir fonksiyon olduğunu varsayacaktır. Daha sonra, dabs ın gerçek tanımıyla karşılaştığında, bir sorun ortaya çıkacaktır, çünkü double döndüren bir fonksiyon olarak tekrar tanımlamaya çalışacaktır. Bu durumda bir hata mesajı verilecektir. 27

3.En kötü durum, dabs ın tanımı ayrı bir kaynak dosyada verildiği zaman ortaya çıkacaktır. Ayrı ayrı derlemeden dolayı, derleyici uyuşmazlığı bulamayacaktır. Hatta bağlayıcı bile birşey yapamayacaktır. Programın yürütülmesi esnasında anlamsız sonuçlar elde edilecektir. Bunun nedeni, yine, derleyicinin tanımı veya bildirimi yapılmamış olan fonksiyonun int döndürdüğünü varsayması, böylece de dabs fonksiyonu tarafından döndürülen double değerin deneme tarafından int gibi yorumlanmasıdır. 28

Birçok derleyici yapılan bu tip varsayımları, bir uyarı mesajı şeklinde kullanıcıya bildirirler. Bu tip uyarıları mutlaka dikkate alın, çünkü varsayımlar her zaman sizin düşündüklerinizle uyuşmayabilir. Yukarıdaki 2 ve 3 teki sorunları çözmek için aşağıdaki şekil önerilmektedir: 29

Yukarıda yazdığımız alan_fonksiyon.c programını yazmanın en sorunsuz yolu şu şekilde olacaktır. 30

Yerel ( Local ) ve Global Değişkenler Kendi oluşturacağınız fonksiyon içersinde, main( ) fonksiyonunda ki her şeyi yapabilirsiniz. Değişken tanımlayabilir, fonksiyon içinden başka fonksiyonları çağırabilir veya dilediğiniz operatörü kullanabilirsiniz. Ancak değişken tanımlamalarıyla ilgili göz ardı etmememiz gereken bir konu bulunuyor. Bir fonksiyon içersinde tanımladığınız değişkenler, sadece o fonksiyon içersinde tanımlıdır. main( ) veya kendinize ait fonksiyonlardan bu değişkenlere ulaşmamız mümkün değildir. main( ) içinde tanımladığınız a isimli değişkenle, kendinize özgü tanımladığınız kup_hesapla( ) içersinde tanımlanmış a isimli değişken, bellekte farklı adresleri işaret eder. Dolayısıyla değişkenlerin arasında hiçbir ilişki yoktur. kup_hesapla( ) içersinde geçen a değişkeninde yapacağınız değişiklik, main( ) fonksiyonundakini etkilemez. Keza, tersi de geçerlidir. Şu ana kadar yaptığımız bütün örneklerde, değişkenleri yerel olarak tanımladığımızı belirtelim. Yerel değişken dışında, bir de global değişken tipi bulunur. Programın herhangi bir noktasından erişebileceğiniz ve nerede olursa olsun aynı bellek adresini işaret eden değişkenler, global değişkenlerdir. Hep aynı bellek adresi söz konusu olduğun için, programın herhangi bir noktasında yapacağınız değişiklik, global değişkenin geçtiği bütün yerleri etkiler. 31

Aşağıdaki örneği inceleyelim: 32

Kod arasına konulan yorumlarda görebileceğiniz gibi, değişkenler lokal olarak tanımlanmasa, a'nin değeri farklı olurdu. Sayının karesini bulduktan sonra, küpünü yanlış hesaplardık. Değişkenler lokal olduğu için, her aşamada farklı bir değişken tanımlandı ve sorun çıkartacak bir durum olmadı. Benzer bir programı global değişkenler için inceleyelim. 33

Gördüğünüz gibi, sonuc isimli değişken her iki fonksiyonun dışında bir alanda, programın en başında tanımlanıyor. Bu sayede, fonksiyon bağımsız bir değişken elde ediyoruz. Global değişkenlerle ilgili dikkat etmemiz gereken bir iki ufak nokta bulunuyor: Global bir değişkeni fonksiyonların dışında bir alanda tanımlarız. Tanımladığımız noktanın altında kalan bütün fonksiyonlar, bu değişkeni tanır. Fakat tanımlanma noktasının üstünde kalan fonksiyonlar, değişkeni görmez. Bu yüzden, bütün programda geçerli olacak gerçek anlamda global bir değişken istiyorsanız, #include ifadelerinin ardından tanımlamayı yapmanız gerekir. Aynı ismi taşıyan yerel ve global değişkenleri aynı anda kullanıyorsak, iş birazcık farklılaşır. Bir fonksiyon içersinde, Global değişkenle aynı isimde, yerel bir değişken bulunduruyorsanız, bu durumda lokal değişkenle işlem yapılır. Açıkcası, sınırsız sayıda değişken ismi vermek mümkünken, global değişkenle aynı adı vermek pek uygun değildir. Program akışını takip etmeyi zorlaştıracağından, ortak isimlerden kaçınmak daha akıllıca olacaktır. 34

Örnek: 1'den 100'e kadar olan sayıların toplamını veren programı while komutunu kullanarak yazın. #include <stdio.h> main() { int i, j; i =1; j = 0; while (i<101) { j =j+i; i =i+1 } printf("toplam = %d",j); } 35

Soru: 1'den 100'e kadar olan sayıların toplamını veren programı for döngüsünü kullanarak yazın. 36

#include <stdio.h> main() { int i; int toplam=0; } for (i=0;i<=100; i++){ toplam =toplam+i; } printf("toplam = %d",toplam); 37

Örnek : Sadece toplama ve çıkarma işlemlerini ve while komutunu kullanarak çarpma işlemini gerçekleştiriniz #include<stdio.h> main() { int a, b, c; printf ( iki sayıyı giriniz ); scanf( %d%d, &a, &b); c = 0; while (b > 0) { c = c + a; b = b - 1; } printf( Sonuç = &d\n, c); } 38

Soru: Girilen sayının faktöriyelini veren programı for döngüsü kullanarak yazın. 39

#include<stdio.h> main() { int i, j; int fact; printf("bir sayi giriniz : "); scanf("%d", &i); fact =1; for (j=1; j<=i; j++) fact =fact*j; printf("faktöriyel =%d",fact); } 40