7 Temmuz 2014 Pazartesi

Assembly Dilinde Klavyeden Cümle Girme (asm)

Emu8086 da oldukça basit bir şekilde derlenip çalıştırılabilecek program: 

; You may customize this and other start-up templates; 
; The location of this template is c:\emu8086\inc\0_com_template.txt

org 100h

.model small
.stack 64
.data

snc db 10,13,’ ’,’$’,10,13          ; sonuc icin ayrilan alan

.code

mov     ax,@data
mov     ds,ax
mov     es,ax

dizi_al:
mov     ah,01                         ;klavyeden karakter isteniyor
int       21h                            ;girilen al’de

cmp     al,13                          ;al’deki değeri enter ile karşılaştır
jz        yaz                            ;enter’e basılmışsa yaz’a atla

inc       si                              ;si ile kelime içinde bir sonraki karaktere ilerle

cmp     al,61h                         ;al içindeki değerle a=61h karşılaştır
jg        degis                          ;girilen değerden buyukse degis’e atla
jl         sbt                             ;girilen değerden kucukse sbt’e atla

degis:
sub       al,20h                        ;al değerinden 20h çıkar

sbt:
sub       al,0h                          ;al değerinden 0h çıkar

mov      [snc+si],al                  ;kelime içerisinde sıradaki harfe son al değerini yukle

jmp       dizi_al                        ;dizi başlangıcına atla 

yaz:
mov      ah,09h                       ;ekrana snc’de tutulan değer yazılıyor
lea       dx,snc 
int       21h 

dosa:                                     ;programı terket
mov     ah,4ch 
int       21h 
end


ret




Assembly Dilinde Büyük Harfi Küçük Harfe Dönüştürme (asm)

Emu8086 programı ile çok rahat bir şekilde derlenip çalıştırılabilecek bir kod örneği: 

org 100h

.model tiny
.data
titlex db "BUYUk KARAKterLER DONUSTURULMUS OLMALI$"
.code
program:
mov ax,@data
mov ds,ax
lea bx,titlex
mov cx, 38                                                                                      
basla:
mov ah,[bx]
cmp ah,61h
jA B30

cmp ah,41h   
jb B30
;and ah,11011111B
add ah,20h
mov [bx],ah
B30:
inc bx
loop basla
mov dx, offset titlex
mov ah,09
int 21h
mov ah,4ch
int 21h
end program

ret




Adres Çözümleme Protokolü (ARP)

Adres Çözümleme Protokolü (ARP)


Adres Çözümleme Protokolü (ARP)

Adres Çözümleme Protokolü (ARP), RFC 826 "Address Resolution Protocol (ARP)" belgesinde tanımlanan gerekli bir TCP/IP standardıdır. ARP, TCP/IP tabanlı yazılımların kullandığı IP adreslerini LAN donanımları tarafından kullanılan ortam erişim denetim adreslerine çözümler. ARP, aynı fiziksel ağ üzerinde yer alan ana bilgisayarlara aşağıdaki iletişim hizmetlerini sağlar.
  • Ortam erişim denetim adresleri "Ekteki IP adresiyle yapılandırılmış olan aygıtın ortam erişim denetim adresi nedir?” şeklindeki bir ağ yayın isteğiyle elde edilir.
  • Bir ARP isteği yanıtlandığında hem ARP yanıtını gönderen hem de ARP isteğinde bulunan, birbirlerinin IP adreslerini ve ortam erişim denetim adreslerini ARP önbelleği denen bir yerel tabloya gelecekte başvurmak üzere bir girdi olarak kaydederler.

Donanım adresleme

Yerel ağlarda kullanılmak için üretilmiş donanımlar üretici tarafından aygıta programlanan benzersiz bir adrese sahip olmalıdırlar. Ethernet ve Token Ring LAN donanımları için bu adres ortam erişim denetim adresi olarak bilinir.
Her ortam erişim denetim adresi, aygıtı kendi fiziksel ağı içerisinde 6 baytlık bir numara ile tanıtır. Bu numara ağ bağdaştırıcısı gibi her fiziksel donanımın salt okunur belleğine (ROM) programlanmıştır. Ortam erişim denetim adresleri onaltılık sayılar şeklinde görüntülenir (örneğin , 00-AA-00-3F-89-4A).
Ortam erişim denetim adreslerine ilişkin yetki ve kayıt işlemleri Elektrik ve Elektronik Mühendisleri Enstitüsü’nün (IEEE) elindedir. Geçerli uygulamada IEEE, ortam erişim denetim adresinin ilk üç baytını bireysel üreticilerin benzersiz numaralarını kaydetmek ve atamak için ayırmıştır. Böylece üreticiler, ortam erişim denetimi adresinin son üç baytını ağ bağdaştırıcılarına atayabilirler.

ARP yerel trafik için ortam erişim denetim adreslerini nasıl çözümler?

Aşağıdaki resimde ARP’nin aynı yerel ağda bulunan ana bilgisayarlar için IP adreslerini nasıl donanım adreslerine çözümlediği gösterilmiştir.
ARP medya erişim denetimi adreslerini nasıl çözümler
Bu örnekte A ve B adlı iki TCP/IP ana bilgisayarı aynı fiziksel ağ üzerinde yer almaktadır. A ana bilgisayarına 10.0.0.99 IP adresi ve B ana bilgisayarına 10.0.0.100 IP adresi atanmıştır.
A ana bilgisayarı B ana bilgisayarıyla iletişim kurmaya çalıştığında aşağıdaki adımlar B ana bilgisayarının yazılımla atanan adresini (10.0.0.100) B ana bilgisayarının donanımla atanan ortam erişim denetim adresine çözümler:
  1. A ana bilgisayarındaki yönlendirme tablosunun içeriğine bağlı olarak, IP, B ana bilgisayarına erişmek için kullanılacak iletme IP adresinin 10.0.0.100 olduğunu belirler. Sonra A ana bilgisayarı kendi yerel ARP önbelleğinde B ana bilgisayarı için eşleşen bir donanım adresi arar.
  2. A ana bilgisayarı önbellekte eşleşen bir adres bulamazsa yerel ağdaki tüm ana bilgisayarlara "10.0.0.100 için donanım adresi nedir?" sorusunu yayınlar. Bu ARP istediğinde kaynak A ana bilgisayarının hem donanım hem de yazılım adresi yer alır.
    Yerel ağda bulunan her ana bilgisayar ARP istediğini alır ve kendi IP adresiyle bir eşleşme olup olmadığını denetler. Bir ana bilgisayar kendi IP adresiyle bir eşleşme bulamazsa ARP isteğini atar. 
  3. B ana bilgisayarı ARP istediğindeki IP adresinin kendi IP adresiyle eşleştiğini belirler ve yerel ARP önbelleğine A ana bilgisayarı için bir donanım/yazılım adres eşleştirmesi ekler. 
  4. B ana bilgisayarı, donanım adresini içeren bir ARP yanıt iletisini doğrudan A ana bilgisayarına geri gönderir. 
  5. A ana bilgisayarı B ana bilgisayarından ARP yanıt iletisini aldığında ARP önbelleğini B ana bilgisayarının donanım/yazılım adres eşleştirmesiyle güncelleştirir.
B ana bilgisayarının ortam erişim adresi bir kez belirlendikten sonra A ana bilgisayarı, IP trafiğini, B ana bilgisayarının ortam erişim denetim adresini kullanarak B ana bilgisayarına gönderebilir.

ARP uzak trafik için ortam erişim denetim adreslerini nasıl çözümler?

ARP yerel ağda olmayan hedefler için IP veri birimlerini yerel yönlendiricilere iletmek üzere de kullanılır. Bu durumda ARP, yerel ağdaki yönlendirici arabiriminin ortam erişim denetim adresini çözümler.
Aşağıdaki resimde ARP’ın ortak bir yönlendirici ile bağlı olan ve farklı fiziksel ağlarda bulunan iki ana bilgisayar için IP adreslerini donanım adreslerine nasıl çözümlediği gösterilmiştir.
ARP medya erişim denetimi adreslerini nasıl çözümler
Bu örnekte A ana bilgisayarına 10.0.0.99 IP adresi ve B ana bilgisayarına 192.169.0.99 IP adresi atanmıştır. 1 numaralı yönlendirici arabirimi A ana bilgisayarıyla aynı fiziksel ağdadır ve 10.0.0.1 IP adresini kullanmaktadır. 2 numaralı yönlendirici arabirimi B ana bilgisayarıyla aynı fiziksel ağdadır ve 192.168.0.1 IP adresini kullanmaktadır.
A ana bilgisayarı B ana bilgisayarıyla iletişim kurmaya çalıştığında aşağıdaki adımlar 1 numaralı yönlendirici arabiriminin yazılımla atanan adresini (10.00,00,1) donanımla atanan ortam erişim denetim adresine çözümler:
  1. A ana bilgisayarındaki yönlendirme tablosunun içeriğine bağlı olarak, IP, B ana bilgisayarına erişmek için kullanılacak iletme IP adresinin 10.0.0.1, yani varsayılan ağ geçidinin IP adresi olduğunu belirler. Sonra A ana bilgisayarı kendi yerel ARP önbelleğinde 10.0.0.1 IP adresi değeriyle eşleşen bir donanım adresi arar.
  2. A ana bilgisayarı önbellekte eşleşen bir adres bulamazsa, yerel ağdaki tüm ana bilgisayarlara "10.0.0.100 için donanım adresi nedir?" sorusu ile bir ARP isteği çerçevesi yayınlar. Bu ARP istediğinde kaynak A ana bilgisayarının hem donanım hem de yazılım adresi yer alır.
    Yerel ağda bulunan her ana bilgisayar ARP istediğini alır ve kendi IP adresiyle bir eşleşme olup olmadığını denetler. Bir ana bilgisayar kendi IP adresiyle bir eşleşme bulamazsa ARP isteğini atar. 
  3. Yönlendirici ARP istediğindeki IP adresinin kendi IP adresiyle eşleştiğini belirler ve yerel ARP önbelleğine A ana bilgisayarı için bir donanım/yazılım adres eşleştirmesi ekler. 
  4. Yönlendirici bundan sonra, donanım adresini içeren bir ARP yanıt iletisini doğrudan A ana bilgisayarına geri gönderir. 
  5. A ana bilgisayarı yönlendiriciden ARP yanıt iletisini aldığında ARP önbelleğini 10.0.0.1 için donanım/yazılım adres eşleştirmesiyle güncelleştirir.
1 numaralı yönlendirici arabiriminin ortam erişim adresi bir kez belirlendikten sonra A ana bilgisayarı, 1 numaralı yönlendirici arabirimin ortam erişim denetim adresini kullanarak IP trafiğini 1 numaralı yönlendirici arabirimine gönderebilir. Ardından, yönlendirici bu bölümde bahsedilen aynı ARP işlemi aracılığıyla trafiği B ana bilgisayarına iletir.

ARP önbelleği

Yayın sayısını en alt düzeye düşürmek için ARP, gelecekte kullanılmak üzere, IP adresinden ortam erişim denetim adresine eşleştirmelerinden oluşan bir önbellek tutar. ARP önbelleğinde dinamik ve statik girdiler olabilir. Dinamik girdiler zaman içerisinde otomatik olarak eklenir veya silinir. Statik girdiler ise bilgisayar yeniden başlatılana kadar ARP önbelleğinde kalırlar.
Her dinamik ARP önbelleği girdisi potansiyel olarak 10 dakikalık bir ömre sahiptir. Önbelleğe eklenen yeni girdilere zaman bilgisi girilir. Bir girdi eklendikten sonra 2 dakika içinde yeniden kullanılmazsa zaman aşımına uğrar ve ARP önbelleğinden silinir. Bir girdi kullanılırsa ömrü iki dakika daha uzar. Bir girdinin kullanımı sürdükçe, en çok 10 dakika olmak üzere, ek ikişer dakika daha önbellekte kalır.
ARP önbelleği arp komutuyla görüntülenebilir. ARP önbelleğini görüntülemek için, komut isteminde arp -a yazın. arp komut satırı seçeneklerini görüntülemek için, komut isteminde arp /? yazın.
Not
  • Her ağ bağdaştırıcısı için ayrı bir ARP önbelleği vardır.
Kaynak: Microsoft Server 

OSİ KATMANLARI (İnternet İletişim Kuralları Dizisi)

İnternet protokol takımı, bilgisayarlar ve  cihazları arasında iletişimi sağlamak amacıyla standart olarak kabul edilmiş kurallar dizisidir. Bu kurallar dizisi temel olarak verinin ağ üzerinden ne şekilde paketleneceğini ve iletilen veride hata olup olmadığının nasıl denetleneceğini belirlemektedir.
Ağ kavramının ortaya çıkmasından günümüze kadar geçen sürede farklı amaçlar için birçok protokol geliştirilmiştir. Bu protokoller ilk zamanlar belli bir standarda uygun olarak geliştirilmemiş, genelde bilgisayar donanımlarına bağlı kullanılacak şekilde tasarlanmışlardır. Bu dönemde ağ yapıları donanım üreticileri tarafından kendilerine has bir biçimde geliştirilmekteydi. Bu yapılara örnek olarak IBM 'in SNA ve DEC 'in DECnet ağları verilebilir. Bu şekilde tanımlanan protokoller ve donanımlar iletişimde bir ortak noktanın bulunması ve ağlar için yazılımların geliştirilmesinde sorun oluşturmuştur. Ortaya çıkan bu sorunun çözümü olarak 1978 yılında ISO (International Organization for Standardization - Uluslararası Standartlık Örgütü) tarafından, donanımdan ve ağ alt yapısından bağımsız olarak geliştirilmiş OSI (Open Systems Interconnection) başvuru modeli ortaya konmuştur. Bu yapısı ile OSI başvuru modeli bir standart olarak kabul görülmüş ve hızlı bir şekilde gelişme göstermiştir.

Şimdi osi katmanlarından bahsedip, basamaklar arasında neler yapıldığına göz atalım.

Osi katmanları server/client arasında iletişim ve işlemler silsilesinden geçer. Protokollere göre belirlenen bu iletişimde örnek verecek olursak,

mesela siz dokundum.blogspot.com adresinden bu sayfaya ulaştınız. Bu sayfayı anasayfanıza getirmek için geçen işlemler şunlardır:
  • Blogger web sunucusu, HTML bir çıktı yaratır ve üzerinde çalıştığı sisteme "şu veriyi şu adrese şu port ile ulaştır(port 80-http veya 443-https) yolla" komutu verir. Bu veri, 4. katman olan uygulama katmanına gönderilir.
  • Sistem, bu çıktıya öncelikle 3.katman olan taşıma katmanının bilgilerini iliştirir, yani paketin başına port bilgisini ilave edip yeni boyutu yazar.
  • Ardından, az önceki pakete bu sefer de ağ katmanı bilgileri, başka bir deyişle yollayan bilgisayarın IP adresleri ve paketin toplam boyu, eklenir.
  • Son işlem olarak tersi bir yolla tekrar alıcıya gönderilir. 
Denilebilir. Bunu şema halinde gösterecek olursak;

Resim
Resim



OSİ katmanları ile ilgili genel kavramlar: 



Ağ katmanındaki protokoller
  • ARP (Address Resolution Protocol, yani Adres Çözümleme Protokolü) bir IP adresinin hangi ağ kartına (yani MAC adresine) ait olduğunu bulmaya yarar. TCP/IP'de veri gönderilecek bilgisayarın hangisi olduğunu bulmak için kullanılır. Ayrıca IP adresini yeni almış olan bir RARP, yani Ters ARP) protokolü ARP'ın tersi işlemi yapar, yani hangi MAC adresinin hangi IP adresini kullandığını bulur. Bir TCP/IP ağında RARP'ın çalışacağı garanti değildir, zira RARP bir RARP sunucusuna ihtiyaç duyar.

IP katmanındaki protokoller

  • ICMP (Internet Control Message Protocol, yani Internet Yönetim Mesajlaşması Protokolü), hata ve türlü bilgi mesajlarını ileten protokoldür. Örneğin, ping programı ICMP'yi kullanır.
  • RIP (Router Information Protocol, yani Router Bilgi Protokolü) router'ların yönlendirme tablolarını otomatik olarak üretebilmesi için yaratılmıştır.
  • OSPF (Open Shortest Path First, yani İlk Açık Yöne Öncelik) aynı RIP gibi router'ların yönlendirme tablolarını otomatik olarak üretebilmesine yarar. OSPF, RIP'ten daha gelişmiş bir protokoldür.
  • IGMP, (Internet Group Messaging Protocol, yani Internet Grup Mesajlaşma Protokolü) bir sistemin internet yayınlarına (multicast) abone olmasına ve aboneliği durdurmasına yarar. Bu yayınlar, UDP üzerinden yapılır ve genelde çoklu ortam (radyo veya video) içerikli olurlar.
  • DHCP (Dynamic Host Configuration Protocol, yani Dinamik Cihaz Ayar Protokolü) bir TCP/IP ağına bağlanan bir cihaza otomatik olarak IP adresi, ağ maskesi, ağ geçidi ve DNS sunucusu atanmasına yarar.

Taşıma katmanındaki protokoller

  • UDP (User Datagram Protocol, yani Kullanıcı Veri Protokolü), IP üzerinden veri yollamaya yarar. Verilerin ulaşacağını garanti etmez ve UDP paketlerinin maksimum boy sınırları vardır. Öte yandan, UDP son derece basit ve bağlantı gerektirmeyen (connectionless) bir protokoldür.
  • TCP (Transmission Control Protocol, yani Gönderim Kontrol Protokolü), IP üzerinden ulaşma garantili ve herhangi bir boyda veri gönderilmesine imkân tanıyan bir protokoldür. UDP'den farklı olarak, TCP'de iki cihazın iletişim kurabilmesi için önce birbirlerine bağlanmaları gerekmektedir.

Uygulama katmanındaki protokoller

  • DNS (Domain Name System, yani Alan Adı Sistemi) alan adı verilen isimler (mesela www.wikipedia.org) ile IP adreslerini birbirine bağlayan sistemdir. Paylaştırılmış bir veritabanı olarak çalışır. UDP veya TCP üzerinden çalışabilir.
  • HTTP (HyperText Transfer Protocol, yani HiperMetin Yollama Protokolü) ilk başta HTML sayfaları yollamak için yaratılmış olan bir protokol olup günümüzde her türlü verinin gönderimi için kullanılır. TCP üzerinden çalışır.
  • HTTPS (Secure HTTP yani Güvenli HTTP) HTTP'nin RSA şifrelemesi ile güçlendirilmiş halidir. TCP üzerinden çalışır.
  • POP3 (Post Office Protocol 3, yani Postahane Protokolü 3) e-posta almak için kullanılan bir protokoldür. TCP üzerinden çalışır.
  • SMTP (Simple Mail Transfer Protocol, yani Basit Mektup Gönderme Protokolü) e-posta göndermek için kullanılır. TCP üzerinden çalışır.
  • FTP (File Transfer Protocol, yani Dosya Gönderme Protokolü) dosya göndermek ve almak için kullanılır. HTTP'den değişik olarak kullanıcının illa ki sisteme giriş yapmasını gerektirir. Veri ve komut alış verişi için iki ayrı port kullanır. TCP üzerinden çalışır.
  • SFTP veya FTPS (Secure FTP, yani Güvenli FTP), FTP'nin RSA ile güçlendirilmiş halidir. TCP üzerinden çalışır.
Tüm bu protokoller (ve dahası) sayesinde TCP/IP her geçen gün daha da popülerleşen bir protokol olmuştur.

En genel bilgi için kaynak: 
http://tr.wikipedia.org/wiki/%C4%B0nternet_ileti%C5%9Fim_kurallar%C4%B1_dizisi
Faydalı olabilecek link:
http://bidb.itu.edu.tr/seyirdefteri/blog/2013/09/07/osi-katmanlar%C4%B1

RAİD ve RAİD TÜRLERİ

RAİD ve RAİD TÜRLERİ

Raid NEDİR?
Eskiden bilgisayarlardaki depolama alanı Megabyte(MB) ile ölçülürken, yakın geçmişte Gigabyte(GB) ile ölçülmeye başlanmış ve şu an Terabytle(TB) ile ölçülür olmuştur. Alan arttıkça “nasıl olsa depolamak için çok yer var” diyerek çoğumuz yedek almıyoruz ve diskimize zarar gelince bazen saatlerce hatta günlerce kurtarmaya çalışıyoruz, bazen ise kurtarılamayacak durumda oluyor ve bütün verileri kaybediyoruz. Bir de bunu ev kullanıcıları için değil de iş yerleri için düşünelim. Verileri kaybetmek çok büyük bir sorun olur.
İşte burada devreye Raid giriyor; Veri kaybını engellemek için yeni bir disk takıyorsunuz. Taktığınız bu disk ile ister performans elde edebilirsiniz isterseniz de veri kaybını engellemek için güvenlik oluşturabilirsiniz.

Raid türleri NELERDİR?
Raid 0
+ En az 2 disk gereklidir (istenirse bu sayı arttırılır).
+ Performans sağlar (yazma hızı disklerin toplam hızları kadar olur).
-  Güvenliği yoktur.
raid_0
Raid 1
+ En az 2 disk gerekmektedir (istenirse bu sayı arttırılır).
+ Aynı veri bütün disklere yazılır ve bu sayede veri güvenle korunur.
-Kapasite minimum olan diskin boyutu ile sınırlıdır.
raid_1
Raid 2
- En az 14 disk gereklidir, bunların 10 tanesi veri için, 4 tanesi de ECC (Error Correction Control yani hata düzeltme kontrolü) için kullanılır. Artık Raid kartlarında ECC olduğu için Raid 2 günümüzde kullanılmamaktadır. ECC olmayanlar için ufak bir not; 14 diskli yapıda toplam kapasitenin yaklaşık %70’i kullanılmaktadır.
raid_2
Raid 3
+ Erişim çok hızlıdır.
+ Yedek bir disk varsa parity (0 ve 1ler ile kayıt) disk bozulursa diğer disk otomatik olarak devralır. Veri kaybı olmaz
- En az 3 disk gerekmektedir.
Not: Günümüzde pek kullanılmaz
raid_3
Raid 4
+ Part part yüklediği için yazma sırasında hızlı bir şekilde okuma yapar.
- Yazma hızı azalır
- En az 3 disk gereklidir
raid_4

Raid 5
+ Tüm disklere hem parity bilgisi ulaşır hem de veri bilgileri ulaşır.
+ Veriler diske yazılmadan önce Raid kart üzerinde parçalara ayrılarak yazılır.
- En az 3 disk gerekmektedir.
Not: Günümüzde en yaygın kullanılın Raid’dir.
raid_5
Raid 6
Not: Raid 5 ile neredeyse aynı olan Raid 6’nın farkı en az 4 disk gerektirir ve 2 ayrı parity disk oluşturur. Bu sebeple de Yazma hızı Raid 5’e göre oldukça yavaştır.
raid_6
Raid 0+1
+ En iyi performans.
+ En az 4 disk gerekmektedir, iki farklı Raid 0’ın Raid 1 bünyesinde birleşmesidir.
Not: En çok tercih edilen yapıdır.
raid_01
Raid 1+0
+ Raid nesting adı verilen yapı ile farklı iki Raid 1’in Raid 0 bünyesinde birleşmesidir. En az 4 disk gerekmektedir.
+ Performans olarak yüksek seviyedir.
raid_10
Raid 1+5
+ En güvenli yapıdır., çok öenmli dosyaların saklanmasında kullanılır.
- İki adet Raid 5 yapısının Raid 1 i bünyesinde birleşmesidir ancak en az 6 adet disk gerekmektedir.
raid_15
Raid 5+0
+ Yüksek performans
+ Yüksek güvenlik
- En az 6 disk gerekmektedir, İki tane Raid 5’in Raid 0 bünyesinde birleşmesidir.
raid_50
Raid 5+1
Not: Raid 5+0 ile benzerdir. İki adet Raid 5’in Raid 1 bünyesinde birleşmesidir. Oldukça da güvenlidir
raid_51
Raid 6+0
+ Yüksek seviye güvenlik.
- En az 8 disk gerekmektedir, iki adet Raid 6’nın Raid 0 bünyesinde birleşmesidir.
- Güvenlik ile kıyaslandığında en maliyetli yapıdır.
raid_60

NOT: Daha fazla bilgi ve fikir için:  http://tr.wikipedia.org/wiki/RAID

27 Mart 2014 Perşembe

Breadth First Search (BFS) Algoritması

#include <iostream>
#include <queue>
#include <conio.h>
#include <stdio.h>

using namespace std;

enum VertexName { A , B , C , D , E , F };

struct Vertex{

    VertexName name;

    int kaynak;
    int veri[6];
    int uzaklik;
    int Time;

};

queue<Vertex> dolasim;

void BFS ( Vertex [] , Vertex );

int main()

{
   
    // burada matrisi diziye atmak için tanımladık

    Vertex dizi[5];
   
    //dosya işlemlerinin okuması
   
    FILE *oku;
   
    oku=fopen("deneme.txt","r");
   
    int a,b,c,d,e;
   
    dizi[0].name = A;
    dizi[1].name = B;
    dizi[2].name = C;
    dizi[3].name = D;
    dizi[4].name = E;
   
    if(oku==NULL ){

  puts("Dosya açilmadi !\n"); return 0;
}

for(int i=0; i<5;i++){   //diziye elemanları atama işlemlerini yerine getirdik

    fscanf(oku,"%d %d %d %d %d\n",&a,&b,&c,&d,&e);
   
    dizi[i].veri[0] = a;  
    dizi[i].veri[1] = b;  
    dizi[i].veri[2] = c;  
    dizi[i].veri[3] = d;  
    dizi[i].veri[4] = e;  
}
 fclose(oku);
    //dosya sonu
   
    int secim,num;
   
    //sorunun b şıkkında dereceleri hakkında yorum yaptık
   
    /*  burada dikkat edilmesi gerekn husus soruya yönelik yaptığım için
   
    köşegenlerde olduğunda misal, dizi[i][i]x2 kuralını yerine  getirmedim, ancak
   
    bu örnek dışında dikkat etmemiz gereken husus olarak göze çarpar
   
    */
   
    printf("[0-4 ARASI] DERECESINI BULMAK İSTEDİGİNİZ GRAF NUMARASINI GİRİNİZ:");
    scanf("%d",&num);
   
    int top=0;
 
    for(int a=0;a<5;a++){
 
       if(num !=a){
             
            top=top+dizi[num].veri[a];
            }
       
        else{  // yukarıda anlattığım köşegen durumu
       
             top=top+2*dizi[num].veri[a];
       
            }
        }
       
        // C şıkkı dolaşma iiçin gerekli adımlar
       
    printf("\nGIRDIGINIZ GRAFIN DERECESI:%d\n",top);  
    printf("\n[0-4 ARASI] LUTFEN DOLASMAK ISTEDIGINIZ GRAF NUMARASINI GIRINIZ:\n");
    scanf("%d",&secim);
   
    //dolaşılması istenene node dan başlayıp hepsinden geçen yollar
   
    BFS( dizi , dizi[secim] ); //uygun fonksiyon
   
}
/* Bu fonksiyonun amacı dolaşılan node leri tutulan isimleri sırasında yazıp bunları

daha iyi görebilmek için hazırlanmıştır!

*/

void sonraki_yaz ( Vertex sonraki ){
   
    switch ( sonraki.name )
    {

    case A:
        printf("Isim : A ");
        break;

    case B:
        printf("Isim : B ");
        break;

    case C:
        printf("Isim : C ");
        break;

    case D:
        printf("Isim : D ");
        break;

    case E:
        printf("Isim : E ");
        break;

    }
   
    puts("");
   
    // ailelerini çocuklarını parentlerini görebilmek için adımları takibi kolaylaştıran fonksiyon
   
    switch ( sonraki.kaynak )
    {
    case -1:
        printf("Parent : NULL ");
        break;
    case 0:
        printf("Kaynak : A ");
        break;
    case 1:
        printf("Kaynak : B ");
        break;
    case 2:
        printf("Kaynak : C ");
        break;
    case 3:
        printf("Kaynak : D ");
        break;
    case 4:
        printf("Kaynak : E ");
        break;
    }
   
    puts("\n");
   
    getch();
   
}

/*
 
  asıl olayın hazırlandığı yer

  bu fonksiyonu hazırlarken C kütüphanelerinden faydalandık. bu kütüphaneye ait
 
  push()
 
  empty()
 
  front()
 
  pop()
 
  fonksiyonlarından <queue> kütüphanesi
 
  ile hazırladık.
 
  OLAYIN MANTIĞI
 
  Fonksiyona gönderilen node kuyruğa atılır.

  Kuyruk boşalıncaya kadar döngü sürdürülür.

  Sıradaki node kuyruktan çıkarılır.

  Çıkarılan node daha önce gezilmemiş ise, gezildi işareti konur
 
  ve gezilmemiş komşuları kuyruğa konur

*/


void BFS ( Vertex all[5] , Vertex a )  //diziyi ve kullanıcıdan alınan node başlangıcı
{
    int simdiki_deger; //deger tutumu
   
    Vertex yeniVertex; //tutulacak deger tanımlama
   
    for ( int i = 0 ; i < 5 ; i++ )
    {
        if ( all[i].name != a.name ) //girilen degerin adı değilse yapılan işlemler
        {
            all[i].uzaklik = 9999999;
            all[i].kaynak = -1;
        }
    }
   
    a.uzaklik = 0;
    a.kaynak = -1;
   
    dolasim.push(a);  //yığın görevi
   
    while ( !dolasim.empty() ) // doluluk kontrolu
    {
        yeniVertex = dolasim.front();
       
        for ( int i = 0 ; i < 5 ; i++ )
        {
            if ( yeniVertex.name ==  i )
            {
                all[i] = yeniVertex;
                simdiki_deger = i;
                break;
            }
        }
       
        dolasim.pop(); //boşaltım,çıkarım
               
        for ( int j = 0 ; j < 5 ; j++ )
        {
            if ( yeniVertex.veri[j] == 1 && all[j].uzaklik == 9999999 )
            {
               
                all[j].uzaklik = yeniVertex.uzaklik + 1;
               
                all[j].kaynak = yeniVertex.name;
               
                dolasim.push(all[j]); //tekrar boşaltılan yerlerin dolması, koyması
           
            }
        }

       sonraki_yaz( yeniVertex );

    }
}