15. hafta struct ve pointerlar, fonksiyonlarda struct kullanımı · 2020. 5. 20. · 2 struct ve...
Post on 20-Aug-2020
8 Views
Preview:
TRANSCRIPT
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Ü
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
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; };
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;
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’;
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;
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); }
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);
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));
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); }
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); } }
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); } }
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; }
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); }
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); }
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); }
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",¥i.x,¥i.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); }
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",¥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))); } int main() {
struct nokta A=veri_al(); struct nokta B=veri_al(); printf("Noktalar arasi uzaklik: %.2f",h_uzaklik(&A,&B)); }
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. Fonksiyona ürünleri tutan struct parametre olarak gönderilecektir. typedef struct urun{
int id; char ad[20], tip [10], marka[30]; float fiyat; };
top related