Türkçe Forum - Girburaya.net

Geri git   Türkçe Forum - Girburaya.net > Webmaster > Programlama > C ve C++
Kayıt ol Yardım Üye Listesi Ajanda Arama Bugünki Mesajlar Bütün Forumları okunmuş kabul et

C ve C++ C ve C++ Hakkında Aradığınız Herşey.. C ve C++ Kodları..

Yeni Konu aç  Cevapla
 
LinkBack Seçenekler
Alt 12-27-07, 12:32   #1 (permalink)
DeJiN
 
Mesajlar: n/a
Standart c++ 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











İ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[i]);
}
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( );
}
Ö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[i]);
}
max=a[0];
for( i=1; i<1726; i++)
if (max<a[i]);
max=a[i];
printf(“En büyük sayı = %d \n”, max);
getch( );
}



















Ö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[i] );
for (i=0; i<4; i++)
for ( j=i+1; j<5; j++)
if ( a[i] < a[j] )
{
gec = a[i];
a [i] = a[j];
a [j] = gec;
}
for (i=0; i<5; i++)
printf ( “ %d\n”,a[i]);
getch( );
}










Ö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 [i] ) ;
}
for ( i=0; i<5; i++)
printf (“%d. kişinin adı = % s \ n”, i+1, ad [i] ) ;
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.







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çin-
deki 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 ( ) ;
}






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

Ö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[i] );
}
printf ( “ \n \n”);
for ( i =1; i<7; i++)
printf (“%d.sayı = %d \n”, i, *z++);
getch ( );
}



Ö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( );
}

















Ö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.



























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




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





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














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















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













Ö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.







Ö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.















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




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.








Ö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.











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.


Ö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( );
}


















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











Ö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.





























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












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

















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





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.










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




















Ö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.







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.






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.

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.











Ö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( );
}



Ö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( ); }
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.








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
Gönderilecek değer
Verinin
2’lik değeri
27
26
25
24
23
22
21
20
Led No 8 7 6 5 4 3 2 1



Yakıla-
cak

LED X 20 = 1
X 21 = 2
X 22 = 4
X 23 = 8
X 24 = 16
X 25 = 32
X 26 = 64
X 27 = 128






















Ö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



Ö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 [i] ) ;
delay (1000);
}
for (i = 3 ; i ≥ 0 ; i + t)
{
output ( 0x378 , a [i] )
delay (1000),
}
getch ( ) ;
}















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
Gönderilecek değer
Display segmenti
g f e d c b a
Yanacak Rakam
27
26
25
24
23
22
21
20
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



























Ö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 [i] ) ;
delay (1000);
}
getch ( ) ;
}































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,graphdefa ults
b. cleardevice,setviewport komutu,clearviewport komutu

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.


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







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






Ö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( );
}
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.
Ö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( );
}













Ö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





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) . 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.











Ö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( );
}













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)














Ö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( );
}
Ö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( );
}













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





Ö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.




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










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








Ö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( );
}




















Ö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( );
}




Ö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( );
}

















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






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.













Ö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( );
}


























Ö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( );
}












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.















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 ;





(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);

















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







Ö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( );
}






Ö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.





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)










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( );
Ö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 ( );
}

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( ));




Ö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( );
}









Ö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( );
}








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