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
© Copyright 2024 Paperzz