26 : Fonksiyonda Birden Fazla Değişkeni Güncellemek
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.
İlk önce matrisi_olustur fonksiyonundan bahsedelim. Değişken tanımlamalarından sonra srand fonksiyonunu çağırdık. Bu fonksiyon rastgele yani random sayı üretmeden önce çağrılır. Random sayı üreticisinin bilgisayar saati ile çağrılmasını sağlar. Bu şekilde her rand çağrısında yeni bir sayı üretilir. Aksi takdirde rand ile hep aynı sayıyı alırsınız. Daha sonra rand fonksiyonunu çağırdık. Bir sayı üretildi. Bu sayıyının 5 ile modunu alıyoruz ve bize 0 ile 4 arası bir sayı vermiş oluyor. Biz 1 ile 5 arasında olmasını istemiştik. 1 ile toplayarak boyut şartını yerine getirmiş oluyoruz. srand fonksiyonunu time(NULL) ile çağırmak için time kütüphanesini eklememiz gerekiyor. time fonksiyonu bu kütüphanede tanımlanmış durumda.
Daha sonra bu boyut değerlerini a ile b işaretçilerinin içeriğine atamamız gerekiyor ki main fonksiyondan ulaşabilelim.
En son matrisin değerlerini bulmamız gerekiyor. Yine rand fonksiyonunu kullanacağız çünkü yine rastgele olmasını istiyoruz. Ancak burada sayılarımızın 0 ile 1 arasında olması gerekiyor. İstek o şekilde yapılmıştı. Bunu da nasıl yaparız? rand zaten 0 ile RAND_MAX arasında bir değer üretecekti. Biz çıkan herhangi bir sayıyı RAND_MAX değerine bölersek 0 ile 1 arasında bir sayı elde etmiş oluruz. Bu değer stdlib header dosyası içinde tanımlanmış durumda. Bu sebeple en başta bu kütüphane de eklenmiş olmalı.
main fonksiyonda ise bu fonksiyonu çağırmak kaldı. Fonksiyon bir double matris ve iki int indis değeri istiyor. Indis değerleri için bir pointer gerekiyor. Bu yüzden biz x ve y değişkenlerini int tipinde tanımladığımız için &x şeklinde fonksiyona geçiriyoruz ki bu işaret değişkenin adresini göstererek fonksiyona uygun olsun. Matrisi daha önceki örneklerde gördüğümüz şekilde ismiyle kullanabiliriz. Bu şekilde x ve y indisleri fonksiyonda doldurulup, oluşturulan matris ile birlikte bize geri dönecek ve biz bu değerler ile matrisi yazdırabileceğiz.
main fonksiyonu ile matrisi_olustur fonksiyonu içindeki x ve y değişkenleri birbirinden bağımsız olduğunu unutmayalım. Her değişken tanımlandığı yerde kullanılabilirdir. main fonksiyonunda x ve y yerine c ve d isimlerini kullansam herhangi bir değişiklik olmazdı.
Ben kodu çalıştırdığımda aşağıdaki gibi bir çıktı alıyorum. Siz de çalıştırdığınızda değerler farklı olacak şekilde matrislerin yazdırıldığını göreceksiniz. Çünkü herşey rastgele oluşmalı.
Ş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 <stdlib.h> void matrisi_olustur(double matris[][5], int *a, int *b); int main() { double m[5][5]; int x = 0; int y = 0; int i = 0; int j = 0; matrisi_olustur(m, &x, &y); printf("matris boyutu : %dx%d \n",x,y); for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { printf ("%f ", m[i][j]); } printf("\n"); } } void matrisi_olustur(double matris[][5], int *a, int *b) { int i = 0; int j = 0; srand(time(NULL)); int x = (rand() % 5)+1; int y = (rand() % 5)+1; *a = x; *b = y; printf("%dx%d boyutlu bir matris olusturuluyor.\n",x,y); for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { matris[i][j] = (double) rand() / (double) RAND_MAX; } } printf("Olusturulan matris: \n"); for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { printf ("%f ", matris[i][j]); } printf("\n"); } printf("\n\n"); }
İlk önce matrisi_olustur fonksiyonundan bahsedelim. Değişken tanımlamalarından sonra srand fonksiyonunu çağırdık. Bu fonksiyon rastgele yani random sayı üretmeden önce çağrılır. Random sayı üreticisinin bilgisayar saati ile çağrılmasını sağlar. Bu şekilde her rand çağrısında yeni bir sayı üretilir. Aksi takdirde rand ile hep aynı sayıyı alırsınız. Daha sonra rand fonksiyonunu çağırdık. Bir sayı üretildi. Bu sayıyının 5 ile modunu alıyoruz ve bize 0 ile 4 arası bir sayı vermiş oluyor. Biz 1 ile 5 arasında olmasını istemiştik. 1 ile toplayarak boyut şartını yerine getirmiş oluyoruz. srand fonksiyonunu time(NULL) ile çağırmak için time kütüphanesini eklememiz gerekiyor. time fonksiyonu bu kütüphanede tanımlanmış durumda.
Daha sonra bu boyut değerlerini a ile b işaretçilerinin içeriğine atamamız gerekiyor ki main fonksiyondan ulaşabilelim.
En son matrisin değerlerini bulmamız gerekiyor. Yine rand fonksiyonunu kullanacağız çünkü yine rastgele olmasını istiyoruz. Ancak burada sayılarımızın 0 ile 1 arasında olması gerekiyor. İstek o şekilde yapılmıştı. Bunu da nasıl yaparız? rand zaten 0 ile RAND_MAX arasında bir değer üretecekti. Biz çıkan herhangi bir sayıyı RAND_MAX değerine bölersek 0 ile 1 arasında bir sayı elde etmiş oluruz. Bu değer stdlib header dosyası içinde tanımlanmış durumda. Bu sebeple en başta bu kütüphane de eklenmiş olmalı.
main fonksiyonda ise bu fonksiyonu çağırmak kaldı. Fonksiyon bir double matris ve iki int indis değeri istiyor. Indis değerleri için bir pointer gerekiyor. Bu yüzden biz x ve y değişkenlerini int tipinde tanımladığımız için &x şeklinde fonksiyona geçiriyoruz ki bu işaret değişkenin adresini göstererek fonksiyona uygun olsun. Matrisi daha önceki örneklerde gördüğümüz şekilde ismiyle kullanabiliriz. Bu şekilde x ve y indisleri fonksiyonda doldurulup, oluşturulan matris ile birlikte bize geri dönecek ve biz bu değerler ile matrisi yazdırabileceğiz.
main fonksiyonu ile matrisi_olustur fonksiyonu içindeki x ve y değişkenleri birbirinden bağımsız olduğunu unutmayalım. Her değişken tanımlandığı yerde kullanılabilirdir. main fonksiyonunda x ve y yerine c ve d isimlerini kullansam herhangi bir değişiklik olmazdı.
Ben kodu çalıştırdığımda aşağıdaki gibi bir çıktı alıyorum. Siz de çalıştırdığınızda değerler farklı olacak şekilde matrislerin yazdırıldığını göreceksiniz. Çünkü herşey rastgele oluşmalı.
Yorumlar
Yorum Gönder