Veri Yapıları ve Programlama Ders Notu VERİ YAPILARI VE PROGRAMLAMA 1. İndisli Değişkenler 2. Pointerlar 3. Fonksiyonlar Dahili fonksiyonlar Ana programa değer aktaran Ana programa değer aktarmayan Harici fonksiyonlar 4. Ekran Kontrol Komutları Gotoxy Clreol Delinle İnsline Textbackground( ) Textcolor window 5. Dosyalama Text dosyalama Binary dosyalama 6. Paralel Port Uygulamaları 7. Grafik Veri Yapıları ve Programlama Ders Notu İNDİSLİ DEĞİŞKENLER C programlama dilinde diğer programlama dillerinde olduğu gibi indisli değişken tanımlamak mümkündür.C programlama dilinde ilk indis numarası 0 ile başlar. İndisli değişkenler,daha önce anlatılan bütün değişken tiplerinde tanımlanabilir.İndisli değişken tanımlanırken önce değişkenin hangi tip olduğu,daha sonrada değişken adı yazılır.Değişken adının yanında köşeli parantez içerisinde indis sayısı yazılır. int a [10]; int a [3] [4]; char ad [10]; sütun satır a [0] a [1] . . . . . . . . a [9] ÖRNEK :#include<stdio.h> #include<conio.h> main ( ) { int a[10] ,i; clrscr ( ); for ( i=0; i<5; i++) { printf (“%d. sayıyı giriniz : ” i+1); scanf (“%d”,&a); } printf (“İlk girilen sayı =%d/n”,a[0]); printf (“Üçüncü girilen sayı =%d/n”,a[2]); printf (“Son girilen sayı =%d/n”,a[4]); getch( ); } a [0] [0] a [0] [2] a [2] [1] a [2] [3] Veri Yapıları ve Programlama Ders Notu ÖRNEK : Klavyeden kullanıcı tarafından girilen 1726 sayıdan en büyüğünü bulan programı yazınız. #include<stdio.h> #include<conio.h> main( ) { int a[1726],i,max ; clrscr( ); for( i=0; i<1726; i++) { printf(“%d.sayıyı giriniz :”,i+1); scanf(“%d”,&a); } max=a[0]; for( i=1; i<1726; i++) if (max<a); max=a; printf(“En büyük sayı = %d \n”, max); getch( ); } Veri Yapıları ve Programlama Ders Notu ÖRNEK : Klavyeden kullanıcı tarafından girilen 5 sayıyı büyükten küçüğe doğru sıralayıp, ekrana yazan programı yazınız. # include<stdio.h> #include<conio.h> main( ) { int a [5] ,i,j,gec; clrscr( ); for (i=0; i<5; i++) { printf( “ %d .sayıyı giriniz :”,i+1); scanf( “ %d ”,&a ); for (i=0; i<4; i++) for ( j=i+1; j<5; j++) if ( a < a[j] ) { gec = a; a = a[j]; a [j] = gec; } for (i=0; i<5; i++) printf ( “ %d\n”,a); getch( ); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h> #include<conio.h> main( ) { char ad [5][15]; int i; clrscr( ); for ( i=0; i<5; i++) { printf (“%d . kişinin adını giriniz :”,i+1) ; scanf ( “%s”,& ad ) ; } for ( i=0; i<5; i++) printf (“%d. kişinin adı = % s \ n”, i+1, ad ) ; getch ( ) ; } ÖDEV : 1. 3*3 ’lük A ve B matrisleri klavyeden girilmektedir.Buna göre A ve B matrislerini toplayıp,oluşan C matrisine ekrana yazan programı yazınız. 2. 5*5’lik D matrisinin elemanları klavyeden girilecektir.Bu matrisin her satırındaki en küçük eleman ile her sütundaki en büyük elemanı bulan programı yazınız. 3. Klavyeden sırası ile öğrenci no,adı soyadı,vize ve final notları girilecektir.Sınıfta toplam 20 öğrenci vardır .Her öğrencinin ortalaması hesaplandıktan sonra,ortalamalara bakılarak en yüksek nottan en düşük nota doğru sıralama yapılacak ve ekrandan öğrencinin no,adı,soyadı,vize,final ve ortalama notları gösterilecektir.Bu programı yazınız. Veri Yapıları ve Programlama Ders Notu
P O I N T E R L E R Pointer tipi değişkenler,normal değişkenlerin adresini tutan değişkenlerdir.Pointer kullanarak C programlama dilinde adres bazında işlemler yapmak mümkün olmaktadır. p değişkeni pointer olarak tanımladıktan sonra p=&a a 123 117F:A071 denildiği zaman p pointerinin içinde, a değişkeninin adresi bulunur.*p denildiği zaman p pointerinin içindeki adresdeki değer belirtilir. p 117F:AO71 120A:139B ÖRNEK: #include<stdio.h> #include<conio.h> main ( ) { int a,*k ; /* *k integer , pointer tipte değişken */ clrscr ( ); a =123 ; k =&a ; printf (“ a değişkenin adresi : % p \n”,&a ) ; printf (“ a değişkeninin değeri : % d \n ”,a ) ; printf (“ k pointerının gösterdiği adres : % p \n”,k) ; printf (“k pointerının gösterdiği adresteki değer : % d \n ”,*k), getch ( ) ; } Veri Yapıları ve Programlama Ders Notu
NOT : Char tipindeki bir değişkenin adresi , int tipte bir pointer değişkende tutulamaz.Değişkenin tipi ile pointer değişkeninin tipi aynı olmalıdır. 1) int a,b,c , *ptr ,*d,e ; 2) a = 23 3) ptr = &a 4) b = a ; 5) d = ptr ; 6) c = *d ; 7) e = c + *ptr ; Burada ; 1. adımda a,b,c,e değişkenleri ile ptr ve d pointer değişkenleri integer olarak tanımlanıyor. 2. adımda a değişkenine 23 değeri aktarılıyor. 3. adımda a değişkenini adresi ptr pointer değişkenine aktarılıyor. 4. adımda b değişkenine a değişkeninin içeriği yani 23 değeri aktarılıyor. 5. adımda, d pointerına , ptr pointerının değeri yani a değişkeninin adresi aktarılıyor. 6. adımda c değişkenine d pointerının gösterdiği adresteki değer yani 23 aktarılır. 7. adımda e değişkenine c değişkeninin içindeki değer ( 23 ) ile ptr pointerının gösterdiği adresteki değer ( 23 ) toplanır ve aktarılır ( e = 46 ) ÖRNEK : #include<stdio.h> #include<conio.h> main( ) { int a ,*k ,*l ; clrscr( ); a = 47; k = &a; l =k; printf (“a değişkeninin adresi : %p \n”, l ); printf (“a değişkeninin değeri : %d \n “, *l ); getch ( ); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<conio.h> main( ) { int a ,*k ,*l ; clrscr( ); a = 47; k = &a; l =k; printf (“Bir sayı giriniz : “); scanf (“ %d “, k ); printf (“Girilen sayı = %d \n” , *l ); getch ( ); } ÖRNEK : #include<stdio.h> #include<conio.h> main( ) { int a [7] , i , *z; clrscr ( ); z = a; /* z = &a[0] */ for ( i =0; i<6; i++) { printf (“ %d. sayıyı giriniz :”, i+1); scanf (“%d”, &a ); } printf ( “ \n \n”); for ( i =1; i<7; i++) printf (“%d.sayı = %d \n”, i, *z++); getch ( ); } Veri Yapıları ve Programlama Ders Notu ÖRNEK : Klavyeden kullanıcı tarafından büyük harfle girilen cümleyi , pointer kullanarak küçük harfe çeviren programı yazınız. #include<stdio.h> #include<conio.h> #include<ctype.h> main( ) { char klm [80], *p; clrscr( ); p = klm; printf (“BÜYÜK HARFLERLE bir cumle giriniz :”); gets (klm); printf (“ \n”); while ( *p ) printf ( “ %c”, tolower (*p++)); getch( ); } Veri Yapıları ve Programlama Ders Notu
ÖDEV 1. 5x5 ‘lik iki matrisi birbirine çarpan ve sonuç matrisi ekrana yazan programı pointer kullanarak yazınız. 2. 10x10’luk bir matrisin değerleri kullanıcı tarafından girildikten sonra , pointer kullanarak bu matristeki en büyük elamanı bulan programı yazınız. 3. Klavyeden kullanıcı tarafından girilen cümleyi tersten yazdıran programı pointer kullanarak yazınız. Veri Yapıları ve Programlama Ders Notu
F O N K S İ Y O N L A R Problem çözmenin ilkelerinden biri problemi mümkün olduğu kadar çok parçaya bölmek idi.Daha sonra bu parçalar bağımsız olarak düşünülüp çözümleri elde edilir.C de bu bölme işlemi fonksiyon olarak adlandırılır. Profesyonel programlar incelenirse , programın mantıksal bütünlük gösteren parçalar halinde yapıldığı görülecektir.Böylece , programın yazılması ve anlaşılması kolaylaşır. C dilinde yazılan ana programın kendisi de esasında main( ) adında bir fonksiyondur.Main( ) fonksiyon yazılmaksızın herhangi bir başka fonksiyonun kullanılması mümkün olamaz.Geleneksel olarak , programcılar tarafından komut olarak adlandırılmalarına rağmen , scanf ,printf ,sin ,log ve bunlar gibi ,diğer C deki bütün komutlar , gerçekte bir fonksiyondur.C programlama dilinde fonksiyonlar bir veya birden fazla komuttan oluşan alt programlardır.Her fonksiyonun bir ismi olur,fonksiyonun ismi tıpkı komut gibi ana program içinde yazıldığı gibi o fonksiyon çalışır ve belirlenen görevi yerine getirir.Fonksiyon isminin yanında parantezler yer alır. C programlama dilinde fonksiyonlar 2’ye ayrılır. * Dahili fonksiyonlar Ana programa değer aktaran Ana programa değer aktarmayan * Harici fonksiyonlar Fonksiyonların genel yazılımı şöyledir ; tip fonksiyonun_adi ( parametre listesi ) { komut 1 ; komut 2 ; . . komut n ; } Veri Yapıları ve Programlama Ders Notu
Ana Programa Değer Aktarmayan Fonksiyonlar ÖRNEK : #include<stdio.h> #include<conio.h> void yaz (void) { printf (“Uluborlu S.Karasoy MYO \n ”); } main ( ) Ana programdan önce fonksiyon yazılabilir. { ayrıca ana programdan sonrada yazılabilir.Ama clrscr( ); burada dikkat edilecek olan kural,eğer fonksiyon yaz( ); ana programdan sonra tanımlanırsa ,fonksiyonun getch( ); tam ismi , ana programdan önce mutlaka } yazılmalıdır. ÖRNEK : #include<stdio.h> #include<conio.h> void yaz (void); main( ) { clrscr( ); yaz( ); getch( ); } void yaz (void); { printf( “Uluborlu S.Karasoy MYO”); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Çarpma ve toplama işlemini yapan fonksiyonu yazınız. #include<stdio.h> #include<conio.h> int topla (int a, int b); carp (int x , int y) { printf ( “%d * %d = %d \n ”, x, y, x*y ); } main( ) { clrscr( ); topla(10,7); carp(8,3); topla(6,9); getch( ); } topla( int a, int b) { printf( “Toplam = %d \n ”, a+b ); } Veri Yapıları ve Programlama Ders Notu RNEK : #include<stdio.h> #include<conio.h> int kare ( int sayi ); main( ) { int a; clrscr( ); printf ( “Bir sayi giriniz :”); scanf ( “%d “,&a); kare (a); getch( ); } int kare (int sayi) { clrscr( ); printf( “Sayının karesi = %d \n ”, sayi *sayi); } Veri Yapıları ve Programlama Ders Notu
Ana Programa Değer Aktaran Fonksiyonlar ÖRNEK : #include<stdio.h> #include<conio.h> int topla ( int a , int b); main( ) { int x,y,cevap; clrscr( ); printf ( “1.sayıyı giriniz : ”); scanf ( “%d”,&x); printf ( “2.sayıyı giriniz : ”); scanf ( “%d”,&y); cevap = topla (x,y); printf ( “Toplamın Sonucu = %d \n”,cevap); getch( ); } int topla ( int a, int b) { int c; c = a+b; return a+b; return(c); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<conio.h> int f1 (void); main( ) { int i; for( i = 0; i<10; i++) printf( “%d”,f1( ) ); getch( ); } int f1(void) { static int a; a = a+25; return(a); } Harici Fonksiyonlar int topla (int d , int e) { int sonuc; sonuc = d+e; return(sonuc); } Program yazıldıktan sonra c:\ TC \ toplamaişlemi.C olarak kaydedilir.Yeni program sayfası açılır. Veri Yapıları ve Programlama Ders Notu ÖRNEK : #include<stdio.h> #include<conio.h> #include<c:\ TC \ toplamaişlemi.C> main( ) { int a,b; clrscr( ); printf( “2 sayı giriniz :”); printf( “%d %d” &a,&b); printf( “Toplam = %d \n, topla (a,b)”); getch( ); } ÖDEV 1. Klavyeden a ve b sayıları girildikten sonra usal( ) fonksiyonu ile ab’yi bulan programı fonksiyon ile yazınız. 2. Klavyeden girilen açı değerinin sin,cos’u bulan programı harici fonksiyonlar kullanarak yazınız. 3. Klavyeden girilen a sayısının faktöriyelini recursive function ile yazınız. Veri Yapıları ve Programlama Ders Notu
EKRAN KONTROL KOMUTLARI C programlama dilinde hem text modunda , hem de grafik modunda ekran kontrol komutları bulunmaktadır. Ekran kontrol komutları , ekranın silinmesi , kursörün herhangi bir yere konumlandırılması , çeşitli renkte fonlar üzerine yine çeşitli renklerde yazılar yazılması amaçlarıyla kullanılmaktadır. ÖRNEK : #include<stdio.h> #include<conio.h> #include<string.h> char mesaj [40] = “ Turbo C Ekran Fonksiyonları”; main( ) { register int x , y; char *p; clrscr( ); p = mesaj; for( y =1; y<=strlen(mesaj); x++) { for ( y =1; y<=12; y++) { gotoxy (x,y); printf( “%c”, *p); delay(1000); gotoxy(x , 25-y); printf( “%c”, *p); delay(1000); } p++; } getch( ); } Veri Yapıları ve Programlama Ders Notu
Burada kullanılan ; gotoxy komutu : x ve y olmak üzere iki parametre alır.x sütun y ise satır numarasıdır.gotoxy(x,y) komutu,kursörü ekranın x sütun y.satırına konumlandırır.Text modunda ekran 80 sütun ve 25 satırdan oluşmaktadır. ÖRNEK : #include<stdio.h> #include<conio.h> void mesaj (char *s , int x , int y); main( ) { clrscr( ); mesaj( “Bu bir mesajdır……..”,1.10); getch( ); mesaj( “Bu da bir mesajdır….”, 10,10); getch( ); } void mesaj( char *s , int x, int y) Bu bir meBu da bir mesajdır. { gotoxy(x ,y); clreol( ); printf(s); } Burada kullanılan clreol( ) komutu, kursorün bulunduğu noktadan itibaren , satır sonuna kadar olan kısmı siler. Veri Yapıları ve Programlama Ders Notu
ÖRNEK :#include<stdio.h> #include<conio.h> main( ) { int x,y ; clrscr( ); for( y =1; y<25; y++) for( x =1; x<80; x++) { gotoxy( x,y ); printf( “ %c“, (y-1) + ‘A’); } for( y =2; y<26; y+=2) { gotoxy(1,y); delline( ); insline( ); } getch( ); } Bu programda kullanılan delline( ) komutu, kursorün bulunduğu satırı siler. İnsline ( ) komutu ise kursorün bulunduğu yere yeni bir boş satır açar,böylece kursorün bulunduğu ve diğer alt satırlar bir satır aşağıya kayar. Veri Yapıları ve Programlama Ders Notu
Textbackground ve Textcolor Komutları Bu komutlar , text modunda ekranın zemin rengini ve yazı karakterlerinin rengini belirler. textbackground( ) : ekranın zemin rengini belirler textcolor( ) : yazı karakterlerinin rengini belirler. textbackground( ) ve textcolor( ) komutları bir renk parametresi alırlar.Bu parametreler rengin sembolik sabit ismi (ingilizce) veya buna karşılık gelen sayısal değer olabilir. Sembolik Sabit Sayısal Değer Renk BLACK 0 Siyah BLUE 1 Mavi GREEN 2 Yeşil CYAN 3 Turkuaz RED 4 Kırmızı MAGENTA 5 Mor BROWN 6 Kahverengi LIGHTGRAY 7 Açık Gri DARKGRAY 8 Koyu Gri LIGHTBLUE 9 Açık Mavi LIGHTGREEN 10 Açık Yeşil LIGHTCYAN 11 Açık Turkuaz LIGHTRED 12 Açık Kırmızı LIGHTMAGENTA 13 Açık Mor YELLOW 14 Sarı WHITE 15 Beyaz BLINK 128 Yanıp Sönme textcolor (BLUE); ile textcolor(1); aynı işi yapar. Ekrana renkli karakterlerin yazılmasında cprintf( ) komutu kullanılır. Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<conio.h> main( ) { clrscr( ); textbackground(15); textcolor(RED); cprintf( “Uluborlu”); textbackground(GREEN); textcolor(7); cprintf( “Selahattin Karasoy”); textbackground(1); textcolor(YELLOW+BLINK); /* textcolor(14+128); */ cprintf( “Meslek Yüksek Okulu”); getch( ); } Veri Yapıları ve Programlama Ders Notu
T E X T P E N C E R E S İ Text modunda window tanımlaması yapılarak ekranın sadece bir bölgesi aktif hale getirilebilir.Window tanımlandıktan sonra , yazılan bütün ekran kontrol komutları ( clrscr( ), delline( ), gotoxy(x,y)) hep bu tanımlı bölgede çalışır. Şimdiye kadar yapılan programlarda varsayılan pencere kullanılmıştır.(80 sütun ve 25 satırdan meydana gelen) Window (x1 ,y1 x2, y2) : komutu ise ekranın bir bölgesini aktif pencere olarak tanımlar.Burada kullanılan x1 , y1 aktif pencerenin sol üst köşesini , x2, y2 ise sağ alt köşesini gösterir. ÖRNEK : #include<stdio.h> #include<conio.h> main( ) { clrscr( ); window(5,3,50,10); gotoxy(3,2); printf( “SDÜ-Isparta”); getch( ); } (x1,y1) (x2,y2)
Veri Yapıları ve Programlama Ders Notu ÖDEV 1. 2. 3. Window komutları kullanılarak ekrana satranç tahtası şeklini çizen ve satranç oyunu için , başlangıç şeklindeki taşların yerini gösteren programı yazınız. kıyas kıyas kıyas kıyas k a kıyas ı s A B C D E F G H 1 2 3 4 5 6 7 8 Kale At Fil Vezir Şah Fil At Kale Piyon Piyon …. ….. ….. …. ….. ….. Piyon Piyon Piyon ….. ….. ….. …… …… Kale At Fil Vezir Şah Fil At Kale Veri Yapıları ve Programlama Ders Notu
D O S Y A L A R Birçok program uygulamasında ,programa girilen ve program tarafından üretilen bilgilerin yardımcı bellekte (disket veya harddisk) depo edilip daha sonra tekrar kullanılması gerekmektedir. Program tarafından üretilen bilgilerin depo edildiği dosyalara VERİ DOSYALARI adı verilir.Dosyalar,bilgisayar programcılığında en önemli kavramların başında gelir. Veri Programdan veri dosyasına bilgi yazılması Veri Veri dosyasından programa bilgi okunması C programlama dilinde 2 tip veri dosyası tanımlıdır. -TEXT -BINARY dosyalar Program Veri Dosyası Program Veri Dosyası Veri Yapıları ve Programlama Ders Notu
Veri Dosyalarının Açılma Modları Dosyalar , bilgi yazma , bilgi okuma ve bilgi ekleme modunda açılabilir. Mod Anlamı w Text dosyasını yazma modunda oluşturur. r Text dosyasını okuma modunda açar a Text dosyasını bilgi ekleme modunda açar. wb Binary dosyasını yazma modunda açar. rb Binary dosyasını okuma modunda açar. ab Binary dosyasını bilgi ekleme modunda açar. w + Text dosyasını okuma / yazma modunda açar r + Text dosyasını okuma / yazma modunda açar a + Text dosyasını okuma / bilgi ekleme modunda açar w + b Binary dosyasını okuma / yazma modunda açar a + b Binary dosyasını okuma / bilgi ekleme modunda açar Veri Yapıları ve Programlama Ders Notu
TEXT DOSYALAR Text dosyalara bilgiler sırasal olarak kaydedilir ve kaydedilen bilgilerin en sonuna dosya sonu (EOF) işareti konur. Dosya sonu işareti (EOF) ekranda görüntülenemeyen özel bir işarettir. Veri dosyası Sırasal kayıtlar Dosya sonu işareti 1) Yazma (w-write) modu Bir text dosyasını diskette veya harddiskte oluştururken “w” modunu kullanarak açmak gerekir. Daha önce oluşturulmuş ve içine bilgi yazılmış bir dosya tekrar “w” modunda açılırsa , yazıcı kafa dosyanın en başına konumlanacağı için , yeni girilen bilgiler önceki bilgilerin üzerine yazılır , böylece önceki bilgiler silinmiş olur. Text dosyalarla işlem yapacak olan programlarda ilk önce , değişkenlerin tanımlandığı bölümde bir dosya değişkeni tanımlanır. Bu tanımda bir değişken (pointer tipi bir değişken) FILE tipi tanımlanır. Bu değişken program içinde dosyayı temsil eder. ÖRNEK : # include <stdio.h> # include <conio.h> main( ) { FILE *abc; int i,no; abc = fopen (“rakam”,”w”); for ( i=1 ; i<=5 ; i+t) { printf ( “%d. Sayıyı giriniz :”,i ); scanf ( “%d”,&no); fprintf (abc , “%d \n”, no); } fclose (abc); } ---- ---- --- ---- ---- --- ---- ---- --- ---- ---- --- Veri Yapıları ve Programlama Ders Notu
fopen komutu ile dosya açılır. Fopen komutunun iki parametresi bulunur. Bu parametreler fopen komutundan sonra parantez içinde verilir. Her iki parametrede çift tırnak içerisindedir ve birbirinden (,) ile ayrılır. Bu parametrelerden ilk açılacak olan dosyanın adıdır. Bu dosya adı en fazla 8 karakter olmalıdır. İstenirse dosya adından sonra dosya uzantısı da verilir. Bu uzantı genellikle Dat’dır. (İngilizce DATA (veri)’nin kısaltılmışıdır) . fopen komutundaki ikinci parametre ise dosyanın açılma modudur. fprintf komutu ile de dosyaya bilgi yazılır. Komuttaki ilk parametre bilginin hangi dosyaya yazılacağını gösterir. Buradaki abc değişkeni rakam isimli dosyayı temsil eder. Daha sonra çift tırnak içindeki değişken veya değişkenler dosyaya yazılacak bilgilerdir. Bu bilgiler den sonra \n kullanılır ve çift tırnak kapatılır. Çünkü text dosyalarda bilgiler sıralı mantık ile yazıldığı için \n kullanılır. Üçüncü parametre ise bilgileri temsil eden değişken isimleridir. 2) Okuma (r-read) modu ÖRNEK : #include <stdio.h> #include <conio.h> main ( ) { FILE *dd; int no; dd = fopen (“rakam”, “r”); while ( fscanf (dd ,”%d”,&no)!=EOF ) printf ( “%d\n”,no); fclose (dd); getch (); } Burada dosya fopen komutu ile (“r”) okuma modunda açılmıştır. fscanf komutu dosyadan bilgi alır , alınan bilgi no değişkenine aktarılıyor, bu işlem dosyanın sonuna kadar devam eder. while döngüsü EOF (dosya sonuna) gelindiğinde sona erer. Veri Yapıları ve Programlama Ders Notu
3) Bilgi ekleme (a- append) modu ÖRNEK : #include <stdio.h> #include <conio.h> main ( ) { FILE *dd; int i,no; dd = fopen (“rakam” , “a”); for ( i=1; i<=3 ; i+t ) { printf (“%d. Sayıyı giriniz : ” , i ); scanf(“%d.” , & no); fprintf (dd, “%d \ n ”,no); } fclose (dd); } Diskette (veya HDD) mevcut olan bir dosya eğer tekrar “w” moduyla açılmış olsaydı , yazıcı kafa dosyanın başına konumlanacağından yeni bilgiler önceki bilgilerin üzerine yazılacağından önceki bilgiler kaybolur. Dosya “a” modunda açıldığında ise, yazıcı kafa dosya sonu (EOF) işaretinin bulunduğu yere konumlanır ve böylece yeni bilgiler önceki bilgilerin sonundan itibaren yazılmaya başlar. Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h> #include <conio.h> main( ) { FILE *xyz; char ad [20], de; int no; xyz = fopen ( “isimler” , “w” ); while (1) { printf (“Adı : ”); scanf ( “%s”,& ad); printf (“Numarası : ” )scanf ( “%d” , & no); fprintf ( xyz , “%s %5d \ n ” ,ad , no); printf (“Devam etmek istiyor musunuz (e/h) ? ” ); de = getche ( ) ; if ( de = = ‘h’) break; } fclose(xyz); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h> #include <conio.h> main ( ) { FILE *klm ; char ad [20]; int no; klm = fopen(“isimler”,“r”); clrscr( ); printf ( “ Adı Numarası \n ); printf ( “………………….. \n ); while (fscanf (klm , “%s %5d ” , ad, &no )!= EOF ) printf (“ %s %5d \n ” , ad ,no); fclose (klm); getch( ); } ÖDEV 1) Bir sınıftaki öğrencilerin “adı,soyadı,numarası,vize notu ve final notu” dosyada tutulmak isteniyor. Buna göre program çalıştığında 1-Kayıt ekleme 2-Kayıt bulma (isim ve numaraya göre) 3- Kayıt silme (numaraya göre ) 4- Bilgi değiştirme 5- Listeleme seçenekleri bulunacaktır. Programı text dosyalama kullanarak yazınız. Veri Yapıları ve Programlama Ders Notu
BINARY DOSYALAR Binary dosyalara BYTE düzeyinde kayıt yapılır ve okunur. Yani kullanılan değişkenlerin boyutuna göre , dosyada kayıtlar tutulur. Bu dosyalarda kayıt yapma işleminde “fwrite, “ kayıt okuma işleminde ise “fread” komutları kullanılır. fwrite komutunun genel yazılımı fwrite ( değişken , byte sayısı, bilgi sayısı, dosya değişkeni ) Değişken : Kaydedilecek bilgiyi tutan değişkenin adresi Byte sayısı : Kaydedilecek bilginin byte olarak uzunluğu (bunun için sizeof komutu kullanılır) Bilgi sayısı : Her seferde kaydedilecek olan bilgi sayısı , genellikle bu sayı 1 olur. Dosya değişkeni : Diskteki dosyayı programda temsil eden değişken. fread komutunun genel yazılımı fread (değişken byte sayısı, bilgi sayısı,dosya değişkeni) Değişken : Okunacak olan bilgiyi tutacak olan değişkenin adresi. Byte sayısı : Okunacak bilginin byte olarak uzunluğu (sizeof komutu) Bilgi sayısı : Her seferde okunacak bilgi sayısı (1) Dosya değişkeni : Diskdeki dosyayı programda temsil eden değişken. ---- ---- --- ---- /--- --- ---- ---- --/ Veri Yapıları ve Programlama Ders Notu
Structure tipi değişkenler Bu tip değişkenler daha çok BINARY dosyalarda kullanılmakta ve bu yolla kayıt yapma ve okuma işlemleri çok hızlı olarak gerçekleştirilebilmektedir.( Ayrıca TEXT dosyalarda da kullanılabilir) Birbiriyle bağlantılı ve bir küme teşkil eden değişkenler bir tek değişkenin elemanları olarak tanımlanabilir. Bu durumda bir grup değişkene bir tek isimle ulaşmak mümkündür. Structure tip değişkenler. Örneğin, öğrencinin bilgileri birbirine bağlantılı olarak düşünülebilir. Adı Soyadı Numarası Sınıfı Bölümü Yukarıdaki elemanlar bir araya getirildiğinde ogr_bil adlı bir değişkenin alt elemanları olarak tanımlanabilir. Struct b { int no; char ad [10] , soyad[10]; char sınıf [5]; char bölüm [15]; } ogr_bil; Bu tanımlamadan sonra ogr_bil değişkeninin elemanlarına, ogr_bil. no ogr_bil. ad ogr_bil. soyad ogr_bil. sınıf ogr_bil. bolum şeklinde ulaşılabilir. Binary dosyalamada kullanılan “fseek” komutu ise , yazıcı kafayı belirli bir kayıt alanına konumlandırır.böylece her kaydın bir kayıt numarası olmakta , bu numara kullanılarak kayda doğrudan doğruya ulaşmak imkanı bulunmaktadır. Veri Yapıları ve Programlama Ders Notu
fseek komutunun genel yazılımı fseek (dosya değişkeni , kayıt pozisyonu , referans noktası ) Dosya değişkeni : Diskdeki dosyayı programda temsil eden değişkenin adı. Kayıt pozisyonu : Kayıtların başlangıcından , okuyucu veya yazıcı kafanın bulunduğu noktadan yada kayıtların sonundan itibaren, byte olarak , kayıt yapılacak veya kayıt okunacak alan. Referans noktası : Kayıt pozisyonunun nereden itibaren hesaplanacağı gösterilir. 0 : Kayıt pozisyonu , kaydın başından itibaren byte cinsinden hesaplanır. 0 yerine SEEK_SET yazılabilir. 1 : Kayıt pozisyonunun , yazıcı veya okuyucu kafanın bulunduğu noktadan itibaren hesaplanacağını gösterir. 1 yerine SEEK_CUR yazılabilir. 2 : Kayıt pozisyonu kaydın sonundan itibaren byte cinsinden hesaplanır. 2 yerine SEEK_END yazılabilir. Binary ve text dosyalarda kayıtlara numarada verilebilir. Fiziki ( yani disketteki) kayıt alanı numarası 0’dan başlar ancak her kayıt alanına kayıt yapılması zorunluluğu yoktur. Kayıtlar rastgele alanlara yazılıp okunabilir. Bu durumda içinde kayıt bulunan alanlarla, kayıt bulunmayan alanların birbirinden ayırt edilmesi gerekir. Bunun için kayıt bulunan alanlara ilk kayıt elemanı olarak özel bir işaret (mesela *) konulmakta ve böylece bir alanda kayıt bulunup bulunmadığı kontrol edilebilmektedir. Veri Yapıları ve Programlama Ders Notu ÖRNEK: #include <stdio.h> #include <conio.h> struct b { char ad [5]; char soyad [15]; char adres [20]; char tel.[12]; char şehir [15]; }bilgi; main( ) { FILE *dosya ; char ce ; dosya = fopen (“tel_rehber” , “wb” ); do { clrscr ( ); printf (“Adınız :”); scanf (“%s” , & bilgi.ad ); printf (“soyadınız :”); scanf (“%s” , & bilgi.soyad); printf (“adresiniz :”); scanf (“%s” , & bilgi.adres ); printf (“telefonunuz :”); scanf (“%s” , & bilgi.tel ); printf (“şehrin adı :”); scanf (“%s” , & bilgi.şehir ); fwrite (&bilgi , sizeof (bilgi) ,1, dosya); printf (“tekrar kayıt yapılacak mı (e/h) :”); ce = getce(); }white (ce = = ‘e’); fclose (dosya): printf (“kayıt yapıldı …”); getch( ); } Veri Yapıları ve Programlama Ders Notu ÖRNEK : #include < stdio.h> #include <conio.h> struct b { char ad [15]; char soyadı [15]; char adres [20]; char tel[12]; char şehir [15]; } bilgi ; main( ) { FILE *dosya; int sayı ,k, k-sayı; dosya = fopen (“tel. – rehberi” , “rb”);fseek (dosya, 0.2); k – sayısı = ftell(dosya)/ 77; // ftell komutu kayıt sayısını bulur. fseek (dosya, 0,0); değişkenlerin byte olarak uzunluğu clrscr ( ); say = 0 for ( k=0; k<k-sayısı ; k++) { if (say=0) { printf (‘’ ADI SOYODI TEL. ADRES ŞEHİR \n’’); printf (‘’ ……………………………………....\n’’); } fread (& bilgi, sizeof (bilgi),1, dosya); printf(‘’ %s %s %s %s %s \n’’,bilgi.ad, bilgi.soyad, bilgi.tel,bilgi.adres, bilgi.sehir); say ++; } fclose (dosya); printf (“liste sonu …..” ); getch( ); } Veri Yapıları ve Programlama Ders Notu
PARALEL PORT UYGULAMALARI Paralel port , bilgisayarın en kolay programlanabilen portudur. Bu pinler üzerinde DATA , STATUS , CONTROL adı verilen 3 tane port vardır. Bu pinlerden herhangi birinin “1” olması durumu , o pinden okunacak voltajın +5V olması anlamına gelir. “0” olması durumu ise o pinin 0 volt olduğunu ifade eder. 25 nolu pin topraktır. Bir paralel porttan veri alışverişi yapılabilmesi için bu verinin önce geçici bir yere (register) kaydedilmesi gerekir. Her register on altı ( hexadecimal ) sayı sisteminde bir adresi vardır. Bunlar 378 , 379 , 37A , şeklindedir. Data (378) , status (379) , control (37A) “Gönder” komutu ile porta veri gönderildiğinde , o veri , paralel portun 2 – 9 numaralı pinleri arasında görülür. Bir pine veri göndermek , o uçtaki gerilimin +5V veya 0V olması demektir. Programda 10 tabanında gönderilen sayısal değer , portta 8 bit halinde , 2 tabanında gözükür. Veri Yapıları ve Programlama Ders Notu Alttaki şekilde 8 tane Led , dirençlerle (220Ω veya 390Ω) birlikte paralel porta bağlanmaktadır. Çünkü LED’ler 1,5V ‘la çalışır. Ama paralel porttan 5V çıkar. Ledlerin patlamaması için gerilim düşürücü olarak direnç kullanılır. ÖRNEK : Paralel porta bağlanan 8 tane LED’in sağdan sola doğru sırası ile yanması için gereken programı yazınız. İlk önce porta gönderilecek olan sayıların belirlenmesi gerekir. Pin 9 8 7 6 5 4 3 2 Verinin 2’lik değeri 27 26 25 24 23 22 21 20 Led No 8 7 6 5 4 3 2 1 Gönderilecek değer X 20 = 1 X 21 = 2 X 22 = 4 X 23 = 8 X 24 = 16 X 25 = 32 X 26 = 64 Yakılacak LED X 27 = 128 25 2 3 9 25 2 3 9 Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <math.h> #include <stdio.h> #include <conio.h> #include <dos.h> main ( ) { int d, i ; clrscr ; outport (0x378 , 1 ) ; delay (1000) ; for (i = 0 ; i<= 7 ; i++) outport (0x378 , 2 ) ; delay (1000) ; { outport (0x378 , 4 ) ; delay (1000) ; d = pow (2,i) ; outport (0x378 , 8 ) ; delay (1000) ; outport (0x378 , d) outport (0x378 , 16 ) ; delay (1000) ; delay ( 1000 ) ; outport (0x378 , 32 ) ; delay (1000) ; } outport (0x378 , 64 ) ; delay (1000) ; outport (0x378 , 1128 ) ; delay (1000) ; getch ( ) ; } ÖRNEK : Bilgisayarın parelel portuna bağlı 8 LED’i , 1 sn aralıklarla kenarlardan ortaya doğru , sonra ortadan iki yana doğru sürekli bu şekilde ledleri yakan programı yazınız. 8 7 6 5 4 3 2 1 x x x x x x x x x x x x x x x x 1+128=129 2+64=66 4+32=36 8+16=24 24 36 66 129 Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h> #include <conio.h> #include <dos.h> main ( ) { int i , a [4] = (129 , 66 , 36 , 24) ; for (i = 0 ; i<4 ; i + t) { output (0x378 , a ) ; delay (1000); } for (i = 3 ; i ≥ 0 ; i + t) { output ( 0x378 , a ) delay (1000), } getch ( ) ; } Veri Yapıları ve Programlama Ders Notu
SEVEN SEGMENT DİSPLAY (GÖSTERGE) UYGULAMALARI 7 segment display Burada 0 rakamının oluşması için g hariç diğerlerinin aktif (lojik 1) olması gerekir. Pin 9 8 7 6 5 4 3 2 Display segmenti g f e d c b a Yanacak Rakam 27 26 25 24 23 22 21 20 Gönder ilecek değer 0 0 0 1 1 1 1 1 1 63 1 0 0 0 0 0 1 1 0 6 2 0 1 0 1 1 0 1 1 91 3 0 1 0 0 1 1 1 1 79 4 0 1 1 0 0 1 1 0 102 5 0 1 1 0 1 1 0 1 109 6 0 1 1 1 1 1 0 1 125 7 0 0 0 0 0 1 1 1 7 8 0 1 1 1 1 1 1 1 127 9 0 1 1 0 1 1 1 1 111 Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h> #include <conio.h> #include <dos.h> main ( ) { int i , a [10] = {63,6,91,79,102,109,125,7,127,111} ; for (i = 0 ; i<9 ; i + +) { output (0x378 , a ) ; delay (1000); } getch ( ) ; } Veri Yapıları ve Programlama Ders Notu
C GRAFİK 1) a. Grafik Ekrana Geçiş(harici function yazılması) piksel çizim komutları b. Getpiksel komutu 2) a. line komutu b. circle komutu 3) a. arc komutu b. ellipse komutu 4) a. grafik imlecinin yerinin degiştirilmesi.(moveto,moverel) lineto b. rectangle komutu 5) a. drawppoly komutu b. çizim tipinin değiştirilmesi(çizginin ince,kalın,noktalı v.s) 6) a. bar komutu,bar3d komutu b. pieslice komutu,sector komutu 7) a. fillellipse komutu,fillpolly komutu b. yazı komutları 8) a. outtext komutu,outtextxy komutu b. settextjustify komutu 9) a. metin boyutlarının belirlenmesi(textheight,textwidth) b. çizim renklerinin seçimi(setbkcolor,setcolor) 10) a. restorecrtmode,getgraphmode,setgraphmode,graphdefaults b. cleardevice,setviewport komutu,clearviewport komutu Veri Yapıları ve Programlama Ders Notu
Grafik Sisteminin Başlatılması Bilgisayarın grafik adaptörü ve modunun belirlenmesinden sonra yapılacak ilk iş çizim için grafik sisteminin başlatılmasıdır.Grafik sisteminin başlatılması, grafik adaptörünün çizim için hazır duruma getirilmesi demektir. Grafik sistemini başlatmak için initgraph komutu kullanılır. void far initgraph (int far *GrAdapter,int far *GrMod,char far *dir); initgraph komutu,verilen grafik adaptörü ve moduna ait bilgileri içeren uygun grafik arabirim dosyasını disketten okuyup hafızaya yükleyerek Borland grafik Kernel’i ile grafik arabirimi arasındaki iletişimi hazırlar ve grafik sistemini başlatır. Sistemin Program Komutları Tarafından Belirlenerek Açılması Tek bir grafik adaptörünü destekleyen program yazmak yerine, Borland Grafik Paketi tarafından desteklenen tüm grafik adaptör ve modlarında çalışabilecek bir program yazmak için grafik adaptör ve modunun program tarafından otomatik olarak belirlenmesi gerekir. detectgraph (&GrAdapter,&GrMod); initgraph (&GrAdapter,&GrMod,” “); yazılırsa grafik sisteminin tipi otomatik olarak belirlenir ve çizim için hazır duruma getirilir. Grafik Sisteminin Kontrolü Grafik sisteminin belirlenmesinde ,hazır duruma getirilmesinde ve grafik komutlarının uygulanması sırasında çeşitli hatalar meydana gelebilir.Bu hata kontrollerinin programcı tarafından yapılması gerekir.Bu kontroller “graphresult” komutunun kullanımıyla yapılır. int far graphresult(void); Graphresult komutu işlenen son grafik komutunda bir hata meydana gelip gelmediği hakkında bir tamsayı değeri üretir.Bu değerin 0 olması durumunda hata yok,negatif olması halinde ise bir hata meydana geldi demektir. initgraph ile grafik sisteminin başlatılmasında hata kontrolünün muhakkak yapılması gerekir.Çünkü sistemin başlatılmaması durumunda sonraki grafik komutlarının çalıştırılmasının bir anlamı kalmayacaktır. Veri Yapıları ve Programlama Ders Notu GrAdapter=DETECT; initgraph (&GrAdapter,&GrMod,” “); hata-kodu=graphresult( ); if(hata-kodu!=grOk) { !=anlam eşit değil} { printf(“Grafik hatası : # %d kodlu hata\n”,hata-kodu); getch( ); exit(1); } Genellikle ,hata oluştuğunda kullanıcıya sadece hatanın kodunu vermek hatanın ne olduğunun anlaşılması bakımından yarar sağlamaz.Kullanıcı için önemli olan hata kodu değil hatanın sebebidir.”Grapherrormsg”komutu ise hata kodunun ingilizce olarak açıklanmasını verir. for (i=0; i<= -15; i--) printf(“# %3d : %s\n”,i,grapherrormsg(i)); printf(“# %3d : %s\n”,-18,grapherrormsg(-18)); Ekran Çıktısı : 0 : No Error -1 : (BGI) graphics not installed . . . -15 : Graphics Error -18 : Invalid File Version Number Veri Yapıları ve Programlama Ders Notu 46 Kıyas KAYAALP Grafik Sisteminin Kapatılması initgraph basit anlamda text ekranından grafik ekrana geçişi sağlayan bir komuttur.Grafik çizimine geçmeden ,grafik ekrana geçilmesi gerektiği gibi grafik çiziminden sonra da grafik ekrandan tekrar metin ekranına dönülmesi gereklidir.Bunun için “closegraph” komutu kullanılır. Bu komut grafik ekrandan metin ekranına geçilmesini veya kısaca grafik sisteminin kapatılmasını gerçekleştirir. Grafik Ekrana Geçiş ÖRNEK : # include<stdio.h> # include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if (graphresult( )!=grOk) { printf(“Grafik hatası : (%d kodlu hata\n)”,graphresult); getch( ); exit(1); } circle(100,100,150); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 47 Kıyas KAYAALP ÖRNEK : # include<stdio.h> # include<conio.h> # include<graphics.h> void main( ) { int GrAdapter,Gr Mod; int hata-kodu; /* Grafik Ekrana Geçiş : Grafik adaptör ve modunun otomatik olarak */ /* saptanıp grafik ekranın hazır duruma getirilmesi */ GrAdapter=DETECT; initgraph(&GrAdapter,GrMod,” “); hata-kodu=graphresult( ); /* Grafik Ekrana Geçişte hata kontrolü if (hata-kodu!=grOk) { printf (“Grafik hatası : (# %d kodlu hata) %s\n”,hata-kodu,grapherrormsg(hata-kodu)); getch( ); exit(1); } . . . /* Grafik komutları yazılır */ . getch( ); /* grafik ekrandan ,metin ekrana geri dönüş */ closegraph( ); } Veri Yapıları ve Programlama Ders Notu PİKSEL ÇİZİM KOMUTLARI En basit haliyle bir grafik çizimi,(ekran,ekran kartının türüne göre değişiklik gösterebilen piksel adı verilen noktalardan oluşur.Mesela 640*480’lik bir ekranda yatay doğrultuda ( ) 640 adet nokta bulunur, düşey doğrultuda (Y) 480 adet nokta bulunur.Toplam ise 640*480=307200 tane nokta bulunur.)grafik ekrandaki piksellerin istenilen renge boyanmasıyla yapılır.Bir Pikselin istenilen renge boyanması için üç bilgiye ihtiyaç vardır ; Pikselin kaçıncı sütuna karşı geldiği -x Pikselin kaçıncı satıra karşı geldiği -y Pikselin hangi renge boyanacağı -renk Borland grafik paketinde bu işlemi yapmak için “putpixel” komutu kullanılır. void far putpixel (int x, int y, int renk); Bu komut yardımıyla x,y koordinatındaki pixel,verilen renk ile boyanır.Renk değeri,GRAPHİCS.H başlık dosyasında tanımlanmış olan sabit isimleri veya bunlara karşılık gelen tamsayı renk kodları kullanılabilir.C’de renk isimleri BÜYÜK HARF ŞEKLİNDE kullanılması gerekir. BLACK 0 DARK GRAY 8 BLUE 1 LİGHT BLUE 9 GREEN 2 LIGHT GREEN 10 CYAN 3 LIGHT CYAN 11 RED 4 LIGHT RED 12 MAGENTA 5 LIGHT MAGENTA 13 BROWN 6 YELLOW 14 LIGHTGRAY 7 WHİTE 15 Bu renk bilgileri kullanılarak 100.sütun ve 20.satıra karşılık gelen pikselin mavi renge boyanması istenirse ; putpixel (100,20,BLUE); veya putpixel(100,20,1); kullanılır. Veri Yapıları ve Programlama Ders Notu 49 Kıyas KAYAALP ÖRNEK:Ekrana alt alta 15 tane renk koyan programı yazınız. #include<stdio.h> #include<graphics.h> main( ) . { . int a=DETECT,b; . int i; . clrscr( ); initgraph(&a,&b, “ “); if(graphresult( )!=grOk) { printf(“grafik hatası:(%d kodlu hata\n)”,graphresult); getch( ); exit(1); } for(i=1; i<=15; i++) putpixel(100,100+i,i); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 50 Kıyas KAYAALP ÖRNEK: Ekrana 1000 tane rastgele koordinatlarda renkli nokta koyan programı yazınız. #include<stdio.h> #include<stdlib.h> #include<graphics.h> main( ) { int a=DETECT,b; int i; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“grafik hatası(%d kodlu hata\n)”,graphresult); getch( ); exit( ); } for(i=0; i<1000; i++) { putpixel(random(639),random(479),i); delay(1200); } getch( ); closegraph( ); } 100 (0,0) 20 mavi Veri Yapıları ve Programlama Ders Notu 51 Kıyas KAYAALP Putpixel komutunu kullanarak diğer karmaşık çizimleri de gerçekleştirmek mümkündür.Örneğin ekranda(x1,y1 ) noktasında başlayan ve (x2,y2) noktasında son bulan bir doğru parçasının çizimi için y(x)=y1+(x-x1) . 1 2 1 2 y y x x denklemi kullanılabilir.Bu denkleme göre bir x değerine karşılık bir y değeri bulunarak putpixel ile çizim gerçekleştirilebilir. Getpixel Putpixelin tersine verilen koordinattaki pikselin hangi renge sahip olduğunu anlamak için “getpixel”komutu kullanılır. Unsigned far getpixel(int x,int y); Bu komut verilen x,y koordinatındaki rengi saptayarak bu renge ait sayısal kodu geri gönderir. Unsigned renk; İşaretsiz tam sayısal bir değişken tanımlanması yapıldıktan sonra Renk=getpixel(100,20); Komutu verildiğinde eğer buradaki piksel mavi renge sahipse renk değişkenlerine 1(BLUE) değeri atanır. Veri Yapıları ve Programlama Ders Notu 52 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; unsigned int k; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“grafik hatası:%d nolu hata “\n”,graphresult); getch( ); exit(1); } putpixel(100,200,5); getch( ) ; k=getpixel(100,100); closegraph( ); printf(“%d”,k); getch( ); } Veri Yapıları ve Programlama Ders Notu 53 Kıyas KAYAALP TEMEL ÇİZİM KOMUTLARI Doğru parçası,dikdörtgen,daire,elips v.b. şekiller grafik çizimlerinde oldukça sık kullanılırlar ve karmaşık grafik çizimlerinin temel elemanlarını teşkil ederler.Bu temel şekillerin çizimi için gerekli tüm komutlar,Borland grafik paketi içinde programcılara hazır olarak sunulmuştur. LİNE KOMUTU Bir doğru parçası çizimi gerçekleştirmek için “line” komutu kullanılır.Doğru parçasının çiziminde Borland Grafik Koordinat sistemine göre tayin edilmiş olan bir başlangıç koordinat ve bir de bitiş koordinatı kullanılır. void far line (int x1,int y1,int x2,int y2); Burada x1,y1 doğrunun başlangıç koordinatı ; x2,y2 ise bitiş koordinatıdır.Line komutunda çizim için renk parametresi yoktur.Çizim rengi için grafik sistemde önceden programcı tarafından “setcolor” ile verilmiş olan renk değeri kullanılır.Eğer bu renk verilmedi ise çizimde beyaz renk kullanılır. (0,0) (x2,y2) (x1,y1) Veri Yapıları ve Programlama Ders Notu 54 Kıyas KAYAALP ÖRNEK :#include<stdio.h> #include<conio.h> main( ) { int a=DELECT ,b; initgraph(&a,&b,””); if (graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } line (250,240,430,240); line (320,150,320,330); getch( ); closegraph( ); } ÖRNEK:#include<stdio.h> #include<conio.h> main( ) { int a=DELECT,i,b; initgraph(&a,&b,””); if(graphresult()!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } for(i=0;i<=479;i=i+5) line(0,240,639,i); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 55 Kıyas KAYAALP ÖRNEK :#include(stdio.h) #include(conio.h) main( ) { int a=DELECT.b; int i; initgraph(&a,&b,””); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch(); exit(1); } for(i=0;i<=150;i=+5) { line(320,240,320+i,390+i); line(320,240,320-i,390-i); } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 56 Kıyas KAYAALP CIRCLE KOMUTU Daire çizimi için kullanılan komut circle ‘dır. Yazılımı : void for circle(int x,int y,int r); Circle ile parametreler sırasıyla x,y dairenin merkez koordinatı ve r dairenin yarıçapını belirten tamsayı değerleridir. ÖRNEK :#include(stdio.h) #include(conio.h) main( ) { int a=DELECT,b; clrscr( ); initgraph(&a,&b,””); i f(graphresult!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } circle(100,100,50); getch( ); closegraph( ); } r (x,y) Veri Yapıları ve Programlama Ders Notu 57 Kıyas KAYAALP ÖRNEK : Ekranda rastgele renkte,yarıçapta ve noktada 50 tane çember çizen programı yazınız. #include<stdio.h> #include<graphics.h> #include<conio.h> main( ) { int a=DELECT,b; int i; clrscr( ); randomize( ); initgraph(&a,&b,””); if(graphresult!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit( ); } for(i=0;i<=50;i++) { setcolor(random(15)); circle(random(680),random(400),random(50)); delay(9200); } getch( ); closegraph( ); } ÖDEV : Ekrana yine rastgele renkte,yarıçapta ve merkezde 50 tane çember çizdirilecek fakat çemberler ekranın dışına taşmayacak yani yarım çember olmayacak bu programı yazınız. Veri Yapıları ve Programlama Ders Notu 58 Kıyas KAYAALP ARC KOMUTU Bir daire parçası (yay) çizimi için “ARC” komutu kullanılır. Yazılımı: void for arc(int x ,int y, int aci1, int aci2, int r); Bu komutta verilen parametrelerin anlamlarına sırasıyla x.y yayın merkez koordinatı ,açı1 ve açı2 yayın başlangıç ve bitiş açılarını (derece cinsinden)ve son olarak r daire yayının yarıçapıdır.Yayın çiziminde kullanılan açılar merkez koordinattan doğuya doğru olan yönü 0 olmak üzere saat ibrelerinin ters yönünde arttırılarak tespit edilir ve yayın çizimi için açıların alabileceği değerler normalde şu şekilde olmalıdır. Bu bilgiye göre bir daire yayının çizimi aşağıdaki gibi yapılır, 0o açı1 360o 0o açı2 360o açı1 açı2 90o 0o 180o 360o 270o ry açı2 açı1 (x,y) rx Veri Yapıları ve Programlama Ders Notu 59 Kıyas KAYAALP Eğer yukarıda verilen yay çizimi için ilgili açı kurallarına uyulmadı ise açılar aşağıdaki kurallara göre belirlenir. a)Verilen açının 360’den büyük olması durumunda bu değerlerden 360 çıkartılır. Arc(x,y, 40, 450, r); komutu Arc (x,y, 40, 360+90, r); komutunun veya Arc (x,y, 40, 90, r); komutunun aynısıdır. b)Açı1, açı2’den büyükse (açı1>açı2) bu durumda açı2’ye 360 eklenir. arc(x,y,90,40,r); komutu arc(x,y,90+340,r); ile aynıdır. Burada açı1=0 ve açı2=360 olarak verilirse tam bir daire elde edilir.Bu durumda Arc (x,y, 0, 360, r); Komutu Circle (x, y, r); Veri Yapıları ve Programlama Ders Notu 60 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hataları”,graphresult); getch( ); exit(1); } arc(100,100,0,90,50); arc(100,200,90,180,50); arc(100,300,180,270,50); arc(100,400,270,360,50); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 61 Kıyas KAYAALP ÖRNEK : Bir çember üzerinde yürüyen ışık efekti veren program.10’ar derecelik yaylar çizilerek farklı renklerde bir çember oluşturuluyor. #include<stdio.h> #include<graphics.h> main( ) { int a= DETECT,b; int i,k,l; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk); { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } k=0; for (l=0; l<14; l++) for (i=0; i<36; i++) { setcolor (l+1); arc(320,240,k,k+10,100); delay(9000); setcolor(0); arc(320,240,k,k+10,100); k=k+10; } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 62 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } arc(0,200,270,0,100); arc(200,200,50,180,100); arc(200,200,0,90,100); arc(400,200,180,270,100); arc(600,200,90,180,100); arc(600,200,90,180,100); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 63 Kıyas KAYAALP ELLİPSE KOMUTU Bir elips veya eliptik yay çizimi için kullanılan komut “ellipse”tir. void far ellipse(int x,int y,int aci1,int aci2,int rx,int ry); ellips’te verilen parametrelerin anlamları arc’takine benzerdir.Sırasıyla x,y : elips merkezinin koordinatını açı1,açı2 : elips yayının başlangıç ve bitiş açıları (derece olarak) rx : elipsin x yönündeki ry : elipsin y yönündeki yarıçaplarıdır. Açılar,merkez koordinatının doğuya doğru olan yönü 0o olmak üzere saat ibrelerinin ters yönünde arttırılarak belirlenir. Açılar için kullanılan değerler normalde aşağıdaki gibi olmalıdır. 0o açı1 360o 0o açı2 360o açı1 açı2 verilen bilgilere göre elips yayının çizimi, 90o 0o 180o 360o 270o Eğer açı1 = 0o ve açı2 = 360o verilirse tam bir ellipse elde edilir. Ellipse (x,y,0,360,rx,ry); ry açı2 açı1 (x,y) rx Veri Yapıları ve Programlama Ders Notu 64 Kıyas KAYAALP 0o 360o Ayrıca rx ve ry değerleri aynı olursa (rx = ry) ve açı1 = 0o ve açı2 = 360o olarak verilirse, ellipse (x,y,0,360,rx,ry); Komutu teorik olarak circle(x,y,r); Komutunun aynısı olur. rx ile ry birbirine eşit ve değeri r, açı1 0,açı2 = 360 ve açı1<açı2 Olması durumunda ellipse (x,y,açı1,açı2,r,r); Komutu teorik olarak arc (x,y,açı1,açı2,r); Komutunun aynısıdır. ry rx Veri Yapıları ve Programlama Ders Notu 65 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası\n”,graphresult); getch( ); exit(1); } ellipse(320,240,0,360,150,75); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 66 Kıyas KAYAALP ÖRNEK : #include<stdio.h> 4 3 2 #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası\n”,graphresult); getch( ); exit(1); } çember ellipse(320,240,0,360,35,35); /x1x/ ellipse(320,240,0,90,70,50); /x2x/ ellipse(320,240,0,180,50,90,65); /x3x/ ellipse(320,240,0,270,110,80); /x4x/ ellipse(320,240,0,360,130,95); /x5x/ getch( ); closegraph( ); } 4 5 1 Veri Yapıları ve Programlama Ders Notu 67 Kıyas KAYAALP GRAFİK İMLEÇ Metin ekranında genelde bir yazının ekrana basımı , imlecin olduğu yer referans alınarak yapılır.Grafik ekranda da metin ekranında olduğu gibi bir grafik imleç vardır.Borland Grafik Paketindeki grafik komutlarından bazıları bu grafik imleç yerini çizim için referans noktası olarak alır. Grafik imlecin yeri bir pikseli gösteren koordinattır.Bu imleç hayali bir imleçtir ve ekranda görünmez.Sadece gerekli komutlarla grafik imlecin nerede olduğu veya neresi olacağı belirlenir. Grafik İmleç Yerinin Belirlenmesi Grafik sistemi initgraph ile başlatıldığında grafik imlecin yeri ekranın sol üst köşesi olan (0,0) koordinattır.Bazı çizim komutlarının uygulanmasından sonra yeri değişen grafik imlecin nerede olduğu “getx” ve “gety” komutlarıyla belirlenebilir. int far getx (void) int far gety (void) Burada getx komutu grafik imlecin bulunduğu yerin x-koordinatını,gety ise y-koordinatını verir. Veri Yapıları ve Programlama Ders Notu 68 Kıyas KAYAALP Grafik İmleç Yerinin Değiştirilmesi Grafik imlecin yerini değiştirmek için “moveto” veya “moverel” komutları kullanılır. void far moveto (int x,int y); Burada verilen x ve y değerleri ,grafik imlecin ekrandaki yeni yeridir. Moveto komutunun uygulanmasından sonra grafik imlecin yeri doğrudan x,y olarak değiştirilir. void far moverel (int dx,int dy); “moverel” komutu ise grafiksel imlecin bulunduğu yerden başlayarak x yönünde dx kadar ,y yönünde dy kadar uzaklıktaki koordinatı grafik imlecin yeni yeri olarak değiştirilir. (0,0) Çizimlerde Grafik İmlecin Kullanımı Bazı grafik çizimlerinde doğru çiziminin grafik imlecin bulunduğu noktadan başlıyarak yapılması istenebilir.Bu durumda ,kullanılabilen komutlardan biri “lineto” komutudur. void far lineto (int x,int y); Bu komutta x ve y parametreleri ile sadece doğru parçasının bitiş koordinatı verilir.Grafik imlecin yeri doğrudan başlangıç noktası kabul edilerek verilen x , y noktasına bir doğru çizilir.Doğru parçası çizildikten sonra grafik imlecin yeri x,y olarak değiştirilir. Mesela aşağıdaki komutlarla ; eski konum dx dy yeni konum Veri Yapıları ve Programlama Ders Notu 69 Kıyas KAYAALP (0,0) 100 400 500 moveto (100,300); 100 lineto (400,100); 150 Grafik imlecin son lineto (500,100); yeri lineto (500,150); 300 Grafik imlecin başlangıç yeri ilk önce moveto ile grafik imlecin yeri belirlenir ve peşi sıra lineto ile doğru parçası çizimleri gerçekleştirilir.Bu komutların tümünün icrası sonucunda grafik imlecin son konumu 500,150 koordinatı olacaktır. lineto (x,y) komutu, line komutu kullanılarak aşağıdaki gibi ifade edilebilir.Burada line komutunun grafik imlecin yerini değiştirmediğine dikkat ediniz. line (getx( ), gety( ), x,y); moveto (x,y); Veri Yapıları ve Programlama Ders Notu 70 Kıyas KAYAALP doğru parçası çiziminde başlangıç koordinatı olarak grafiksel imlecin bulunduğu yeri kullanan ikinci komut “linerel”dir. void far linerel (int dx, int dy); linerel komutu grafik imlecin bulunduğu pozisyondan başlayarak x-yönünde dx kadar , y-yönünde dy kadar uzaklıktaki koordinata bir doğru çizer.Bu komutun grafik imlece etkisi aynı “lineto”da olduğu gibidir.Grafik imlecin yeri işlemden önce (Cx.Cy) olmak üzere verilen dx ve dy artım değerleriyle grafik imlecin yeni koordinatı (Cx+dx,Cy+dy) olarak belirlenir. (0,0) Eski konumu Yeni konumu linerel (dx,dy) komutu ,line komutu kullanılarak aşağıdaki gibi ifade edilebilir.Line komutunun grafik imlecin yerini değiştirmediği görülür. line(getx( ),gety( ),getx( )+dx,gety( )+dy); moveto(getx( )+dx,gety( )+dy); (cx,cy) dx dy (cx+dx,cy+dy) Veri Yapıları ve Programlama Ders Notu 71 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk ) { printf(“%d nolu grafik hatası\n”,graphresult); getch( ); exit(1); } moveto (100,100); lineto (150,100); lineto (150,150); lineto (200,150); lineto (200,100); lineto (250,100); lineto (250,150); lineto (300,150); lineto (300,100); moverel (0,-50); lineto (100,50); getch( ); closegraph( ); } 11 10 2 1 3 5 6 7 9 4 8 Veri Yapıları ve Programlama Ders Notu 72 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; int i; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk ) { printf(“%d nolu grafik hatası\n”,graphresult); getch( ); exit(1); } moveto(320,240); for (i=0; i<20; i++) { lineto (320+i*10,230-i*10); lineto (310-i*10,230-i*10); lineto (310-i*10,250+i*10); lineto (330+i*10,250+i*10); } getch( ); closegraph( ); } SORU : Bu şeklin merkezine bir çember konsun ve bu çember labirentin dışına, her borudan geçerek çıksın. Veri Yapıları ve Programlama Ders Notu 73 Kıyas KAYAALP Grafik İmlecin Yerini Değiştiren Komutlar Borland Grafik Paketindeki komutlardan bazıları grafik imlecin yerini doğrudan başlangıç noktası kabul ederek çizimi gerçekleştirir.Bir kısmı ise grafik imlecin yerini dolaylı olarak kullanır ve çizim bittikten sonra onu eski komutuna tekrar getirir.Sadece çizim komutları değil grafik sisteminin hazırlanması ve kontrolü için kullanılan grafik komutlardan bazıları da grafik imlecin yerini etki eder. Grafik imlecin yerini değiştiren komutların isimleri ve imlecin son konumu aşağıdaki tabloda verilmiştir. Komut İsmi Grafik İmlecin Son Konumu initgraph (0,0) setgraphmode (0,0) graphdefaults (0,0) cleardevice (0,0) setviewport (0,0) clearviewport (0,0) moveto (x,y) moverel (cx+dx,cy+dy) lineto (x,y) linerel (cx+dx,cy+dy) Veri Yapıları ve Programlama Ders Notu 74 Kıyas KAYAALP Grafik Çizim Alanı Boyutlarının (Resolution) Belirlenmesi Ekranın yatayda ve düşeyde bulunan piksellerin sayısı grafik sisteminin sahip olduğu grafik adaptör ve moduna göre değişiklik gösterir.Grafik ekranının piksel olarak boyutunun belirlenmesi programcının tüm grafik adaptör ve ekran modlarını destekleyen genel bir program yazması bakımından oldukça önemlidir.Örneğin ,en basit haliyle ekranın etrafına bir çerçeve çizdirmek istenirse ve bu işlemin yatayda ve düşeyde farklı piksel sayısına sahip farklı adaptör ve modlar için de geçerli olması istenirse,program içinde çizime başlamadan evvel grafik ekran boyutlarının her defasında tanımlanması gereklidir.Bu da program içinde bir çok kontrolün yapılması demektir. Borland grafik sistemi initgraph ile başlatılırken ekranın piksel olarak boyutları grafik sistemi içinde bellekte bir yere yerleştirilir.Programcının ekran boyutlarını kendi tanımlaması yerine ,sistemden bu değerleri alması en uygunudur.Borland Grafik Paketi sistemden bu değerlerin alınmasını sağlayan iki komut içerir. getmaxx ve getmaxy int far getmaxx(void); int far getmaxy(void); getmaxx ve getmaxy komutları , sırasıyla ekranda bulunan piksellerin yatayda ve düşeydeki son piksel numarasını verir. ÖRNEK :Ekranın etrafına bir çerçeve çizdirdikten sonra ekranı iki doğru ile dört eşit parçaya bölme işleminin adaptör ve moddan bağımsız olarak yazınız. moveto (0,0); lineto (getmaxx( ),0); 0 getmaxx()/2 getmaxy() lineto (getmaxx( ),getmaxy( )); 0 lineto (0,getmaxy( )); lineto (0,0); moveto (getmaxx( )/2,0); getmaxy()/2 lineto (getmaxx( )/2,getmaxy); moveto (0,getmaxy( )/2); lineto (getmaxx( ),getmaxy( )/2); getmaxy moveto (0,0); getch( ); Veri Yapıları ve Programlama Ders Notu 75 Kıyas KAYAALP ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } moveto (0,0); lineto (getmaxx( ),0); lineto (getmaxx( ),getmaxy( )); lineto (0,getmaxy( )); lineto (0,0); moveto (getmaxx( )/2,0); lineto (getmaxx( )/2,getmaxy( )); moveto (0,getmaxy( )/2); lineto (getmaxx( ),getmaxy( )/2); moveto (0,0); circle (getmaxx( )/2,getmaxy( )/2,getmaxy( )/2); circle (getmaxx( )/4,getmaxy( )/4,getmaxy( )/4); circle (getmaxx( )-getmaxx( )/4,getmaxy( )-getmaxy( )/4,getmaxy( )/4); circle (getmaxx( )/4,getmaxy( )-getmaxy( )/4,getmaxy( )/4); circle (getmaxx( )-getmaxx( )/4,getmaxy( )/4,getmaxy( )/4); circle (getmaxx( )/2,getmaxy( )/2,getmaxy( )/6); getch( ); closegraph ( ); } Veri Yapıları ve Programlama Ders Notu 76 Kıyas KAYAALP BİRLEŞİK DOĞRU ÇİZİMLERİ Rectangle Komutu Dikdörtgen çizimi için Borland Grafik Paketinde mevcut olan “Rectangle” komutu kullanılır. void far rectangle (int x1,int y1,intx2,int y2); rectangle komutundaki parametrelerden x1,y1 çifti dikdörtgenin sol-üst köşesinin koordinatını x2,y2 çifti dikdörtgenin sağ-alt köşesinin koordinatını belirtir.Bu parametrelere göre dikdörtgen çizimi aşağıdaki şekilde yapılır. x1 x2 y1 y2 rectangle komutu gerçekte line veya lineto komutlarıyla yapılmış birleşik bir çizim komutudur.Yani , rectangle (x1,y1,x2,y2); komutu line komutu kullanılarak aşağıdaki gibi ifade edilebilir. line (x1,y1,x2,y1); line (x2,y1,x2,y2); line (x2,y2,x1,y2); line (x1,y2,x1,y1); bu komut kullanılarak ekranın sınırlarında bir çerçeve çizdirilmesi rectangle (0,0,getmaxx( ),getmaxy( )); (x1,y1) (x2,y2) Veri Yapıları ve Programlama Ders Notu 77 Kıyas KAYAALP ÖRNEK : İç içe dikdörtgenlerin getmaxx( ) ve getmaxy( ) komutları kullanılarak çizilmesi. #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; int i,d,e,g; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit( ); } g=0; d=0; e=0; for (i=1; i<11; i++) { setcolor(i); rectangle(d+g , e+g , getmaxx( )-g , getmaxy( )-g); g=g+20; } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 78 Kıyas KAYAALP ÖRNEK :#include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası\n”,graphresult); getch( ); exit(1); } rectangle (0,0,155,120); rectangle (155,120,310,240); rectangle (310,240,465,360); rectangle (465,360,620,479); rectangle (310,120,465,240); rectangle (155,240,310,360); rectangle (0,360,155,479); rectangle (465,120,620,0); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu 79 Kıyas KAYAALP Drawpoly Komutu Drawpoly komutu,bazı grafik uygulamalarında ihtiyaç duyulan üçgen,yamuk,beşgen gibi çokgenlerin ve genel olarak da poligon çizimlerinin yapımında kullanılan bir komuttur.Bu komut genelde poligonların çizimi için hazırlanmıştır. void far drawpoly (int nokta-sayısı,int far *nokta-koord); Burada nokta-sayısı parametresi poligonu meydana getiren köşe noktalarının sayısını, nokta-koord ise bu noktaların koordinatlarını içeren diziyi gösteren bir pointerdır. ÖRNEK : Bu komutun kullanımı için poligonun köşe noktalarını içerecek olan bir dizi tanımlayalım.Bu poligonun köşe sayısı 4 tane olsun.Bu durumda 8 elemanlı (bir elemanı x koordinatı için ve bir elemanı y koordinatı için olmak üzere , 2*4=8) bir dizi tanımlamak gerekir. int polo[8]; sekiz elemanlı bir dizi tanımlamasından sonra ,bu elemanlara aşağıdaki şekilde uygun koordinat değerleri atanır. /* x koordinatı y koordinatı Anlamı */ poly[0]=200; poly[1]=300; /* (200,300) koordinatı */ poly[2]=100; poly[3]=150; /* (100,150) koordinatı */ poly[4]=150; poly[5]=50; /* (150,50) koordinatı */ poly[6]=400; poly[7]=75; /* (400,75) koordinatı */ poly dizisine poligonun tüm koordinatları yerleştirildikten sonra , drawpoly (4,poly); komutu ile poligonun çizimi gerçekleştirilir.Çizilen poligonun şekli , (150,50) (400,75) (100,150) (200,300) Veri Yapıları ve Programlama Ders Notu
drawpoly komutu çizilen poligonu otomatik olarak kapatmaz.Poligonun uçlarının kapatılması gerekiyorsa son poligon koordinatı olarak poligonun başlangıç koordinatının verilmesi gerekir.Örneğin yukarıdaki tanımlanan poligonun kapatılması istenirse ; int poly[8+2]; sekiz elemana ilaveten bir de bitiş koordinatı içeren 10 elemanlı bir dizi tanımlanmasından sonra ,bu elemanlara aşağıdaki şekilde uygun koordinat değerleri atanır. poly[0]=200; poly[1]=300; poly[2]=100; poly[3]=150; poly[4]=150; poly[5]=50; poly[6]=400; poly[7]=75; poly[8]=poly[0]; poly[9]=poly[1]; poly dizisine poligonun tüm koordinatları yerleştirildikten sonra ; drawpoly (5,poly); komutu ile kapalı bir poligonun çizimi gerçekleştirilir.Çizilen poligonun şekli şöyledir. (150,150) (400,75) (100,150) (200,300) Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; int poly[10]; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası/n”,graphresult); getch( ); exit(1); } poly[0]=200; poly[1]=300; poly[2]=100; poly[3]=150; poly[4]=150; poly[5]=50; poly[6]=400; poly[7]=75; poly[8]=200; poly[9]=300; drawpoly(5,poly); getch( ); exit(1); } Veri Yapıları ve Programlama Ders Notu
ÇİZİM TİPİNİN DEĞİŞTİRİLMESİ İnitgraph ile grafik sistemi hazır duruma getirildikten sonra yapılan çizimlerde,çizim şekli kesiksiz-ince bir çizgi şeklindedir.Yani bir doğru parçası çizimi yapıldığında doğrunun çizim tipi ( _____ ) şeklindedir. bazı grafik uygulamalarında ,örneğin iki boyutlu bir kartezyen koordinat sisteminde aynı eksenler kullanılarak birden fazla eğrinin çizilmesi durumunda eğrilerin birbirinden ayırt edilmesi zorlaşır. Bu karışıklıktan kurtulmanın bir yolu,her eğrinin diğerlerinden ayırt edilmesini sağlayacak şekilde çizim tiplerinin değiştirilmesidir. farklı çizim tiplerini kullanabilmek için ,programcının çeşitli algoritmalar geliştirerek tüm çizim komutlarını tekrar düzenlemesi gerekir.Bu da programcı için programın yazımında büyük bir zaman kaybına ve hatta programın yavaşlamasına sebep olacaktır. Borland Grafik Paketi bu yükü Veri Yapıları ve Programlama Ders Notu
programcının üstünden kaldırarak çizim tipinin grafik komutları vasıtasıyla kolaylıkla tanımlanabilir hale getirmiştir. çizim tipinin değiştirilmesi “setlinestyle” komutu yardımıyla gerçekleştirilir. void far setlinestyle (int çizimtipi,unsigned patern,int kalınlık); setlinestyle komutu çizim tipinin ve çizim kalınlığının değiştirilmesini sağlar.Buradaki parametrelerden sırasıyla çizimtipi çizimin ne tipte olacağını belirten bir tamsayı; patern kullanıcının kendi çizim tipini tanımlamak istemesi durumunda kullandığı ve yeni çizim tipini belirten tamsayı kalınlık . Çizimin kalınlığını belirten bir tamsayı değerdir. Çizim Tipi Parametresi: Çizim tipi için kullanılabilecek sabit isimler ve bu isimlerin içerdikleri değerler şunlardır. Adı Sayısal Değeri Çizim Tipi SOLID-LİNE 0 ___________ DOTTED-LİNE 1 ...................... CENTER-LİNE 2 DASHED-LİNE 3 USERBIT-LİNE 4 ? Buradaki userbıt-line çizim tip ismi için çizim şekli ancak programcı tanımlandığında belli olur. Veri Yapıları ve Programlama Ders Notu Patern parametresi : Patern parametresi ,grafik sisteminde tanımlı dört tane doğru .izim tipi dışında programcının kendi çizim tipini tanımlamakta kullandığı değeri içeren parametredir. Yeni çizim tipi ,2 bayt’lık bir tamsayının bitleri göz önüne alınarak oluşturulur.Örneğin, (—— .......——......) şeklinde bir çizim tipi ,tanımlanan çizim tipinin her siyah noktası için 16 bitlik alan içinde karşılık gelen bitin 1,her beyaz noktası için de bitin 0 yapılmasıyla tanımlanır.Bu 16 bitlik alan düzeni oluşturulduktan sonra bir işaretsiz tamsayı olarak Bu 16 bitlik alan düzeni oluşturulduktan sonra bir işaretsiz tamsayı olarak yorumlanır ve elde edilen bu değer patern değeri olarak verilir. heksadecimal (16 sayı tabanına göre) 0xEABA olarak verilen bu tamsayı değerinin bir çizim şekli olarak tanımlanabilmesi ve kullanılabilmesi için ,evvela çizimtipi parametre değeri için 4 değeri veya USERBIT-LİNE sabit isminin verilmesi gereklidir. Kalınlık Parametresi : Kalınlık parametresi ,çizilen çizginin kalınlığının tanımlandığı bir tamsayı değeridir.Bu parametre için sadece iki değer tanımlanmıştır.Bunlar; Adı Değeri Anlamı NORM-WIDTH 1 1 piksel kalınlığında THICH-WIDTH 3 3 piksel kalınlığında 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 Veri Yapıları ve Programlama Ders Notu
line(100,270,400,270); getch( ); closegraph( ); } ÖRNEK : #include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; int i,k; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } k=10; for(i=0; i<18; i++) { setlinestyle(SOLID-LINE,9,3); line(70+k,70+k,470-k,70+k); setlinestyle(DOTED-LINE,8,3); line(470-k,70+k,470-k,470-k); setlinestyle(CENTER-LINE,7,3); line(470-k,470-k,70+k,470-k); setlinestyle(DASHED-LINE,8,3); line(70+k,470-k,70+k,70+k); k=k+10; } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
BİRLEŞİK ÇİZİM KOMUTLARI bar bar3d pieslice sector fillellipse fillpoly Bu komutlardan bar ve bar3d ,histogram(çubuk) grafiklerin yapımında ;pieslice,sector ve fillellipse komutları pay(dilim) grafiklerin yapımında kullanmak üzere tasarlanmışlardır. Bar Komutu Bu komut genel anlamda içi doldurulmuş bir dikdörtgenin çizimini gerçekleştirir.dikdörtgenin içi setfillstyle veya setfillpattern komutu ile belirlenmiş olan tarama deseni ve rengi ile doldurulur. void far bar (int x1,int y1,int x2,int y2); bar komutunda verilen parametreler rectangle komutundakine benzerdir.Bunlar sırasıyla x1,y1 dikdörtgenin sol üst köşesinin koordinatını ,x2,y2 dikdörtgenin sağ alt köşesinin koordinatını belirtir. bar komutu rectangle ve floodfill komutlarının birlikte kullanımıyla aşağıdaki gibi ifade edilebilir. rectangle(x1,y1,x2,y2); floodfill ((int) ((x1+x2)/2),(int) ((y1+y2)/2),getcolor( )); (x1,y1) (x2,y2) Veri Yapıları ve Programlama Ders Notu
ÖRNEK :#include<stdio.h> #include<graphics.h> main( ) { int a=DETECT,b; int i,k; clrscr( ); initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası”,graphresult); getch( ); exit(1); } k=10; for( i=0; i<18; i++) { setlinestyle(SOLID-LINE,9,3); circle(470-k,360-k,k); k=k+10; } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<c:\TC\gekran.c> main( ) Satranç Tahtası { int i,k,m,n; clrscr( ); graph( ); a=0; k=0; m=0; n=0; rectangle(0,0,getmaxx( ),getmaxy( )); for( i=0; i<64; i++) { bar (m,n,m+80,n+60); m+=160; k++; if (k= =8) { m=80; n+=60; } if (k= =16) { m=0; n+=60; } if (k= =24) { m=80; n+=60; } if (k= =32) { m=0; n+=60; } if (k= =40) { m=80; n+=60; } if (k= =48) { m=0; n+=60; } if (k= =56) {m=80; n+=60;} if (k= =64) {m=0; n+=60;} } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Ekrana rastgele koordinatlarda ,rastgele renkte bar çizen programı yazınız. #include<stdio.h> #include<conio.h> #include<dos.h> #include<c:\TC\gekran> main( ) { int i; clrscr( ); randomize( ); graph( ); for ( i=0; i<10; i++ ) { setcolor(random(14)+1); setfillstyle(random(12),random(14)+1); bar(random(639),random(479),random(639),random(479)); getch( ); } getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
bar3d komutu bar3d komutu,3 boyutlu görünüşe sahip bir dikdörtgenin (bar’ın) çizimi için tasarlanmıştır. void far bar3d (int x1,int y1,int x2,int y2,int d,int ust); bar3d’de kullanılan parametreler sırasıyla x1,y1 dikdörtgeninin sol üst köşesinin koordinatını , x2,y2 dikdörtgeninin sağ alt köşesinin koordinatını , d dikdörtgeninin piksel sayısı olarak derinliği ve üst dikdörtgeninin üst kısmının çizilip çizilmeyeceğini belirtirler.Bu parametrelerle 3 boyutlu dikdörtgenin çizimi aşağıdaki gibi olur. (x1,y1) (x2,y2) d üst parametresi 0 ‘dan farklı bir değer ise 3 boyutlu bir barın üstü vardır.üst parametresi 0 ise çizilen 3 boyutlu barın üstü yoktur (açıktır). Bu tür bir kullanımın amacı üç boyutlu bir görünüşe sahip dikdörtgenlerin üst üste yerleştirilebilmesini sağlamaktır. y4 bu şeklin çizimi için kullanılan üst =1 komutlar; bar3d (x1,y1,x2,y2,20,0); y3 bar3d (x1,y3,x2,y2,20,0); üst =0 bar3d (x1,y4,x2,y3,20,1); şeklindedir. y2 üst =0 y1 x1 x2 yukarıdaki şekilde üst üste üç farklı üç boyutlu dikdörtgen çizimi yapılmıştır.Görüleceği üzere en alttaki üç boyutlu dikdörtgenin üzerine diğer bir dikdörtgenin çizilebilmesi için alttaki dikdörtgenin üst kısmının oluşmasını gereklidir. Bar veya bar3d komutları kullanılarak yapılabilen grafik tiplerine örnek olarak aşağıdaki Histogram Grafikler verilebilir. Veri Yapıları ve Programlama Ders Notu 93 Kıyas KAYAALP (a) bar ile (b) bar ile 1 2 3 4 1 2 3 4 (c) bar3d ile (d) bar3d ile 1 2 3 4 1 2 3 4 Örneğin burada x-ekseni yılları,y-ekseni kâr miktarını göstermek üzere (a) ve(c) yıllara göre toplam kâr miktarını , (b) ve (d) ise yıllara göre toplam kârda üç şirketin payı bu tip grafiklerle oldukça kolay ifade edilebilir. Veri Yapıları ve Programlama Ders Notu
ÖRNEK :#include<stdio.h> #include<c:\tc\gekran.c> main( ) { clrscr( ); desen şekli graph( ); desen rengi setcolor(12); setfillstyle(5,6); bar3d(100,400,150,450,15,0); setcolor(6); setfillstyle(8,7); bar3d(100,300,150,400,15,0); setcolor(9); setfillstyle(5,7); bar3d(100,250,150,300,15,0); setcolor(3); setfillstyle(1,8); bar3d(100,150,150,250,15,1); setcolor(6); setfillstyle(7,7); bar3d(200,100,250,450,15,0); setcolor(15); setfillstyle(11,3); bar3d(300,150,350,450,15,1); getch( ); closegraph( ); } ÖDEV : Veri Yapıları ve Programlama Ders Notu
Pieslice Komutu Histogram grafiklerinden başka sıkça kullanılan diğer bir grafik tipi de pay-dilim (pie) grafikleridir.Pay grafikler bir daire %100’ü göstermek üzere olayların bu yüzde içinde etkin olduğu orana göre dairenin dilimlere ayrılmasıyla oluşturulmuş grafiklerdir. %15 %52 %11 %11 %11 Pay grafiklerinin hazırlanması için Borland Grafik Paketinde bulunan pieslice komutundan yararlanılır. void far pieslice (int x, int y,int aci1,int aci2,int r); pieslice komutu arc komutunun parametrelerine benzerdir.Pieslice x,y merkez koordinatlı açı1’den başlayıp açı2’de son bulan r yarıçaplı daire dilimi çizer.Daire diliminin içi setfillstyle veya setfillpattern komutu ile belirlenmiş olan tarama deseni ve rengi ile doldurulur. 90o 180o 0o 360o 270o Bu komut arc,getarccoords,line ve floodfill komutların birlikte kullanımıyla yapılmıştır. açı2 r açı1 (x,y) Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<c:\tc\gekran.c> main( ) { clrscr( ); graph( ); getcolor(1); setfillstyle(9,4); pieslice(320,240,0,75,150); setfillstyle(9,6); pieslice(320,240,75,105,150); setfillstyle(9,3); pieslice(320,240,105,175,150); setfillstyle(9,5); pieslice(320,240,175,225,150); setfillstyle(9,8); pieslice(320,240,225,287,150); setfillstyle(9,7); pieslice(320,240,287,360,150); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
sector Komutu Pieslice komutunun elipsler için uyarlanmış şekli fillellipse ve sector komutlarıdır.İçi dolu bir elips diliminin çizimi istenirse sector komutu kullanılır. void far sector (int x, int y, int aci1, int acı2, int rx, int ry); Bu komutun parametreleri ellipse komutunun parametreleri ile aynıdır.Sırasıyla x,y elips diliminin merkez koordinatını , acı1 ve acı2 elips diliminin başlangıç ve bitiş açılarını , rx elipsin x-yönündeki , ry ise y-yönündeki yarıçapıdır. 90o 0o 180o 360o 270o sector komutu ellipse, getarccoords,line ve floodfill komutlarının birlikte kullanımıyla yapılmıştır. ry açı2 açı1 (x,y) rx Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<c:\tc\gekran.c> main( ) { clrscr( ); graph( ); setcolor(1); setfillstyle(2,4); sector(320,240,0,75,100,180); setfillstyle(3,6); sector(320,240,75,105,100,180); setfillstyle(4,3); setcolor(320,240,105,175,100,180); setfillstyle(5,5); sector(320,240,175,225,100,180); setfillstyle(6,8); sector(320,240,225,287,100,180); setfillstyle(7,7); sector(320,240,287,360,100,180); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
FillEllipse Komutu Fillellipse komutu tam bir elips çizerek setfillstyle veya setfillpattern komutu ile belirlenmiş olan tarama deseni ve rengi ile doludur. void far fillellipse (int x, int y, int rx, int ry); 0o 360o Bu komutun benzeri ellipse ve floodfill komutlarının birlikte kullanılmasıyla yapılabilir. ellipse (x,y,0,360,rx,ry); floodfill (x,y,getcolor( )); ÖRNEK : #include<stdio.h> #include<c:\tc\gekran.c> main( ) { clrscr( ); graph( ); setcolor(15); setfillstyle(7,4); fillellipse(100,400,50,80); setfillstyle(3,6); fillellipse(250,360,80,120); setfillstyle(4,3); fillellipse(450,300,100,180); getch( ); closegraph( ); } ry (x.y) rx Veri Yapıları ve Programlama Ders Notu
Fillpoly Komutu Fillpoly komutu içi taralı poligonların çiziminde kullanılır.Fillpoly’nin kullanımı drawpoly komutu ile aynıdır.Tek fark poligon içinin tarama deseni ile doldurulmasıdır..Poligonun içi doldurulacağından poligonun kapalı olması gerekir. void far fillpoly (int nokta-sayisi, int far *nokta-koord); burada nokta-sayisi parametresi poligonu meydana getiren köşe noktalarının sayısını noktakoord ise bu noktaların koordinatlarını içeren diziyi gösteren bir pointer’dır. int poly [10]; poly [0]= 200; poly [1]= 300; /* (200,300) koordinatı */ poly [2]= 100; poly [3]= 150; /* (100,150) koordinatı */ poly [4]= 150; poly [5]= 50; /* (150,50) koordinatı */ poly [6]= 400; poly [7]= 75; /* (400,75) koordinatı */ poly [8]= poly [0]; poly [9]= poly [1] /* başlangıcı koordinatı */ fillpoly (5,poly); (150,50) (400,75) (100,150) (200,500) Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h> #include<c:\tc\gekran.c> main( ) { int ali [22]; clrscr( ); graph( ); ali[0]=40; ali[1]=0; ali[2]=30; ali[3]=25; =10; =25; =25; =40; =20; =60; =40; =48; =60; =60; =55; =40; =70; =25; =50; =25; =40; =0; setcolor (4); setfillstyle (9,9); fillpoly (11,ali); getch ( ); closegraph ( ); } Veri Yapıları ve Programlama Ders Notu GRAFİK YAZI KOMUTLARI Borland Grafik Paketinde metin ekranı ile grafik ekran birbirinden farklıdır.Bu yüzden,grafik ekranda C’de printf veya buna benzer komutlarla metin ekranında yazı yazmak EGA ve VGA hariç diğer grafik sistemleri için mümkün değildir. Borland Grafik sistemindeki bu durumdan dolayı grafik ekranda yazı yazımı için özel teknikler kullanılır. Bunlar ; a- Nokta Temelli Karakter Tanımlama Tekniği b- Vektör Temelli Karakter Tanımlama Tekniği Bu tekniklerle çeşitli karakter setlerinin oluşturulması ve kullanımı oldukça zahmetli ve sıkıcı bir işlemdir.Borland Grafik Paketi bu yükü programcının üzerinden kaldırmak için yukarıdaki iki tekniğinde kullanıldığı 11 çeşit karakter setini programcılara hazır olarak sunmuştur.Bu karakter font setleri ,oluşturulan yazı tipine uygun olarak verilen bir isimle “.CHR” uzantısıyla HDD depolanmıştır. Bu dosyalara kısaca Karakter Font Dosyaları denir. Yazım Özelliklerinin Belirlenmesi Yazım işlemine geçmeden önce ,yazım ile bilgilerin grafik sistemine bildirilmesi gerekir.Yazım ile ilgili bilgiler üç tanedir. Metnin font tipi Yazım yönü Büyüklüğü Bu özelliklerin grafik sistemine bildirilmesi “settextstyle” komutu ile yapılır. void far settextstyle (int font, int yon, int boyut); settextstyle komutu ile ekrana yazılacak olan metnin , hangi font tipi,kullanılarak ,hangi yönde ve hangi büyüklükte basılacağı belirtilir. Bu komut kullanıldıktan sonra her yazım işleminde ,verilen bu bilgiler kullanılır. veri ve Programlama Ders Notu
Font : Metnin ekrana basımında kullanılacak olan font karakter dosyasını belirten tamsayı bir değerdir. İsmi Değeri Bulunduğu Dosya İsmi DEFAULT-FONT 0 --------------- TRIPLEX-FONT 1 TRIP.CHR SMALL-FONT 2 LITT.CHR SANS-SERIF-FONT 3 SANS.CHR GOTHIC-FONT 4 GOTH.CHR Settextstyle komutunda font için ,örneğin 1 veya bunun sembolik ismi olan C’de TRIPLEXFONT kullanıldığında TRIP.CHR dosyası bulunduğu yerden bir defalık belleğe yüklenir. Program içerisinde settextstyle komutu verilmediği halde yazım yapılırsa , bu durumda font tipi olarak grafik sistem içinde hazır olarak bulunan ve DEFAULT olarak isimlendirilen font seti kullanılır. Yön : Bu parametre ,metnin ekranda hangi yönde basılacağını belirten bir tamsayı değerdir.Metin yatay (0) yazılacaksa soldan sağa ,dikey (1) yazılacaksa aşağıdan yukarı doğru olur. Adı Değeri HORIZ-DIR 0 yatay VERT-DIR 1 dikey Programda yazının yönü belirlenirken adı veya değeri kullanılır. Boyut : Boyut parametresi ,metnin ekrana basılması sırasında karakterlerinin hangi büyüklükte olacağını belirleyen bir tamsayı değerdir.Bu tamsayı değer 1-10 arasında değişebilir.Boyut için 1 kullanılırsa ,metnin karakterleri font dosyasında tanımlandığı şekilde gerçek boyutunda basılır.Eğer 4 kullanılırsa ,metnin karakterleri gerçek boyutun 4 katı büyüklüğünde basılır. Veri Yapıları ve Programlama Ders Notu Eğer karakter boyutunun bire-bir oranından farklı bir oranda büyütülmesi istenirse;örneğin boyu sabit kalırken eninin büyütülmesi veya eni sabit kalırken boyunun büyütülmesi gibi bu durumda settextstyle komutuna ilaveten “setusercharsize” komutu kullanılır. Setusercharsize ile tanımlana karakter büyütme oranının geçerli olabilmesi için settextstyle ‘de boyut parametresi için “0” veya “USER-CHAR-SİZE” isminin kullanılması gerekir. void far setusercharsize (int carpx, int bolx, int carpy, int boly); karakterlerin yükseklik ve genişliği için büyütme oranlarının hesabı ; Genişlik için Büyütme Faktörü = bolx carpx Yükseklik için Büyütme Faktörü = boly carpy formülü ile yapılır. Örneğin,karakterlerin yüksekliğini %100 oranında büyütmek ve genişliğini ise %50 oranında küçültmek istenilirse ; Eni için bolx carpx = 2 1 ( %50 azalış ) Boy için boly carpy = 1 2 ( %100 artış) Bu oranların grafik sistemine aktarılması ; settextstyle ( font ,yon , USER-CHAR-SİZE); setusercharsize (1,2,2,1); komutları ile yapılır. setusercharsize komutu sadece .CHR font dosya karakterlerine uygulanabilir. DEFAULT font seti karakterlerine uygulanamaz. Veri Yapıları ve Programlama Ders Notu
Metnin Ekrana Yazımı Outtext komutu : Outtext komutu,grafik imlecin bulunduğu yeri referans noktası kabul ederek verilen metni ekrana basar. void far outtext (char far *metin); ilk olarak metnin basılacağı referans noktası moveto ile belirlenir ve sonra outtext komutu uygulanır.Eğer referans noktası moveto ile belirlenmediyse,o anda grafik imleç nerede bulunuyorsa ,yazım bu noktaya göre yapılır. ÖRNEK : moveto (50,100); outtext (“UMYO”); Bu komutların icrası sonunda ,eğer settextstyle’de yazım yönü düşey olarak verildi ise aşağıdaki şeklin solundaki gibi,yatay olarak belirlendi ise aşağıdaki gibi bir ekran çıktısı oluşur. Eğer yazım için *.CHR dosyalarından biri kullanılıyorsa ekrana basılacak metin çizim için tanımlanan ekran alanı sınırlarını aştığında aşan kısımları kesilir.Eğer yazım için DEFAULT font dosya karakterleri kullanılıyorsa ekrana basılacak metin ekran sınırlarını aştığında metnin hiçbir karakteri yazılmaz. (500,100) (50,100) . . Veri Yapıları ve Programlama Ders Notu ÖRNEK : #include<stdio.h> #include<c:\tc\gekran.c> main( ) { clrscr( ); graph( ); moveto(0,0); settextstyle(DEFAULT_FONT_HORIZ_DIR,1); outtext(“yatay default_font”); moveto(0,15); settextstyle(1,0,1); outtext(“yatay triplex font”); moveto(0,40); settextstyle(2,0,4); outtext(“yatay small font 4 kat büyütülmüş”); moveto(0,70); settextstyle(3,0,1); outtext(“yatay sans serif font”); moveto(0,100); settextstyle(4,0,1); outtext(“yatay gothic font”); moveto(20,200); settextstyle(DEFAULT_FONT ,1,1); outtext(“dikey default_font”); moveto(50,200); settextstyle(1,1,1); outtext(“dikey triplex font”); moveto(90,200); settextstyle(2,1,4); outtext(“dikey small font 4 kat buyutulmus”); moveto(120,200); Veri Yapıları ve Programlama Ders Notu
settextstyle(3,1,1); outtext(“dikey sans serif font”); moveto(150,200); settextstyle(4,1,1); outtext(“dikey gothic font”); moveto(200,0); settextstyle(1,0,USER_CHAR_SIZE); setusercharsize(1,2,2,1); outtext(“triplex font yukseklık %100 arttı,genişlik %50 azaldi”); moveto(0,130); settextstyle(1,0,USER_CHAR_SIZE); setusercharsize(2,1,1,2); outtext(“triplex font yukseklık %100 artti,genişlik %50 azaldi”); getch( ); closegraph( ); } Outtextxy Komutu Outtextxy komutu outtext komutuna benzerdir.Aralarındaki tek fark ,outtext grafik imlecin yerini değiştirirken outtextxy’nin değiştirmemesidir.Bu komut ,metni ekrana basmak için grafik imlecin konumunu referans nokta olarak almaz.Metni nereye basacağını parametre listesinde belirler. void far outtextxy (int x, int y, char far *metin); outtextxy komutundaki parametrelerden ilk ikisi x ve y,basılacak metnin ekrandaki referans noktasını ,metin ise basılacak metni belirtir. Veri Yapıları ve Programlama Ders Notu
Metnin Referans Noktasının Neresine Basılacağının Belirlenmesi Programcı metni,referans nokta etrafında istediği yere “settextjustify” komutunu kullanarak bastırabilir. void far settextjustify (int yatay, int düşey); Hiçbir yazım özelliği verilmeden , outtextxy (50,100,”UMYO”); Komutu kullanıldığında çıkış,verilen (50,100) referans noktasının sağ-alt tarafına yapılır. Referans noktası Eğer programcı referans noktasını bu şekilde kullanmak istemezse , settextjustify komutu vasıtasıyla metni referans nokta etrafında sağa-sola ve aşağı-yukarı şeklinde iki yönlü olarak hareketini belirleyerek , metnin konumunu ayarlar.Settextjustify komutundaki yatay ve düşey parametreleri , metnin konumunu ayarlayan tamsayı değerlerdir.Bunların alabileceği değerler ve bu değerleri gösteren sabit isimler şöyledir. UMYO Veri Yapıları ve Programlama Ders Notu Yatay için : Komut Değeri Anlamı LEFT-TEXT 0 Ref. Noktası metnin solunda CENTER-TEXT 1 Ref. Noktası metnin ortasında RIGHT-TEXT 2 Ref. Noktası metnin sağında Dikey için : Komut Değeri Anlamı BOTTOM-TEXT 0 Ref. Noktası metnin altında CENTER-TEXT 1 Ref. Noktası metnin ortasında TOP-TEXT 2 Ref. Noktası metnin üstünde Şematik olarak: TOP-TEXT CENTER-TEXT BOTTOM-TEXT LEFT-TEXT CENTER-TEXT RIGHT-TEXT Veri Yapıları ve Programlama Ders Notu ÖRNEKLER : 1- Referans noktası metnin yatayda sağında ,dikeyde ortasında ise , Settextjustify (RIGHT-TEXT , CENTER-TEXT); Outtextxy (300,200,”UMYO”); 300 200 2- Referans noktası metnin yatayda orta, düşeyde ise üstünde kalmaktaysa , settextjustify (CENTER-TEXT , TOP-TEXT); outtextxy (300,200,”UMYO”); 300 200 UMYO -------------------- UMYO Veri Yapıları ve Programlama Ders Notu 3- Referans nokta metnin yatayda ve düşeyde ortasında kalıyorsa , settextjustify (CENTER-TEXT , CENTER-TEXT); outtextxy (300,200,UMYO); 300 200 ------ --------UM YO Veri Yapıları ve Programlama Ders Notu ÖRNEK : #include<stdio.h> #include<c:\tc\gekran.c> main( ) { clrscr( ); graph( ); settextjustify (LEFT_TEXT_TOP_TEXT); outtextxy (0,0,”kursor sol taraf ust”); settextjustify (LEFT_TEXT_CENTER_TEXT); outtextxy (0,100,”- kursor sol taraf ORTA”); settextjustify (LEFT_TEXT_BOTTOM_TEXT); outtextxy (0,200,”_ kursor sol taraf ALT”); settextjustify (RIGHT_TEXT_TOP_TEXT); outtextxy (600,0,” kursor sag taraf ust ”); settextjustify (RIGHT_TEXT_CENTER_TEXT); outtextxy (600,100,” kursor sag taraf ORTA-”); settextjustify (RIGHT_TEXT_BOTTOM_TEXT); outtextxy (600,200,” kursor sag taraf ALT_”); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
Metnin Ekrana Basımında Grafik İmleç Konumunun Değişimi Bir metnin ekrana basımından sonra grafik imlecin konumu , her zaman değişmez.Grafik imlecin yerinin değişimi settextjustify’de verilen parametre değerlerine bağlıdır. Settextjustify komutu grafik kursorünün yerini sadece aşağıdaki şartlar sağlandığında değiştirilir. Settextstyle’de yön parametresi için 0 veya HORIZ-DIR kullanılır. Settextstyle’de yatay parametresi için 0 veya LEFT-TEXT kullanılır. Metin yazımı için outtext kullanması ile olur. ÖRNEKLER : a) moveto (200,100); settextstyle (TRIPLEX_FONT , HORIZ_DIR,1); settextstyle (LEFT_TEXT , TOP_TEXT); outtext (“UMYO”); referans noktası yeni koordinat b) moveto (200,100); settextstyle (TRIPLEX_FONT , HORIZ_DIR ,1); settextstyle (LEFT_TEXT , CENTER_TEXT); outtext (“UMYO”); referans noktası yeni koordinat ---------- UMYO ------------- UMYO Veri Yapıları ve Programlama Ders Notu
Metin Boyutlarının Belirlenmesi Ekrana basılacak olan metnin ,piksel değeri olarak belirli bir eni ve boyu vardır.Bu değerler , settextstyle ve settextjustify ile verilen metin özelliklerine göre değişir.Örneğin “UMYO” metininin TRIPLEX font tipine göre belirli bir uzunluk ve yükseklik değeri vardır.Font tipi ve boyutu değiştirildiği vakit aynı metin farklı boyutlara sahip olur. TextHeight Komutu int far textheight (char far *metin); Aktif olan font tipi ve büyütme faktörüne göre verilen metnin piksel olarak yüksekliğini verir.Örneğin büyültme faktörü 1 olan DEFAULT font için textheight 8 değerini verir. UMYO Bu komutun kullanılabileceği yerler; Ekrana basılacak olan metnin satırları arasındaki boşlukların ayarlanmasında Metnin etrafına bir çerçevenin çizilmesinde Çizim alanının yüksekliğinin bulunmasında . TextWidth Komutu int far textwidth (char far *metin); Aktif olan font tipi ve büyütme faktörüne göre verilen metnin piksel olarak genişliğini verir. UMYO | | Bu komutun kullanılabileceği yerler ; Ekrana basılacak olan metnin satır genişliklerinin ayarlanmasında Metnin etrafına bir çerçevenin çizilmesinde Çizim alnının genişliğinin bulunmasında. Veri Yapıları ve Programlama Ders Notu ÇİZİM RENKLERİNİN SEÇİMİ Grafik çizimlerde 2 tip renk belirlenmesi yapılır.Bunlar ; Zemin rengi Çizim rengi İnitgraph ile grafik sistemi açıldığında başlangıçta zemin rengi için siyah , çizim rengi için beyaz kullanılır. Çizimin Yapıldığı Zemin Renginin Belirlenmesi Renk paletlerindeki birinci renk daima zemin rengini belirtir.Başlangıçta ,palette bu renk büyük bir olasılıkla siyahtır.Çizime başlamadan önce zemin rengi “setbkcolor” Komutu kullanılarak paletteki renklerden biri ile değiştirilebilir. void far setbkcolor (int renk); ÖRNEK : setbkcolor (1); Çizim Renginin Belirlenmesi Çizim rengi grafik sisteminin sahip olduğu paletten bir rengin seçilmesiyle belirlenir.Çizim renginin belirlenmesi için “setcolor” komutu kullanılır. void far setcolor (int renk); ÖRNEK : setcolor (2); Restorecrtmode Komutları void far restorecrtmode (void); restorecrtmode komutu , grafik ekrandan çıkmadan geçici olarak metin ekranına geri dönüşü sağlar.Grafik ekranından metin ekranına geçişte , ekran modunu initgraph komutu çalıştırılmadan önceki durumuna getirir.Bu sırada grafik ekran silinir. Veri Yapıları ve Programlama Ders Notu
Bu iki komutun kullanımı aşağıdaki program yapısı ile gösterilebilir. main( ) { /*...........................Metin Ekranı ............................*/ . . . /*......................Grafik Ekrana Geçiş.......................*/ initgraph (&a,&b,” “); . . . /*...............Tekrar Metin Ekranına Geçiş................*/ restorecrtmode( ); . . . /*..............Grafik Ekrana Geri Dönüş.....................*/ setgraphmode(getgraphmode( )); . . . /*..........Grafik Ekranın Kapatılması ve Metin Ekrana Dönüş..........*/ closegraph( ); /*.............................Metin Ekranı..........................*/ . . . } Veri Yapıları ve Programlama Ders Notu
Getgraphmode Komutu Getgraphmode komutu , sistemde aktif olan grafik modunu öğrenmek için kullanılır.Bu komut , grafik sisteminin hangi moda sahip olduğunu belirleyerek bu moda ait bir tamsayı değeri verir. int far getgraphmode (void); Setgraphmode Komutu Setgraphmode komutu , grafik sistemini kapatılıp açılmasına gerek olmadan doğrudan kullanılmakta olan grafik modunun değiştirilmesini sağlar. void far setgraphmode (int modno); Hangi modun aktif hale getirileceği modno ile belirlenir.Modno parametresi , grafik adaptörün desteklediği modlardan birini belirten bir tamsayı değerdir. Bu komut çalıştırıldığında sırasıyla üç işlemi yerine getirir. 1) Grafik sisteminin modunu değiştirir. 2) Grafik ekranı siler. 3) Graphdefaults komutunu çalıştırır. Graphdefaults Komutu Bir grafik çalışmasına başlandığında çizim şekli ve rengi bilgileri , zemin renk bilgisi , yazım tipi , yönü ve boyutu bilgileri ,alan doldurma deseni ve rengi bilgileri ve grafik imlecin konumu bilgileri için aksi belirtilmedikçe grafik sistemi içinde bulunan hazır değerler kullanılır.Bunlar grafik sistemi tarafından belirlenmiş başlangıç değerleridir.Daha sonra bu bilgiler , programcı tarafından programın akışına ve yapılan çizimin amacına göre yeri geldiğinde değiştirilir.Programın bir noktasında değeri değiştirilen bu bilgilerin başlangıç değerlerine ihtiyaç duyulursa , başlangıç değerlerin ayrı ayrı komutlar kullanılarak grafik sistemine aktarılması yerine “graphdefaults”komutunun kullanımı tercih edilir.Bu komut sözü edilen tüm özelliklerin , grafik adaptörünün açılışındaki başlangıç değerlerini almasını sağlar. void far graphdefaults (void); Veri Yapıları ve Programlama Ders Notu ÖRNEK : #include<graphics.h> #include<stdlib.h> #include<stdio.h> #include<conio.h> main( ) { int a=DETECT,b; int x,y; initgraph(&a,&b,” “); if(graphresult( )!=grOk) { printf(“%d nolu grafik hatası /n”,graphresult); getch( ); exit(1); x=getmaxx( )/2; y=getmaxy( )/2; settextjustify (CENTER_TEXT , CENTER_TEXT); outtextxy(x,y,”Grafik Ekrandan Çıkış için bir tuşa basınız”); getch( ); restorecrtmode( ); printf(“Şu Anda Metin Ekranındasınız”); printf(“Grafik Moda Dönüş için tekrar bir tuşa basınız”); getch( ); setgraphmode(getgraphmode( )); settextjustify (CENTER_TEXT , CENTER_TEXT); outtextxy(x,y + textheight (“w”), “Çıkış için bir tuşa basınız”); getch( ); closegraph( ); } Veri Yapıları ve Programlama Ders Notu
EKRAN GÖRÜNTÜ DÜZENLENMESİ Cleardevice Komutu Cleardevice komutu , grafik ekranın tamamını siler.Silme işlemi,tüm piksellere zemin renginin verilmesiyle olur. void far cleardevice (void); Ekranın silinmesinden sonra grafik imleç, ekranın (0,0) koordinatına taşınır. Setviewport Komutu Setviewport komutu , grafik ekranda bir grafik pencerenin tanımlanmasında kullanılır.Başlangıçta tüm ekran getmaxx+1 genişliğinde ve getmaxy+1 yüksekliğinde bir grafik penceredir.Yapılan tüm çizimler bu pencere içinde gerçekleştirilir.Programcı ihtiyaç duyduğunda bu grafik pencerenin boyutlarını değiştirerek daha küçük boyutlara sahip bir alanda çizim yapabilir. void far setviewport (int x1, int y1, int x2 ,int y2, int kesme); Yukarıda verilen setviewport parametresinde x1,y1,x2,y2 pencere boyutlarının belirlenmesinde , kesme parametresi ise çizimin pencere dışına taşan kısımlarının kesilip kesilmeyeceğine karar verilmesinde kullanılır. Setviewport’un iki tür kullanımı vardır ; 1. Grafik ekranın (0,0) koordinatının (orijinin) ekranda başka bir yere taşınması 2. Grafik ekran içinde grafik pencerenin tanımlanması. Veri Yapıları ve Programlama Ders Notu
YENİ BİR GRAFİK PENCERESİNİN TANIMLANMASI Tüm grafik ekran içinde daha küçük bir grafik ekranının tanımlanmasıdır.Tanımlanan bu alana grafik pencere denir.Tanımlanan grafik penceresi , boyutları haricinde tüm ekranın sahip olduğu özelliklere sahiptir.Grafik ekranı, sınırlarından taşan çizimler kesildiği gibi, grafik penceresi dışına taşan çizimlerde sınırlarda kesilir. Setview ile bir grafik pencerenin tanımlanması için verilen parametrelerin olması gereken değerler şöyle olmalıdır ; x1,y1 : tanımlanan yeni grafik pencerenin sol üst köşesinin ana ekran üzerindeki sağ alt köşesinin koordinatı. x2,y2 : x1 x2 ve y1 y2 şartına göre yeni grafik ekranın ana ekran üzerindeki sağ alt köşesinin koordinatı. 0 x1 x2 0 y1 y2 şartını sağlanması gerekir. Kesme : 0 dan farklı herhangi bir değer (1 olarak alacağız) Setviewport (x1,y1,x2,y2,1); Şeklinde tanımlanan grafik penceresi aşağıdaki şekilde gösterilmiştir. x1 x2 y1 y2 (x1,y1) (x2,y2) Veri Yapıları ve Programlama Ders Notu
Bu pencerenin tanımlanmasından sonra yapılan tüm çizimler artık bu pencere içinde olacaktır.setviewport ile ekranda (x2-x1) genişliğinde ve (y2-y1) yüksekliğinde tanımlanan ekran alanın özellikleri önceden kullanılan tüm grafik ekranın sahip olduğu özelliklerle aynıdır.Farklı olan tek şey çizim alanının boyutlarıdır.Yeni grafik penceresi tanımlandıktan sonra yeni orijin ,yeni pencerenin sol üst köşesidir. Yapılan çizimlerin tanımlanan grafik pencerenin sınırlarını aşması halinde aşan kısımlar sınırlarda kesilecektir. Yapılan çizimlerin ekran sınırlarında kesilmesine karşın , grafik imleç için böyle bir durum söz konusu değildir.Grafik imlecin yeri grafik pencere sınırlarını aşabilir. ÖRNEK : setviewport (100,100,250,180,1); moveto (10,60); lineto (180,20); 100 200 100 grafik imlecin yeni konumu çizilmeyen kısım 180 (0,0) (180,20) Veri Yapıları ve Programlama Ders Notu
grafik pencere sınırları dışında kalan grafik imlecin konumu , çizimler için bir referans noktası olarak kullanılabilir. ÖRNEK : setviewport (100,100,250,180,1); moveto (10,60); lineto (180,20); lineto (180,40); lineto (40,60); lineto (-10,100); grafik imlecin son konumu setviewport ile tanımlanan pencerenin iptal edilip ana ekrana dönülmek istenmesi durumunda tekrar setviewport komutu kullanılır. Clearviewport Komutu Clearviewport komutu , ana grafik ekran için hazırlanmış olan cleardevice komutunun grafik pencerelere uygulanmış halidir. void far clearviewport (void); clearviewport , ana grafik ekranında setviewport ile tanımlanmış olan grafik pencerenin içini zemin rengini kullanarak siler.Grafik imleci , grafik pencerenin sol üst köşesi olan (0,0) koordinatına taşır. Veri Yapıları ve Programlama Ders Notu Kaynaklar
< Bu mesaj bu kişi tarafından değiştirildi t_arslan -- 29 Mayıs 2006; 0:02:08 >
1. sayfa
Hizmet kalitesi için çerezleri kullanabiliriz, DH'yi kullanırken depoladığımız çerezlerle ilgili veri politikamıza gözatın.
VERİ YAPILARI VE PROGRAMLAMA
1. İndisli Değişkenler
2. Pointerlar
3. Fonksiyonlar
Dahili fonksiyonlar
Ana programa değer aktaran
Ana programa değer aktarmayan
Harici fonksiyonlar
4. Ekran Kontrol Komutları
Gotoxy
Clreol
Delinle
İnsline
Textbackground( )
Textcolor
window
5. Dosyalama
Text dosyalama
Binary dosyalama
6. Paralel Port Uygulamaları
7. Grafik
Veri Yapıları ve Programlama Ders Notu
İNDİSLİ DEĞİŞKENLER
C programlama dilinde diğer programlama dillerinde olduğu gibi indisli değişken tanımlamak
mümkündür.C programlama dilinde ilk indis numarası 0 ile başlar.
İndisli değişkenler,daha önce anlatılan bütün değişken tiplerinde tanımlanabilir.İndisli
değişken tanımlanırken önce değişkenin hangi tip olduğu,daha sonrada değişken adı
yazılır.Değişken adının yanında köşeli parantez içerisinde indis sayısı yazılır.
int a [10]; int a [3] [4];
char ad [10]; sütun
satır
a [0]
a [1]
.
. .
. .
. .
.
a [9]
ÖRNEK :#include<stdio.h>
#include<conio.h>
main ( )
{
int a[10] ,i;
clrscr ( );
for ( i=0; i<5; i++)
{
printf (“%d. sayıyı giriniz : ” i+1);
scanf (“%d”,&a);
}
printf (“İlk girilen sayı =%d/n”,a[0]);
printf (“Üçüncü girilen sayı =%d/n”,a[2]);
printf (“Son girilen sayı =%d/n”,a[4]);
getch( );
}
a [0] [0] a [0] [2]
a [2] [1] a [2] [3]
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Klavyeden kullanıcı tarafından girilen 1726 sayıdan en büyüğünü bulan programı
yazınız.
#include<stdio.h>
#include<conio.h>
main( )
{
int a[1726],i,max ;
clrscr( );
for( i=0; i<1726; i++)
{
printf(“%d.sayıyı giriniz :”,i+1);
scanf(“%d”,&a);
}
max=a[0];
for( i=1; i<1726; i++)
if (max<a);
max=a;
printf(“En büyük sayı = %d \n”, max);
getch( );
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Klavyeden kullanıcı tarafından girilen 5 sayıyı büyükten küçüğe doğru sıralayıp,
ekrana yazan programı yazınız.
# include<stdio.h>
#include<conio.h>
main( )
{
int a [5] ,i,j,gec;
clrscr( );
for (i=0; i<5; i++)
{
printf( “ %d .sayıyı giriniz :”,i+1); scanf( “ %d ”,&a );
for (i=0; i<4; i++)
for ( j=i+1; j<5; j++)
if ( a < a[j] )
{
gec = a;
a = a[j];
a [j] = gec;
}
for (i=0; i<5; i++)
printf ( “ %d\n”,a);
getch( );
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h>
#include<conio.h>
main( )
{
char ad [5][15];
int i;
clrscr( );
for ( i=0; i<5; i++)
{
printf (“%d . kişinin adını giriniz :”,i+1) ;
scanf ( “%s”,& ad ) ;
}
for ( i=0; i<5; i++)
printf (“%d. kişinin adı = % s \ n”, i+1, ad ) ;
getch ( ) ;
}
ÖDEV :
1. 3*3 ’lük A ve B matrisleri klavyeden girilmektedir.Buna göre A ve B matrislerini
toplayıp,oluşan C matrisine ekrana yazan programı yazınız.
2. 5*5’lik D matrisinin elemanları klavyeden girilecektir.Bu matrisin her satırındaki en
küçük eleman ile her sütundaki en büyük elemanı bulan programı yazınız.
3. Klavyeden sırası ile öğrenci no,adı soyadı,vize ve final notları girilecektir.Sınıfta
toplam 20 öğrenci vardır .Her öğrencinin ortalaması hesaplandıktan sonra,ortalamalara
bakılarak en yüksek nottan en düşük nota doğru sıralama yapılacak ve ekrandan
öğrencinin no,adı,soyadı,vize,final ve ortalama notları gösterilecektir.Bu programı
yazınız.
Veri Yapıları ve Programlama Ders Notu
P O I N T E R L E R
Pointer tipi değişkenler,normal değişkenlerin adresini tutan değişkenlerdir.Pointer kullanarak
C programlama dilinde adres bazında işlemler yapmak mümkün olmaktadır.
p değişkeni pointer olarak tanımladıktan sonra p=&a
a 123 117F:A071 denildiği zaman p pointerinin içinde, a değişkeninin
adresi bulunur.*p denildiği zaman p pointerinin içindeki
adresdeki değer belirtilir.
p 117F:AO71 120A:139B
ÖRNEK: #include<stdio.h>
#include<conio.h>
main ( )
{
int a,*k ; /* *k integer , pointer tipte değişken */
clrscr ( );
a =123 ;
k =&a ;
printf (“ a değişkenin adresi : % p \n”,&a ) ;
printf (“ a değişkeninin değeri : % d \n ”,a ) ;
printf (“ k pointerının gösterdiği adres : % p \n”,k) ;
printf (“k pointerının gösterdiği adresteki değer : % d \n ”,*k),
getch ( ) ;
}
Veri Yapıları ve Programlama Ders Notu
NOT : Char tipindeki bir değişkenin adresi , int tipte bir pointer değişkende
tutulamaz.Değişkenin tipi ile pointer değişkeninin tipi aynı olmalıdır.
1) int a,b,c , *ptr ,*d,e ;
2) a = 23
3) ptr = &a
4) b = a ;
5) d = ptr ;
6) c = *d ;
7) e = c + *ptr ;
Burada ; 1. adımda a,b,c,e değişkenleri ile ptr ve d pointer değişkenleri integer olarak
tanımlanıyor.
2. adımda a değişkenine 23 değeri aktarılıyor.
3. adımda a değişkenini adresi ptr pointer değişkenine aktarılıyor.
4. adımda b değişkenine a değişkeninin içeriği yani 23 değeri aktarılıyor.
5. adımda, d pointerına , ptr pointerının değeri yani a değişkeninin adresi
aktarılıyor.
6. adımda c değişkenine d pointerının gösterdiği adresteki değer yani 23 aktarılır.
7. adımda e değişkenine c değişkeninin içindeki değer ( 23 ) ile ptr pointerının
gösterdiği adresteki değer ( 23 ) toplanır ve aktarılır ( e = 46 )
ÖRNEK : #include<stdio.h>
#include<conio.h>
main( )
{
int a ,*k ,*l ;
clrscr( );
a = 47;
k = &a;
l =k;
printf (“a değişkeninin adresi : %p \n”, l );
printf (“a değişkeninin değeri : %d \n “, *l );
getch ( );
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<conio.h>
main( )
{
int a ,*k ,*l ;
clrscr( );
a = 47;
k = &a;
l =k;
printf (“Bir sayı giriniz : “); scanf (“ %d “, k );
printf (“Girilen sayı = %d \n” , *l );
getch ( );
}
ÖRNEK : #include<stdio.h>
#include<conio.h>
main( )
{
int a [7] , i , *z;
clrscr ( );
z = a; /* z = &a[0] */
for ( i =0; i<6; i++)
{
printf (“ %d. sayıyı giriniz :”, i+1); scanf (“%d”, &a );
}
printf ( “ \n \n”);
for ( i =1; i<7; i++)
printf (“%d.sayı = %d \n”, i, *z++);
getch ( );
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Klavyeden kullanıcı tarafından büyük harfle girilen cümleyi , pointer kullanarak
küçük harfe çeviren programı yazınız.
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
main( )
{
char klm [80], *p;
clrscr( );
p = klm;
printf (“BÜYÜK HARFLERLE bir cumle giriniz :”);
gets (klm);
printf (“ \n”);
while ( *p )
printf ( “ %c”, tolower (*p++));
getch( );
}
Veri Yapıları ve Programlama Ders Notu
ÖDEV
1. 5x5 ‘lik iki matrisi birbirine çarpan ve sonuç matrisi ekrana yazan programı pointer
kullanarak yazınız.
2. 10x10’luk bir matrisin değerleri kullanıcı tarafından girildikten sonra , pointer
kullanarak bu matristeki en büyük elamanı bulan programı yazınız.
3. Klavyeden kullanıcı tarafından girilen cümleyi tersten yazdıran programı pointer
kullanarak yazınız.
Veri Yapıları ve Programlama Ders Notu
F O N K S İ Y O N L A R
Problem çözmenin ilkelerinden biri problemi mümkün olduğu kadar çok parçaya bölmek
idi.Daha sonra bu parçalar bağımsız olarak düşünülüp çözümleri elde edilir.C de bu bölme
işlemi fonksiyon olarak adlandırılır.
Profesyonel programlar incelenirse , programın mantıksal bütünlük gösteren parçalar halinde
yapıldığı görülecektir.Böylece , programın yazılması ve anlaşılması kolaylaşır.
C dilinde yazılan ana programın kendisi de esasında main( ) adında bir fonksiyondur.Main( )
fonksiyon yazılmaksızın herhangi bir başka fonksiyonun kullanılması mümkün
olamaz.Geleneksel olarak , programcılar tarafından komut olarak adlandırılmalarına rağmen ,
scanf ,printf ,sin ,log ve bunlar gibi ,diğer C deki bütün komutlar , gerçekte bir
fonksiyondur.C programlama dilinde fonksiyonlar bir veya birden fazla komuttan oluşan alt
programlardır.Her fonksiyonun bir ismi olur,fonksiyonun ismi tıpkı komut gibi ana program
içinde yazıldığı gibi o fonksiyon çalışır ve belirlenen görevi yerine getirir.Fonksiyon isminin
yanında parantezler yer alır.
C programlama dilinde fonksiyonlar 2’ye ayrılır.
* Dahili fonksiyonlar Ana programa değer aktaran
Ana programa değer aktarmayan
* Harici fonksiyonlar
Fonksiyonların genel yazılımı şöyledir ;
tip fonksiyonun_adi ( parametre listesi )
{
komut 1 ;
komut 2 ;
.
.
komut n ;
}
Veri Yapıları ve Programlama Ders Notu
Ana Programa Değer Aktarmayan Fonksiyonlar
ÖRNEK : #include<stdio.h>
#include<conio.h>
void yaz (void)
{
printf (“Uluborlu S.Karasoy MYO \n ”);
}
main ( ) Ana programdan önce fonksiyon yazılabilir.
{ ayrıca ana programdan sonrada yazılabilir.Ama
clrscr( ); burada dikkat edilecek olan kural,eğer fonksiyon
yaz( ); ana programdan sonra tanımlanırsa ,fonksiyonun
getch( ); tam ismi , ana programdan önce mutlaka
} yazılmalıdır.
ÖRNEK : #include<stdio.h>
#include<conio.h>
void yaz (void);
main( )
{
clrscr( );
yaz( );
getch( );
}
void yaz (void);
{
printf( “Uluborlu S.Karasoy MYO”);
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Çarpma ve toplama işlemini yapan fonksiyonu yazınız.
#include<stdio.h>
#include<conio.h>
int topla (int a, int b);
carp (int x , int y)
{
printf ( “%d * %d = %d \n ”, x, y, x*y );
}
main( )
{
clrscr( );
topla(10,7);
carp(8,3);
topla(6,9);
getch( );
}
topla( int a, int b)
{
printf( “Toplam = %d \n ”, a+b );
}
Veri Yapıları ve Programlama Ders Notu
RNEK : #include<stdio.h>
#include<conio.h>
int kare ( int sayi );
main( )
{
int a;
clrscr( );
printf ( “Bir sayi giriniz :”);
scanf ( “%d “,&a);
kare (a);
getch( );
}
int kare (int sayi)
{
clrscr( );
printf( “Sayının karesi = %d \n ”, sayi *sayi);
}
Veri Yapıları ve Programlama Ders Notu
Ana Programa Değer Aktaran Fonksiyonlar
ÖRNEK : #include<stdio.h>
#include<conio.h>
int topla ( int a , int b);
main( )
{
int x,y,cevap;
clrscr( );
printf ( “1.sayıyı giriniz : ”); scanf ( “%d”,&x);
printf ( “2.sayıyı giriniz : ”); scanf ( “%d”,&y);
cevap = topla (x,y);
printf ( “Toplamın Sonucu = %d \n”,cevap);
getch( );
}
int topla ( int a, int b)
{
int c;
c = a+b; return a+b;
return(c);
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<conio.h>
int f1 (void);
main( )
{
int i;
for( i = 0; i<10; i++)
printf( “%d”,f1( ) );
getch( );
}
int f1(void)
{
static int a;
a = a+25;
return(a);
}
Harici Fonksiyonlar
int topla (int d , int e)
{
int sonuc;
sonuc = d+e;
return(sonuc);
}
Program yazıldıktan sonra c:\ TC \ toplamaişlemi.C olarak kaydedilir.Yeni program sayfası
açılır.
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<conio.h>
#include<c:\ TC \ toplamaişlemi.C>
main( )
{
int a,b;
clrscr( );
printf( “2 sayı giriniz :”);
printf( “%d %d” &a,&b);
printf( “Toplam = %d \n, topla (a,b)”);
getch( );
}
ÖDEV
1. Klavyeden a ve b sayıları girildikten sonra usal( ) fonksiyonu ile ab’yi bulan programı
fonksiyon ile yazınız.
2. Klavyeden girilen açı değerinin sin,cos’u bulan programı harici fonksiyonlar
kullanarak yazınız.
3. Klavyeden girilen a sayısının faktöriyelini recursive function ile yazınız.
Veri Yapıları ve Programlama Ders Notu
EKRAN KONTROL KOMUTLARI
C programlama dilinde hem text modunda , hem de grafik modunda ekran kontrol komutları
bulunmaktadır.
Ekran kontrol komutları , ekranın silinmesi , kursörün herhangi bir yere konumlandırılması ,
çeşitli renkte fonlar üzerine yine çeşitli renklerde yazılar yazılması amaçlarıyla
kullanılmaktadır.
ÖRNEK : #include<stdio.h>
#include<conio.h>
#include<string.h>
char mesaj [40] = “ Turbo C Ekran Fonksiyonları”;
main( )
{
register int x , y;
char *p;
clrscr( );
p = mesaj;
for( y =1; y<=strlen(mesaj); x++)
{
for ( y =1; y<=12; y++)
{
gotoxy (x,y);
printf( “%c”, *p); delay(1000);
gotoxy(x , 25-y);
printf( “%c”, *p); delay(1000);
}
p++;
}
getch( );
}
Veri Yapıları ve Programlama Ders Notu
Burada kullanılan ;
gotoxy komutu : x ve y olmak üzere iki parametre alır.x sütun y ise satır
numarasıdır.gotoxy(x,y) komutu,kursörü ekranın x sütun y.satırına konumlandırır.Text
modunda ekran 80 sütun ve 25 satırdan oluşmaktadır.
ÖRNEK : #include<stdio.h>
#include<conio.h>
void mesaj (char *s , int x , int y);
main( )
{
clrscr( );
mesaj( “Bu bir mesajdır……..”,1.10);
getch( );
mesaj( “Bu da bir mesajdır….”, 10,10);
getch( );
}
void mesaj( char *s , int x, int y) Bu bir meBu da bir mesajdır.
{
gotoxy(x ,y);
clreol( );
printf(s);
}
Burada kullanılan clreol( ) komutu, kursorün bulunduğu noktadan itibaren , satır sonuna kadar
olan kısmı siler.
Veri Yapıları ve Programlama Ders Notu
ÖRNEK :#include<stdio.h>
#include<conio.h>
main( )
{
int x,y ;
clrscr( );
for( y =1; y<25; y++)
for( x =1; x<80; x++)
{
gotoxy( x,y );
printf( “ %c“, (y-1) + ‘A’);
}
for( y =2; y<26; y+=2)
{
gotoxy(1,y);
delline( ); insline( );
}
getch( );
}
Bu programda kullanılan delline( ) komutu, kursorün bulunduğu satırı siler.
İnsline ( ) komutu ise kursorün bulunduğu yere yeni bir boş satır açar,böylece kursorün
bulunduğu ve diğer alt satırlar bir satır aşağıya kayar.
Veri Yapıları ve Programlama Ders Notu
Textbackground ve Textcolor Komutları
Bu komutlar , text modunda ekranın zemin rengini ve yazı karakterlerinin rengini belirler.
textbackground( ) : ekranın zemin rengini belirler
textcolor( ) : yazı karakterlerinin rengini belirler.
textbackground( ) ve textcolor( ) komutları bir renk parametresi alırlar.Bu parametreler rengin
sembolik sabit ismi (ingilizce) veya buna karşılık gelen sayısal değer olabilir.
Sembolik Sabit Sayısal Değer Renk
BLACK 0 Siyah
BLUE 1 Mavi
GREEN 2 Yeşil
CYAN 3 Turkuaz
RED 4 Kırmızı
MAGENTA 5 Mor
BROWN 6 Kahverengi
LIGHTGRAY 7 Açık Gri
DARKGRAY 8 Koyu Gri
LIGHTBLUE 9 Açık Mavi
LIGHTGREEN 10 Açık Yeşil
LIGHTCYAN 11 Açık Turkuaz
LIGHTRED 12 Açık Kırmızı
LIGHTMAGENTA 13 Açık Mor
YELLOW 14 Sarı
WHITE 15 Beyaz
BLINK 128 Yanıp Sönme
textcolor (BLUE); ile textcolor(1); aynı işi yapar.
Ekrana renkli karakterlerin yazılmasında cprintf( ) komutu kullanılır.
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<conio.h>
main( )
{
clrscr( );
textbackground(15);
textcolor(RED);
cprintf( “Uluborlu”);
textbackground(GREEN);
textcolor(7);
cprintf( “Selahattin Karasoy”);
textbackground(1);
textcolor(YELLOW+BLINK); /* textcolor(14+128); */
cprintf( “Meslek Yüksek Okulu”);
getch( );
}
Veri Yapıları ve Programlama Ders Notu
T E X T P E N C E R E S İ
Text modunda window tanımlaması yapılarak ekranın sadece bir bölgesi aktif hale
getirilebilir.Window tanımlandıktan sonra , yazılan bütün ekran kontrol komutları ( clrscr( ),
delline( ), gotoxy(x,y)) hep bu tanımlı bölgede çalışır.
Şimdiye kadar yapılan programlarda varsayılan pencere kullanılmıştır.(80 sütun ve 25
satırdan meydana gelen)
Window (x1 ,y1 x2, y2) : komutu ise ekranın bir bölgesini aktif pencere olarak tanımlar.Burada
kullanılan x1 , y1 aktif pencerenin sol üst köşesini , x2, y2 ise sağ alt köşesini gösterir.
ÖRNEK : #include<stdio.h>
#include<conio.h>
main( )
{
clrscr( );
window(5,3,50,10);
gotoxy(3,2);
printf( “SDÜ-Isparta”);
getch( );
}
(x1,y1)
(x2,y2)
Veri Yapıları ve Programlama Ders Notu
ÖDEV
1. 2.
3. Window komutları kullanılarak ekrana satranç tahtası şeklini çizen ve satranç oyunu
için , başlangıç şeklindeki taşların yerini gösteren programı yazınız.
kıyas
kıyas
kıyas
kıyas
k a
kıyas
ı s
A B C D E F G H
1
2
3
4
5
6
7
8
Kale At Fil Vezir Şah Fil At Kale
Piyon Piyon …. ….. ….. …. ….. …..
Piyon Piyon Piyon ….. ….. ….. …… ……
Kale At Fil Vezir Şah Fil At Kale
Veri Yapıları ve Programlama Ders Notu
D O S Y A L A R
Birçok program uygulamasında ,programa girilen ve program tarafından üretilen
bilgilerin yardımcı bellekte (disket veya harddisk) depo edilip daha sonra tekrar kullanılması
gerekmektedir. Program tarafından üretilen bilgilerin depo edildiği dosyalara VERİ
DOSYALARI adı verilir.Dosyalar,bilgisayar programcılığında en önemli kavramların başında
gelir.
Veri Programdan veri dosyasına bilgi yazılması
Veri Veri dosyasından programa bilgi okunması
C programlama dilinde 2 tip veri dosyası tanımlıdır.
-TEXT
-BINARY dosyalar
Program Veri
Dosyası
Program Veri
Dosyası
Veri Yapıları ve Programlama Ders Notu
Veri Dosyalarının Açılma Modları
Dosyalar , bilgi yazma , bilgi okuma ve bilgi ekleme modunda açılabilir.
Mod Anlamı
w Text dosyasını yazma modunda oluşturur.
r Text dosyasını okuma modunda açar
a Text dosyasını bilgi ekleme modunda açar.
wb Binary dosyasını yazma modunda açar.
rb Binary dosyasını okuma modunda açar.
ab Binary dosyasını bilgi ekleme modunda açar.
w + Text dosyasını okuma / yazma modunda açar
r + Text dosyasını okuma / yazma modunda açar
a + Text dosyasını okuma / bilgi ekleme modunda açar
w + b Binary dosyasını okuma / yazma modunda açar
a + b Binary dosyasını okuma / bilgi ekleme modunda açar
Veri Yapıları ve Programlama Ders Notu
TEXT DOSYALAR
Text dosyalara bilgiler sırasal olarak kaydedilir ve kaydedilen bilgilerin en sonuna
dosya sonu (EOF) işareti konur. Dosya sonu işareti (EOF) ekranda görüntülenemeyen özel bir
işarettir.
Veri dosyası
Sırasal kayıtlar
Dosya sonu
işareti
1) Yazma (w-write) modu
Bir text dosyasını diskette veya harddiskte oluştururken “w” modunu kullanarak
açmak gerekir. Daha önce oluşturulmuş ve içine bilgi yazılmış bir dosya tekrar “w” modunda
açılırsa , yazıcı kafa dosyanın en başına konumlanacağı için , yeni girilen bilgiler önceki
bilgilerin üzerine yazılır , böylece önceki bilgiler silinmiş olur.
Text dosyalarla işlem yapacak olan programlarda ilk önce , değişkenlerin tanımlandığı
bölümde bir dosya değişkeni tanımlanır. Bu tanımda bir değişken (pointer tipi bir değişken)
FILE tipi tanımlanır. Bu değişken program içinde dosyayı temsil eder.
ÖRNEK : # include <stdio.h>
# include <conio.h>
main( )
{
FILE *abc;
int i,no;
abc = fopen (“rakam”,”w”);
for ( i=1 ; i<=5 ; i+t)
{
printf ( “%d. Sayıyı giriniz :”,i );
scanf ( “%d”,&no);
fprintf (abc , “%d \n”, no);
}
fclose (abc); }
---- ---- ---
---- ---- ---
---- ---- ---
---- ---- ---
Veri Yapıları ve Programlama Ders Notu
fopen komutu ile dosya açılır. Fopen komutunun iki parametresi bulunur. Bu
parametreler fopen komutundan sonra parantez içinde verilir. Her iki parametrede çift tırnak
içerisindedir ve birbirinden (,) ile ayrılır. Bu parametrelerden ilk açılacak olan dosyanın
adıdır. Bu dosya adı en fazla 8 karakter olmalıdır. İstenirse dosya adından sonra dosya
uzantısı da verilir. Bu uzantı genellikle Dat’dır. (İngilizce DATA (veri)’nin kısaltılmışıdır) .
fopen komutundaki ikinci parametre ise dosyanın açılma modudur.
fprintf komutu ile de dosyaya bilgi yazılır. Komuttaki ilk parametre bilginin hangi
dosyaya yazılacağını gösterir. Buradaki abc değişkeni rakam isimli dosyayı temsil eder. Daha
sonra çift tırnak içindeki değişken veya değişkenler dosyaya yazılacak bilgilerdir. Bu bilgiler
den sonra \n kullanılır ve çift tırnak kapatılır. Çünkü text dosyalarda bilgiler sıralı mantık ile
yazıldığı için \n kullanılır. Üçüncü parametre ise bilgileri temsil eden değişken isimleridir.
2) Okuma (r-read) modu
ÖRNEK : #include <stdio.h>
#include <conio.h>
main ( )
{
FILE *dd;
int no;
dd = fopen (“rakam”, “r”);
while ( fscanf (dd ,”%d”,&no)!=EOF )
printf ( “%d\n”,no);
fclose (dd);
getch ();
}
Burada dosya fopen komutu ile (“r”) okuma modunda açılmıştır. fscanf komutu
dosyadan bilgi alır , alınan bilgi no değişkenine aktarılıyor, bu işlem dosyanın sonuna kadar
devam eder. while döngüsü EOF (dosya sonuna) gelindiğinde sona erer.
Veri Yapıları ve Programlama Ders Notu
3) Bilgi ekleme (a- append) modu
ÖRNEK : #include <stdio.h>
#include <conio.h>
main ( )
{
FILE *dd;
int i,no;
dd = fopen (“rakam” , “a”);
for ( i=1; i<=3 ; i+t )
{
printf (“%d. Sayıyı giriniz : ” , i );
scanf(“%d.” , & no);
fprintf (dd, “%d \ n ”,no);
}
fclose (dd);
}
Diskette (veya HDD) mevcut olan bir dosya eğer tekrar “w” moduyla açılmış olsaydı ,
yazıcı kafa dosyanın başına konumlanacağından yeni bilgiler önceki bilgilerin üzerine
yazılacağından önceki bilgiler kaybolur.
Dosya “a” modunda açıldığında ise, yazıcı kafa dosya sonu (EOF) işaretinin
bulunduğu yere konumlanır ve böylece yeni bilgiler önceki bilgilerin sonundan itibaren
yazılmaya başlar.
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h>
#include <conio.h>
main( )
{
FILE *xyz;
char ad [20], de;
int no;
xyz = fopen ( “isimler” , “w” );
while (1)
{
printf (“Adı : ”); scanf ( “%s”,& ad);
printf (“Numarası : ” )scanf ( “%d” , & no);
fprintf ( xyz , “%s %5d \ n ” ,ad , no);
printf (“Devam etmek istiyor musunuz (e/h) ? ” );
de = getche ( ) ;
if ( de = = ‘h’)
break;
}
fclose(xyz);
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h>
#include <conio.h>
main ( )
{
FILE *klm ;
char ad [20];
int no;
klm = fopen(“isimler”,“r”);
clrscr( );
printf ( “ Adı Numarası \n );
printf ( “………………….. \n );
while (fscanf (klm , “%s %5d ” , ad, &no )!= EOF )
printf (“ %s %5d \n ” , ad ,no);
fclose (klm);
getch( );
}
ÖDEV
1) Bir sınıftaki öğrencilerin “adı,soyadı,numarası,vize notu ve final notu” dosyada tutulmak
isteniyor. Buna göre program çalıştığında
1-Kayıt ekleme
2-Kayıt bulma (isim ve numaraya göre)
3- Kayıt silme (numaraya göre )
4- Bilgi değiştirme
5- Listeleme
seçenekleri bulunacaktır. Programı text dosyalama kullanarak yazınız.
Veri Yapıları ve Programlama Ders Notu
BINARY DOSYALAR
Binary dosyalara BYTE düzeyinde kayıt yapılır ve okunur. Yani kullanılan
değişkenlerin boyutuna göre , dosyada kayıtlar tutulur.
Bu dosyalarda kayıt yapma işleminde “fwrite, “ kayıt okuma işleminde ise “fread”
komutları kullanılır.
fwrite komutunun genel yazılımı
fwrite ( değişken , byte sayısı, bilgi sayısı, dosya değişkeni )
Değişken : Kaydedilecek bilgiyi tutan değişkenin adresi
Byte sayısı : Kaydedilecek bilginin byte olarak uzunluğu (bunun için sizeof komutu
kullanılır)
Bilgi sayısı : Her seferde kaydedilecek olan bilgi sayısı , genellikle bu sayı 1 olur.
Dosya değişkeni : Diskteki dosyayı programda temsil eden değişken.
fread komutunun genel yazılımı
fread (değişken byte sayısı, bilgi sayısı,dosya değişkeni)
Değişken : Okunacak olan bilgiyi tutacak olan değişkenin adresi.
Byte sayısı : Okunacak bilginin byte olarak uzunluğu (sizeof komutu)
Bilgi sayısı : Her seferde okunacak bilgi sayısı (1)
Dosya değişkeni : Diskdeki dosyayı programda temsil eden değişken.
---- ---- ---
---- /--- ---
---- ---- --/
Veri Yapıları ve Programlama Ders Notu
Structure tipi değişkenler
Bu tip değişkenler daha çok BINARY dosyalarda kullanılmakta ve bu yolla kayıt
yapma ve okuma işlemleri çok hızlı olarak gerçekleştirilebilmektedir.( Ayrıca TEXT
dosyalarda da kullanılabilir)
Birbiriyle bağlantılı ve bir küme teşkil eden değişkenler bir tek değişkenin elemanları
olarak tanımlanabilir. Bu durumda bir grup değişkene bir tek isimle ulaşmak mümkündür.
Structure tip değişkenler.
Örneğin, öğrencinin bilgileri birbirine bağlantılı olarak düşünülebilir.
Adı
Soyadı
Numarası
Sınıfı
Bölümü
Yukarıdaki elemanlar bir araya getirildiğinde ogr_bil adlı bir değişkenin alt elemanları olarak
tanımlanabilir.
Struct b
{
int no;
char ad [10] , soyad[10];
char sınıf [5];
char bölüm [15];
} ogr_bil;
Bu tanımlamadan sonra ogr_bil değişkeninin elemanlarına,
ogr_bil. no
ogr_bil. ad
ogr_bil. soyad
ogr_bil. sınıf
ogr_bil. bolum
şeklinde ulaşılabilir.
Binary dosyalamada kullanılan “fseek” komutu ise , yazıcı kafayı belirli bir kayıt
alanına konumlandırır.böylece her kaydın bir kayıt numarası olmakta , bu numara kullanılarak
kayda doğrudan doğruya ulaşmak imkanı bulunmaktadır.
Veri Yapıları ve Programlama Ders Notu
fseek komutunun genel yazılımı
fseek (dosya değişkeni , kayıt pozisyonu , referans noktası )
Dosya değişkeni : Diskdeki dosyayı programda temsil eden değişkenin adı.
Kayıt pozisyonu : Kayıtların başlangıcından , okuyucu veya yazıcı kafanın bulunduğu
noktadan yada kayıtların sonundan itibaren, byte olarak , kayıt yapılacak
veya kayıt okunacak alan.
Referans noktası : Kayıt pozisyonunun nereden itibaren hesaplanacağı gösterilir.
0 : Kayıt pozisyonu , kaydın başından itibaren byte cinsinden hesaplanır. 0
yerine SEEK_SET yazılabilir.
1 : Kayıt pozisyonunun , yazıcı veya okuyucu kafanın bulunduğu noktadan
itibaren hesaplanacağını gösterir. 1 yerine SEEK_CUR yazılabilir.
2 : Kayıt pozisyonu kaydın sonundan itibaren byte cinsinden hesaplanır. 2
yerine SEEK_END yazılabilir.
Binary ve text dosyalarda kayıtlara numarada verilebilir. Fiziki ( yani disketteki) kayıt
alanı numarası 0’dan başlar ancak her kayıt alanına kayıt yapılması zorunluluğu yoktur.
Kayıtlar rastgele alanlara yazılıp okunabilir. Bu durumda içinde kayıt bulunan alanlarla, kayıt
bulunmayan alanların birbirinden ayırt edilmesi gerekir. Bunun için kayıt bulunan alanlara ilk
kayıt elemanı olarak özel bir işaret (mesela *) konulmakta ve böylece bir alanda kayıt
bulunup bulunmadığı kontrol edilebilmektedir.
Veri Yapıları ve Programlama Ders Notu
ÖRNEK: #include <stdio.h>
#include <conio.h>
struct b
{
char ad [5];
char soyad [15];
char adres [20];
char tel.[12];
char şehir [15];
}bilgi;
main( )
{
FILE *dosya ;
char ce ;
dosya = fopen (“tel_rehber” , “wb” );
do
{
clrscr ( );
printf (“Adınız :”); scanf (“%s” , & bilgi.ad );
printf (“soyadınız :”); scanf (“%s” , & bilgi.soyad);
printf (“adresiniz :”); scanf (“%s” , & bilgi.adres );
printf (“telefonunuz :”); scanf (“%s” , & bilgi.tel );
printf (“şehrin adı :”); scanf (“%s” , & bilgi.şehir );
fwrite (&bilgi , sizeof (bilgi) ,1, dosya);
printf (“tekrar kayıt yapılacak mı (e/h) :”);
ce = getce();
}white (ce = = ‘e’);
fclose (dosya):
printf (“kayıt yapıldı …”);
getch( );
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include < stdio.h>
#include <conio.h>
struct b
{ char ad [15];
char soyadı [15];
char adres [20];
char tel[12];
char şehir [15];
} bilgi ;
main( )
{
FILE *dosya;
int sayı ,k, k-sayı;
dosya = fopen (“tel. – rehberi” , “rb”);fseek (dosya, 0.2);
k – sayısı = ftell(dosya)/ 77; // ftell komutu kayıt sayısını bulur.
fseek (dosya, 0,0); değişkenlerin byte olarak uzunluğu
clrscr ( );
say = 0
for ( k=0; k<k-sayısı ; k++)
{
if (say=0)
{
printf (‘’ ADI SOYODI TEL. ADRES ŞEHİR \n’’);
printf (‘’ ……………………………………....\n’’);
}
fread (& bilgi, sizeof (bilgi),1, dosya);
printf(‘’ %s %s %s %s %s \n’’,bilgi.ad, bilgi.soyad, bilgi.tel,bilgi.adres,
bilgi.sehir);
say ++;
}
fclose (dosya);
printf (“liste sonu …..” );
getch( ); }
Veri Yapıları ve Programlama Ders Notu
PARALEL PORT UYGULAMALARI
Paralel port , bilgisayarın en kolay programlanabilen portudur. Bu pinler üzerinde DATA ,
STATUS , CONTROL adı verilen 3 tane port vardır. Bu pinlerden herhangi birinin “1”
olması durumu , o pinden okunacak voltajın +5V olması anlamına gelir. “0” olması durumu
ise o pinin 0 volt olduğunu ifade eder.
25 nolu pin topraktır.
Bir paralel porttan veri alışverişi yapılabilmesi için bu verinin önce geçici bir yere (register)
kaydedilmesi gerekir. Her register on altı ( hexadecimal ) sayı sisteminde bir adresi vardır.
Bunlar 378 , 379 , 37A , şeklindedir. Data (378) , status (379) , control (37A)
“Gönder” komutu ile porta veri gönderildiğinde , o veri , paralel portun 2 – 9 numaralı
pinleri arasında görülür. Bir pine veri göndermek , o uçtaki gerilimin +5V veya 0V olması
demektir. Programda 10 tabanında gönderilen sayısal değer , portta 8 bit halinde , 2 tabanında
gözükür.
Veri Yapıları ve Programlama Ders Notu
Alttaki şekilde 8 tane Led , dirençlerle (220Ω veya 390Ω) birlikte paralel porta
bağlanmaktadır. Çünkü LED’ler 1,5V ‘la çalışır. Ama paralel porttan 5V çıkar. Ledlerin
patlamaması için gerilim düşürücü olarak direnç kullanılır.
ÖRNEK : Paralel porta bağlanan 8 tane LED’in sağdan sola doğru sırası ile yanması için
gereken programı yazınız.
İlk önce porta gönderilecek olan sayıların belirlenmesi gerekir.
Pin 9 8 7 6 5 4 3 2
Verinin
2’lik
değeri
27 26 25 24 23 22 21 20
Led No 8 7 6 5 4 3 2 1
Gönderilecek
değer
X 20 = 1
X 21 = 2
X 22 = 4
X 23 = 8
X 24 = 16
X 25 = 32
X 26 = 64
Yakılacak
LED
X 27 = 128
25
2
3
9
25
2
3
9
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <math.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
main ( )
{
int d, i ;
clrscr ;
outport (0x378 , 1 ) ; delay (1000) ; for (i = 0 ; i<= 7 ; i++)
outport (0x378 , 2 ) ; delay (1000) ; {
outport (0x378 , 4 ) ; delay (1000) ; d = pow (2,i) ;
outport (0x378 , 8 ) ; delay (1000) ; outport (0x378 , d)
outport (0x378 , 16 ) ; delay (1000) ; delay ( 1000 ) ;
outport (0x378 , 32 ) ; delay (1000) ; }
outport (0x378 , 64 ) ; delay (1000) ;
outport (0x378 , 1128 ) ; delay (1000) ;
getch ( ) ;
}
ÖRNEK : Bilgisayarın parelel portuna bağlı 8 LED’i , 1 sn aralıklarla kenarlardan ortaya
doğru , sonra ortadan iki yana doğru sürekli bu şekilde ledleri yakan programı yazınız.
8 7 6 5 4 3 2 1
x x
x x
x x
x x
x x
x x
x x
x x
1+128=129
2+64=66
4+32=36
8+16=24
24
36
66
129
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h>
#include <conio.h>
#include <dos.h>
main ( )
{
int i , a [4] = (129 , 66 , 36 , 24) ;
for (i = 0 ; i<4 ; i + t)
{
output (0x378 , a ) ;
delay (1000);
}
for (i = 3 ; i ≥ 0 ; i + t)
{
output ( 0x378 , a )
delay (1000),
}
getch ( ) ;
}
Veri Yapıları ve Programlama Ders Notu
SEVEN SEGMENT DİSPLAY (GÖSTERGE) UYGULAMALARI
7 segment display
Burada 0 rakamının oluşması için g hariç diğerlerinin aktif (lojik 1) olması gerekir.
Pin 9 8 7 6 5 4 3 2
Display
segmenti
g f e d c b a
Yanacak
Rakam 27 26 25 24 23 22 21 20
Gönder
ilecek
değer
0 0 0 1 1 1 1 1 1 63
1 0 0 0 0 0 1 1 0 6
2 0 1 0 1 1 0 1 1 91
3 0 1 0 0 1 1 1 1 79
4 0 1 1 0 0 1 1 0 102
5 0 1 1 0 1 1 0 1 109
6 0 1 1 1 1 1 0 1 125
7 0 0 0 0 0 1 1 1 7
8 0 1 1 1 1 1 1 1 127
9 0 1 1 0 1 1 1 1 111
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include <stdio.h>
#include <conio.h>
#include <dos.h>
main ( )
{
int i , a [10] = {63,6,91,79,102,109,125,7,127,111} ;
for (i = 0 ; i<9 ; i + +)
{
output (0x378 , a ) ;
delay (1000);
}
getch ( ) ;
}
Veri Yapıları ve Programlama Ders Notu
C GRAFİK
1) a. Grafik Ekrana Geçiş(harici function yazılması)
piksel çizim komutları
b. Getpiksel komutu
2) a. line komutu
b. circle komutu
3) a. arc komutu
b. ellipse komutu
4) a. grafik imlecinin yerinin degiştirilmesi.(moveto,moverel) lineto
b. rectangle komutu
5) a. drawppoly komutu
b. çizim tipinin değiştirilmesi(çizginin ince,kalın,noktalı v.s)
6) a. bar komutu,bar3d komutu
b. pieslice komutu,sector komutu
7) a. fillellipse komutu,fillpolly komutu
b. yazı komutları
8) a. outtext komutu,outtextxy komutu
b. settextjustify komutu
9) a. metin boyutlarının belirlenmesi(textheight,textwidth)
b. çizim renklerinin seçimi(setbkcolor,setcolor)
10) a. restorecrtmode,getgraphmode,setgraphmode,graphdefaults
b. cleardevice,setviewport komutu,clearviewport komutu
Veri Yapıları ve Programlama Ders Notu
Grafik Sisteminin Başlatılması
Bilgisayarın grafik adaptörü ve modunun belirlenmesinden sonra yapılacak ilk iş çizim için
grafik sisteminin başlatılmasıdır.Grafik sisteminin başlatılması, grafik adaptörünün çizim için
hazır duruma getirilmesi demektir.
Grafik sistemini başlatmak için initgraph komutu kullanılır.
void far initgraph (int far *GrAdapter,int far *GrMod,char far *dir);
initgraph komutu,verilen grafik adaptörü ve moduna ait bilgileri içeren uygun grafik arabirim
dosyasını disketten okuyup hafızaya yükleyerek Borland grafik Kernel’i ile grafik arabirimi
arasındaki iletişimi hazırlar ve grafik sistemini başlatır.
Sistemin Program Komutları Tarafından Belirlenerek Açılması
Tek bir grafik adaptörünü destekleyen program yazmak yerine, Borland Grafik Paketi
tarafından desteklenen tüm grafik adaptör ve modlarında çalışabilecek bir program yazmak
için grafik adaptör ve modunun program tarafından otomatik olarak belirlenmesi gerekir.
detectgraph (&GrAdapter,&GrMod);
initgraph (&GrAdapter,&GrMod,” “);
yazılırsa grafik sisteminin tipi otomatik olarak belirlenir ve çizim için hazır duruma getirilir.
Grafik Sisteminin Kontrolü
Grafik sisteminin belirlenmesinde ,hazır duruma getirilmesinde ve grafik komutlarının
uygulanması sırasında çeşitli hatalar meydana gelebilir.Bu hata kontrollerinin programcı
tarafından yapılması gerekir.Bu kontroller “graphresult” komutunun kullanımıyla yapılır.
int far graphresult(void);
Graphresult komutu işlenen son grafik komutunda bir hata meydana gelip gelmediği hakkında
bir tamsayı değeri üretir.Bu değerin 0 olması durumunda hata yok,negatif olması halinde ise
bir hata meydana geldi demektir.
initgraph ile grafik sisteminin başlatılmasında hata kontrolünün muhakkak yapılması
gerekir.Çünkü sistemin başlatılmaması durumunda sonraki grafik komutlarının
çalıştırılmasının bir anlamı kalmayacaktır.
Veri Yapıları ve Programlama Ders Notu
GrAdapter=DETECT;
initgraph (&GrAdapter,&GrMod,” “);
hata-kodu=graphresult( );
if(hata-kodu!=grOk) { !=anlam eşit değil}
{
printf(“Grafik hatası : # %d kodlu hata\n”,hata-kodu);
getch( );
exit(1);
}
Genellikle ,hata oluştuğunda kullanıcıya sadece hatanın kodunu vermek hatanın ne olduğunun
anlaşılması bakımından yarar sağlamaz.Kullanıcı için önemli olan hata kodu değil hatanın
sebebidir.”Grapherrormsg”komutu ise hata kodunun ingilizce olarak açıklanmasını verir.
for (i=0; i<= -15; i--)
printf(“# %3d : %s\n”,i,grapherrormsg(i));
printf(“# %3d : %s\n”,-18,grapherrormsg(-18));
Ekran Çıktısı :
0 : No Error
-1 : (BGI) graphics not installed
.
.
.
-15 : Graphics Error
-18 : Invalid File Version Number
Veri Yapıları ve Programlama Ders Notu
46 Kıyas KAYAALP
Grafik Sisteminin Kapatılması
initgraph basit anlamda text ekranından grafik ekrana geçişi sağlayan bir komuttur.Grafik
çizimine geçmeden ,grafik ekrana geçilmesi gerektiği gibi grafik çiziminden sonra da grafik
ekrandan tekrar metin ekranına dönülmesi gereklidir.Bunun için “closegraph” komutu
kullanılır.
Bu komut grafik ekrandan metin ekranına geçilmesini veya kısaca grafik sisteminin
kapatılmasını gerçekleştirir.
Grafik Ekrana Geçiş
ÖRNEK : # include<stdio.h>
# include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if (graphresult( )!=grOk)
{
printf(“Grafik hatası : (%d kodlu hata\n)”,graphresult);
getch( );
exit(1);
}
circle(100,100,150);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
47 Kıyas KAYAALP
ÖRNEK : # include<stdio.h>
# include<conio.h>
# include<graphics.h>
void main( )
{
int GrAdapter,Gr Mod;
int hata-kodu;
/* Grafik Ekrana Geçiş : Grafik adaptör ve modunun otomatik olarak */
/* saptanıp grafik ekranın hazır duruma getirilmesi */
GrAdapter=DETECT;
initgraph(&GrAdapter,GrMod,” “);
hata-kodu=graphresult( );
/* Grafik Ekrana Geçişte hata kontrolü
if (hata-kodu!=grOk)
{
printf (“Grafik hatası : (# %d kodlu hata) %s\n”,hata-kodu,grapherrormsg(hata-kodu));
getch( );
exit(1);
}
.
.
. /* Grafik komutları yazılır */
.
getch( );
/* grafik ekrandan ,metin ekrana geri dönüş */
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
PİKSEL ÇİZİM KOMUTLARI
En basit haliyle bir grafik çizimi,(ekran,ekran kartının türüne göre değişiklik gösterebilen
piksel adı verilen noktalardan oluşur.Mesela 640*480’lik bir ekranda yatay doğrultuda ( )
640 adet nokta bulunur, düşey doğrultuda (Y) 480 adet nokta bulunur.Toplam ise
640*480=307200 tane nokta bulunur.)grafik ekrandaki piksellerin istenilen renge
boyanmasıyla yapılır.Bir Pikselin istenilen renge boyanması için üç bilgiye ihtiyaç vardır ;
Pikselin kaçıncı sütuna karşı geldiği -x
Pikselin kaçıncı satıra karşı geldiği -y
Pikselin hangi renge boyanacağı -renk
Borland grafik paketinde bu işlemi yapmak için “putpixel” komutu kullanılır.
void far putpixel (int x, int y, int renk);
Bu komut yardımıyla x,y koordinatındaki pixel,verilen renk ile boyanır.Renk
değeri,GRAPHİCS.H başlık dosyasında tanımlanmış olan sabit isimleri veya bunlara karşılık
gelen tamsayı renk kodları kullanılabilir.C’de renk isimleri BÜYÜK HARF ŞEKLİNDE
kullanılması gerekir.
BLACK 0 DARK GRAY 8
BLUE 1 LİGHT BLUE 9
GREEN 2 LIGHT GREEN 10
CYAN 3 LIGHT CYAN 11
RED 4 LIGHT RED 12
MAGENTA 5 LIGHT MAGENTA 13
BROWN 6 YELLOW 14
LIGHTGRAY 7 WHİTE 15
Bu renk bilgileri kullanılarak 100.sütun ve 20.satıra karşılık gelen pikselin mavi renge
boyanması istenirse ;
putpixel (100,20,BLUE); veya putpixel(100,20,1); kullanılır.
Veri Yapıları ve Programlama Ders Notu
49 Kıyas KAYAALP
ÖRNEK:Ekrana alt alta 15 tane renk koyan programı yazınız.
#include<stdio.h>
#include<graphics.h>
main( ) .
{ .
int a=DETECT,b; .
int i; .
clrscr( );
initgraph(&a,&b, “ “);
if(graphresult( )!=grOk)
{
printf(“grafik hatası:(%d kodlu hata\n)”,graphresult);
getch( );
exit(1);
}
for(i=1; i<=15; i++)
putpixel(100,100+i,i);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
50 Kıyas KAYAALP
ÖRNEK: Ekrana 1000 tane rastgele koordinatlarda renkli nokta koyan programı yazınız.
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int i;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“grafik hatası(%d kodlu hata\n)”,graphresult);
getch( );
exit( );
}
for(i=0; i<1000; i++)
{
putpixel(random(639),random(479),i);
delay(1200);
}
getch( );
closegraph( );
}
100
(0,0)
20 mavi
Veri Yapıları ve Programlama Ders Notu
51 Kıyas KAYAALP
Putpixel komutunu kullanarak diğer karmaşık çizimleri de gerçekleştirmek
mümkündür.Örneğin ekranda(x1,y1 ) noktasında başlayan ve (x2,y2) noktasında son bulan bir
doğru parçasının çizimi için
y(x)=y1+(x-x1) .
1 2
1 2
y y
x x
denklemi kullanılabilir.Bu denkleme göre bir x
değerine karşılık bir y değeri bulunarak putpixel ile çizim gerçekleştirilebilir.
Getpixel
Putpixelin tersine verilen koordinattaki pikselin hangi renge sahip olduğunu anlamak için
“getpixel”komutu kullanılır.
Unsigned far getpixel(int x,int y);
Bu komut verilen x,y koordinatındaki rengi saptayarak bu renge ait sayısal kodu geri
gönderir.
Unsigned renk;
İşaretsiz tam sayısal bir değişken tanımlanması yapıldıktan sonra
Renk=getpixel(100,20);
Komutu verildiğinde eğer buradaki piksel mavi renge sahipse renk değişkenlerine 1(BLUE)
değeri atanır.
Veri Yapıları ve Programlama Ders Notu
52 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
unsigned int k;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“grafik hatası:%d nolu hata “\n”,graphresult);
getch( );
exit(1);
}
putpixel(100,200,5);
getch( ) ;
k=getpixel(100,100);
closegraph( );
printf(“%d”,k);
getch( );
}
Veri Yapıları ve Programlama Ders Notu
53 Kıyas KAYAALP
TEMEL ÇİZİM KOMUTLARI
Doğru parçası,dikdörtgen,daire,elips v.b. şekiller grafik çizimlerinde oldukça sık kullanılırlar
ve karmaşık grafik çizimlerinin temel elemanlarını teşkil ederler.Bu temel şekillerin çizimi
için gerekli tüm komutlar,Borland grafik paketi içinde programcılara hazır olarak
sunulmuştur.
LİNE KOMUTU
Bir doğru parçası çizimi gerçekleştirmek için “line” komutu kullanılır.Doğru parçasının
çiziminde Borland Grafik Koordinat sistemine göre tayin edilmiş olan bir başlangıç koordinat
ve bir de bitiş koordinatı kullanılır.
void far line (int x1,int y1,int x2,int y2);
Burada x1,y1 doğrunun başlangıç koordinatı ; x2,y2 ise bitiş koordinatıdır.Line komutunda
çizim için renk parametresi yoktur.Çizim rengi için grafik sistemde önceden programcı
tarafından “setcolor” ile verilmiş olan renk değeri kullanılır.Eğer bu renk verilmedi ise
çizimde beyaz renk kullanılır.
(0,0)
(x2,y2)
(x1,y1)
Veri Yapıları ve Programlama Ders Notu
54 Kıyas KAYAALP
ÖRNEK :#include<stdio.h>
#include<conio.h>
main( )
{
int a=DELECT ,b;
initgraph(&a,&b,””);
if (graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
line (250,240,430,240);
line (320,150,320,330);
getch( );
closegraph( );
}
ÖRNEK:#include<stdio.h>
#include<conio.h>
main( )
{
int a=DELECT,i,b;
initgraph(&a,&b,””);
if(graphresult()!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
for(i=0;i<=479;i=i+5)
line(0,240,639,i);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
55 Kıyas KAYAALP
ÖRNEK :#include(stdio.h)
#include(conio.h)
main( )
{
int a=DELECT.b;
int i;
initgraph(&a,&b,””);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch();
exit(1);
}
for(i=0;i<=150;i=+5)
{
line(320,240,320+i,390+i);
line(320,240,320-i,390-i);
}
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
56 Kıyas KAYAALP
CIRCLE KOMUTU
Daire çizimi için kullanılan komut circle ‘dır.
Yazılımı : void for circle(int x,int y,int r);
Circle ile parametreler sırasıyla x,y dairenin merkez koordinatı ve r dairenin yarıçapını
belirten tamsayı değerleridir.
ÖRNEK :#include(stdio.h)
#include(conio.h)
main( )
{
int a=DELECT,b;
clrscr( );
initgraph(&a,&b,””);
i f(graphresult!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
circle(100,100,50);
getch( );
closegraph( );
}
r
(x,y)
Veri Yapıları ve Programlama Ders Notu
57 Kıyas KAYAALP
ÖRNEK : Ekranda rastgele renkte,yarıçapta ve noktada 50 tane çember çizen programı
yazınız.
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
main( )
{
int a=DELECT,b;
int i;
clrscr( );
randomize( );
initgraph(&a,&b,””);
if(graphresult!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit( );
}
for(i=0;i<=50;i++)
{
setcolor(random(15));
circle(random(680),random(400),random(50));
delay(9200);
}
getch( );
closegraph( );
}
ÖDEV : Ekrana yine rastgele renkte,yarıçapta ve merkezde 50 tane çember çizdirilecek fakat
çemberler ekranın dışına taşmayacak yani yarım çember olmayacak bu programı yazınız.
Veri Yapıları ve Programlama Ders Notu
58 Kıyas KAYAALP
ARC KOMUTU
Bir daire parçası (yay) çizimi için “ARC” komutu kullanılır.
Yazılımı: void for arc(int x ,int y, int aci1, int aci2, int r);
Bu komutta verilen parametrelerin anlamlarına sırasıyla x.y yayın merkez koordinatı ,açı1 ve
açı2 yayın başlangıç ve bitiş açılarını (derece cinsinden)ve son olarak r daire yayının
yarıçapıdır.Yayın çiziminde kullanılan açılar merkez koordinattan doğuya doğru olan yönü 0
olmak üzere saat ibrelerinin ters yönünde arttırılarak tespit edilir ve yayın çizimi için açıların
alabileceği değerler normalde şu şekilde olmalıdır.
Bu bilgiye göre bir daire yayının çizimi aşağıdaki gibi yapılır,
0o açı1 360o
0o açı2 360o
açı1 açı2
90o
0o
180o 360o
270o
ry
açı2
açı1
(x,y) rx
Veri Yapıları ve Programlama Ders Notu
59 Kıyas KAYAALP
Eğer yukarıda verilen yay çizimi için ilgili açı kurallarına uyulmadı ise açılar aşağıdaki
kurallara göre belirlenir.
a)Verilen açının 360’den büyük olması durumunda bu değerlerden 360 çıkartılır.
Arc(x,y, 40, 450, r);
komutu
Arc (x,y, 40, 360+90, r);
komutunun veya
Arc (x,y, 40, 90, r);
komutunun aynısıdır.
b)Açı1, açı2’den büyükse (açı1>açı2) bu durumda açı2’ye 360 eklenir.
arc(x,y,90,40,r);
komutu
arc(x,y,90+340,r);
ile aynıdır.
Burada açı1=0 ve açı2=360 olarak verilirse tam bir daire elde edilir.Bu durumda
Arc (x,y, 0, 360, r);
Komutu
Circle (x, y, r);
Veri Yapıları ve Programlama Ders Notu
60 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hataları”,graphresult);
getch( );
exit(1);
}
arc(100,100,0,90,50);
arc(100,200,90,180,50);
arc(100,300,180,270,50);
arc(100,400,270,360,50);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
61 Kıyas KAYAALP
ÖRNEK : Bir çember üzerinde yürüyen ışık efekti veren program.10’ar derecelik yaylar
çizilerek farklı renklerde bir çember oluşturuluyor.
#include<stdio.h>
#include<graphics.h>
main( )
{
int a= DETECT,b;
int i,k,l;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk);
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
k=0;
for (l=0; l<14; l++)
for (i=0; i<36; i++)
{
setcolor (l+1);
arc(320,240,k,k+10,100);
delay(9000);
setcolor(0);
arc(320,240,k,k+10,100);
k=k+10;
}
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
62 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
arc(0,200,270,0,100);
arc(200,200,50,180,100);
arc(200,200,0,90,100);
arc(400,200,180,270,100);
arc(600,200,90,180,100);
arc(600,200,90,180,100);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
63 Kıyas KAYAALP
ELLİPSE KOMUTU
Bir elips veya eliptik yay çizimi için kullanılan komut “ellipse”tir.
void far ellipse(int x,int y,int aci1,int aci2,int rx,int ry);
ellips’te verilen parametrelerin anlamları arc’takine benzerdir.Sırasıyla
x,y : elips merkezinin koordinatını
açı1,açı2 : elips yayının başlangıç ve bitiş açıları (derece olarak)
rx : elipsin x yönündeki
ry : elipsin y yönündeki yarıçaplarıdır.
Açılar,merkez koordinatının doğuya doğru olan yönü 0o olmak üzere saat ibrelerinin ters
yönünde arttırılarak belirlenir.
Açılar için kullanılan değerler normalde aşağıdaki gibi olmalıdır.
0o açı1 360o
0o açı2 360o
açı1 açı2
verilen bilgilere göre elips yayının çizimi,
90o
0o
180o
360o
270o
Eğer açı1 = 0o ve açı2 = 360o verilirse tam bir ellipse elde edilir.
Ellipse (x,y,0,360,rx,ry);
ry
açı2
açı1
(x,y) rx
Veri Yapıları ve Programlama Ders Notu
64 Kıyas KAYAALP
0o
360o
Ayrıca rx ve ry değerleri aynı olursa (rx = ry) ve açı1 = 0o ve açı2 = 360o olarak verilirse,
ellipse (x,y,0,360,rx,ry);
Komutu teorik olarak
circle(x,y,r);
Komutunun aynısı olur.
rx ile ry birbirine eşit ve değeri r, açı1 0,açı2 = 360 ve açı1<açı2
Olması durumunda
ellipse (x,y,açı1,açı2,r,r);
Komutu teorik olarak
arc (x,y,açı1,açı2,r);
Komutunun aynısıdır.
ry
rx
Veri Yapıları ve Programlama Ders Notu
65 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası\n”,graphresult);
getch( );
exit(1);
}
ellipse(320,240,0,360,150,75);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
66 Kıyas KAYAALP
ÖRNEK : #include<stdio.h> 4 3 2
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası\n”,graphresult);
getch( );
exit(1);
} çember
ellipse(320,240,0,360,35,35); /x1x/
ellipse(320,240,0,90,70,50); /x2x/
ellipse(320,240,0,180,50,90,65); /x3x/
ellipse(320,240,0,270,110,80); /x4x/
ellipse(320,240,0,360,130,95); /x5x/
getch( );
closegraph( );
}
4
5
1
Veri Yapıları ve Programlama Ders Notu
67 Kıyas KAYAALP
GRAFİK İMLEÇ
Metin ekranında genelde bir yazının ekrana basımı , imlecin olduğu yer referans alınarak
yapılır.Grafik ekranda da metin ekranında olduğu gibi bir grafik imleç vardır.Borland Grafik
Paketindeki grafik komutlarından bazıları bu grafik imleç yerini çizim için referans noktası
olarak alır. Grafik imlecin yeri bir pikseli gösteren koordinattır.Bu imleç hayali bir imleçtir ve
ekranda görünmez.Sadece gerekli komutlarla grafik imlecin nerede olduğu veya neresi
olacağı belirlenir.
Grafik İmleç Yerinin Belirlenmesi
Grafik sistemi initgraph ile başlatıldığında grafik imlecin yeri ekranın sol üst köşesi olan (0,0)
koordinattır.Bazı çizim komutlarının uygulanmasından sonra yeri değişen grafik imlecin
nerede olduğu “getx” ve “gety” komutlarıyla belirlenebilir.
int far getx (void)
int far gety (void)
Burada getx komutu grafik imlecin bulunduğu yerin x-koordinatını,gety ise y-koordinatını
verir.
Veri Yapıları ve Programlama Ders Notu
68 Kıyas KAYAALP
Grafik İmleç Yerinin Değiştirilmesi
Grafik imlecin yerini değiştirmek için “moveto” veya “moverel” komutları kullanılır.
void far moveto (int x,int y);
Burada verilen x ve y değerleri ,grafik imlecin ekrandaki yeni yeridir.
Moveto komutunun uygulanmasından sonra grafik imlecin yeri doğrudan x,y olarak
değiştirilir.
void far moverel (int dx,int dy);
“moverel” komutu ise grafiksel imlecin bulunduğu yerden başlayarak x yönünde dx kadar ,y
yönünde dy kadar uzaklıktaki koordinatı grafik imlecin yeni yeri olarak değiştirilir.
(0,0)
Çizimlerde Grafik İmlecin Kullanımı
Bazı grafik çizimlerinde doğru çiziminin grafik imlecin bulunduğu noktadan başlıyarak yapılması
istenebilir.Bu durumda ,kullanılabilen komutlardan biri “lineto” komutudur.
void far lineto (int x,int y);
Bu komutta x ve y parametreleri ile sadece doğru parçasının bitiş koordinatı verilir.Grafik imlecin
yeri doğrudan başlangıç noktası kabul edilerek verilen x , y noktasına bir doğru çizilir.Doğru
parçası çizildikten sonra grafik imlecin yeri x,y olarak değiştirilir.
Mesela aşağıdaki komutlarla ;
eski konum
dx
dy
yeni konum
Veri Yapıları ve Programlama Ders Notu
69 Kıyas KAYAALP
(0,0) 100 400 500
moveto (100,300); 100
lineto (400,100); 150 Grafik imlecin son
lineto (500,100); yeri
lineto (500,150); 300 Grafik imlecin
başlangıç yeri
ilk önce moveto ile grafik imlecin yeri belirlenir ve peşi sıra lineto ile doğru parçası çizimleri
gerçekleştirilir.Bu komutların tümünün icrası sonucunda grafik imlecin son konumu 500,150
koordinatı olacaktır.
lineto (x,y) komutu, line komutu kullanılarak aşağıdaki gibi ifade edilebilir.Burada line
komutunun grafik imlecin yerini değiştirmediğine dikkat ediniz.
line (getx( ), gety( ), x,y);
moveto (x,y);
Veri Yapıları ve Programlama Ders Notu
70 Kıyas KAYAALP
doğru parçası çiziminde başlangıç koordinatı olarak grafiksel imlecin bulunduğu yeri kullanan
ikinci komut “linerel”dir.
void far linerel (int dx, int dy);
linerel komutu grafik imlecin bulunduğu pozisyondan başlayarak x-yönünde dx kadar ,
y-yönünde dy kadar uzaklıktaki koordinata bir doğru çizer.Bu komutun grafik imlece etkisi aynı
“lineto”da olduğu gibidir.Grafik imlecin yeri işlemden önce (Cx.Cy) olmak üzere verilen dx ve dy
artım değerleriyle grafik imlecin yeni koordinatı (Cx+dx,Cy+dy) olarak belirlenir.
(0,0) Eski konumu
Yeni konumu
linerel (dx,dy) komutu ,line komutu kullanılarak aşağıdaki gibi ifade edilebilir.Line komutunun
grafik imlecin yerini değiştirmediği görülür.
line(getx( ),gety( ),getx( )+dx,gety( )+dy);
moveto(getx( )+dx,gety( )+dy);
(cx,cy) dx
dy
(cx+dx,cy+dy)
Veri Yapıları ve Programlama Ders Notu
71 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk )
{
printf(“%d nolu grafik hatası\n”,graphresult);
getch( );
exit(1);
}
moveto (100,100);
lineto (150,100);
lineto (150,150);
lineto (200,150);
lineto (200,100);
lineto (250,100);
lineto (250,150);
lineto (300,150);
lineto (300,100);
moverel (0,-50);
lineto (100,50);
getch( );
closegraph( );
}
11
10
2
1
3 5 6 7 9
4 8
Veri Yapıları ve Programlama Ders Notu
72 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int i;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk )
{
printf(“%d nolu grafik hatası\n”,graphresult);
getch( );
exit(1);
}
moveto(320,240);
for (i=0; i<20; i++)
{
lineto (320+i*10,230-i*10);
lineto (310-i*10,230-i*10);
lineto (310-i*10,250+i*10);
lineto (330+i*10,250+i*10);
}
getch( );
closegraph( );
}
SORU : Bu şeklin merkezine bir çember konsun ve bu çember labirentin dışına, her borudan
geçerek çıksın.
Veri Yapıları ve Programlama Ders Notu
73 Kıyas KAYAALP
Grafik İmlecin Yerini Değiştiren Komutlar
Borland Grafik Paketindeki komutlardan bazıları grafik imlecin yerini doğrudan başlangıç noktası
kabul ederek çizimi gerçekleştirir.Bir kısmı ise grafik imlecin yerini dolaylı olarak kullanır ve
çizim bittikten sonra onu eski komutuna tekrar getirir.Sadece çizim komutları değil grafik
sisteminin hazırlanması ve kontrolü için kullanılan grafik komutlardan bazıları da grafik imlecin
yerini etki eder.
Grafik imlecin yerini değiştiren komutların isimleri ve imlecin son konumu aşağıdaki tabloda
verilmiştir.
Komut İsmi Grafik İmlecin Son Konumu
initgraph (0,0)
setgraphmode (0,0)
graphdefaults (0,0)
cleardevice (0,0)
setviewport (0,0)
clearviewport (0,0)
moveto (x,y)
moverel (cx+dx,cy+dy)
lineto (x,y)
linerel (cx+dx,cy+dy)
Veri Yapıları ve Programlama Ders Notu
74 Kıyas KAYAALP
Grafik Çizim Alanı Boyutlarının (Resolution) Belirlenmesi
Ekranın yatayda ve düşeyde bulunan piksellerin sayısı grafik sisteminin sahip olduğu grafik
adaptör ve moduna göre değişiklik gösterir.Grafik ekranının piksel olarak boyutunun belirlenmesi
programcının tüm grafik adaptör ve ekran modlarını destekleyen genel bir program yazması
bakımından oldukça önemlidir.Örneğin ,en basit haliyle ekranın etrafına bir çerçeve çizdirmek
istenirse ve bu işlemin yatayda ve düşeyde farklı piksel sayısına sahip farklı adaptör ve modlar
için de geçerli olması istenirse,program içinde çizime başlamadan evvel grafik ekran boyutlarının
her defasında tanımlanması gereklidir.Bu da program içinde bir çok kontrolün yapılması
demektir.
Borland grafik sistemi initgraph ile başlatılırken ekranın piksel olarak boyutları grafik sistemi
içinde bellekte bir yere yerleştirilir.Programcının ekran boyutlarını kendi tanımlaması yerine
,sistemden bu değerleri alması en uygunudur.Borland Grafik Paketi sistemden bu değerlerin
alınmasını sağlayan iki komut içerir. getmaxx ve getmaxy
int far getmaxx(void);
int far getmaxy(void);
getmaxx ve getmaxy komutları , sırasıyla ekranda bulunan piksellerin yatayda ve düşeydeki son
piksel numarasını verir.
ÖRNEK :Ekranın etrafına bir çerçeve çizdirdikten sonra ekranı iki doğru ile dört eşit parçaya
bölme işleminin adaptör ve moddan bağımsız olarak yazınız.
moveto (0,0);
lineto (getmaxx( ),0); 0 getmaxx()/2 getmaxy()
lineto (getmaxx( ),getmaxy( )); 0
lineto (0,getmaxy( ));
lineto (0,0);
moveto (getmaxx( )/2,0); getmaxy()/2
lineto (getmaxx( )/2,getmaxy);
moveto (0,getmaxy( )/2);
lineto (getmaxx( ),getmaxy( )/2); getmaxy
moveto (0,0);
getch( );
Veri Yapıları ve Programlama Ders Notu
75 Kıyas KAYAALP
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
moveto (0,0);
lineto (getmaxx( ),0);
lineto (getmaxx( ),getmaxy( ));
lineto (0,getmaxy( ));
lineto (0,0);
moveto (getmaxx( )/2,0);
lineto (getmaxx( )/2,getmaxy( ));
moveto (0,getmaxy( )/2);
lineto (getmaxx( ),getmaxy( )/2);
moveto (0,0);
circle (getmaxx( )/2,getmaxy( )/2,getmaxy( )/2);
circle (getmaxx( )/4,getmaxy( )/4,getmaxy( )/4);
circle (getmaxx( )-getmaxx( )/4,getmaxy( )-getmaxy( )/4,getmaxy( )/4);
circle (getmaxx( )/4,getmaxy( )-getmaxy( )/4,getmaxy( )/4);
circle (getmaxx( )-getmaxx( )/4,getmaxy( )/4,getmaxy( )/4);
circle (getmaxx( )/2,getmaxy( )/2,getmaxy( )/6);
getch( );
closegraph ( );
}
Veri Yapıları ve Programlama Ders Notu
76 Kıyas KAYAALP
BİRLEŞİK DOĞRU ÇİZİMLERİ
Rectangle Komutu
Dikdörtgen çizimi için Borland Grafik Paketinde mevcut olan “Rectangle” komutu kullanılır.
void far rectangle (int x1,int y1,intx2,int y2);
rectangle komutundaki parametrelerden x1,y1 çifti dikdörtgenin sol-üst köşesinin koordinatını
x2,y2 çifti dikdörtgenin sağ-alt köşesinin koordinatını belirtir.Bu parametrelere göre dikdörtgen
çizimi aşağıdaki şekilde yapılır.
x1 x2
y1
y2
rectangle komutu gerçekte line veya lineto komutlarıyla yapılmış birleşik bir çizim
komutudur.Yani ,
rectangle (x1,y1,x2,y2);
komutu line komutu kullanılarak aşağıdaki gibi ifade edilebilir.
line (x1,y1,x2,y1);
line (x2,y1,x2,y2);
line (x2,y2,x1,y2);
line (x1,y2,x1,y1);
bu komut kullanılarak ekranın sınırlarında bir çerçeve çizdirilmesi
rectangle (0,0,getmaxx( ),getmaxy( ));
(x1,y1)
(x2,y2)
Veri Yapıları ve Programlama Ders Notu
77 Kıyas KAYAALP
ÖRNEK : İç içe dikdörtgenlerin getmaxx( ) ve getmaxy( ) komutları kullanılarak çizilmesi.
#include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int i,d,e,g;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit( );
}
g=0; d=0; e=0;
for (i=1; i<11; i++)
{
setcolor(i);
rectangle(d+g , e+g , getmaxx( )-g , getmaxy( )-g);
g=g+20;
}
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
78 Kıyas KAYAALP
ÖRNEK :#include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası\n”,graphresult);
getch( );
exit(1);
}
rectangle (0,0,155,120);
rectangle (155,120,310,240);
rectangle (310,240,465,360);
rectangle (465,360,620,479);
rectangle (310,120,465,240);
rectangle (155,240,310,360);
rectangle (0,360,155,479);
rectangle (465,120,620,0);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
79 Kıyas KAYAALP
Drawpoly Komutu
Drawpoly komutu,bazı grafik uygulamalarında ihtiyaç duyulan üçgen,yamuk,beşgen gibi
çokgenlerin ve genel olarak da poligon çizimlerinin yapımında kullanılan bir komuttur.Bu komut
genelde poligonların çizimi için hazırlanmıştır.
void far drawpoly (int nokta-sayısı,int far *nokta-koord);
Burada nokta-sayısı parametresi poligonu meydana getiren köşe noktalarının sayısını,
nokta-koord ise bu noktaların koordinatlarını içeren diziyi gösteren bir pointerdır.
ÖRNEK : Bu komutun kullanımı için poligonun köşe noktalarını içerecek olan bir dizi
tanımlayalım.Bu poligonun köşe sayısı 4 tane olsun.Bu durumda 8 elemanlı (bir elemanı x
koordinatı için ve bir elemanı y koordinatı için olmak üzere , 2*4=8) bir dizi tanımlamak gerekir.
int polo[8];
sekiz elemanlı bir dizi tanımlamasından sonra ,bu elemanlara aşağıdaki şekilde uygun koordinat
değerleri atanır.
/* x koordinatı y koordinatı Anlamı */
poly[0]=200; poly[1]=300; /* (200,300) koordinatı */
poly[2]=100; poly[3]=150; /* (100,150) koordinatı */
poly[4]=150; poly[5]=50; /* (150,50) koordinatı */
poly[6]=400; poly[7]=75; /* (400,75) koordinatı */
poly dizisine poligonun tüm koordinatları yerleştirildikten sonra ,
drawpoly (4,poly);
komutu ile poligonun çizimi gerçekleştirilir.Çizilen poligonun şekli ,
(150,50)
(400,75)
(100,150)
(200,300)
Veri Yapıları ve Programlama Ders Notu
drawpoly komutu çizilen poligonu otomatik olarak kapatmaz.Poligonun uçlarının kapatılması
gerekiyorsa son poligon koordinatı olarak poligonun başlangıç koordinatının verilmesi
gerekir.Örneğin yukarıdaki tanımlanan poligonun kapatılması istenirse ;
int poly[8+2];
sekiz elemana ilaveten bir de bitiş koordinatı içeren 10 elemanlı bir dizi tanımlanmasından sonra
,bu elemanlara aşağıdaki şekilde uygun koordinat değerleri atanır.
poly[0]=200; poly[1]=300;
poly[2]=100; poly[3]=150;
poly[4]=150; poly[5]=50;
poly[6]=400; poly[7]=75;
poly[8]=poly[0]; poly[9]=poly[1];
poly dizisine poligonun tüm koordinatları yerleştirildikten sonra ;
drawpoly (5,poly);
komutu ile kapalı bir poligonun çizimi gerçekleştirilir.Çizilen poligonun şekli şöyledir.
(150,150)
(400,75)
(100,150)
(200,300)
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int poly[10];
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası/n”,graphresult);
getch( );
exit(1);
}
poly[0]=200; poly[1]=300;
poly[2]=100; poly[3]=150;
poly[4]=150; poly[5]=50;
poly[6]=400; poly[7]=75;
poly[8]=200; poly[9]=300;
drawpoly(5,poly);
getch( );
exit(1);
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int poly[20];
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası\n”,graphresult);
getch( );
exit(1);
}
poly [0]=50; poly [1]=50;
poly [2]=100; poly [3]=50;
poly [4]=100; poly [5]=100;
poly [6]=150; poly [7]=100;
poly [8]=150; poly [9]=150;
poly [10]=200; poly [11]=150;
poly [12]=200; poly [13]=200;
poly [14]=250; poly [15]=200;
poly [16]=250; poly [17]=250;
poly [18]=300; poly [19]=250;
drawpoly(10,poly);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
ÇİZİM TİPİNİN DEĞİŞTİRİLMESİ
İnitgraph ile grafik sistemi hazır duruma getirildikten sonra yapılan çizimlerde,çizim şekli
kesiksiz-ince bir çizgi şeklindedir.Yani bir doğru parçası çizimi yapıldığında doğrunun çizim tipi
( _____ ) şeklindedir.
bazı grafik uygulamalarında ,örneğin iki boyutlu bir kartezyen koordinat sisteminde aynı eksenler
kullanılarak birden fazla eğrinin çizilmesi durumunda eğrilerin birbirinden ayırt edilmesi zorlaşır.
Bu karışıklıktan kurtulmanın bir yolu,her eğrinin diğerlerinden ayırt edilmesini sağlayacak şekilde
çizim tiplerinin değiştirilmesidir.
farklı çizim tiplerini kullanabilmek için ,programcının çeşitli algoritmalar geliştirerek tüm çizim
komutlarını tekrar düzenlemesi gerekir.Bu da programcı için programın yazımında büyük bir
zaman kaybına ve hatta programın yavaşlamasına sebep olacaktır. Borland Grafik Paketi bu yükü
Veri Yapıları ve Programlama Ders Notu
programcının üstünden kaldırarak çizim tipinin grafik komutları vasıtasıyla kolaylıkla
tanımlanabilir hale getirmiştir.
çizim tipinin değiştirilmesi “setlinestyle” komutu yardımıyla gerçekleştirilir.
void far setlinestyle (int çizimtipi,unsigned patern,int kalınlık);
setlinestyle komutu çizim tipinin ve çizim kalınlığının değiştirilmesini sağlar.Buradaki
parametrelerden sırasıyla çizimtipi çizimin ne tipte olacağını belirten bir tamsayı; patern
kullanıcının kendi çizim tipini tanımlamak istemesi durumunda kullandığı ve yeni çizim tipini
belirten tamsayı kalınlık . Çizimin kalınlığını belirten bir tamsayı değerdir.
Çizim Tipi Parametresi:
Çizim tipi için kullanılabilecek sabit isimler ve bu isimlerin içerdikleri değerler şunlardır.
Adı Sayısal Değeri Çizim Tipi
SOLID-LİNE 0 ___________
DOTTED-LİNE 1 ......................
CENTER-LİNE 2
DASHED-LİNE 3
USERBIT-LİNE 4 ?
Buradaki userbıt-line çizim tip ismi için çizim şekli ancak programcı tanımlandığında belli olur.
Veri Yapıları ve Programlama Ders Notu
Patern parametresi :
Patern parametresi ,grafik sisteminde tanımlı dört tane doğru .izim tipi dışında programcının kendi
çizim tipini tanımlamakta kullandığı değeri içeren parametredir.
Yeni çizim tipi ,2 bayt’lık bir tamsayının bitleri göz önüne alınarak oluşturulur.Örneğin,
(—— .......——......) şeklinde bir çizim tipi ,tanımlanan çizim tipinin her siyah noktası için 16
bitlik alan içinde karşılık gelen bitin 1,her beyaz noktası için de bitin 0 yapılmasıyla tanımlanır.Bu
16 bitlik alan düzeni oluşturulduktan sonra bir işaretsiz tamsayı olarak
Bu 16 bitlik alan düzeni oluşturulduktan sonra bir işaretsiz tamsayı olarak yorumlanır ve elde
edilen bu değer patern değeri olarak verilir.
heksadecimal (16 sayı tabanına göre) 0xEABA
olarak verilen bu tamsayı değerinin bir çizim şekli olarak tanımlanabilmesi ve kullanılabilmesi
için ,evvela çizimtipi parametre değeri için 4 değeri veya USERBIT-LİNE sabit isminin verilmesi
gereklidir.
Kalınlık Parametresi :
Kalınlık parametresi ,çizilen çizginin kalınlığının tanımlandığı bir tamsayı değeridir.Bu parametre
için sadece iki değer tanımlanmıştır.Bunlar;
Adı Değeri Anlamı
NORM-WIDTH 1 1 piksel kalınlığında
THICH-WIDTH 3 3 piksel kalınlığında
1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{ .
int a=DETECT,b;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
setlinestyle(SOLID-LINE,0,3);
line(100,100,400,100);
setlinestyle(SOLID-LINE,0,1);
line(100,110,400,110);
setlinestyle(DOTTED-LINE,0,3);
line(100,140,400,140);
setlinestyle(DOTTED-LINE,0,1);
line(100,150,400,150);
setlinestyle(CENTER-LINE,0,3);
line(100,180,400,180);
setlinestyle(CENTER-LINE,0,1);
line(100,190,400,190);
setlinestyle(DASHED-LINE,0,3);
line(100,220,400,220);
setlinestyle(DASHED-LINE,0,1);
line(100,230,400,230);
setlinestyle(USERBIT-LINE,0xEABA,3);
line(100,260,400,260);
setlinestyle(USERBIT-LINE,0xEABA,1);
-----------------------------------
-----------------------------------
------------------------------------
Veri Yapıları ve Programlama Ders Notu
line(100,270,400,270);
getch( );
closegraph( );
}
ÖRNEK : #include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int i,k;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
k=10;
for(i=0; i<18; i++)
{
setlinestyle(SOLID-LINE,9,3);
line(70+k,70+k,470-k,70+k);
setlinestyle(DOTED-LINE,8,3);
line(470-k,70+k,470-k,470-k);
setlinestyle(CENTER-LINE,7,3);
line(470-k,470-k,70+k,470-k);
setlinestyle(DASHED-LINE,8,3);
line(70+k,470-k,70+k,70+k);
k=k+10;
}
getch( );
closegraph( ); }
Veri Yapıları ve Programlama Ders Notu
BİRLEŞİK ÇİZİM KOMUTLARI
bar
bar3d
pieslice
sector
fillellipse
fillpoly
Bu komutlardan bar ve bar3d ,histogram(çubuk) grafiklerin yapımında ;pieslice,sector ve
fillellipse komutları pay(dilim) grafiklerin yapımında kullanmak üzere tasarlanmışlardır.
Bar Komutu
Bu komut genel anlamda içi doldurulmuş bir dikdörtgenin çizimini gerçekleştirir.dikdörtgenin
içi setfillstyle veya setfillpattern komutu ile belirlenmiş olan tarama deseni ve rengi ile
doldurulur.
void far bar (int x1,int y1,int x2,int y2);
bar komutunda verilen parametreler rectangle komutundakine benzerdir.Bunlar sırasıyla x1,y1
dikdörtgenin sol üst köşesinin koordinatını ,x2,y2 dikdörtgenin sağ alt köşesinin koordinatını
belirtir.
bar komutu rectangle ve floodfill komutlarının birlikte kullanımıyla aşağıdaki gibi ifade edilebilir.
rectangle(x1,y1,x2,y2);
floodfill ((int) ((x1+x2)/2),(int) ((y1+y2)/2),getcolor( ));
(x1,y1)
(x2,y2)
Veri Yapıları ve Programlama Ders Notu
ÖRNEK :#include<stdio.h>
#include<graphics.h>
main( )
{
int a=DETECT,b;
int i,k;
clrscr( );
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası”,graphresult);
getch( );
exit(1);
}
k=10;
for( i=0; i<18; i++)
{
setlinestyle(SOLID-LINE,9,3);
circle(470-k,360-k,k);
k=k+10;
}
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<c:\TC\gekran.c>
main( ) Satranç Tahtası
{
int i,k,m,n;
clrscr( );
graph( );
a=0; k=0; m=0; n=0;
rectangle(0,0,getmaxx( ),getmaxy( ));
for( i=0; i<64; i++)
{
bar (m,n,m+80,n+60);
m+=160;
k++;
if (k= =8)
{ m=80; n+=60; }
if (k= =16)
{ m=0; n+=60; }
if (k= =24)
{ m=80; n+=60; }
if (k= =32)
{ m=0; n+=60; }
if (k= =40)
{ m=80; n+=60; }
if (k= =48)
{ m=0; n+=60; }
if (k= =56)
{m=80; n+=60;}
if (k= =64)
{m=0; n+=60;}
}
getch( );
closegraph( ); }
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : Ekrana rastgele koordinatlarda ,rastgele renkte bar çizen programı yazınız.
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<c:\TC\gekran>
main( )
{
int i;
clrscr( );
randomize( );
graph( );
for ( i=0; i<10; i++ )
{
setcolor(random(14)+1);
setfillstyle(random(12),random(14)+1);
bar(random(639),random(479),random(639),random(479));
getch( );
}
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
bar3d komutu
bar3d komutu,3 boyutlu görünüşe sahip bir dikdörtgenin (bar’ın) çizimi için tasarlanmıştır.
void far bar3d (int x1,int y1,int x2,int y2,int d,int ust);
bar3d’de kullanılan parametreler sırasıyla x1,y1 dikdörtgeninin sol üst köşesinin koordinatını ,
x2,y2 dikdörtgeninin sağ alt köşesinin koordinatını , d dikdörtgeninin piksel sayısı olarak derinliği
ve üst dikdörtgeninin üst kısmının çizilip çizilmeyeceğini belirtirler.Bu parametrelerle 3 boyutlu
dikdörtgenin çizimi aşağıdaki gibi olur.
(x1,y1)
(x2,y2)
d
üst parametresi 0 ‘dan farklı bir değer ise 3 boyutlu bir barın üstü vardır.üst parametresi 0 ise
çizilen 3 boyutlu barın üstü yoktur (açıktır). Bu tür bir kullanımın amacı üç boyutlu bir görünüşe
sahip dikdörtgenlerin üst üste yerleştirilebilmesini sağlamaktır.
y4 bu şeklin çizimi için kullanılan
üst =1 komutlar;
bar3d (x1,y1,x2,y2,20,0);
y3 bar3d (x1,y3,x2,y2,20,0);
üst =0 bar3d (x1,y4,x2,y3,20,1); şeklindedir.
y2
üst =0
y1
x1 x2
yukarıdaki şekilde üst üste üç farklı üç boyutlu dikdörtgen çizimi yapılmıştır.Görüleceği üzere
en alttaki üç boyutlu dikdörtgenin üzerine diğer bir dikdörtgenin çizilebilmesi için alttaki
dikdörtgenin üst kısmının oluşmasını gereklidir.
Bar veya bar3d komutları kullanılarak yapılabilen grafik tiplerine örnek olarak aşağıdaki
Histogram Grafikler verilebilir.
Veri Yapıları ve Programlama Ders Notu
93 Kıyas KAYAALP
(a) bar ile (b) bar ile
1 2 3 4 1 2 3 4
(c) bar3d ile (d) bar3d ile
1 2 3 4 1 2 3 4
Örneğin burada x-ekseni yılları,y-ekseni kâr miktarını göstermek üzere (a) ve(c) yıllara göre
toplam kâr miktarını , (b) ve (d) ise yıllara göre toplam kârda üç şirketin payı bu tip
grafiklerle oldukça kolay ifade edilebilir.
Veri Yapıları ve Programlama Ders Notu
ÖRNEK :#include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
clrscr( ); desen şekli
graph( ); desen rengi
setcolor(12); setfillstyle(5,6);
bar3d(100,400,150,450,15,0);
setcolor(6);
setfillstyle(8,7);
bar3d(100,300,150,400,15,0);
setcolor(9);
setfillstyle(5,7);
bar3d(100,250,150,300,15,0);
setcolor(3);
setfillstyle(1,8);
bar3d(100,150,150,250,15,1);
setcolor(6);
setfillstyle(7,7);
bar3d(200,100,250,450,15,0);
setcolor(15);
setfillstyle(11,3);
bar3d(300,150,350,450,15,1);
getch( );
closegraph( );
}
ÖDEV :
Veri Yapıları ve Programlama Ders Notu
Pieslice Komutu
Histogram grafiklerinden başka sıkça kullanılan diğer bir grafik tipi de pay-dilim (pie)
grafikleridir.Pay grafikler bir daire %100’ü göstermek üzere olayların bu yüzde içinde etkin
olduğu orana göre dairenin dilimlere ayrılmasıyla oluşturulmuş grafiklerdir.
%15 %52
%11 %11
%11
Pay grafiklerinin hazırlanması için Borland Grafik Paketinde bulunan pieslice komutundan
yararlanılır.
void far pieslice (int x, int y,int aci1,int aci2,int r);
pieslice komutu arc komutunun parametrelerine benzerdir.Pieslice x,y merkez koordinatlı
açı1’den başlayıp açı2’de son bulan r yarıçaplı daire dilimi çizer.Daire diliminin içi
setfillstyle veya setfillpattern komutu ile belirlenmiş olan tarama deseni ve rengi ile
doldurulur.
90o
180o 0o
360o
270o
Bu komut arc,getarccoords,line ve floodfill komutların birlikte kullanımıyla yapılmıştır.
açı2
r
açı1
(x,y)
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
clrscr( );
graph( );
getcolor(1);
setfillstyle(9,4);
pieslice(320,240,0,75,150);
setfillstyle(9,6);
pieslice(320,240,75,105,150);
setfillstyle(9,3);
pieslice(320,240,105,175,150);
setfillstyle(9,5);
pieslice(320,240,175,225,150);
setfillstyle(9,8);
pieslice(320,240,225,287,150);
setfillstyle(9,7);
pieslice(320,240,287,360,150);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
sector Komutu
Pieslice komutunun elipsler için uyarlanmış şekli fillellipse ve sector komutlarıdır.İçi dolu bir
elips diliminin çizimi istenirse sector komutu kullanılır.
void far sector (int x, int y, int aci1, int acı2, int rx, int ry);
Bu komutun parametreleri ellipse komutunun parametreleri ile aynıdır.Sırasıyla x,y elips
diliminin merkez koordinatını , acı1 ve acı2 elips diliminin başlangıç ve bitiş açılarını , rx
elipsin x-yönündeki , ry ise y-yönündeki yarıçapıdır.
90o
0o
180o 360o
270o
sector komutu ellipse, getarccoords,line ve floodfill komutlarının birlikte kullanımıyla
yapılmıştır.
ry
açı2
açı1
(x,y) rx
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
clrscr( );
graph( );
setcolor(1);
setfillstyle(2,4);
sector(320,240,0,75,100,180);
setfillstyle(3,6);
sector(320,240,75,105,100,180);
setfillstyle(4,3);
setcolor(320,240,105,175,100,180);
setfillstyle(5,5);
sector(320,240,175,225,100,180);
setfillstyle(6,8);
sector(320,240,225,287,100,180);
setfillstyle(7,7);
sector(320,240,287,360,100,180);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
FillEllipse Komutu
Fillellipse komutu tam bir elips çizerek setfillstyle veya setfillpattern komutu ile belirlenmiş
olan tarama deseni ve rengi ile doludur.
void far fillellipse (int x, int y, int rx, int ry);
0o
360o
Bu komutun benzeri ellipse ve floodfill komutlarının birlikte kullanılmasıyla yapılabilir.
ellipse (x,y,0,360,rx,ry);
floodfill (x,y,getcolor( ));
ÖRNEK : #include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
clrscr( );
graph( );
setcolor(15);
setfillstyle(7,4);
fillellipse(100,400,50,80);
setfillstyle(3,6);
fillellipse(250,360,80,120);
setfillstyle(4,3);
fillellipse(450,300,100,180);
getch( );
closegraph( );
}
ry
(x.y) rx
Veri Yapıları ve Programlama Ders Notu
Fillpoly Komutu
Fillpoly komutu içi taralı poligonların çiziminde kullanılır.Fillpoly’nin kullanımı drawpoly
komutu ile aynıdır.Tek fark poligon içinin tarama deseni ile doldurulmasıdır..Poligonun içi
doldurulacağından poligonun kapalı olması gerekir.
void far fillpoly (int nokta-sayisi, int far *nokta-koord);
burada nokta-sayisi parametresi poligonu meydana getiren köşe noktalarının sayısını noktakoord
ise bu noktaların koordinatlarını içeren diziyi gösteren bir pointer’dır.
int poly [10];
poly [0]= 200; poly [1]= 300; /* (200,300) koordinatı */
poly [2]= 100; poly [3]= 150; /* (100,150) koordinatı */
poly [4]= 150; poly [5]= 50; /* (150,50) koordinatı */
poly [6]= 400; poly [7]= 75; /* (400,75) koordinatı */
poly [8]= poly [0]; poly [9]= poly [1] /* başlangıcı koordinatı */
fillpoly (5,poly);
(150,50)
(400,75)
(100,150)
(200,500)
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
int ali [22];
clrscr( );
graph( );
ali[0]=40; ali[1]=0;
ali[2]=30; ali[3]=25;
=10; =25;
=25; =40;
=20; =60;
=40; =48;
=60; =60;
=55; =40;
=70; =25;
=50; =25;
=40; =0;
setcolor (4);
setfillstyle (9,9);
fillpoly (11,ali);
getch ( );
closegraph ( );
}
Veri Yapıları ve Programlama Ders Notu
GRAFİK YAZI KOMUTLARI
Borland Grafik Paketinde metin ekranı ile grafik ekran birbirinden farklıdır.Bu yüzden,grafik
ekranda C’de printf veya buna benzer komutlarla metin ekranında yazı yazmak EGA ve VGA
hariç diğer grafik sistemleri için mümkün değildir.
Borland Grafik sistemindeki bu durumdan dolayı grafik ekranda yazı yazımı için özel
teknikler kullanılır.
Bunlar ;
a- Nokta Temelli Karakter Tanımlama Tekniği
b- Vektör Temelli Karakter Tanımlama Tekniği
Bu tekniklerle çeşitli karakter setlerinin oluşturulması ve kullanımı oldukça zahmetli ve sıkıcı
bir işlemdir.Borland Grafik Paketi bu yükü programcının üzerinden kaldırmak için yukarıdaki
iki tekniğinde kullanıldığı 11 çeşit karakter setini programcılara hazır olarak sunmuştur.Bu
karakter font setleri ,oluşturulan yazı tipine uygun olarak verilen bir isimle “.CHR”
uzantısıyla HDD depolanmıştır.
Bu dosyalara kısaca Karakter Font Dosyaları denir.
Yazım Özelliklerinin Belirlenmesi
Yazım işlemine geçmeden önce ,yazım ile bilgilerin grafik sistemine bildirilmesi
gerekir.Yazım ile ilgili bilgiler üç tanedir.
Metnin font tipi
Yazım yönü
Büyüklüğü
Bu özelliklerin grafik sistemine bildirilmesi “settextstyle” komutu ile yapılır.
void far settextstyle (int font, int yon, int boyut);
settextstyle komutu ile ekrana yazılacak olan metnin , hangi font tipi,kullanılarak ,hangi
yönde ve hangi büyüklükte basılacağı belirtilir.
Bu komut kullanıldıktan sonra her yazım işleminde ,verilen bu bilgiler kullanılır.
veri ve Programlama Ders Notu
Font :
Metnin ekrana basımında kullanılacak olan font karakter dosyasını belirten tamsayı bir
değerdir.
İsmi Değeri Bulunduğu Dosya İsmi
DEFAULT-FONT 0 ---------------
TRIPLEX-FONT 1 TRIP.CHR
SMALL-FONT 2 LITT.CHR
SANS-SERIF-FONT 3 SANS.CHR
GOTHIC-FONT 4 GOTH.CHR
Settextstyle komutunda font için ,örneğin 1 veya bunun sembolik ismi olan C’de TRIPLEXFONT
kullanıldığında TRIP.CHR dosyası bulunduğu yerden bir defalık belleğe yüklenir.
Program içerisinde settextstyle komutu verilmediği halde yazım yapılırsa , bu durumda font
tipi olarak grafik sistem içinde hazır olarak bulunan ve DEFAULT olarak isimlendirilen font
seti kullanılır.
Yön :
Bu parametre ,metnin ekranda hangi yönde basılacağını belirten bir tamsayı değerdir.Metin
yatay (0) yazılacaksa soldan sağa ,dikey (1) yazılacaksa aşağıdan yukarı doğru olur.
Adı Değeri
HORIZ-DIR 0 yatay
VERT-DIR 1 dikey
Programda yazının yönü belirlenirken adı veya değeri kullanılır.
Boyut :
Boyut parametresi ,metnin ekrana basılması sırasında karakterlerinin hangi büyüklükte
olacağını belirleyen bir tamsayı değerdir.Bu tamsayı değer 1-10 arasında değişebilir.Boyut
için 1 kullanılırsa ,metnin karakterleri font dosyasında tanımlandığı şekilde gerçek boyutunda
basılır.Eğer 4 kullanılırsa ,metnin karakterleri gerçek boyutun 4 katı büyüklüğünde basılır.
Veri Yapıları ve Programlama Ders Notu
Eğer karakter boyutunun bire-bir oranından farklı bir oranda büyütülmesi istenirse;örneğin
boyu sabit kalırken eninin büyütülmesi veya eni sabit kalırken boyunun büyütülmesi gibi bu
durumda settextstyle komutuna ilaveten “setusercharsize” komutu kullanılır.
Setusercharsize ile tanımlana karakter büyütme oranının geçerli olabilmesi için settextstyle
‘de boyut parametresi için “0” veya “USER-CHAR-SİZE” isminin kullanılması gerekir.
void far setusercharsize (int carpx, int bolx, int carpy, int boly);
karakterlerin yükseklik ve genişliği için büyütme oranlarının hesabı ;
Genişlik için Büyütme Faktörü =
bolx
carpx
Yükseklik için Büyütme Faktörü =
boly
carpy
formülü ile yapılır.
Örneğin,karakterlerin yüksekliğini %100 oranında büyütmek ve genişliğini ise %50 oranında
küçültmek istenilirse ;
Eni için
bolx
carpx
=
2
1
( %50 azalış )
Boy için
boly
carpy
=
1
2
( %100 artış)
Bu oranların grafik sistemine aktarılması ;
settextstyle ( font ,yon , USER-CHAR-SİZE);
setusercharsize (1,2,2,1);
komutları ile yapılır.
setusercharsize komutu sadece .CHR font dosya karakterlerine uygulanabilir. DEFAULT
font seti karakterlerine uygulanamaz.
Veri Yapıları ve Programlama Ders Notu
Metnin Ekrana Yazımı
Outtext komutu :
Outtext komutu,grafik imlecin bulunduğu yeri referans noktası kabul ederek verilen metni
ekrana basar.
void far outtext (char far *metin);
ilk olarak metnin basılacağı referans noktası moveto ile belirlenir ve sonra outtext komutu
uygulanır.Eğer referans noktası moveto ile belirlenmediyse,o anda grafik imleç nerede
bulunuyorsa ,yazım bu noktaya göre yapılır.
ÖRNEK : moveto (50,100);
outtext (“UMYO”);
Bu komutların icrası sonunda ,eğer settextstyle’de yazım yönü düşey olarak verildi ise
aşağıdaki şeklin solundaki gibi,yatay olarak belirlendi ise aşağıdaki gibi bir ekran çıktısı
oluşur.
Eğer yazım için *.CHR dosyalarından biri kullanılıyorsa ekrana basılacak metin çizim için
tanımlanan ekran alanı sınırlarını aştığında aşan kısımları kesilir.Eğer yazım için DEFAULT
font dosya karakterleri kullanılıyorsa ekrana basılacak metin ekran sınırlarını aştığında metnin
hiçbir karakteri yazılmaz.
(500,100) (50,100)
. .
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
clrscr( );
graph( );
moveto(0,0);
settextstyle(DEFAULT_FONT_HORIZ_DIR,1);
outtext(“yatay default_font”);
moveto(0,15);
settextstyle(1,0,1);
outtext(“yatay triplex font”);
moveto(0,40);
settextstyle(2,0,4);
outtext(“yatay small font 4 kat büyütülmüş”);
moveto(0,70);
settextstyle(3,0,1);
outtext(“yatay sans serif font”);
moveto(0,100);
settextstyle(4,0,1);
outtext(“yatay gothic font”);
moveto(20,200);
settextstyle(DEFAULT_FONT ,1,1);
outtext(“dikey default_font”);
moveto(50,200);
settextstyle(1,1,1);
outtext(“dikey triplex font”);
moveto(90,200);
settextstyle(2,1,4);
outtext(“dikey small font 4 kat buyutulmus”);
moveto(120,200);
Veri Yapıları ve Programlama Ders Notu
settextstyle(3,1,1);
outtext(“dikey sans serif font”);
moveto(150,200);
settextstyle(4,1,1);
outtext(“dikey gothic font”);
moveto(200,0);
settextstyle(1,0,USER_CHAR_SIZE);
setusercharsize(1,2,2,1);
outtext(“triplex font yukseklık %100 arttı,genişlik %50 azaldi”);
moveto(0,130);
settextstyle(1,0,USER_CHAR_SIZE);
setusercharsize(2,1,1,2);
outtext(“triplex font yukseklık %100 artti,genişlik %50 azaldi”);
getch( );
closegraph( );
}
Outtextxy Komutu
Outtextxy komutu outtext komutuna benzerdir.Aralarındaki tek fark ,outtext grafik imlecin
yerini değiştirirken outtextxy’nin değiştirmemesidir.Bu komut ,metni ekrana basmak için
grafik imlecin konumunu referans nokta olarak almaz.Metni nereye basacağını parametre
listesinde belirler.
void far outtextxy (int x, int y, char far *metin);
outtextxy komutundaki parametrelerden ilk ikisi x ve y,basılacak metnin ekrandaki referans
noktasını ,metin ise basılacak metni belirtir.
Veri Yapıları ve Programlama Ders Notu
Metnin Referans Noktasının Neresine Basılacağının Belirlenmesi
Programcı metni,referans nokta etrafında istediği yere “settextjustify” komutunu kullanarak
bastırabilir.
void far settextjustify (int yatay, int düşey);
Hiçbir yazım özelliği verilmeden ,
outtextxy (50,100,”UMYO”);
Komutu kullanıldığında çıkış,verilen (50,100) referans noktasının sağ-alt tarafına yapılır.
Referans noktası
Eğer programcı referans noktasını bu şekilde kullanmak istemezse , settextjustify komutu
vasıtasıyla metni referans nokta etrafında sağa-sola ve aşağı-yukarı şeklinde iki yönlü olarak
hareketini belirleyerek , metnin konumunu ayarlar.Settextjustify komutundaki yatay ve düşey
parametreleri , metnin konumunu ayarlayan tamsayı değerlerdir.Bunların alabileceği değerler
ve bu değerleri gösteren sabit isimler şöyledir.
UMYO
Veri Yapıları ve Programlama Ders Notu
Yatay için :
Komut Değeri Anlamı
LEFT-TEXT 0 Ref. Noktası metnin solunda
CENTER-TEXT 1 Ref. Noktası metnin ortasında
RIGHT-TEXT 2 Ref. Noktası metnin sağında
Dikey için :
Komut Değeri Anlamı
BOTTOM-TEXT 0 Ref. Noktası metnin altında
CENTER-TEXT 1 Ref. Noktası metnin ortasında
TOP-TEXT 2 Ref. Noktası metnin üstünde
Şematik olarak:
TOP-TEXT
CENTER-TEXT
BOTTOM-TEXT
LEFT-TEXT CENTER-TEXT RIGHT-TEXT
Veri Yapıları ve Programlama Ders Notu
ÖRNEKLER :
1- Referans noktası metnin yatayda sağında ,dikeyde ortasında ise ,
Settextjustify (RIGHT-TEXT , CENTER-TEXT);
Outtextxy (300,200,”UMYO”);
300
200
2- Referans noktası metnin yatayda orta, düşeyde ise üstünde kalmaktaysa ,
settextjustify (CENTER-TEXT , TOP-TEXT);
outtextxy (300,200,”UMYO”);
300
200
UMYO
--------------------
UMYO
Veri Yapıları ve Programlama Ders Notu
3- Referans nokta metnin yatayda ve düşeyde ortasında kalıyorsa ,
settextjustify (CENTER-TEXT , CENTER-TEXT);
outtextxy (300,200,UMYO);
300
200 ------ --------UM YO
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<stdio.h>
#include<c:\tc\gekran.c>
main( )
{
clrscr( );
graph( );
settextjustify (LEFT_TEXT_TOP_TEXT);
outtextxy (0,0,”kursor sol taraf ust”);
settextjustify (LEFT_TEXT_CENTER_TEXT);
outtextxy (0,100,”- kursor sol taraf ORTA”);
settextjustify (LEFT_TEXT_BOTTOM_TEXT);
outtextxy (0,200,”_ kursor sol taraf ALT”);
settextjustify (RIGHT_TEXT_TOP_TEXT);
outtextxy (600,0,” kursor sag taraf ust ”);
settextjustify (RIGHT_TEXT_CENTER_TEXT);
outtextxy (600,100,” kursor sag taraf ORTA-”);
settextjustify (RIGHT_TEXT_BOTTOM_TEXT);
outtextxy (600,200,” kursor sag taraf ALT_”);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
Metnin Ekrana Basımında Grafik İmleç Konumunun Değişimi
Bir metnin ekrana basımından sonra grafik imlecin konumu , her zaman değişmez.Grafik
imlecin yerinin değişimi settextjustify’de verilen parametre değerlerine bağlıdır.
Settextjustify komutu grafik kursorünün yerini sadece aşağıdaki şartlar sağlandığında
değiştirilir.
Settextstyle’de yön parametresi için 0 veya HORIZ-DIR kullanılır.
Settextstyle’de yatay parametresi için 0 veya LEFT-TEXT kullanılır.
Metin yazımı için outtext kullanması ile olur.
ÖRNEKLER :
a) moveto (200,100);
settextstyle (TRIPLEX_FONT , HORIZ_DIR,1);
settextstyle (LEFT_TEXT , TOP_TEXT);
outtext (“UMYO”);
referans noktası yeni koordinat
b) moveto (200,100);
settextstyle (TRIPLEX_FONT , HORIZ_DIR ,1);
settextstyle (LEFT_TEXT , CENTER_TEXT);
outtext (“UMYO”);
referans noktası yeni koordinat
---------- UMYO
------------- UMYO
Veri Yapıları ve Programlama Ders Notu
Metin Boyutlarının Belirlenmesi
Ekrana basılacak olan metnin ,piksel değeri olarak belirli bir eni ve boyu vardır.Bu değerler ,
settextstyle ve settextjustify ile verilen metin özelliklerine göre değişir.Örneğin “UMYO”
metininin TRIPLEX font tipine göre belirli bir uzunluk ve yükseklik değeri vardır.Font tipi ve
boyutu değiştirildiği vakit aynı metin farklı boyutlara sahip olur.
TextHeight Komutu
int far textheight (char far *metin);
Aktif olan font tipi ve büyütme faktörüne göre verilen metnin piksel olarak yüksekliğini
verir.Örneğin büyültme faktörü 1 olan DEFAULT font için textheight 8 değerini verir.
UMYO
Bu komutun kullanılabileceği yerler;
Ekrana basılacak olan metnin satırları arasındaki boşlukların ayarlanmasında
Metnin etrafına bir çerçevenin çizilmesinde
Çizim alanının yüksekliğinin bulunmasında .
TextWidth Komutu
int far textwidth (char far *metin);
Aktif olan font tipi ve büyütme faktörüne göre verilen metnin piksel olarak genişliğini verir.
UMYO
| |
Bu komutun kullanılabileceği yerler ;
Ekrana basılacak olan metnin satır genişliklerinin ayarlanmasında
Metnin etrafına bir çerçevenin çizilmesinde
Çizim alnının genişliğinin bulunmasında.
Veri Yapıları ve Programlama Ders Notu
ÇİZİM RENKLERİNİN SEÇİMİ
Grafik çizimlerde 2 tip renk belirlenmesi yapılır.Bunlar ;
Zemin rengi
Çizim rengi
İnitgraph ile grafik sistemi açıldığında başlangıçta zemin rengi için siyah , çizim rengi için
beyaz kullanılır.
Çizimin Yapıldığı Zemin Renginin Belirlenmesi
Renk paletlerindeki birinci renk daima zemin rengini belirtir.Başlangıçta ,palette bu renk
büyük bir olasılıkla siyahtır.Çizime başlamadan önce zemin rengi “setbkcolor”
Komutu kullanılarak paletteki renklerden biri ile değiştirilebilir.
void far setbkcolor (int renk);
ÖRNEK : setbkcolor (1);
Çizim Renginin Belirlenmesi
Çizim rengi grafik sisteminin sahip olduğu paletten bir rengin seçilmesiyle belirlenir.Çizim
renginin belirlenmesi için “setcolor” komutu kullanılır.
void far setcolor (int renk);
ÖRNEK : setcolor (2);
Restorecrtmode Komutları
void far restorecrtmode (void);
restorecrtmode komutu , grafik ekrandan çıkmadan geçici olarak metin ekranına geri dönüşü
sağlar.Grafik ekranından metin ekranına geçişte , ekran modunu initgraph komutu
çalıştırılmadan önceki durumuna getirir.Bu sırada grafik ekran silinir.
Veri Yapıları ve Programlama Ders Notu
Bu iki komutun kullanımı aşağıdaki program yapısı ile gösterilebilir.
main( )
{
/*...........................Metin Ekranı ............................*/
.
.
.
/*......................Grafik Ekrana Geçiş.......................*/
initgraph (&a,&b,” “);
.
.
.
/*...............Tekrar Metin Ekranına Geçiş................*/
restorecrtmode( );
.
.
.
/*..............Grafik Ekrana Geri Dönüş.....................*/
setgraphmode(getgraphmode( ));
.
.
.
/*..........Grafik Ekranın Kapatılması ve Metin Ekrana Dönüş..........*/
closegraph( );
/*.............................Metin Ekranı..........................*/
.
.
.
}
Veri Yapıları ve Programlama Ders Notu
Getgraphmode Komutu
Getgraphmode komutu , sistemde aktif olan grafik modunu öğrenmek için kullanılır.Bu
komut , grafik sisteminin hangi moda sahip olduğunu belirleyerek bu moda ait bir tamsayı
değeri verir.
int far getgraphmode (void);
Setgraphmode Komutu
Setgraphmode komutu , grafik sistemini kapatılıp açılmasına gerek olmadan doğrudan
kullanılmakta olan grafik modunun değiştirilmesini sağlar.
void far setgraphmode (int modno);
Hangi modun aktif hale getirileceği modno ile belirlenir.Modno parametresi , grafik
adaptörün desteklediği modlardan birini belirten bir tamsayı değerdir.
Bu komut çalıştırıldığında sırasıyla üç işlemi yerine getirir.
1) Grafik sisteminin modunu değiştirir.
2) Grafik ekranı siler.
3) Graphdefaults komutunu çalıştırır.
Graphdefaults Komutu
Bir grafik çalışmasına başlandığında çizim şekli ve rengi bilgileri , zemin renk bilgisi , yazım
tipi , yönü ve boyutu bilgileri ,alan doldurma deseni ve rengi bilgileri ve grafik imlecin
konumu bilgileri için aksi belirtilmedikçe grafik sistemi içinde bulunan hazır değerler
kullanılır.Bunlar grafik sistemi tarafından belirlenmiş başlangıç değerleridir.Daha sonra bu
bilgiler , programcı tarafından programın akışına ve yapılan çizimin amacına göre yeri
geldiğinde değiştirilir.Programın bir noktasında değeri değiştirilen bu bilgilerin başlangıç
değerlerine ihtiyaç duyulursa , başlangıç değerlerin ayrı ayrı komutlar kullanılarak grafik
sistemine aktarılması yerine “graphdefaults”komutunun kullanımı tercih edilir.Bu komut
sözü edilen tüm özelliklerin , grafik adaptörünün açılışındaki başlangıç değerlerini almasını
sağlar.
void far graphdefaults (void);
Veri Yapıları ve Programlama Ders Notu
ÖRNEK : #include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
main( )
{
int a=DETECT,b;
int x,y;
initgraph(&a,&b,” “);
if(graphresult( )!=grOk)
{
printf(“%d nolu grafik hatası /n”,graphresult);
getch( );
exit(1);
x=getmaxx( )/2;
y=getmaxy( )/2;
settextjustify (CENTER_TEXT , CENTER_TEXT);
outtextxy(x,y,”Grafik Ekrandan Çıkış için bir tuşa basınız”);
getch( );
restorecrtmode( );
printf(“Şu Anda Metin Ekranındasınız”);
printf(“Grafik Moda Dönüş için tekrar bir tuşa basınız”);
getch( );
setgraphmode(getgraphmode( ));
settextjustify (CENTER_TEXT , CENTER_TEXT);
outtextxy(x,y + textheight (“w”), “Çıkış için bir tuşa basınız”);
getch( );
closegraph( );
}
Veri Yapıları ve Programlama Ders Notu
EKRAN GÖRÜNTÜ DÜZENLENMESİ
Cleardevice Komutu
Cleardevice komutu , grafik ekranın tamamını siler.Silme işlemi,tüm piksellere zemin
renginin verilmesiyle olur.
void far cleardevice (void);
Ekranın silinmesinden sonra grafik imleç, ekranın (0,0) koordinatına taşınır.
Setviewport Komutu
Setviewport komutu , grafik ekranda bir grafik pencerenin tanımlanmasında
kullanılır.Başlangıçta tüm ekran getmaxx+1 genişliğinde ve getmaxy+1 yüksekliğinde bir
grafik penceredir.Yapılan tüm çizimler bu pencere içinde gerçekleştirilir.Programcı ihtiyaç
duyduğunda bu grafik pencerenin boyutlarını değiştirerek daha küçük boyutlara sahip bir
alanda çizim yapabilir.
void far setviewport (int x1, int y1, int x2 ,int y2, int kesme);
Yukarıda verilen setviewport parametresinde x1,y1,x2,y2 pencere boyutlarının
belirlenmesinde , kesme parametresi ise çizimin pencere dışına taşan kısımlarının kesilip
kesilmeyeceğine karar verilmesinde kullanılır.
Setviewport’un iki tür kullanımı vardır ;
1. Grafik ekranın (0,0) koordinatının (orijinin) ekranda başka bir yere taşınması
2. Grafik ekran içinde grafik pencerenin tanımlanması.
Veri Yapıları ve Programlama Ders Notu
YENİ BİR GRAFİK PENCERESİNİN TANIMLANMASI
Tüm grafik ekran içinde daha küçük bir grafik ekranının tanımlanmasıdır.Tanımlanan bu
alana grafik pencere denir.Tanımlanan grafik penceresi , boyutları haricinde tüm ekranın
sahip olduğu özelliklere sahiptir.Grafik ekranı, sınırlarından taşan çizimler kesildiği gibi,
grafik penceresi dışına taşan çizimlerde sınırlarda kesilir.
Setview ile bir grafik pencerenin tanımlanması için verilen parametrelerin olması gereken
değerler şöyle olmalıdır ;
x1,y1 : tanımlanan yeni grafik pencerenin sol üst köşesinin ana ekran üzerindeki sağ alt
köşesinin koordinatı.
x2,y2 : x1 x2 ve y1 y2 şartına göre yeni grafik ekranın ana ekran üzerindeki sağ alt
köşesinin koordinatı.
0 x1 x2
0 y1 y2
şartını sağlanması gerekir.
Kesme : 0 dan farklı herhangi bir değer (1 olarak alacağız)
Setviewport (x1,y1,x2,y2,1);
Şeklinde tanımlanan grafik penceresi aşağıdaki şekilde gösterilmiştir.
x1 x2
y1
y2
(x1,y1)
(x2,y2)
Veri Yapıları ve Programlama Ders Notu
Bu pencerenin tanımlanmasından sonra yapılan tüm çizimler artık bu pencere içinde
olacaktır.setviewport ile ekranda (x2-x1) genişliğinde ve (y2-y1) yüksekliğinde tanımlanan
ekran alanın özellikleri önceden kullanılan tüm grafik ekranın sahip olduğu özelliklerle
aynıdır.Farklı olan tek şey çizim alanının boyutlarıdır.Yeni grafik penceresi
tanımlandıktan sonra yeni orijin ,yeni pencerenin sol üst köşesidir.
Yapılan çizimlerin tanımlanan grafik pencerenin sınırlarını aşması halinde aşan kısımlar
sınırlarda kesilecektir.
Yapılan çizimlerin ekran sınırlarında kesilmesine karşın , grafik imleç için böyle bir durum
söz konusu değildir.Grafik imlecin yeri grafik pencere sınırlarını aşabilir.
ÖRNEK : setviewport (100,100,250,180,1);
moveto (10,60);
lineto (180,20);
100 200
100
grafik imlecin yeni konumu
çizilmeyen kısım
180
(0,0) (180,20)
Veri Yapıları ve Programlama Ders Notu
grafik pencere sınırları dışında kalan grafik imlecin konumu , çizimler için bir referans
noktası olarak kullanılabilir.
ÖRNEK : setviewport (100,100,250,180,1);
moveto (10,60);
lineto (180,20);
lineto (180,40);
lineto (40,60);
lineto (-10,100);
grafik imlecin son konumu
setviewport ile tanımlanan pencerenin iptal edilip ana ekrana dönülmek istenmesi durumunda
tekrar setviewport komutu kullanılır.
Clearviewport Komutu
Clearviewport komutu , ana grafik ekran için hazırlanmış olan cleardevice komutunun grafik
pencerelere uygulanmış halidir.
void far clearviewport (void);
clearviewport , ana grafik ekranında setviewport ile tanımlanmış olan grafik pencerenin içini
zemin rengini kullanarak siler.Grafik imleci , grafik pencerenin sol üst köşesi olan (0,0)
koordinatına taşır.
Veri Yapıları ve Programlama Ders Notu
Kaynaklar
< Bu mesaj bu kişi tarafından değiştirildi t_arslan -- 29 Mayıs 2006; 0:02:08 >