BÖLÜM 11: YAPISAL VERİ TİPLERİ

Benzer belgeler
enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

enum, struct, union ve typedef Yapıları

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

ALGORİTMA VE PROGRAMLAMA II

Pointer Kavramı. Veri Yapıları

YAPILAR (STRUCTURES)

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Birlik (Union) 1 Birlik (Union), enum, typedef

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

BİLG Dr. Mustafa T. Babagil 1

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

PROGRAMLAMAYA GİRİŞ DERS 2

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

Fonksiyonlar (Altprogram)

Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri hafta -

Diziler (Arrays) Çok Boyutlu Diziler

Özyineleme (Recursion)

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Dr. Fatih AY Tel: fatihay@fatihay.net

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

Temel Giriş/Çıkış Fonksiyonları

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

KAYITLAR BÖLÜM Giriş

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

Göstericiler (Pointers)

Programlamaya Giriş. Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi.

BİL1001 Bilgisayar Bilimlerine Giriş 1

Programlama Dilleri 1. Ders 4: Diziler

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

C Programlama printf() Fonksiyonu

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

8. İŞARETCİLER (POINTERS)

BLM 112- Programlama Dilleri II. Hafta 4 İşaretçiler (Pointers)

Bölüm 8, Yrd. Doç. Dr. A. Kadir YALDIR PAÜ Bilgisayar Mühendisliği Bölümü BÖLÜM 8: DİZİLER

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Giriş. ENF102 Jeoloji

EBG101 PROGRAMLAMA TEMELLERİ VE ALGORİTMA

C++ Dersi: Nesne Tabanlı Programlama

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

Pointers (İşaretçiler)

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

Sınav tarihi : Süre : 60 dak.

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

HSancak Nesne Tabanlı Programlama I Ders Notları

DİZİLER 5/4/2010. ENF-102 Jeoloji Giriş. Tek Boyutlu Diziler. Tek Boyutlu Diziler. Örnek. Örnek

KOCAELİ ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ. BİLGİSAYAR LABORATUVARI II FİNAL SINAVI SORU ve CEVAPLARI(I. ogr)

Visual Basic 6.0. Anadolu Üniversitesi Endüstri Mühendisliği Bölümü. Değişkenler ve Veri tipleri. Ders Notları

#include<stdio.h> #include<conio.h> #define doktorsayisi 3. typedef struct dr{ int ay1, ay2, ay3, ay4; } doktor; float hesapla(doktor dktr){

Programlama Dilleri 1. Ders 5: Göstericiler

Hafta 13 Fonksiyonlar

Örnek 4: Örnek Özyinelemeli fonksiyon örneği Bölüm 9. C++ programlama dilinde Nesne ve sınıf

C++ Dersi: Nesne Tabanlı Programlama

Operator Aşırı Yükleme (Operator OverLoading)

Yrd. Doç. Dr. Caner ÖZCAN

C Programlama Dilininin Basit Yapıları

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

Genel Programlama II

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

C Konsol Giriş Çıkış Fonksiyonları

C PROGRAMLAMA D İ L İ

/*int sayi1, sayi2,toplam=0;

C++ Dersi: Nesne Tabanlı Programlama 2. Baskı

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ALGORİTMA VE PROGRAMLAMA II

8. Bölüm DİZİLER. tip dizi_ismi[eleman_sayısı]; Bütün diziler 0 ile baţlar.

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

Örnek1: #include <iostream> #include <string> using namespace std;

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

Bölüm 2 - C ile Programlamaya Giriş

Sınav tarihi : Süre : 60 dak. c) En başta #include<stdio.h> yazılmamıştır. c) zt d) Pi e) X0

/* Çember alanını hesaplar */

Kocaeli Üniversitesi Bilgisayar Mühendisliği Programlama 2 Dersi Final Sınavı. A Grubu

void main() { int a[] = {1, 2, 3, 4, 5, 6}; int *p=&a[2]; int **pp=&p; printf("%d", **pp+2); }

Giris {\} /\ Suhap SAHIN Onur GÖK

İLERI MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

Eln 1001 Bilgisayar Programlama I

Yrd. Doç. Dr. Caner ÖZCAN

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 3. Bölüm Veri Tipleri ve Değişkenler

