Kayıtlar

fonksiyonlar etiketine sahip yayınlar gösteriliyor

32 - Call By Reference ve Call By Value

Fonksiyonlara veri geçirilirken iki method kullanılır: referans ile çağırma methodu ve değer ile çağırma methodu. Bu methodlar ayrıca pass-by-reference ve pass-by-value olarak da isimlendirilirler. Call by value methodunda data fonksiyona geçirildiğinde geçirilen verinin bir kopyası oluşturulur. Çağrılan fonksiyon bu kopya ile çalışırken geri dönüşte çağıran fonksiyondaki asıl değişken, çağrılan fonksiyondaki yapılan işlemler nedeniyle oluşan değişikliklerden etkilenmez. Bu değişiklik sadece kopya üzerinde ve çağrılan fonksiyon içinde meydana gelir. #include <stdio.h> void call_by_value(int x) { printf("Fonksiyon icinde degisiklikten once x = %d \n", x); x += 10; printf("Fonksiyon icinde degisiklikten sonra x = %d \n", x); } int main() { int x = 10; printf("Fonksiyon cagrilmadan once ana fonksiyonda x = %d \n", x); call_by_value(x); printf("Fonksiyon cagrildiktan sonra ana fonksiyonda x = %d \n", x); return 0; } Öncelikl...

31 : Fonksiyonda Struct Kullanımı

Struct tipini fonksiyonlarda parametre ya da dönüş değeri olarak kullanabiliriz. Struct için fonksiyonda ekstra özel bir konu yok. Bir önceki yazıda kullandığımız özellikler ile fonksiyonlarda struct tipli değişkenleri kullanabiliriz. Bir fonksiyon ile mainde oluşturduğum bir ogrencinin bilgilerini dolduracağım. Daha sonra bir fonksiyon ile bu ogrencinin adını ve soyadını yazdıracağım. Başka bir fonksiyon ile de numarasını ve not ortalamasını yazdıracağım. Adını yazdırdığım fonksiyona parametre olarak structı verirken numarasını yazdırdığım fonksiyona parametre olarak structın adresini vereceğim. Bu iki kullanım arasında farklar var. Bu farkları başka bir yazıda açıklamaya çalışacağım. Bu yazıda sadece bu farkların sözdiziminde nasıl görüldüğünü göstereceğim. #include <stdio.h> #include <string.h> typedef struct ogrenci { char ad[50]; char soyad[50]; int numara; float not; }ogrenci; ogrenci bilgiDoldur(); void adSoyadYazdir(ogrenci bilgi); void notNumaraYa...

26 : Fonksiyonda Birden Fazla Değişkeni Güncellemek

Resim
Bir fonksiyonun birden fazla değişken dönüşü olamayacağını söylemiştik. Birden fazla değişken bir dizi halinde ise nasıl kullanacağımızı da gördük. Peki bu değişkenler birbirinden ayrı tiplerde değişkenler ise nasıl güncelleyebiliriz? Şimdi bir örnek uyduracağım. Diyeceğim ki bir fonksiyonum olsun. Rastgele boyutlu bir matris üretsin. Matrisin boyutları en çok 5x5 en az 1x1 olsun. Değerler 0 ile 1 arasında olsun ve rastgele seçilsin yine. Fonksiyonda bu değerler yazdırılsın ve sonra main fonksiyonda biz de tekrar yazdırıp doğru mu alıyoruz matrisi kontrol edebilelim. Önce matrisi oluşturacak bir fonksiyon yazmam gerekiyor. Rastgele sayılarla nasıl çalışılır görmüş de olacağız bu sayede. Ancak boyutun da rastgele olması bizim için problem. Çünkü main fonksiyonunda yazdırmak istediğimizde sınırları nasıl belirleyeceğimizi bilmemiz gerekir. Bunun için de bu boyut değerlerini fonksiyondan öğrenmemiz gerekir. rastgele_matris.c #include <stdio.h> #include <time.h> #include...

25 : Pointer ile Dizi Elemanlarına Ulaşma

Bir dizi, bellekte aynı tip verilerden oluşan bloğu ifade eder. Önceki örnekte bir işaretçinin bellekte verinin tutulduğu bir adresi ifade ettiğini söylemiştik. Aynı şekilde dizinin ismi de bu veri bloğunun başlangıç adresini ifade eder. Bir dizi değişkeni ile bir pointer değişkeni arasında benzerlikler bulunur. Aşağıdaki örnekte bir dizi tanımlayacağız ve bunu print ettireceğiz. Daha sonra tekrar pointer kullanarak ulaşıp print ettireceğiz ki fark olmadığını görelim. dizi_pointer.c #include <stdio.h> int main() { int data[7] = {12, 2, 4, 55, 132, 1567, 43}; int i = 0; printf("-- Girilen sayilar -- \n"); printf("Dizi ile: \n"); for(i = 0; i < 7; ++i) { printf("%d ", data[i]); } printf("\nPointer ile: \n"); for(i = 0; i < 7; ++i) { printf("%d ", *(data + i)); } printf("\n"); return 0; } Burada dikkat edilmesi gereken nokta *data ifadesinin data dizisinin i...

21 : Matrisler

Resim
Diziler tek boyutlu olabildiği gibi birden çok boyutlu da olabilir. Her bir dizi elemanı başka bir diziyi saklıyor gibi düşünülebilir. Tek boyutlu diziler [] ile tanımlanırken iki boyutlu diziler [][] ile tanımlanır. Örnek olarak iki matrisin çarpımı örneği verilebilir. matrix.c #include <stdio.h> void carpim(int mat1[4][3], int mat2[3]); int main() { int i = 0, j = 0; int matrix1[4][3] = {{1, 1, 1}, {2, 2, 2}, {1, 1, 1}, {2, 2, 2}}; int matrix2[3] = {2, 3, 4}; printf("Matris 1 : \n"); for (i = 0; i < 4; i++) { for(j = 0; j < 3; j++) { printf("%d ", matrix1[i][j]); } printf("\n"); } printf("Matris 2 : \n"); for (i = 0; i < 3; i++) { printf("%d \n",matrix2[i]); } printf("\n"); carpim(matrix1, matrix2); } void carpim(int mat1[4...

20 : Karakter Dizileri

Dizileri karakterlerle de oluşturabiliriz. Bu konuda C ve C++ arasında farklar var. İki dil ile de örnek vereceğiz. Basit şekilde nasıl olduğunu görmek açısından sitenin ismini tanımlayıp bir fonksiyonda print ettirelim. C dilinde bu işi yapmak için bir dizi oluşturmamız gerekiyor. Daha önce gördüğümüz şekilde fonksiyonda parametre olarak kullanmak için [] şeklinde dizi olduğunu belirtmemiz gerekiyor. karakter.c #include <stdio.h> void ismiYazdir(unsigned char isim[]); int main() { unsigned char site_ismi[] = "ccppornekleri.blogspot.com"; ismiYazdir(site_ismi); } void ismiYazdir(unsigned char isim[]) { printf("site ismi : %s \n", isim); } İlk değer verirken yazacağımız karakter dizisini "" işaretleri arasında atamamız gerekiyor. Bu işaretler arasında yazılan ifade derleyici tarafından bir karakter dizisi olarak tanınıyor. Tek bir karater atarken ' ' işaretleri içinde yazdığımızı hatırlatmak isterim. cpp dilinde ise farklı...

Diziler - 19 : Bir pikselin renk kodları nasıl belirtilir.

