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.
Başta yine struct tipini oluşturdum. İlk önce bu yapıyı oluşturmamız gerekiyor çünkü fonksiyonlarda kullanacağız. Fonksiyonlardan sonra oluşturmaya çalışırsak undefined hatası alırız. Bu da ogrenci isimli bir değişkenin tanımlanmamış olduğunu belirtir.
Örnek olması açısından 4 fonksiyon yazdım. Hepsinde parametre yada dönüş değerinde farklılık oluşturdum. Yöntemler birbiri yerine kullanılabilirdi; sadece amaca uygun olması yeterli. Örneğin ismiYazdir fonksiyonu parametre olarak pointer da alabilirdi. Ancak notYazdir fonksiyonu dönüş değeri olarak bir struct alması mantıklı değil. Herhangi bir dönüş değerine ihtiyaç olmadığı için void olarak belirttim. Sadece numaraGuncelle fonksiyonuna dikkat çekmek isterim. Bu fonksiyon denediğinizde göreceksiniz işlevsizdir. Bunun sebebi de yukarıda bahsettiğim fonksiyona değer gönderme ve fonksiyona adres gönderme farkıyla ilgili. Detaya girmeyeceğim burada ancak değişikliğin mainde de geçerli olmasını istiyorsak fonksiyona parametre olarak pointer geçirmemiz gerekirdi. Kodda "bilgi.numara=111" değişikliği sadece numaraGuncelle fonksiyonu içinde geçerlidir. Bu konu call by reference ve call by value olarak geçiyor. Bu konuya daha sonra başka bir yazıyla tekrar döneceğim.
Diğer fonksiyonlarda ogrenci yapısı pointer olarak geçirilirse nasıl, değer olarak geçirilirse nasıl kullanılır görülebilir.
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 notNumaraYazdir(ogrenci *bilgi);
void notGuncelle(ogrenci *bilgi);
void numaraGuncelle(ogrenci bilgi);
int main()
{
ogrenci ogrenci1;
ogrenci1 = bilgiDoldur();
adSoyadYazdir(ogrenci1);
notNumaraYazdir(&ogrenci1);
notGuncelle(&ogrenci1);
notNumaraYazdir(&ogrenci1);
numaraGuncelle(ogrenci1);
notNumaraYazdir(&ogrenci1);
return 0;
}
ogrenci bilgiDoldur()
{
ogrenci bilgi;
strcpy(bilgi.ad, "ad1");
strcpy(bilgi.soyad, "soyad1");
bilgi.numara = 55;
bilgi.not = 3.5;
return bilgi;
}
void adSoyadYazdir(ogrenci bilgi)
{
printf("Ogrenci 1 adi : %s \n",bilgi.ad);
printf("Ogrenci 1 soyadi : %s \n",bilgi.soyad);
}
void notNumaraYazdir(ogrenci *bilgi)
{
printf("Ogrenci 1 numarasi : %d \n",bilgi->numara);
printf("Ogrenci 1 notu : %g \n\n",bilgi->not);
}
void notGuncelle(ogrenci *bilgi)
{
printf("Not guncelleniyor\n");
bilgi->not = 1.2;
}
void numaraGuncelle(ogrenci bilgi)
{
printf("Numara guncelleniyor\n");
bilgi.numara = 111;
}
Başta yine struct tipini oluşturdum. İlk önce bu yapıyı oluşturmamız gerekiyor çünkü fonksiyonlarda kullanacağız. Fonksiyonlardan sonra oluşturmaya çalışırsak undefined hatası alırız. Bu da ogrenci isimli bir değişkenin tanımlanmamış olduğunu belirtir.
Örnek olması açısından 4 fonksiyon yazdım. Hepsinde parametre yada dönüş değerinde farklılık oluşturdum. Yöntemler birbiri yerine kullanılabilirdi; sadece amaca uygun olması yeterli. Örneğin ismiYazdir fonksiyonu parametre olarak pointer da alabilirdi. Ancak notYazdir fonksiyonu dönüş değeri olarak bir struct alması mantıklı değil. Herhangi bir dönüş değerine ihtiyaç olmadığı için void olarak belirttim. Sadece numaraGuncelle fonksiyonuna dikkat çekmek isterim. Bu fonksiyon denediğinizde göreceksiniz işlevsizdir. Bunun sebebi de yukarıda bahsettiğim fonksiyona değer gönderme ve fonksiyona adres gönderme farkıyla ilgili. Detaya girmeyeceğim burada ancak değişikliğin mainde de geçerli olmasını istiyorsak fonksiyona parametre olarak pointer geçirmemiz gerekirdi. Kodda "bilgi.numara=111" değişikliği sadece numaraGuncelle fonksiyonu içinde geçerlidir. Bu konu call by reference ve call by value olarak geçiyor. Bu konuya daha sonra başka bir yazıyla tekrar döneceğim.
Diğer fonksiyonlarda ogrenci yapısı pointer olarak geçirilirse nasıl, değer olarak geçirilirse nasıl kullanılır görülebilir.
Yorumlar
Yorum Gönder