14 Ocak 2014 Salı
VERİ YAPILARI 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
Ö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.
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder