BİLİŞİM - BİLGİSAYAR - EĞİTİM
  İşlevler
 

4 -  İşlevler

           Problem çözmenin ilkelerinden biri problemi mümkün olduğu kadar çok parçaya bölmek idi. Daha sonra bu parçalar bağımsız olarak düşünülüp çözümleri elde edilebilir. C'de bu bölme işlemi işlev kullanarak yapılır.

                Belli bir işi gerçekleştiren program deyimlerinin karmaşık programları düzenlemek ve basitleştirmek için programın bir birimi olarak gruplandırılması.

 

(işlev kullanmanın temel nedenleri : divide and conquer ,  software reusability )

 

Örnek 4.1 : Bir tamsayının faktöriyelini hesaplayan işlev

 

main()

{

  int i;

  prinf(“Sayıyı giriniz “); scanf(“%d”, &i);

  printf(“%dn”, fakt(i));

}

long fakt ( int n)

{

  int j;

  long f = 1;

  for ( j = 2; j < =n; j = j  + 1),

       f = f * j;

  return f;

  }

 

Örnek 4.2 : Bir tamsayının kübünü veren işlev

 

#include <stdio.h>

main()

{

 int sayi;

 int kub(int); /* işlevin prototipi */

 printf("sayıyı gir ");

 scanf("%d", &sayi);

 printf("Kübü = %dn", kub(sayi));

}

int kub(int i)

{  return i*i*i; }

İşlevin tanımlanma biçimi

   dönüş_tipi işlev_adı(parametreler)

   {

    yerel tanımlamalar

     deyimler

   }

 

dönüş_tipi: Eğer işlev bir değer geri gönderecek ise değerin tipini belirtir. Belirtilmez ise Int kabul edilir. Eğer                              işlev değer göndermeyecek ise dönüş_tipi yerine void yazılır.

 

işlev_adı: İşlev çağırılırken kullanılacak ad (belirleyici).

 

parametreler: İşlev için gerekli değerleri içerir. Her parametre değişken tanımlar gibi tanımlanır. Herbirinin                  arasında ',' kullanmak gerekir.

 

yerel tanımlamalar:  Bu işleve özgü(değişken,sabit) tanımlamalar.

 

Eğer işlev bir değer gönderecek ise bu return deyimi ile yapılır.

 

      return değer;

 

 

 

İşlevin Prototipi

Tanımlana bir işlevin ana modül içerisinde prototipinin yazılması gerekir. Prototip ile işlevin dönüş değeri ve aldığı parametrelerin tipleri tanımlanır. Bu bilgiye göre C derleyecisi işlev çağırıldığında değerlerin uygun olduğunu sınar.

 

int kub(int)         kub işlevi int bir değeri alır ve yine int bir değer üretir.

 

Örnek 4.3 : Üç sayıdan en büyüğünü veren işlev.

 

Girdi : üç tane tamsayı

Çıktı : girdilerin en büyüğü

 

int max(int s1, int s2, int s3)

{

 if (s1>s2 && s1>s2)

    return s1;

 else

    if (s2>s3)

       return s2;

    else

       return s3;

}

  

 Bu işlevi kullanan bir program

 #include <stdio.h>

 main()

 {

 int max(int, int, int);

 clrscr();

 printf("%d n", max(1,2,3));

 printf("%d n", max(14,8,12));

 printf("%d n", max(1,6123,3123));

}

...

işlevin tanım bloğu

...

 

Örnek 4.4: Üs alma işlevini gerçekleyen işlev (üs bilgisi tamsayı).

 

Girdi : taban ve üs değeri

Çıktı : tabanın üs. kuvveti

float us (float a, int  b)

 

{

    int i;

    float r;

    r = 1;

    for (i = 1; i<=b; i++)

        r = r * a;

     return  r;

}

 

Fonksiyonun program içinden çağırılışı

 

    d = us(2,3);

    d = us(a, 4);

    d = d * us(3,4);              

 

Üs alma işlemini gerçeklemenin diğer yolu

ab = eblna  = Exp(b * Ln(a))

Exp(x : Real) : Real       ex

Ln(x : Real) : Real         Ln(x)

float us (float a, float  b)

{

   if (a>0)

        return= exp( b * log (a ));

    else

        return= -1;

}

 

Genel değişken (global): Her yerde (main ve diğer işlevler) geçerlidir, değerine erişilebilir.

                                               Programın en başında, main işlevinin dışında tanımlanır.

Yerel değişken (local): Sadece tanımlandığı modülde geçerlidir, değerine erişilebilir.

                                               Modül içinde tanımlanır.