Önceki örneklerde bir sürü değişken tanımladık, kullanıcıdan değerler atamasını istedik. Bunların hepsi tek bir sayıyla yada karakterle tanımlanmıştı. Bir resme baktığımızda üzerinde binlerce farklı renkli noktalar görürüz. Bu her bir nokta pixel ismiyle ifade edilir ve her birinin farklı uzaylarda farklı değerleri vardır. En çok bildiğimiz RGB uzayını düşünürsek bir pixelin değerini belirtmek için R(kırmızı), G(yeşil) ve B(mavi) olarak 3 ayrı değer belirtmemiz gerekir. Örneğin 8 bitlik RGB uzayında 3 ana renk şöyle tanımlanır: Kırmızı  : 255, 0 , 0 Yeşil      : 0, 255, 0 Mavi     : 0, 0, 255 Bu değerleri kullanırken her bir pixel için 3 ayrı değişken mi tutmamız gerekir. Bir resimde alt sol pixele p1 dersem ve kodumda kullanmak istersem; varsayalım değerini değiştirmek istiyorum: p1_r , p1_g ve p1_b olarak 3 ayrı değişken mi oluşturmam gerekir. Ya da bir fonksiyona parametre olarak geçireceğim. Şu şekilde mi yazarım: renk_degistir(p1_r, ...

18 : Sayi Pozitif mi? Fonksiyonda enum döndürme

Fonksiyonların bir sayı döndürdüğünü görmüştük. Ya da bir fonksiyon bir değer döndürmeyip void şeklinde de tanımlanabilir. Dönüş değeri bunların yanında yapısal tipte de olabilir. Sayısal tiplerin haricinde şuana kadarki örneklerde sadece enumeration kullandığım için yine bu şekilde örnekleyeceğim. Daha sonra struct gibi tiplerin örneklerini verdiğimizde fonksiyonlarda da nasıl kullanıldığından bahsedebiliriz. Bu örnekte bir enumeration oluşturacağız. Bu enumeration sayının pozitif, negatif ya da sıfır olduğunu gösterecek. Yine kullanıcıdan bir sayı girmesini isteyeceğiz. Bu sayıyı doğrudan fonksiyona göndereceğiz. Bu sayıyı fonksiyonda kontrol edip hangi durumda olduğunu enumeration ile döndürüp bir switch case yapısı ile yazdıracağız. kontrol.c #include <stdio.h> enum sayi_durumu { sifir = 0, negatif, pozitif }; enum sayi_durumu kontrol (int val); int main() { int val1 = 0; int val2 = 0; printf("Ilk degeri giriniz: "); scanf("%d", &val1); ...

17 : Döngüsüz Faktoriyel Hesabı - Recursive fonksiyon

Daha önce faktoriyel hesabından bahsetmiştik. Kodu yazarken belli bir nokta isteyip döngülerle 1' den o sayıya kadar olan tam sayıları çarparak faktoriyel hesabını yapmıştık. Şimdi aynı hesabı başka bir yöntemle yapacağız. Bu yöntemin adı recursion olarak geçiyor. Özyineleme anlamına geliyor ve bir fonksiyonun kendi kendini çağırmasını amaçlıyor. Kod üzerinden açıklayalım. recursion.c #include<stdio.h> long int faktoriyel_carpimi(int n); int main() { int sayi = 0; long int sonuc = 0; printf("Bir sayi giriniz: "); scanf("%d", &sayi); sonuc = faktoriyel_carpimi(sayi); printf("%d faktoriyel = %ld \n", sayi, sonuc); return 0; } long int faktoriyel_carpimi(int n) { if (n > 1) return n * faktoriyel_carpimi(n-1); else return 1; } Kullanıcıdan bir sayı istedik; n . Bu sayıyı faktoriyel_carpimi fonksiyonunda parametre olarak kullandık. faktoriyel_carpimi fonsiyonunda bu sayının 1' den...

16 : Asal Sayı Kontrolü - void fonksiyon

Bir önceki örnekte fonksiyonlar bir iş yapıp bize bir değer dönüyordu. Biz bu değerleri bir dğeişkene atayıp bu değişken ile yeni bir iş yapıyorduk. Ancak bazı durumda bi iş yaptıktan sonra bizim geri dönüşe ihtiyacımız olmayabilir. Bir örnek ile görelim. Bir sayi isteyeceğiz ve bu sayi asal mi kontrol edeceğiz. asalmi.c #include<stdio.h> void asalmi(int param); int main() { int sayi; printf("Bir sayi giriniz: "); scanf("%d", &sayi); asalmi(sayi); return 0; } void asalmi(int param) { int i, asal = 1; for(i=2; i <= param/2; ++i) { if(param % i == 0) { asal = 0; break; } } if (asal == 1) printf("%d asaldir.\n", param); else printf("%d asal degildir.\n", param); } Burada fonksiyon bir sayi alacak ve kontrol edip bize sonucu yazdıracak. Bize herhangi bir değer dönmesine gerek kalmayacak. Bu sebeple fonksiyonun dönüş değer...

Fonksiyonlar - 15 : Aritmetik işlemler

Uzun kodlar yazılmaya başlandığında bazı kod parçaları tekrar edilmeye başlar. Ayrıca çok uzun satırlar kodun okunmasını zorlaştırır. Hata çözmedeki verim bir hayli düşer. Bu sebeplerden dolayı her işi kendi fonksiyonlarında yaptırmak daha doğru olur. Yani aritmetik bir işlem yapılırken aritmetik isimli bir fonksiyonda dört işlem yaptırmak yerine her işlem için ayrı bir fonksiyon yazmak daha doğru olur. Daha önce yazdığımız dört işlem kodunu fonksiyonlarla ve birden fazla kez işlem yapabilecek şekilde genişletelim. aritmetikfonksiyonlar.c #include<stdio.h> double topla (double sayi1, double sayi2); //prototipler double cikar (double sayi1, double sayi2); double carp (double sayi1, double sayi2); double bol (double sayi1, double sayi2); int main() { char islem; double sayi1, sayi2, sonuc; int bitir = 0; while(1) { printf("Islemi seciniz (+, -, *, /) cikis icin c: "); do{ islem = getchar(); }while (isspace(islem)); if (is...