Teorik Ders 4

Download Report

Transcript Teorik Ders 4

C’de Program Modülleri
• Fonksiyonlar
 C’de modüllere fonksiyon denir.
 Programlar genellikle, programcının yazacağı fonksiyonlarla,
standart C kütüphanesinde tanımlı fonksiyonların birleştirilmesi
ile yazılır.
 C’ kütüphanesindeki fonksiyonlar çok çeşitlidir.
• Fonksiyon çağrıları
 Fonksiyonları çağırırlar.
 Fonksiyonun ismi ve argümanları(gerekli bilgiler) içerir.
 Fonksiyon operasyonları veya işlemleri gerçekleştirir.
 Fonksiyon sonuç döndürür.
• Fonksiyon çağrı benzetimi:
 Patron işçisine bir görev verir ve işin sonunda kendisine rapor
vermesini ister. İşçi bilgileri alır, görevi yapar, sonucu geri bildirir.
Matematik Kütüphanesindeki
Fonksiyonlar
• Matematik kütüphane fonksiyonlar
 Programcının bazı genel matematik işlemlerini yapmasını sağlar.
 #include<math.h>
• Fonksiyonları çağırma formatı
 Fonsiyonİsmi( Argüman )
 Eğer çoklu argüman varsa, virgülle ayrılmış argüman listesi yazarak
kullanılır.
 printf( "%.2f", sqrt( 900.0 ) );
 sqrt fonksiyonunu çağırmak, parantez içindeki girilen argümanın
kare kökünün döndürür.
 Tüm matematik fonksiyonlarının döndürdüğü veri tipi double’dır
 Argümanlar sabit sayılar, değişkenler ya da deyimler olabilir.
Sıklıkla Kullanılan Matematik
Kütüphanesi Fonksiyonları-1
Fonksiyon
Tanım
Örnek
sqrt( x )
x’in karekökü
sqrt( 900.0 ) = 30.0
sqrt( 9.0 ) = 3.0
exp( x )
ex üssel fonksiyonu
exp( 1.0 ) = 2.718282
exp( 2.0 ) = 7.389056
log( x )
log10( x )
x’in e tabanına göre
logaritması
log( 2.718282 ) = 1.0
x’in 10 tabanına göre
logaritması
log10( 1.0 ) = 0.0
log( 7.389056 ) = 2.0
log10( 10.0 ) = 1.0
log10( 100.0 ) = 2.0
fabs( x )
x’in mutlak değeri
fabs( 5.0 ) =5.0
fabs( 0.0 ) = 0.0
fabs( -5.0 ) = 5.0
ceil( x )
x kendinden büyük ilk
tansayıya yuvarlar
ceil( 9.2 ) = 10.0
ceil( -9.8 ) = -9.0
Sıklıkla Kullanılan Matematik
Kütüphanesi Fonksiyonları-2
Fonksiyon
Tanım
Örnek
floor( x )
x kendinden küçük ilk
tamsayıya yuvarlar
floor( 9.2 ) = 9.0
xy
pow( 2, 7 ) = 128.0
pow( x, y )
floor( -9.8 ) = -10.0
pow( 9, .5 ) = 3.0
fmod( x, y )
x/y işleminin kalanını bulur
fmod( 13.657, 2.333 ) = 1.992
sin( x )
x’in sinüsünü hesaplar(x
radyan)
sin( 0.0 ) = 0.0
cos( x )
x’in kosinüsünü hesaplar(x
radyan)
cos( 0.0 ) = 1.0
tan( x )
x’in tanjantını hesaplar(x
radyan)
tan( 0.0 ) = 0.0
Fonksiyon Tanımları
• Fonksiyon tanımlama formatı
Geri dönüş tipi fonksiyon ismi ( parametre listesi)
{
bildirimler ve ifadeler
}
 Fonksiyon ismi: herhangi bir geçerli tanıtıcı
 Geri dönüş tipi: döndürülen sonuçların veri tipi(varsayılan int)
 void tipi geri dönüş değer fonksiyonun herhangi bir değer geri
döndürmeyeceğini gösterir.
 Parametre listesi: virgülle ayrılmış liste, parametreleri bildirir.
 Her parametre için parametre tipi belirtilmelidir. Eğer tip
