15. hafta struct ve pointerlar, fonksiyonlarda struct kullanımı · 2020. 5. 20. · 2 struct ve...

20
15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı Dr. Öğr. Üyesi Nesibe YALÇIN https://nesibeyalcin.wordpress.com/bsm104/ BARTIN ÜNİVERSİTESİ MÜHENDİSLİK, MİMARLIK VE TASARIM FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Upload: others

Post on 20-Aug-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

15. Hafta – Struct ve Pointerlar,

Fonksiyonlarda Struct Kullanımı

Dr. Öğr. Üyesi Nesibe YALÇIN

https://nesibeyalcin.wordpress.com/bsm104/

BARTIN ÜNİVERSİTESİ

MÜHENDİSLİK, MİMARLIK VE TASARIM FAKÜLTESİ

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Page 2: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

2

Struct ve Pointerlar ― Struct veri yapısında bir gösterici değişken tanımlanabilir.

― Pointer kullanarak bir structlara erişilebilir.

struct karmasik_sayi {

float gercek; int sanal;

}; ― struct karmasik_sayi * ks; ― ks: struct karmasik_sayi tipinde bir pointer değişkeni

gercek

sanal

* ks

Page 3: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

3

Struct ve Pointerlar

struct urun{

int id; char ad[20], marka [20]; float fiyat; };

― struct urun * urun1;

― struct kitap * kitap1, *kitap2, *kitaplar;

struct kitap { char ad[50]; char yazar[50]; char tur[10]; int id; };

Page 4: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

4

Struct ve Pointerlar 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;

Page 5: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

5

Struct ve Pointerlar struct ogrenci{

int no, sinif; char sube; char ad[20],soyad[30]; };

struct ogrenci *ogr; ― Değer atama;

ogr->no=136; strcpy(ogr->ad,"melisa"); ogr->sinif=1; strcpy(ogr->soyad,"etik"); ogr->sube=‘A’;

Page 6: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

6

Struct ve Pointerlar ― Pointer vasıtasıyla bir structa/yapıya erişmek iki şekilde olur:

1. Belleğe erişmek için başka bir adresi pointera atayarak struct karmasik_sayi {

float gercek; int sanal;

} *ks1,ks2; 2. Dinamik bellek yönetimi kullanarak

ks1=&ks2;

Page 7: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

7

Örnek - 1 #include <stdio.h> typedef struct karmasik_sayi { float gercek; int sanal; }; int 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); }

Page 8: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

8

Struct ve Pointerlar ― Pointer 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));

void * malloc (int boyut);

Page 9: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

9

Struct ve Pointerlar ― Gerekli eleman sayısını bilmediğimizde bir dizi tahsis etmemiz doğru olmaz. ― Maksimum eleman sayısını belirlemek fazla bellek alanı kullanımına neden olabilir. ― Pointer yardımıyla kullanıcının istediği sayıda struct elemanı oluşturabiliriz.

typedef struct karmasik_sayi { float gercek; int sanal; };

karmasik_sayi *ptr; ptr = (karmasik_sayi*) malloc(N*sizeof(karmasik_sayi));

Page 10: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

10

Örnek - 2 #include <stdio.h> #include <stdlib.h> typedef struct karmasik_sayi{ float gercek; int sanal; }; int 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); }

Page 11: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

11

Örnek - 3 #include <stdio.h> #include <stdlib.h> typedef struct karmasik_sayi{ float gercek; int sanal; }; int main() { int N=3; 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); } }

Page 12: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

12

Örnek -4 #include <stdio.h> #include <stdlib.h> typedef struct ogrenci{ int no; char isim[30]; }; int 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); } }

Page 13: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

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.

Fonksiyon Dönüş Tipi Fonksiyon Adı (parametreler) { ... işlemler ... Fonksiyon Gövdesi return geri dönüş değeri; }

Page 14: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

14

Örnek -1 #include <stdio.h> typedef struct zaman {

int saat; int dakika; int saniye; };

int hesapla(zaman x) {

return (x.saat*3600+x.dakika*60+x.saniye); } int 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); }

Page 15: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

15

Örnek -2 #include <stdio.h> 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); } int main() {

FILE * dosya=fopen("rehberim.txt","r"); dosyadan_oku(dosya,rehber); }

Page 16: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

16

Örnek -3 #include <stdio.h> #include <stdlib.h> struct kayit{

char ad[20]; char soyad[30]; char tel[10];

}*rehber; 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);} int main() {

FILE * dosya=fopen("rehberim.txt","r"); rehber=(kayit*)malloc(10*sizeof(kayit)); dosyadan_oku(dosya,rehber); }

Page 17: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

17

Örnek -4 #include <stdio.h> #include <math.h> struct nokta {

float x; float y; };

struct nokta veri_al(){

struct nokta yeni; puts("noktanin koordinatlari:"); scanf("%f %f",&yeni.x,&yeni.y); return yeni; }

int 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); }

Page 18: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

18

Örnek -5 #include <stdio.h> #include <math.h> struct nokta {

float x; float y; };

struct nokta veri_al() {

struct nokta yeni; puts("noktanin koordinatlari:"); scanf("%f %f",&yeni.x,&yeni.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))); } int main() {

struct nokta A=veri_al(); struct nokta B=veri_al(); printf("Noktalar arasi uzaklik: %.2f",h_uzaklik(&A,&B)); }

Page 19: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

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.

Page 20: 15. Hafta Struct ve Pointerlar, Fonksiyonlarda Struct Kullanımı · 2020. 5. 20. · 2 Struct ve Pointerlar ―Struct veri yapısında bir gösterici değişken tanımlanabilir

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. Fonksiyona ürünleri tutan struct parametre olarak gönderilecektir. typedef struct urun{

int id; char ad[20], tip [10], marka[30]; float fiyat; };