int a;   /*tüm işlevlerden değerine erişilebilir, değeri değiştirilebilir.  (global) */

main()

{

   int b;  /* sadece main işlevi içerisinden erişilebilir  (local ) */

  ...

}

islev1(...);

{

   int b;   /* sadece islev1 işlevi içerisinden erişilebilir. main işlevindeki değişkendan bağımsızdır  (local ) */

   int c;   /* sadece islev1 işlevi içerisinden erişilebilir  (local ) */

   ...

}

 

Örnek 4.5  : 8 bit olarak girilen bir sayıya eşlenik (parity) bitini ekleyen programı yazınız (çift eşlenik)

 

Eşlenik biti en düşük anlamlı bit olarak eklenecektir.

 

Algoritma

                1. Sayıyı oku.

                2. Sayıdaki birlerin sayısını bul.

                3. Birlerin sayısı tek ise 1, çift ise 0 ekle.

 

Programı yazarken 2. ve 3. adımlar işlev olarak yazılacaktır.

 

/* Eşlenik biti ekleme */

int bulbir ( int );

int eklebir ( int , int );

main()

{

  int girsayi, birler;

  clrscr();

  scanf("%d", &girsayi);

  birler = bulbir(girsayi);

  girsayi = eklebir(birler, girsayi);

  printf("%dn", girsayi);

}

int bulbir ( int sayi)

{

   int kacbir = 0;

   while (sayi>0) {

       kacbir = kacbir + (sayi % 2 );

       sayi = sayi / 2;

   }

   return kacbir;

} /* BulBir */

int eklebir ( int birler, int sayi)

{

   return (2 * sayi + (birler % 2));

} /* Eklebir */

 

* Karşı taraf için gereken algoritmayı yaz (sayı doğru mu, doğru ise değeri).       

 

Örnek 4.6  : A işyerindeki bir personelin hangi dilimden gelir vergisi ödeyeceğini (yüzdesini) belirten fonksiyonu yazınız.

 

Girdi : personelin birikmiş vergi matrahı

Çıktı : Kesinti yüzdesi

İlgili bilgi :  0-20 Milyon %25,  20-40 Milyon %30, 40-80 Milyon %35,  80-160 Milyon %40

                 >180 Milyon %45

int  v_oran ( float bvd);

{

   int i;

    if (bvd < 20000000)

        i = 25;

    else if  (bvd < 40000000)

        i = 30;

    else if  (bvd < 80000000)

        i =  35;

     else  if  (bvd < 160000000)

         i =  40;

     else

         i = 45;

     return i;

}

 

Örnek 4.7  :  Gelir vergisi matrahı ve önceki aylara ait birikmiş vergi matrahı belli bir personelin gelir vergisini hesaplayan fonksiyonu yazınız.

 

        Vergi := Gelir vergisi matrahı * Vergi oranı

 

Not : Eğer per”sonel bu ay dilim değiştiriyorsa gelir vergisi gerektiği şekilde eski ve yeni dilime paylaştırılarak kesinti hesaplanmalıdır.

 

Örnek 4.8 : Girilen harfi büyük harfe dönüştüren fonksiyon

 

Girdi : karakter

Çıktı : karakter ( girdi harf ise büyük harfe dönüştürülmüş)

 

char  buyuk(char c);

{

    if (c >= 'a'  && c <= 'z')

        return c - 32;

    else

        return c;

}

 

Örnek 4.9:

 

Girdi : iki sayı ve aralarındaki işlem

Çıktı: iki sayı arasındaki işlemin sonucu

 

int calculate(char islem, int a, ibt b, int c)

{

   int s;

    switch( islem )

        case '+' : s = a + b ; break;

        case '-' : s = a - b ; break;

        case '*' : s = a * b ; break;

        case '/' : s = a / b ; break;

       default : s = 0;

   }

   return s;

}

 

