BİLECİK ŞEYH EDEBALİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri 1-14. hafta - Araş. Gör. Nesibe YALÇIN
Struct ve Göstericiler Struct veri yapısında bir gösterici değişken tanımlanabilir. Pointer kullanarak bir structa erişilebilir. struct karmasik_sayi { float gercek; int sanal; }; * ks gercek sanal struct karmasik_sayi * ks; ks: struct karmasik_sayi tipinde bir pointer değişkeni 2
Struct ve Göstericiler struct urun{ int id; char ad[20], marka [20]; float fiyat; }; struct urun * urun1; struct kitap { char ad[50]; char yazar[50]; char tur[10]; int id; }; struct kitap * kitap1, *kitap2; 3
Struct ve Göstericiler struct telefon{ char marka[20], model[30]; char imei_no[16]; char renk[10]; float fiyat; } Ali_phone, *myphone; Değer atama; Ali_phone.fiyat=2000; (*myphone).fiyat=1600; ya da myphone->fiyat=1600; 4
Struct ve Göstericiler struct ogrenci{ int no, sinif; char sube; char ad[20],soyad[30]; }; struct ogrenci *ogr; Değer atama; ogr->no=136; ogr->sinif=1; ogr->sube= A ; strcpy(ogr->ad,"melisa"); strcpy(ogr->soyad,"etik"); 5
Struct ve Göstericiler Gösterici vasıtasıyla bir yapıya erişmek iki şekilde olur: 1. Belleğe erişmek için başka bir adresi göstericiye atayarak 2. Dinamik bellek yönetimi kullanarak struct karmasik_sayi { float gercek; int sanal; }*ks1,ks2; ks1=&ks2; 6
#include <stdio.h> #include <conio.h> Örnek - 1 typedef struct karmasik_sayi { float gercek; int sanal; }; void main() { karmasik_sayi *ks1, ks2; ks1 = &ks2; printf("gercek kisim: "); scanf("%f",&(*ks1).gercek); //scanf("%f",&ks1->gercek); printf("sanal Kisim: "); scanf("%d",&(*ks1).sanal); printf("sayi: "); printf("%.2f + %d i",(*ks1).gercek,(*ks1).sanal); getch(); } 7
Struct ve Göstericiler Gösterici kullanarak struct içerisindeki bir elemana erişmek için, malloc() fonksiyonu kullanarak dinamik olarak bellek tahsis edilmelidir. struct karmasik_sayi { float gercek; int sanal; }; struct karmasik_sayi *ptr; ptr = (struct karmasik_sayi*) malloc(sizeof(struct karmasik_sayi)); 8
Struct ve Göstericiler Gösterici kullanarak struct içerisindeki bir elemana erişmek için, malloc() fonksiyonu kullanarak dinamik olarak bellek tahsis edilmelidir. typedef struct karmasik_sayi { float gercek; int sanal; }; karmasik_sayi *ptr; ptr = (karmasik_sayi*) malloc(sizeof(karmasik_sayi)); 9
#include <stdio.h> #include <conio.h> #include <stdlib.h> Örnek - 2 typedef struct karmasik_sayi{ float gercek; int sanal; }; void main() { karmasik_sayi *ks; ks=(karmasik_sayi*)malloc(sizeof(karmasik_sayi)); printf("gercek kisim: "); scanf("%f",&ks->gercek); printf("sanal Kisim: "); scanf("%d",&ks->sanal); printf("sayi: "); printf("%.2f + %d i",ks->gercek,ks->sanal); free(ks); getch(); } 10
Struct ve Göstericiler Gerekli nesne sayısını bilmediğimizde bir dizi tahsis etmemiz doğru olmaz. Maksimum nesne sayısını belirlemek fazla bellek alanı kullanımına neden olabilir. Gösterici yardımıyla kullanıcının istediği sayıda struct nesnesi oluşturabiliriz. typedef struct karmasik_sayi { float gercek; int sanal; }; karmasik_sayi *ptr; ptr = (karmasik_sayi*) malloc(n*sizeof(karmasik_sayi)); 11
#include <stdio.h> #include <conio.h> #include <stdlib.h> Örnek - 3 typedef struct karmasik_sayi{ float gercek; int sanal; }; void main() { int N=2; karmasik_sayi *ks; ks=(karmasik_sayi*)malloc(n*sizeof(karmasik_sayi)); for(int i=0;i<n;i++){ printf("gercek kisim: "); scanf("%f",&(ks+i)->gercek); printf("sanal Kisim: "); scanf("%d",&(ks+i)->sanal); printf("sayi: "); printf("%.2f + %d i\n",(ks+i)->gercek,(ks+i)->sanal); } free(ks); getch(); } 12
#include <stdio.h> #include <conio.h> #include <stdlib.h> Örnek -4 typedef struct ogrenci{ int no; char isim[30]; }; void main() { int N; puts("ogrenci sayisi:"); scanf("%d",&n); ogrenci *liste=(ogrenci*)malloc(n*sizeof(ogrenci)); for(int i=0;i<n;i++){ printf("no: "); scanf("%d",&(liste+i)->no); printf("isim: "); scanf("%s",(liste+i)->isim); } for(int i=0;i<n;i++){ printf("%d.ogrenci: ",i+1); printf("%d - %s\n",(liste+i)->no,(liste+i)->isim); } free(liste); getch(); } 13
Fonksiyonlarda Struct Kullanımı Structları diğer değişkenler gibi fonksiyona parametre olarak gönderebilir fonksiyonun dönüş değerini struct olarak belirleyebiliriz. FonksiyonTipi FonksiyonAdı(parametreler) {... işlemler... return geri dönüş değeri; } 14
#include <stdio.h> #include <conio.h> typedef struct zaman { int saat; int dakika; int saniye; }; Örnek -1 int hesapla(zaman x) { return (x.saat*3600+x.dakika*60+x.saniye); } void main() { zaman t; printf("saat:"); scanf("%d",&t.saat); printf("dakika:"); scanf("%d",&t.dakika); printf("saniye:"); scanf("%d",&t.saniye); int sure=hesapla(t); printf("%d saniye eder",sure); getch(); } 15
#include <stdio.h> #include <conio.h> Örnek -2 struct kayit{ char ad[20]; char soyad[30]; char tel[10]; }rehber[10]; void dosyadan_oku(file *fptr, struct kayit a[]){ int i=0; while(!feof(fptr) && i<10){ fscanf(fptr,"%s %s %s\n", a[i].ad,a[i].soyad,a[i].tel); printf("%s %s %s\n",a[i].ad,a[i].soyad,a[i].tel); i++; } fclose(fptr); } void main() { FILE * dosya=fopen("rehberim.txt","r"); dosyadan_oku(dosya,rehber); getch(); } 16
#include <stdio.h> #include <conio.h> #include <stdlib.h> struct kayit{ char ad[20]; char soyad[30]; char tel[10]; }*rehber; Örnek -3 void dosyadan_oku(file *fptr, struct kayit *a){ int i=0; while(!feof(fptr) && i<10){ fscanf(fptr,"%s %s %s\n", a[i].ad,a[i].soyad,a[i].tel); printf("%s %s %s\n",a[i].ad,a[i].soyad,a[i].tel); i++; } fclose(fptr);} void main() { FILE * dosya=fopen("rehberim.txt","r"); rehber=(kayit*)malloc(10*sizeof(kayit)); dosyadan_oku(dosya,rehber); getch(); } 17
#include <stdio.h> #include <conio.h> #include <math.h> struct nokta { float x; float y; }; Örnek -4 struct nokta veri_al(){ struct nokta yeni; puts("noktanin koordinatlari:"); scanf("%f %f",¥i.x,¥i.y); return yeni; } void main() { float uzaklik; struct nokta A=veri_al(); struct nokta B=veri_al(); uzaklik=sqrt(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y))); printf("noktalar arasi uzaklik: %.2f",uzaklik); getch(); } 18
#include <stdio.h> #include <conio.h> #include <math.h> struct nokta { float x; float y; }; Örnek -5 struct nokta veri_al() { struct nokta yeni; puts("noktanin koordinatlari:"); scanf("%f %f",¥i.x,¥i.y); return yeni; } float h_uzaklik (struct nokta *A, struct nokta *B) { return sqrt(((a->x-b->x)*(a->x-b->x))+ ((A->y-B->y)*(A->y-B->y))); } void main() { struct nokta A=veri_al(); struct nokta B=veri_al(); printf("noktalar arasi uzaklik: %.2f",h_uzaklik(&A,&B)); getch(); } 19
Uygulamalar Kisi adında bir struct oluşturun. Bu struct, kişinin adı, yaşı, boyu, cinsiyeti, kilosu, ideal kilosu değerlerini tutsun. Kişinin ideal kilo hesabı için formül: İdeal kilo = (Boy - 100 + Yaş / 10) * K Kadınlar için K=0.8, erkekler için ise K=0.9'dur. Kişinin ideal kilosunu hesaplayan fonksiyonu ve gerekli ana program kodunu C dilinde yazınız. 20
Uygulamalar Depo sorumlusu, depoda yer alan elektronik ürünleri «urun_liste.txt» dosyasına kaydetmek istemektedir. Bunun için gerekli programı C dilinde yazınız. Dosyaya yazma işlemini fonksiyon kullanarak gerçekleştiriniz. NOT: Depodaki toplam ürün sayısı depo sorumlusunun girdiği miktara göre değişebileceğinden pointer kullanmanız gerekmektedir. typedef struct urun{ int id; char ad[20], tip [10], marka[30]; float fiyat; }; 21