BMB1002 Bilgisayar Programlamaya Giriş. Dosyalar. Prof. Dr. Necmettin Kaya

Yrd. Doç. Dr. Caner ÖZCAN

mod ile açılacak olan dosyanın ne amaçla açılacağı belirlenir. Bunlar:

JAVADA DİZİ İŞLEMLERİ

Adım Adım C-II. Eksik kalmış konular

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

Telefon Rehberi Uygulaması

BLM111 Programlama Dilleri I. Hafta 10 Diziler. Yrd. Doç. Dr. Caner ÖZCAN

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Bölüm 9. Altprogramlar ISBN

Nesne Tabanlı Programlama

C PROGRAMLAMA D İ L İ

Transkript:

BÖLÜM 11: YAPISAL VERİ TİPLERİ I. STRUCTURE-YAPI (struct) TİPİ DEĞİŞKENLER Birbiriyle bağlantılı ve bir küme teşkil eden değerler bir tek değişkenin çatısı altında bu değişkenin alt alanları olarak tanımlanabilirler. Bu durumda bir grup değere bir tek isimle ulaşmak mümkün olacaktır. C programlama dilinde bu amaçla kullanılan STRUCTURE (struct) tipi, PASCAL programlama dilindeki RECORD tipine çok benzemektedir. struct tipi değişkenler birden fazla farklı tipte olabilen verilerin oluşturduğu bir bütündür. Diziler ise aynı tip verilerden oluşur. Yapılar da aynı diziler gibi birbirleriyle ilgili olan verileri içerir. Fakat diziden farkı, tek bir yapı elemanı birbirinden tamamen farklı tipte birden fazla veriyi içerebilir. Bu sayede bilgiler daha düzenli olarak bütünlük içersinde temsil edilirler. Tanımlama genel olarak; struct Yapi_Adi { tip Alan1; tip Alan2;... tip Alan_n; Bu yapıda bir değişken deklarasyonu: struct Yapi_Adi Deg_Adi; şeklinde yapılır ve; Tanımlamada her alanın adı ve tipi belirtilir. Yapı tipi olduğunu gösterir struct anahtar sözcüğü kullanılır. Aynı alan adı farklı yapılarda (bağımsız olarak) kullanılabilir. Örneğin, ev adreslerinin elemanları mahalle, sokak, no, semt, posta kodu ve şehir olarak birbirlerine bağlantılı düşünülebilir. Bu elemanlar bir araya getirildiğinde adres adlı bir değişkenin alt elemanları olarak tanımlanabilir. adres adlı değişkeni struct tipi tanımlayalım: struct adres_tipi { char mahalle[20]; char sokak[20]; int no; char semt[20]; int pkodu; char sehir[20]; struct adres_tipi adres; Bu tanımlamadan sonra adres değişkeninin elemanlarına; adres.mahalle adres.sokak adres.no adres.semt adres.pkodu adres.sehir şeklinde ulaşılabilir. 113

struct tipte bir değişken deklare edildiğinde, değişken için bellekte tüm alanları içerecek şekilde bellek alanı ayrılır. Yukarıdaki örnekte adres değişkeninin uzunluğu sizeof(sturct adres_tipi) yazılarak bulunabilir. Bu örnekte no ve pkodu değişkenleri integer olduğu için 4 er byte, diğer char tipi değişkenler ise 20'şer byte genişliğinde olduğuna göre adres değişkeninin uzunluğu 88 byte olmaktadır Diğer bir tanımlama şekli ise yapı adı verilmeden yapılan tanımlamalardır; struct { Alan1; Alan2;... Alan_n; degisken1,..., degisken_n; struct { char ad[20]; char soyad[25]; ogrenci, ogretmen; Bu şekilde yapılan tanımlamalarda değişken veya değişkenlerin tanımlamanın devamında deklare edilmesi gerekmektedir. Tavsiye edilmeyen bir uygulama olup, programın değişik bölümlerinde bu yapıda bir değişken deklarasyonu yapılamaz. C programlama dilinde yapı içersindeki alanların tipi başka bir struct tanımlaması da olabilir. Aşağıdaki örnekte bu uygulamayı göstermek için yapı içerisinde başka bir yapı kullanılmıştır. #include <string.h> struct tarih { int gun; int ay; int yil; struct kisiler { char adi[21]; struct tarih dogum; { struct kisiler a; strcpy(a.adi, "Ali"); a.dogum.gun = 15; a.dogum.ay = 8; a.dogum.yil = 1965; printf("%s: %d/%d/%d\n", a.adi, a.dogum.gun, a.dogum.ay, a.dogum.yil); 114

struct tipi değişkenlerde diğer değişkenlerde olduğu gibi dizi şeklinde deklare edilebilir. Aşağıdaki tanımlama ile nokta yapı değişkenine 5 adet x ve y koordinat değeri girilebilir. struct koordinat { int x; int y; struct koordinat nokta[5]; Aşağıdaki örnekte yapılarda dizi uygulamasına yer verilmiştir. Örnek: N adet öğrencinin numara ve sınav notunu okuyan daha sonra sınavın ortalamasını ve ortalamayı geçenleri listeleyen uygulama. #define OGRSAY 5 { struct ogrenci { char no[10]; int notu; struct ogrenci ogr[ogrsay]; int i; float t, ort; for (i=0; i<ogrsay; i++) { printf("%d. Ogrencinin numarasi ve notu : ", i+1); scanf("%s%d",ogr[i].no, &ogr[i].notu); t = 0; for (i=0; i<ogrsay; i++) t = t + ogr[i].notu; ort = t / OGRSAY; printf("-------------------------------------------\n"); printf("ortalama = %5.2f\n", ort); printf("-------------------------------------------\n"); printf("ortalamayi gecen ogrenciler:\n"); for (i=0; i<ogrsay; i++) if (ogr[i].notu >= ort) printf("%s\t\t%d\n", ogr[i].no, ogr[i].notu); Aynı uygulamayı modüler olarak yazarsak; #define OGRSAY 5 void oku(struct ogrenci ogr[]); float ortalama(struct ogrenci ogr[]); void listele(struct ogrenci ogr[], float not); struct ogrenci { char no[10]; int notu; 115

{ float ort; struct ogrenci ogr[ogrsay]; oku(ogr); ort = ortalama(ogr); printf("----------------------------------\n"); printf("ortalama = %5.2f\n", ort); printf("----------------------------------\n"); printf("ortalamayi gecen ogrenciler:\n"); listele(ogr, ort); void oku(struct ogrenci ogr[]) { for (int i=0; i<ogrsay; i++) { printf("%d. Ogrencinin numarasi ve notu: ", i+1); scanf("%s%d",ogr[i].no, &ogr[i].notu); float ortalama(struct ogrenci ogr[]) { float t = 0; for (int i=0; i<ogrsay; i++) t = t + ogr[i].notu; return t/ogrsay; void listele(struct ogrenci ogr[], float not) { for (int i=0; i<ogrsay; i++) if (ogr[i].notu >= not) printf("%s\t\t%d\n", ogr[i].no, ogr[i].notu); Modüler olarak yazılan bu uygulamadaki listele fonksiyonu sadece ortalamayı geçenleri listelemek için değil, ikinci parametre olarak gönderilen herhangi bir notu geçenleri listelemek amacıyla da kullanılabilir. Örneğin; listele(ogr, 50); şeklinde yapılan bir çağrı, 50 ve üzerinde not alan öğrencilerin listelenmesini sağlar. Dizilerde olduğu gibi, tanımlama anında da struct değişkenlere değer ataması yapılabilir; struct ogryapi a = {"05233003", 93 struct tipi değişkenler BINARY dosyalarda çok sık kullanılmakta ve bu yolla kayıt yapma ve okuma işlemleri çok hızlı olarak gerçekleştirilebilmektedir. Kayıt yapma ve kayıt okuma fonksiyonlarında yapının alt alanları değil struct tipinde deklare edilen değişken ismi kullanılır. Ancak struct tipi değişkenler binary dosyalar dışında bütünlük içermesi gereken değişken tanımlamalarının kullanıldığı dinamik veri yapıları ve TEXT dosyalar dahil her türlü uygulamalarda kullanılabilir. 116

II. VERİ TİPLERİNİ YENİDEN İSİMLENDİRME (typedef) C dilinde var olan veri tiplerine yeni bir isim vermek mümkündür. Tanımlama biçimi: typedef tanımlı_tip yeni_ismi; typedef int tamsayi; Artık tamsayı isminde bir veri tipi vardır ve değişken tanımlamalarında kullanılabilir; tamsayi i, j; typedef unsigned char byte; byte x; struct ile oluşturulan yapıda typedef deyimi ile tekrar tanımlanırsa, bu yapıda değişken tanımlamak için tekrar struct deyiminin kullanılmasına gerek kalmaz; struct compleksyapi { float a, b; typedef struct compleksyapi compleks; compleks z1, z2; veya typedef struct { float a, b complex; complex z1, z2; III. KULLANICI TANIMLI (enumerated - sıralı, numaralandırılmış) TİPLER C programlama dilinde mevcut veri tiplerine (int, float, double, char) ek olarak özellikleri kullanıcı tarafından belirlenen yeni tür kümeleri oluşturulabilir. Programın okunabilirliğini arttırmak için değerler sıralı bir küme olarak tanımlanır. enum [tip_adı] { sabit adı [= değer],... [değişken listesi]; değer: sabite otomatik atanan değer. Belirtilmez ise 0'dan başlar. Sıradaki sabit öncesinin bir fazlası değeri alır. Belirtilen tipte tanımlı bir değişken sadece listedeki değerleri alabilir. enum renkler {BEYAZ, SARI, SIYAH tanımlaması ile oluşan enum renkler tipinde BEYAZ 0, SARI 1 ve SIYAH 2 değerlerine eşit sabitlerdir. Listedeki sabitler belirleyici olmalıdır. Sayısal, karakter ve string bilgi yazılamaz. enum renkler = {"Beyaz", "Sari" /* yanlış */ enum renkler = {0, 1, 2 /* yanlış */ 117

İlişkisel operatörler tanımlıdır; Beyaz < Siyah, Sari > Beyaz Bu tip değişkenler switch ve for deyimlerinde kontrol değişkeni olarak kullanılabilir. Bu tipte bir değişken bilinen yapıda tanımlanır. enum renkler {BEYAZ, SARI, SIYAH enum renkler a; a değişkeni sadece BEYAZ, SARI ve SIYAH değerlerinden birini alabilir. Örnek: enum kullanımı. enum aylar { OCAK = 1, SUBAT, MART, NISAN, MAYIS, HAZIRAN, TEMMUZ, AGUSTOS, EYLUL, EKIM, KASIM, ARALIK { enum aylar ay; char *ayadi[] = {"","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" for (ay = OCAK; ay <= ARALIK; ay++) printf( "%2d%12s\n", ay, ayadi[ay] ); Örnek: Sabitlere farklı değerler atama enum renkler {sari = 4, mavi, kirmizi enum renkler i; { i = mavi; printf("%d\n", i); IV. union DEGİŞKEN YAPISI Bir programda veya fonksiyonda değişkenlerin aynı bellek alanını paylaşması için ortaklık bildirimi union deyimi ile yapılır. Bu uygulama belleğin daha verimli kullanılmasını sağlar. Tanımlama biçimi: union ad { tip değişken_1; tip değişken_2;... tip değişken_n; şeklindedir. 118

union paylas { float f; int i; char ch; Yukarıdaki tanımlama yapıldığında, bellekte bir yer ayrılmaz. Değişken bildirimi: union paylas bir, iki; şeklinde yapılır. Üyelere erişmek ve değer aktarımları ise aşağıdaki gibi olur: iki.f = 3.14; bir.i = 2000; bir.ch = 'A'; Aynı yerde belirtilen alanlardan herhangi biri saklanır. En uzun alan ne ise hafızada o kadar yer ayrılır. union ikisi { int isayi; short ssayi; union ikisi sayi; { sayi.isayi = 32767; printf("%d %d \n",sayi.isayi, sayi.ssayi); union değişkenlerin aynı bellek alanını işgal ettiğini gösteren uygulama; union paylas { int x; int y; z; /* veya union paylas z; */ { int *ptx,*pty; z.x = 10; ptx = &z.x; printf("\ntamsayı(x) = %d - bellek adresi: %p\n", z.x, ptx); z.y = 20; pty = &z.y; printf("\ntamsayı(y) = %d - bellek adresi: %p\n",z.y, pty); Program çıktısı: Tamsayi(x) = 10 - bellek adresi: 00429980 Tamsayi(y) = 20 - bellek adresi: 00429980 119