listelenmezse int olarak alınacaktır.
Fonksiyon Tanımları
• Fonksiyon tanımlama formatı(devam)
Geri dönüş tipi fonksiyon ismi ( parametre listesi)
{
bildirimler ve ifadeler
}
 Bildirimler ve ifadeler: fonksiyon gövdesi(blok)
 Değişkenler bloklar içine tanımlanabilir ve yuvalanabilir.
 Bir fonksiyon tanımı hiçbir koşul altında başka bir fonksiyon içinde
yapılamaz.
 Bir fonksiyonun çağrıldığı yere geri dönmesini kontrol etmek için 3 yol
vardır:
1. Eğer bir fonksiyon bir sonuç ile geri dönmeyecekse, kontrol
fonksiyonun en son parantezine ulaşıldığında ya da
2. return; ifadesinin çalıştırılmasıyla döndürülür.
3. Eğer fonksiyon bir sonuç ile geri dönecekse return deyim;
ifadesi, deyimin değerini çağırıcıya döndürür.
#include <stdio.h>
#include <conio.h>
int maximum( int, int, int );
int main()
{
int a, b, c;
Fonksiyon prototipi
printf( "3 tamsayi giriniz: " );
scanf( "%d%d%d", &a, &b, &c );
printf( "Maksimum: %d\n", maximum( a, b, c ) );
getch();
return 0;
Fonksiyon çağrısı
}
int maximum( int x, int y, int z )
{
int max = x;
if ( y > max )
max = y;
if ( z > max )
max = z;
return max;
}
Fonksiyon tanımı
Fonksiyon Prototipleri
• Fonksiyon prototipleri
 Fonksiyon ismi
 Parametreleri – Fonksiyon ne alacak.
 Geri dönüş tipi – Fonksiyonun döndüreceği veri tipi(varsayılan int)
 Fonksiyon çağrılarını onaylamakta kullanılır.
 Bir fonksiyon prototipi
int maximum( int x, int y, int z );
 3 int alır.
 1 int döndürür.
• Dönüştürme Kuralları ( Argümanların zorlanması)
 Daha düşük tiplere dönüştürmek hatalara sebep olabilir.
Veri Tipleri için Dönüşüm
Hiyerarşisi
Veri Tipleri
printf ile
kullanımları
scanf ile
kullanımları
Long double
%Lf
%Lf
double
%f
%lf
float
%f
%f
Unsigned long int
%lu
%lu
long int
%ld
%ld
unsigned int
%u
%u
int
%d
%d
unsigned short
%hu
%hu
short
%hd
%hd
char
%c
%c
Öncü(Header) Dosyalar
• Öncü dosyalar
O kütüphanedeki her fonksiyon için prototiplerin yer
alır.
<stdlib.h> , <math.h> ….
#include <filename> ile yüklenir.
#include <math.h>
• Programcı tarafından oluşturulan öncü dosyalar
Fonksiyonlarla oluşturulur.
Filename.h şeklinde kaydedilir.
Dahil etmek için #include "filename.h"
Bazı Standart Kütüphane Öncü
Dosyaları
Fonksiyonları Çağırmak:
Değere Göre ve Referansa Göre
• Değerle çağırmak
 Fonksiyona aktarılacak argümanı kopyalar.
 Fonksiyonda ki değişiklikler orijinal olanı etkilemez.
 Fonksiyonun argümanı değiştirmesi gerekmediğinde kullanılır.
 Yanlışlık değişiklikleri önler.
• Referansla çağırmak
 Orijinal argümanı aktarır.
 Fonksiyondaki değişiklikler orijinali etkiler.
 Sadece güvenilir fonksiyonlarla kullanılır.
• Şimdilik sadece, değere göre çağırma üzerine yoğunlaşacağız.
Rasgele Sayılar Üretme
• rand fonksiyonu
<stdlib.h>’ ı yükle
0 ile RAND_MAX(en azından 32767) değeri arasında
bir tamsayı yaratır.
i = rand();
• Dereceldirme
 1 ile n arasında rasgele sayı alabilmek için
1+(rand()%n)
 Rand()%n 0 ile n-1 arasında bir sayı döndürür.
 Buna 1 eklemek 1ile n arasında bir rasgele sayı üretir.
1+(rand()%6)
1 ile 6 arasında sayı
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int i;
for ( i = 1; i <= 20; i++ ) {
printf( "%10d", 1 + ( rand() % 6 ) );
if ( i % 5 == 0 )
printf( "\n" );
}
getch();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int face, roll, frequency1 = 0, frequency2 = 0,
frequency3 = 0, frequency4 = 0,
frequency5 = 0, frequency6 = 0;
case 4:
++frequency4;
break;
case 5:
++frequency5;
break;
case 6:
++frequency6;
break;
for ( roll = 1; roll <= 6000; roll++ ) {
face = 1 + rand() % 6;
switch ( face ) {
case 1:
++frequency1;
break;
case 2:
++frequency2;
break;
case 3:
++frequency3;
break;
}
}
printf( "%s%13s\n", "Yüz", "Frekans" );
printf( " 1%13d\n", frequency1 );
printf( " 2%13d\n", frequency2 );
printf( " 3%13d\n", frequency3 );
printf( " 4%13d\n", frequency4 );
printf( " 5%13d\n", frequency5 );
printf( " 6%13d\n", frequency6 );
getch();
return 0;
}
Programı tekrar çalıştığında sonuçlar hep aynı çıkmaktadır. Öyleyse nasıl rassal
olabilir? rand fonksiyonu gerçekte sahte rasgele sayılar üretir.. rand fonksiyonunu
tekrar tekrar çağırmak, rasgele gibi görünen bir dizi sayı oluşmasına sebep olur.
Ancak bu dizi, program her çalıştırıldığında kendini tekrar etmektedir. Programın
hataları tamamen ayıklandığında, her çalıştırılmada rasgele sayıların farklı bir
dizisinin üretilmesi sağlatılabilir. Buna, rassallaştırma denir ve standart kütüphane
fonksiyonu olan srand sayesinde yapılır.
Rasgele Sayılar Üretme
• srand fonksiyonu
 <stdlib.h>
unsigned tipte bir tamsayıyı argüman olarak kullanır ve
rand fonksiyonunu besleyerek, programın her
çalıştırıldığında farklı bir dizide rasgele sayılar
oluşturulmasını sağlar.
srand(seed)
srand( time( NULL ) );/*load <time.h> */
Time( NULL ): o anki saati saniye biçiminde
oluşturur.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
unsigned seed;
printf( "Beslemeyi girin: " );
scanf( "%u", &seed );
srand( seed );
for ( i = 1; i <= 10; i++ ) {
printf( "%10d", 1 + ( rand() % 6 ) );
if ( i % 5 == 0 )
printf( "\n" );
}
getch();
return 0;
}
Örnek: Şans Oyunu
• Oyuncu iki zarı aynı anda atar. İki zarında altı yüzü
vardır. Bu yüzlerde 1,2,3,4,5 ve 6 adet nokta bulunur.
Zarlar durduktan sonra her iki zarında üste gelen
yüzleri toplanır. Eğer toplam ilk atışta 7 ya da 11 ise
oyuncu kazanır. Eğer toplam ilk atışta 2,3 ya da 12
gelirse (buna barbut denir) oyuncu kaybeder. Eğer ilk
atışta toplam 4,5,6,8,9,10 ise bu toplam oyuncunun
sayısı haline gelir. Kazanmak için oyuncu sayısını bulana
kadar zarları atmaya devam eder. Zarları atmaya
devam ederken kendi sayısı yerine 7 atarsa kaybeder.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int rollDice(void);
int main()
{
int gameStatus, sum, myPoint;
srand( time( NULL ) );
sum = rollDice( );
switch( sum ) {
case 7: case 11:
gameStatus = 1;
break;
case 2: case 3: case 12:
gameStatus = 2;
break;
default:
gameStatus = 0;
myPoint = sum;
printf( "Oyuncunun kazanacagi zar: %d\n", myPoint );
break;
}
while ( gameStatus == 0 ) {
sum = rollDice( );
if ( sum == myPoint )
gameStatus = 1;
else
if ( sum == 7 )
gameStatus = 2;
}
if ( gameStatus == 1 )
printf( "Oyuncu kazanadi\n" );
else
printf( "Oyuncu kaybettti\n" );
getch();
return 0;
}
int rollDice(void) //rollDice fonksiyonu argüman almamaktadır.
{
//Bu sebepten, fonksiyon parametresi void kullanılmıştır.
int die1, die2, workSum;
die1 = 1 + ( rand() % 6 );
die2 = 1 + ( rand() % 6 );
workSum = die1 + die2;
printf( "Oyuncunun attigi zar: %d + %d = %d\n", die1, die2, workSum );
return workSum;
}