() { int

math.h
Matematiksel Fonksiyonlar
stdlib.h
Standart başlık dosyası bazı fonksiyonlar
ctype.h
Karakter Üzerinde İşlem Yapan Fonksiyonlar
Doç. Dr. Ercan Nurcan YILMAZ
math.h
Matematiksel Fonksiyonlar
Matematiksel fonksiyonlarında kullanılan değişken tipleri genelde
double değişkenlerdir.
Bu fonksiyonlardan biri program içinde kullanılacaksa
#include<math.h> başlık dosyası program içine eklenmelidir.
En çok kullanılan matematiksel fonksiyonlar şu şekildedir.
Doç. Dr. Ercan Nurcan YILMAZ
Fonksiyon Bildirimi Açıklama
int abs(int x);
double fabs(double x);
double floor(double x);
double ceil(double x);
double sqrt(double x);
double pow(double x, double
y);
double log(double x);
double log10(double x);
double sin(double x);
double cos(double x);
double tan(double x);
double asin(double x);
double acos(double x);
double atan(double x);
x tamsayısının mutlak değerini hesaplar
x gerçel sayısının mutlak değerini hesaplar
x'e (x'den küçük) en yakın tamsayıyı gönderir
x'e (x'den büyük) en yakın tamsayıyı gönderir
pozitif x sayısının karekökünü hesaplar
x^y (xy) değerini hesaplar
Örnek Sonuç
abs(-4)
fabs(-4.0)
abs(-2.7)
abs(5.6)
sqrt(4.0)
4
4.000000
3.000000
5.000000
2.000000
pow(2.0,3.0) 8.000000
pozitif x sayısının doğal logaritmasını hesaplar, ln(x) log(4.0)
pozitif x sayısının 10 tabanındaki logaritmasını
log10(4.0)
hesaplar
radyan cinsinden girilien x sayısının sinüs değerini
sin(3.14)
hesaplar
radyan cinsinden girilien x sayısının kosinüs değerini
cos(3.14)
hesaplar
radyan cinsinden girilien x sayısının tanjant değerini
tan(3.14)
hesaplar
sinüs değeri x olan açıyı gönderir. Açı -pi/2 ile pi/2
asin(0.5)
arasındadır.
cosinüs değeri x olan açıyı gönderir. Açı -pi/2 ile pi/2
acos(0.5)
arasındadır.
tanjant değeri x olan açıyı gönderir. Açı -pi/2 ile pi/2
atan(0.5)
arasındadır.
1.386294
0.602060
0.001593
-0.999999
-0.001593
0.523599
1.047198
0.463648
Doç. Dr. Ercan Nurcan YILMAZ
/* yuvarlamalar örneği */
#include <math.h>
#include <iostream>
using namespace std;
int main ()
{
double x=3.57;
cout<<floor(x)<<endl; //aşağı yuvarla
cout<<ceil(x)<<endl; //yukarı yuvarla
cout<<round(x)<<endl; //enyakın tamsayıya yuvarla
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
/* sqrt örneği */
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main()
{
float ans;
ans = sqrt(25.0);
cout << "25 sayisinin karekoku: "<<ans<< endl;
system("PAUSE");
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
/* pow örneği */
#include <stdio.h>
/* printf */
#include <math.h>
/* pow */
#include <iostream>
using namespace std;
int main ()
{
printf ("7 ^ 3 = %f\n", pow (7.0, 3.0) );
printf ("4.73 ^ 12 = %f\n", pow (4.73, 12.0) );
printf ("32.01 ^ 1.54 = %f\n\n", pow (32.01, 1.54) );
//aynı işlemleri cout ile yapalım
cout<<"7 ^ 3 ="<<pow (7.0, 3.0)<<endl;
cout<<"4.73 ^ 12 ="<<pow (4.73, 12.0)<<endl;
cout<<"32.01 ^ 1.54 ="<<pow (32.01, 1.54)<<endl;
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
Trigonometrik (sin, cos, tan) fonksiyonlar kendisine parametre
olarak gelen değeri radyan olarak kabul eder ve sonucu hesaplar. Eğer
açılar derece cinsinden hesaplanması gerekiyorsa şu dönüşüm
kullanılmalıdır:
radyan = (3.141593/180.0)*derece;
Sin(60)
Sin(pi/180*60)
60 Radyan derecenin sinüsü
60 Gradyan derecenin sinüsü
Doç. Dr. Ercan Nurcan YILMAZ
Örnek: sin(), cos(), and tan() fonksiyonlarını kullanan bir program
yapalım
Doç. Dr. Ercan Nurcan YILMAZ
#include <stdio.h>
#include <math.h>
#define PI
3.141593
#define CARPAN PI/180.0
main()
{
double x;
x = 30.0; /* 30 derece !
*/
x *= CARPAN; /* radyana çevir */
printf("30 derecenin sinusu
: %f\n", sin(x));
printf("30 derecenin kosinusu : %f\n", cos(x));
printf("30 derecenin tanjanti : %f\n", tan(x));
}
Doç. Dr. Ercan Nurcan YILMAZ
STANDART FONKSİYONLAR(stdlib.h)
Programlarınızda kullanılmak üzere bir dizi fonksiyon
stdlib.h başlık dosyasında tanımlanmıştır. Bu dosya C++ ile
birlikte gelmektedir. İçerisinde bir takım bulunan hazır
fonksiyonlar ile algoritmalar güçlendirilebilir. İçerisindeki
fonksiyon yapıları şunlardır.
1.Sonlu string bilgiyi sayısal değer dönüştürme
2.String bilginin sonunu belirleyerek sayısal değere
dönüştürme
3.Program sonlandırma
4.Hafıza yönetimi
5.Rasgele sayılar
6.Tam sayılarla ilgili fonksiyonlar
Doç. Dr. Ercan Nurcan YILMAZ
Fonksiyon Bildirimi
int atoi(const char *s);
long atol(const char *s);
double atof(const char *s);
Açıklama
Bir katarı tamsayıya çevirir
Bir katarı uzun tamsayıya çevirir
Bir katarı reel sayıya çevirir
Programı sonlandırarak kontrolü işletim
void exit(int durum);
sistemine geri verir.
0 ile RAND_MAX arasında rastgele sayı
üretir.
int rand(void);
RAND_MAX, stdlib.h içinde tanımlanmış
bir sembolik sabittir
stdlib.h'de tanımlanmış iki sayıdan en
max(a,b)
büyüğünü bulan makro fonksiyon
stdlib.h'de tanımlanmış iki sayıdan en
min(a,b)
küçüğünü bulan makro fonksiyon
Bellekte boyut ile belirtilen sayıda bayt
void *malloc(unsigned boyut); kadar yer tahsis eder
malloc ile ayrılan bellek bölgesini
void free(void *ptr);
boşaltır
Örnek
atof("-12345")
atof("1234567890")
atof("-123.546")
Sonuç
-12345
1234567890
-123.456
exit(0)
-
rand()
504851
max(5,9)
9
min(5,9)
5
p=malloc(sizeof(int)*
?
5)
free(p)
-
Doç. Dr. Ercan Nurcan YILMAZ
Sonlu string bilgiyi sayısal değer dönüştürme
Bu fonksiyonların hepsinin yapısı birbirine benzediği için anlaşılması bir hayli
kolay. Hepsi yapı olarak birbirine benziyor.
DonusVeriTipi atox (*char) ;Yukardaki yapıda X bizim ne tür veri istediğimizi
gösteriyor; örnegin fload ise burası f olacak.o durumda DönüşVeriTipi de
fload olacaktır. Bu tür fonksiyonlara birkaç örnek:
float
int
double
long
atof(*char);
atoi(*char);
atod(*char);
atol(*char);
Doç. Dr. Ercan Nurcan YILMAZ
//ÖRNEK PROGRAM
#include<stdio.h>
#include<stdlib.h>
int main() {
char tam_bir_sayi[] = "156";
char yas[] = "18 yaşındayım";
printf( "%d\n", atoi( tam_bir_sayi ) );
printf( "%d\n", atoi( yas ) );
printf("ornek carpim:%d\n",atoi(tam_bir_sayi)*atoi(yas));
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
String bilginin sonunu belirleyerek sayısal değere
dönüştürme
Bu fonksiyonlar ise bir karakter kümesi içinden belirli bir
aralığı sayısal veriye dönüştürür.Kullanımı sonlu string
bilgiyi sayısal değer dönüştürme fonksiyonlarına benzese
de farklılık içerir ve biraz karışıktır.
DönüsVeriTipi
strtoX
(*char,**char,int);Yine
x
dönüştürlücek veri tipini gösteriyor burası d(double)
l(long) ve ul (unsigned long) isimlerini alabiliyor. ilk *char
değişkeni bize dönüştüreceğimiz stringin başlangıç
noktasını veriyor. İkinci argüman ise asıl karışık nokta.
Dönüştürmeyi bitireceğimiz noktanın pointer adresi.
Doç. Dr. Ercan Nurcan YILMAZ
//ÖRNEK PROGRAM
#include<stdio.h>
#include<stdlib.h>
main()
{
char *strdegisken = "135.57abc",*son;
double sonuc;
sonuc = strtod(strdegisken,&son); //string ifade double dönüştürülüyor
printf ("Donusumm sonucunda deger %f oldu\n",sonuc);
printf ("Kalan kisim:%s\n",son);
printf("***************\n");
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
Program sonlandırma
Normalde main program alt programları cağırır ve main programda
return satırına ulaşıldığında veya “}” karakteri ile karşılaşıldığında main
uygulama son bulmuştur denir. Ama standart kütüphane bize üç farklı
fonksiyon ile program sonlandırma imkanı da verir.
abort
Parametre almadan kullanılır. Programı sonlandırır. Sonlandırmakla da
kalmaz açılmış dosyaları kapatır ve bufferi temizler. Böylece tek tek
dosyaları kapatıp belleği geri teslim etmezsiniz.
atexit
Esasında programı sonlandıran bir komut değildir. Fakat ana program
sonlandığında işletilecek programı verir. 32 adet programı sıralar ve en
son girilen program önce çalışır.
exit
Programı bir değer ile sonlandırır. Linux altında sık kullanılan bir
yapıdır.
Doç. Dr. Ercan Nurcan YILMAZ
//ÖRNEK
#include <stdio.h>
#include <stdlib.h>
void cikis1 (void)
{
puts ("cikis1");
}
void cikis2 (void)
{
puts ("cikis2");
}
int main (){
atexit (cikis1);
atexit (cikis2);
puts ("main fonksiyon.");
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
system( ) kullanımı
System fonksiyonu sistem komutlarını yürütmek için kullanılır.Bu fonksiyon
kendisine parametre olarak gelen ifadeyi UNIX, Linux veya MS-DOS komut
satırına yazar ve çalıştırır. system() fonksiyonu ile, bilgisayarın tüm dosya ve
çevre birimleri, küçük program parçaları sayesinde kontrol edilebilir. Genel
yazım biçimi:
system("işletim_sistemi_komutu");
Örneğin,
Windows dizininde bulunan tüm dosyaları listelemek için
system("dir c:\windows");
Bu fonksiyon Linux İşletim sisteminde de kullanımı aynıdır.
Doç. Dr. Ercan Nurcan YILMAZ
//ÖRNEK
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i;
printf ("Sistem kontrol edilebilir durumdamı:...");
if (system(NULL)) puts ("Ok");
else exit (1);
printf ("dir komutu calistiriliyor\n");
i=system ("dir"); /*DIR KOMUTU ÇALIŞTIRILIYOR*/
printf ("Geri donus degeri: %d.\n",i);
return 0;
}
Doç. Dr. Ercan Nurcan YILMAZ
rand() fonksiyonu kullanımı
#include <stdio.h>
#include <cstdlib>
#include <conio.h>
#include <time.h> //time(NULL)
main() {
int
i,ri;
float rf;
char x;
srand(time(NULL));//her seferinde rastgele sayı uretimi için
basla:
system("cls");
for(i=0;i<10;i++) {
ri = rand() % 100;
/* 0-100 arası tamsayı
*/
rf = (float) rand()/RAND_MAX; /* 0-1
arası reel sayı */
printf("%d\t%f\n",ri,rf);
}
puts("\n20 tane rasgele sayi urettim...\n");
puts("Devam etmek istiyorsanız e harfine basınız...");
x=getch();
if(x=='e'||x=='E') goto basla; }
Doç. Dr. Ercan Nurcan YILMAZ
Hafıza yönetimi
C dilinde yazılan bir program bilgisayarda kullandığı
belleği bazı parçalara ayırarak kullanır. Windows XP
altında çalışan programlarda toplamda 4 GB olan bu bellek
bazı bölümlere ayrılır. Program bölümü, kalıcı değişken
bölümü, yerel değişkenlerin kullandığı yığıt ve dinamik
hafıza ayırma işlemlerini yaptığımız yığın. İşletim
sisteminden yararlanarak sistemden yer isteme işlemine
hafızada yer açma (memory allocation) denir.
Bunlar, hafızada yer açmamızı sağlayacak olan malloc( )
fonksiyonu ve işimiz bittiğinde kullandığımız hafızayı iade
etmemizi sağlayacak olan free( ) fonksiyonudur. Bunların
dışında bu kütüphanede calloc( ) ve realloc( ) fonksiyonları
da tanımlanmıştır. Bu fonksiyonları pointer larla
kullanacağımızı unutmayalım. Şimdi bu fonksiyonlara bir
bakalım:
Doç. Dr. Ercan Nurcan YILMAZ
Malloc
Yığında yer açmamızı sağlayacak olan malloc( ) fonksiyonunun genel prototipi
şöyledir:
void * malloc(int size)
Burada size ile ifade edilen yere istenen byte sayısı girilir. Byte sayısını hatalı
girebiliriz bu yüzden burada sizeof( ) fonksiyonu kullanılmalıdır. Hem bu sayede
bir int veya float tipinin kaç byte yer ayırdığını aklımızda tutmak zorunda
kalmayız. Bu yüzden bırakalım da bu konuyu bize hazır sunulan sizeof( )
fonksiyonu düşünsün.
Not: malloc( ) fonksiyonu default olarak void bir değer döndürür. Bu, ayrılan
hafızanın başlangıç adresidir. Bu yüzden bu fonksiyonu her kullandığımızda
gerçekten bu istediğimiz yer ayrıldı mı diye kontrol etmek gerekir. Eğer
fonksiyon başarılı olamamışsa NULL değer döndürür.
ÖRNEK
int *p;
p= malloc( sizeof(int) );
…
Dinamik hafıza ayırma fonksiyonlarını pointerlarla kullanacağımızı söylemiştik.
Bunun için önce bir p pointerı tanımladık ve mallocla ayırdığımız yeri bu p
pointerına döndürdük.
Doç. Dr. Ercan Nurcan YILMAZ
FREE
Program sona erdiğinde ayırdığımız hafızayı yığına iade etmemiz gerekir.
C dili kullanıldıktan sonra iade edilmeyen hafızayı “çöp” olarak nitelendirir.
Bu çöpü bizim toplamamız gerekir. Bunun için free( ) fonksiyonu kullanılır.
Prototipi şöyledir:
void free( void *p);
Örneğin deminki örnekten yola çıkarsak, malloc( ) ile açtığımız hafızayı p
pointerına döndürmüştük. İşimiz bittiğinde free( ) fonksiyonunu
kullanarak açtığımız bu yeri iade edeceğiz. Bunun için,
int *p;
p= (int*) malloc( sizeof(int) );
…
free(p);
yazmamız yeterlidir.
Doç. Dr. Ercan Nurcan YILMAZ
Calloc
calloc( ) fonksiyonu aynı malloc( ) gibi hafızada yer açar ve bu açılan bytelara 0
değerini atar. Prototpi şöyledir:
void *calloc(int sayı, boyut);
//ÖRNEK PROGRAM
#include <stdio.h>
#include <stdlib.h>
#define YER 1000
main() {
int *p, i;
/* YER=1000 boyutunda ve int türünde yer acalım */
p = (int *) malloc(YER * sizeof(int));
/* artık p yi 1000 boyutunda bir dizi olarak kullanabiliriz */
for (i=0; i < YER; i++)
{ /* bu dizi elemanlarına rastgele degerler atayalım */
p[i] = rand();
} /* isimiz bitti simdi tesekkur edelim ve hafızayı iade edelim */
free(p);
}
Doç. Dr. Ercan Nurcan YILMAZ
Realloc
Çoğunlukla bir bellek bloğunu kullanmaya başlarken ihtiyacınız olacak bellek
miktarını bilemez ve yaklaşık bir boyut ile bloğu ayırırsınız. Örneğin, blok bir
dosyadan okunan satırı tutan bir tampon olabilir ve bir satır için yeterli olan
tamponunuz başka bir satır için yetersiz kalabilir.Bunu değiştirmek için realloc
kullanılır.
Çoğu durumda realloc başarısız olduğunda eski bloğa ne olduğunun fazla bir
önemi kalmaz. Çünkü uygulama yazılımı bellek yetmediğinde çalışmasını
sürdüremez ve yapacak tek şey kalır: bir ölümcül hata iletisi ile kendini
sonlandırmak. Çoğunlukla bu durum için bir yordam yazılır. realloc için xrealloc
dur.
KULLANIM ŞEKLİ
* xrealloc (void *ptr, size_t size)
{
}
char *str =realloc (ptr, size);
if (str == 0)
printf ("Sanal bellek tükendi");
return o;
Doç. Dr. Ercan Nurcan YILMAZ
TAM SAYI İLE İLGİLİ FONKSİYONLAR
ABS
Bir tamsayının mutlak değerini hesaplar.
#include <stdio.h>
#include <stdlib.h>
int main (){
int n,m;
n=abs(23);
m=abs(-11);
printf ("n=%d\n",n);
printf ("m=%d\n",m);
return 0;}
ÇIKTI
n=23
m=11
Doç. Dr. Ercan Nurcan YILMAZ
DİV
Birinci parametreyi ikinci parametreye böler, bölümü ve kalanı div_t yapı türünde
döndürür.
#include <stdio.h>
#include <stdlib.h>
int main (){
div_t divresult;
divresult = div (38,5);
printf ("38 div 5 => %d, KALAN %d.\n", divresult.quot, divresult.rem);
return 0;
}
ÇIKTI
38 div 5 => 7, KALAN 3.
Doç. Dr. Ercan Nurcan YILMAZ
LABS
#include <stdio.h>
#include <stdlib.h>
int main (){
long int n,m;
n=labs(65537L);
m=labs(-100000L);
printf ("n=%ld\n",n);
printf ("m=%ld\n",m); }
ÇIKTI
n=65537
m=100000
LDİV
#include <stdio.h>
#include <stdlib.h>
int main (){
ldiv_t ldivresult;
ldivresult = ldiv (1000000L,132L);
printf ("1000000 div 132 => %ld, KALAN %ld.\n", ldivresult.quot, ldivresult.rem); }
ÇIKTI
1000000 div 132 => 7575, KALAN 100.
Doç. Dr. Ercan Nurcan YILMAZ
KARAKTER FONKSİYONLARI(ctype.h)
Bu başlık doyası kabaca C dilinde bulunan karakterler (char) üzerinde
işlem yapmaya imkan sağlar. Başlık dosyası zaten ismi de buradan
almıştır ( char + type = ctype). Amacı bir karakterin tipini algılama
veya değiştirmektir. Kütüphane karakterler üzerinde işlem imkanı
sağladığı için dizgiler (string)üzerinde yapılan işlemler açısından
avantaj sağlar.
Kütüphane herhangi bir C kodunda aşağıdaki şekilde eklenir.
#include <ctype.h>
Eklemenin ardından aşağıdaki fonksiyonlar çağırılabilir:
Doç. Dr. Ercan Nurcan YILMAZ
Komut
Açıklama
Örnek
Sonuç
isalpha(c)
c bir harf ise 0 dan farklı, değilse 0 gönderir
isalpha('a')
8
isalnum(c) c A-Z, a-z veya 0-9 arasında ise 0 dan farklı, değilse 0 gönderir
isalnum('a')
1
isascii(c)
c bir ASCII karakter ise 0 dan farklı, değilse 0 gönderir
isascii('a')
1
isdigit(c)
c bir rakam ise 0 dan farklı, değilse 0 gönderir
isdigit('4')
2
islower(c)
c a-z arasında ise 0 dan farklı, değilse 0 gönderir
islower('P')
0
isupper(c) c A-Z arasında ise 0 dan farklı, değilse 0 gönderir
islower('P')
4
toascii(c)
toascii(65)
A
tolower(c) c karakterini küçük harfe çevirir
tolower('D')
d
toupper(c) c karakterini büyük harfe çevirir
toupper('b')
B
c sayısı ile verilen ASCII koda sahip karakteri verir
Doç. Dr. Ercan Nurcan YILMAZ
/* ASCII kodaları 32-127 arasında olan karakterler üzerinde
ctype.h kütüphanesinde tanımlı bazı makroların kullanımı */
#include <stdio.h>
#include <ctype.h>
main(void)
{
int i;
char c;
for(i=32;i<127;i++)
{
c = toascii(i);
printf("%d\t%c %c %d
}
}
%d\n",i,c,tolower(c),isalpha(c),isdigit(c));
Doç. Dr. Ercan Nurcan YILMAZ
ÖDEV:
1. 0 dereceden 180 dereceye kadar tüm açıları cos, sin ve tan olarak düzgün bir
tablo şeklinde sıralayan programın algoritma akış diyagramı ve programını
yapınız.
Açı:
cos:
sin
tan
0
1.0000 0.000
0.000
1 0.9998
0.0175 0.0175
2. Sayısal loto programı yapılacaktır. Ancak aynı altılı gurubun içinde hiçbir
şekilde aynı sayı ikinci defa gelmemelidir. Buna göre oluşturulacak programın
algoritma akış diyagramı ve programını yapınız.
3. Yapacağınız program sizden isminizin girilmesini isteyecektir. Ancak isim
girerken yanlışlıkla rakam girilirse program yanlış isim girdiğinizi söyleyerek sizi
uyaracak ve ismi tekrar girmenizi isteyecektir.
Doç. Dr. Ercan Nurcan YILMAZ