Çağırma biçimi

 

     a = calculate ('+',4,8');

     a = calculate ('/', 4,2) * calculate ('*', 2,2);

 

Örnek 4.10:  Bir işlevin köklerinden birini Newton yönetimi ile bulan prg. ( x2-2 )

 

#include <stdio.h>

#include <math.h>

double fn(double);

double fnt(double);

 

main()

{

 double x,x0;

 double hata;

 

 hata = 0.0001;        /* izin verilen hata */

 x = 8;                     /* başlangıç değeri */

 do {

   x0 = x;

   x = x0 - fn(x0)/fnt(x0);

 } while (fabs(x-x0)>hata);

printf ("Sonuç = %fn", x);

 printf ("f(x)  = %fn", fn(x));

}

double fn(double x) /* işlevin değeri */

{

 return x*x-2;

}

double fnt(double x)  /* işlevin türevinin değeri */

{

  return 2*x;

}

 

 

Örnek :4.11:  İki sayının ortak katlarının en küçüğünü veren işlevi yazınız.

 

#include <stdio.h>

long okek(long, long);

main()

{

  long i, j;

  clrscr();

  printf("İki tamsayı giriniz :");

  scanf("%ld%ld", &i, &j);

  printf("sayıların okeki = %ld n" okek(i, j));

}

long okek(long p, long q)

/* p < q olmali. Degil ise yerlerini değiştir. */

{

  long i, k;

  if (p>q) {

      i=p;

      p=q;

      q=i;

  }

  /* p nin öyle bir katını bul ki q sayısına tam bölünsün

     2 sayısından itibaren taranmaya başlanabilir fakat

     p/q yeterli

  */

  i = q / p;

  do {

    k = p*i;

    i = i+1;

  } while ( k % q != 0);

  return k;

 

 

 

Örnek :4.12: İstenen sayıdaki asal sayıyı listeleyen programı yazınız.

 

#include <stdio.h>

int asal(int);

main()

{

  int i ;    /* asal olup olmadığı sınanacak sayılar */

  int kac; /* ilk kaç asal sayının listeleneceği bilgisi */

  int j;      /* listelenen asal sayıların adetini tutar */

  clrscr();

  printf("ilk kaç asal sayı listelenecek : ");

  scanf("%d", &kac);

  /* for deyiminde ifade3 kısmında döngü değişkeni yerine

     farklı bir değişkenin değeri değiştiriliyor. Döngü değişkeni

     ide incelenen sayı asal ise arttırılıyor

  */

  i = 2;

  for (j = 1; j<=kac;i++)

      if (asal(i)) {

         printf("%d n", i);

         j++;

      }

}

int asal(int n)

/* sayı asal ise 1 değilk ise 0 değerini alır */

{

        int i;

        if (n % 2 == 0)

                return (n==2);

        if (n % 3 == 0)

                return (n==3);

        if (n % 5 == 0)

                return (n==5);

        for (i=7; i*i <= n; i+=2)

                if (n % i == 0)

                        return 0;

        return 1;

}

 

 

 

Örnek :4.13: Belirtilen tarihteki ayın kaç gün sürdüğünü veren işlevi yazınız.

 

Girdi : Ay ve yıl

Çıktı : Aydaki gün sayısı

int aydakigun(int ay, int yil)

{

  int i;

  switch (ay) {

      case 1:

      case 3:

      case 5:

      case 7:

      case 8:

      case 10:

      case 12 : i = 31;break;

      case 2 :

              if (yil % 4 == 0)

                 i = 29;

              else

                 i = 28;

              break;

      default : i = 30;

  }

  return i;

}

 

Örnek :4.14: Önümüzdeki yılda Ramazan Bayramı nın hangi tarihte kutlanacağını hesaplayan programı yazınız. Bu yılki tarih klavyeden gün ay ve yıl olarak okunacakır.

 

Girdi: Bu yıl kutlanılan tarih

Çıktı : Sonraki tarih

#include <stdio.h>

int aydakigun(int, int);

main()

{

  int gun,ay, yil;

  int i, j ;

  clrscr();

  printf("Bu yılki tarihi giriniz (G A Y) : ");

  scanf("%d %d %d",&gun, &ay, &yil);

  yil = yil + 1;

  gun = gun - 11;

  if (gun < 1 ) {

     ay = ay - 1;

     if (ay < 1 ) {

        ay = 12;

        yil = yil - 1 ;

     }

     gun = gun + aydakigun(ay, yil);

  }

  printf("nGelecek bayram = %d/%d/%dn",gun,ay,yil);

}

 

Örnek :4.15: Girilen bir tamsayının basamaklarının sırasının tersinin oluşturduğu sayıyı veren işlevi yazınız.

#include <stdio.h>

long tersi(long);

main()

{

  long s;

  clrscr();

  printf("Sayıyı giriniz : ");

  scanf("%ld", &s);

  printf("Basamaklarının ters çevirilmişi  = %ld n", tersi(s));

}

long tersi(long k)

{

  long a, b;

  a = 0;

  while (k>0) {

     b = k % 10;

     a = a * 10 + b;

     k = k / 10;

  }

  return a;

}

 
 
  Bugün 119 ziyaretçi (176 klik) www.bilisim-egitim.tr.gg  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol