Merhaba izlek!
Suan öğrenilen bilgilerin harmanlanmasi ile olusturulmuş Böte öğrenci blogundasin.
Gitmek istedigin kategori icin yukaridaki yahut sagdaki paneli kullanabilirsin.

Hot Potatoes

Hot Potatoes  kolaylıkla klasik, çoktan seçmeli vb testler hazırlayabileceginiz ve web ortamında aktara bileceğiniz küçük bir programdır.

HP ile etkileşimli hazırlayabileceğiniz 6 modül vardır. Bunlar:

~ Boşluk Doldurma
~ Çoktan Seçmeli
~ Eşleştirme Alıştırması
~ Karışık Cümlelerden Anlamlı
~ Cümle Oluşturma
~ Bulmaca Hazırlama
~ Ünite Mantığı Oluşturma

Neden Hot Potatoes kullanmalıyız?

Programın kolay bir ara yüzü var hemde ücretsiz sürümleri mevcuttur. Hemde herhangi bir konuda etkileşimli alıştırmalar hazırlamalarını kolaylaştırarak bilgisayar destekli eğitime destek sağlamaktır. HP kullanarak kısa sürede beş değişik türde etkileşimli alıştırmalar hazırlayabilir. Hazırlanan etkileşimli alıştırmalar bir web sitesinde yayınlanarak öğrencilerin kullanımına sunulabilir.

Hot Potatoes Sunusu İçin Tıklayınız

Hot Potatoes 6 Kullanma Kılavuzu İçin Tıklayınız



DownLoad Hot Potatoes for Windows

DownLoad Hot Potatoes for Linux

Assure Modeli’ne Genel Bakış

08 Mart 2010 1 yorum

1. Giriş

ASSURE modeli, öğretmenlerin sınıflarında kullanmaları için değiştirilmiş bir

Öğretim Sistemi Tasarımı (ISD) sürecidir. Öğretim Sistemi Tasarımı, öğretmenlerin öğrencileri için en uygun öğrenme ortamlarını tasarlamada ve geliştirmede kullanabilecekleri bir işlemdir. Bu metodu ders planı oluşturmada ve öğretime öğrenmeyi geliştirmede kullanabilmektedir.


ASSURE, bir dersin geliştirilmesinde kullanılan adım-adım işlemler bütünüdür.

Bilindiği gibi İngilizce’ de ASSURE sözcüğü garanti etmek, temin etmek anlamına da gelmektedir. Bu sözcük aynı zamanda, modelin öngördüğü aşamaların İngilizce yazılışlarının baş harflerinden oluşturulmuş bir kısaltmadır.

ASSURE Modeli Aşamaları

Gagne’nin öğrenme koşulları; iyi tasarlanmış dersler öğrencilerin dikkatinin çekilmesi ile başlar ve sonra yeni materyal sunulur, öğrenciler uygulama yapar, öğrenmeleri ölçülür ve sıradaki aktivitelere geçilir. ASSURE Modeli, tüm bu şartları kapsamaktadır (Heinich, Molenda, Russel ve Smaldino ). Özet olarak; ASSURE Modeli bireysel olarak öğretmenin sınıfta öğretim teknolojileri kullanmasının planlanmasında ve bir saatlik ders sürecinin adım adım planlanmasında kullanılabilecek öğrenme-öğretme süreçlerinde meydana gelebilecek sorunları aşmada bir kılavuz niteliğindedir.

2. ASSURE Modelinin Aşamaları

2.1 Analyze Learners : Öğrencilerin Analizi

ASSURE modelinin ilk aşamasında; öğrenme üzerinde etkili olduğu genel kabul gören

ve öğretim teknolojileri planlamasında dikkate alınması gereken öğrenci özellikleri (genel karakteristikleri, giriş yeterlilikleri ve öğrenme stilleri) incelenmektedir.

2.1.1 Genel Karakteristikleri

Genel karakteristikler yaş, öğrenme düzeyi, meslek, kültürel ya da sosyo-ekonomik faktörler gibi tanımlayıcı hususları kapsar. Bu özelliklerin yüzeysel bir analizi bile öğretim yöntemi seçiminde oldukça yol göstericidir.

2.1.2 Giriş Yeterlilikleri

Öğrenciler öğretmenlerin anlatacaklarını zaten biliyor olabilir ya da öğrenciler, öğretmenin anlatacaklarını anlayabilmek için önkoşul niteliğindeki çok temel yeterliliklere bile sahip olmayabilir. Hedef kitlenin halihazırda ne biliyor olduğunu ölçerek uygun ortam ve materyaller seçilebilir.

2.1.3. Öğrenme Stilleri

Öğrenme stili, bir bireyin nasıl algıladığını, öğrenme ortamları ile nasıl etkileşim içine girdiğini ve bu ortama duygusal olarak nasıl tepkide bulunduğunu tanımlayan psikolojik özellikler grubu anlamına gelmektedir .Literatürde tartışılan öğrenme biçimi değişkenleri şu kategorilere ayrılabilir: Algısaltercihler ve güçlülükler, bilgi işleme alışkanlıkları, motivasyonel faktörler vepsikolojik faktörler.


ASSURE modelinin uygulanacağı grubun öğrenme stillerin öğrenilmesi amacıyla Gregorc’un zeka biçimleri modeli için bir ölçek bulunamadığından Kolb’un öğenmestilleri envanteri kullanılmıştır.

2.1.3.1. Algısal Tercihler ve Güçlükler

Temel algısal tercihler; işitsel, görsel, dokunsal, adalesel duyulardır. Öğrencilerin farklı yönde algısal tercihleri ve güçlükleri dikkate alınarak materyaller seçilmelidir.

2.1.3.2. Bilgi İşleme Alışkanlıklar

Bu kategori de bireylerin bilginin bilişsel işlemesine yönelmeye nasıl meylettikleri ile ilgili birçok değişkeni kapsamaktadır.

2.1.3.3. Motivasyonel Faktörler

Endişe, kontrol odağı, yapı seviyesi, başarı motivasyonu, sosyal motivasyon, dikkatlilik ve idealistlik, çoğu kez öğrenme sürecinde kritik faktörler olarak görülmüştür.

2.1.3.4. Psikolojik Faktörler

Cinsiyet farklılıkları, sağlık ve çevresel koşullar öğrenmenin etkililiği üzerinde en etkili faktörler arasındadır. Sıcaklık, gürültü, ışık ve günün zamanı, konsantrasyon ve dikkati sürdürmeyi etkilediği bilinen unsurlardır.

2.2. State Objectives : Hedeflerinin Belirlenmesi

ASSURE Modelinde öğretim ortamlarını kullanmada ikinci aşama öğretimhedeflerinin belirlenmesidir. Her bir öğrencinin hangi öğrenme hedefine ulaşması beklenmektedir? Daha doğru bir ifade ile eğitim sonunda öğrenci hangi yeni kabiliyete sahip olacaktır. Bir hedef, öğreticinin derse ne koymayı planladığı değil, öğrencinin dersten ne alması gerektiğidir.

2.2.1. İyi belirlenmiş Hedeflerin ABCD’si

Amaçların yazımında ABCD yaklaşımı kullanılabilir:

􀂙 Audince (Topluluk) : Öğrencileriniz kimler?

􀂙 Behavior (Davranış): Öğretim sonucu kazanılacak ve gösterilecek davranışlar

veya performanslar nelerdir?

􀂙 Conditions (Şartlar) : Davranışın gerçekleşeceği ortamın şartları nelerdir?

􀂙 Degree (Derece/Seviye): Gösterilecek öğrenme yetenekleri seviyesi nedir?

2.2.2. Hedeflerin Sınıflandırılması

Bir hedef sonuçta ulaşılması amaçlanan birincil öğrenme tipine göre sınıflandırılır: Bilişsel, duyuşsal, psiko-motor ve bireylerarası (interpersonal) hedefler.

􀂙 Bilişsel öğrenme kategorisi; sözel/görsel bilgi ya da entelektüel kabiliyetler olarak sınıflandırılabilecek zihinsel kabiliyetleri kapsar.

􀂙 Duyuşsal kategorideki kabiliyetler duygu ve değerleri içine alır.

􀂙 Psiko-motor kabiliyetlerde ise atletik kabiliyetler, elle yapılan kabiliyetler ve bunlar gibi fiziksel kabiliyetler söz konusudur

􀂙 Bireylerarası (Interpersonal) kabiliyetler başkaları ile etkin ilişkiler kurma yetisi gerektiren insan merkezli kabiliyetlerdir..

2.2.3. Hedefler ve Bireysel Farklılıklar

Hedefler, öğrencinin ne öğreneceğini sınırlamak için değil minimum başarı seviyesini ortaya koymak içindir. Doğal öğrenmeyi desteklemek ve bireysel farklılıklara zemin hazırlamak için, öğrencilere kendi hedeflerinin bir kısmını belirlemekte yarar vardır.

2.3. Select Methods, Media and Materials : Yöntem, Ortam ve Materyallerin Seçimi

2.3.1.Yöntemin Seçilmesi

Ortam kullanımına yönelik sistemli bir planda ilk olarak, yöntem, ortam ve materyallerin sistematik şekilde seçilmesi gerekir. Seçim sürecinin üç aşaması vardır:

􀂙 Hedeflenen öğrenme görevleri için uygun yöntemlerin belirlenmesi.

􀂙 Yöntemi gerçekleştirmeye uygun ortam formatının seçilmesi.

􀂙 Bu ortam için spesifik materyallerin seçilmesini, gerekli değişikliklerin ya da

tasarımın yapılması.

2.3.2. Ortam Formatının Seçilmesi

ASSURE modeli uygulaması için seçilen ortamın özellikleri aşağıda belirtilmektedir.

2.3.3. Materyallerin Seçimi

Materyal seçerken faklı teknikler vardır. Levy ve Dickie tarafından kullanılacak

medya tabanlı materyaller için yedi özellik belirlenmiştir:

1. Resimli gösterimlerin özellikleri: Resimlere ihtiyacınız var mı? İçeriğin sadece metin ile anlatılması yeterli mi?

2. Boyutun özellikleri: Anlam belirsizliği söz konusu olduğunda resimli gösterimlerdaha kolay görmeye ve anlamaya yardımcı olur. Boyut hem mutlak hem de orantılıdır. Mutlak boyut resmin projeksiyon ekranından veya kitapta görünmesidir.

Resim belirli ve ölçülebilir yükseklik ve genişliğe sahiptir. Resmin belirli parçaları veya elemanları resme veya belirli parçalarına göre daha geniş veya küçükse o zaman bu parçaların boyutuna orantı denir. Orantılı boyutta izleyiciye daha yakın olan kısımlar daha büyük diğerleri daha küçük olarak algılanır.

3. Renklerin özellikleri: Renkler anlamı daha açık hale getirmek için gereklimidir? Renkleri sunuda birlik ve süreklilik duygusunu sağlamak için mi kullanıyorsunuz?

4. Hareketlerin özellikleri: Öğrenme süreçleri ve motor beceriler hareket özelliklerine gereksinim duyar. Bitkilerin damarlarındaki faaliyetler veya farklı yoğunluklarda ışık dalgalarının hareketleri gibi öğrenme süreçleri hareketin kullanılmasını gerektirir.

5. Dilin özellikleri: Yeni materyalin öğrenilmesi için gerekli olan temel kelimeler nelerdir? İçerik dil hakkında yeterli kavramaya sahip biri tarafından öğrenilebilecek düzeyde mi?

6. Ses/resim ilişkisinin özellikleri: Resim yapıyı gösterir. Ses ise resmin nasıl çalıştığını gösterir, belirli terimleri açıklar.

7. Düzenlemenin özellikleri: Herhangi bir türdeki bilginin düzenlenmesi öğrenimi ne kadar etkilemektedir? Genellikle, kompleks materyaller daha kolay olanların arkasından gelmektedir. Bu ardışık düzendir. Fakat bilgi random olarak yapılandırılabilir mi? Öğrenci materyaldeki bilgiler arasında ilişki kurabilecek midir?

Bu özellikler sadece bir teknoloji kullanılarak ulaşılamaz, farklı teknolojilerin birleşimi olmalıdır. Materyallerin tasarım özellikleri ve karakteristiklerinin anlaşılması hangisinin öğrenmeyi çoğaltacağına karar verilmesinde önemlidir.

􀂙 Mevcut materyallerin seçimi: Halihazırda bulunan materyallerden uygun olanının seçilmesidir.

􀂙 Mevcut materyallerin revizyonu: Halihazırda bulunan materyallerde yapılan değişiklikler ile yeni bir materyal elde edilmesi sürecidir.

􀂙 Yeni materyal tasarımı: Öğretim hedeflerine ulaşmada kullanılabilecek yeni bir materyal tasarımı hedefler, zaman, uzmanlık gibi konular dikkate alınmalıdır.

2.4. Utilize Media and Materials : Ortam ve Materyallerden Yararlanma

2.4.1. Materyali ve ortamı gözden geçirme

Materyalin kullanılmada önce gözden geçirilerek olası sorunların önüne geçilebilir. Öğrenme ortamı hazırlanarak ders öncesi son kontroller yapılır.

2.4.2. Materyalleri hazırlama

Eğitimcinin ve öğrencilerini ihtiyaç duyduğu materyallerin toplanıp, ortam ve materyallerin hangi sıra içinde kullanılacağının belirlenmesidir.

2.4.3. Ortamı hazırlama

Öğretim açısından uygun bir hazırlama aşağıdaki gibi olabilir:

􀂙 Dersin içeriğini kapsamlı bir şekilde veren bir sunum

􀂙 Çalışılan konu ile ilgisinin mantıksal izahı

􀂙 Öğrencinin dikkat etmekle ne fayda sağlayacağını dile getiren motive edici açıklama

􀂙 Dikkati dersin spesifik yönlerine çeken ipuçları

2.4.4. Öğrencileri hazırlama

1. Konu ile gerçek hayatta uygulamakta oldukları arasındaki ilişkinin soru cevap yöntemi ile incelenmesi.

2.5. Require Learner Participation: Öğrenci Katılımını Sağlama

Öğrencilere geri bildirim ve öğrenme ortamına katılarak uygulama yapma olanağının sağlanmasıdır.

2.6. Evaluate and Revise : Değerlendirme ve Revizyon

Ders tasarım sürecinin en çok hatalı kullanılan unsuru olan değerlendirme ve gözden geçirme, kaliteli öğretime ulaşmada vazgeçilmez bir bileşendir. Değerlendirme sürekli bir işlemdir. Değerlendirmeler öğretim öncesinde, sırasında ve sonrasında yapılır. Örneğin öğretimden önce, öğrenci kabiliyetleri ile kullanmayı düşündüğünüz metotmateryaller arasında uygunluk olduğundan emin olmak için öğrenci karakteristikleri ölçülür. Ayrıca kullanmadan önce materyaller değerlendirilmelidir. Öğretim esnasında değerlendirme, arzulanan bir kabiliyetin öğrenci tarafından pratiğinin yapılması şeklinde olabileceği gibi, kısa bir quiz veya kendini değerlendirme şeklinde de olabilir. Öğretim esnasında değerlendirmenin genel, tespite yönelik bir amacı vardır. Yani öğretim sürecindeki hedeflere ulaşmayı engelleyebilecek öğrenme /öğretme problemlerini ve zorluklarını belirleyip düzeltmeye yöneliktir.

İşlemci

İşlemci (CPU) Nedir? Bölümleri ve Çalışma Mantığı

İşlemci: İşlemci kısaca takılı bulunduğu sistemde (bilgisayar, playerlar, oyun konsolları vs..) tüm işlemleri denetleme ve sistemin çalışması için gerekli olan adımları uygulama görevine sahiptir. Yani örnek verecek olursak en basit anlamda bir hesap makinasında 4+4 işlemini yaptığımız zaman sonucu görebilmemiz için gerekli işlemlerin yapıldığı birime diyebiliriz. Veya bilgisayarda bir klasöre tıkladığımız zaman içindeki bilgileri ekrana getiren veya bir programı kurarken dosyaların gerekli şekilde bilgisayara yüklenmesini sağlayan aygıtlara diyebiliriz.

İşlemci Nedir?

CPU ingilizce olarak Central Processing Unit veya Merkezi İşlem Birimi olarak adlandırılına ve kısaca yukarıda bahsettiğimiz ve daha birçok işlemi yapan ve sistemlerin çalışmasını sağlayan bir ünite olarak adlandırılabilir. Saniyede yaptığı işlem sayısında göre bir hız birimi atanarak işlemcilerin kapasiteleri ve çalışma hızları belirlenmektedir. İşlemcinin çalışma hızları tamamen tasarım ve üretim teknolojisine bağlı olarak değişmekle birlikte yeni nesil işlemcilerde dışarıdan yapılan müdahalelerle (overclock) hız arttırımları söz konusu olmaktadır. İşlemcilerde hız birimi HZ, MHZ ve GHZ olarak adlandırılan birimle ifade edilmektedir. Bazı özel işlemcilerde ise bu birimin yerini Flop adı verilen bir birim almaktadır.

İşlemci Nasıl Çalışır?

İşlemci kendi içinde bir mimariye sahip olup işlemlerin yapılabilmesi için birçok ünitesi bulunmaktadır. İşlemler yapılırken Logic (mantıksal 1 veya 0) mantığı ile yapılmaktadır. Yani iki sayıyı toplamak için ilk olarak sayıların ikilik değerleri (1001010 şeklinde) ele alınır ve bunun üzerine işlemler yapılarak sonuç elde edilir. Veya bir film izlerken ekrandaki görüntünün oluşması için hafızada bulunana ikilik değerler birleştirilerek görüntüler oluşur. İşlemciler hafızalarında bulunana komutlarla dışarıdan gelen uyarılar eşliğinde işlemleri yapmaktadırlar. İşlemcini hafızasında bulunan komutlara o işlemcinin komut seti denilebilir.

Normalde bilgisayarımızda veya başka kompleks ürünlerde sadece bir tane işlemcinin olduğunu düşünürüz oysaki detaylıca inceleyecek olursak
Bilgisayarımızda;

– Ekran Kartı: İkilik sistemdeki verileri görüntüye dönüştürmek ve görüntüledeki bozukluklar ile yuvarlamalar, gölgelendirmelere, hareketlendirmeler ve diğer bütün efektlerin gerçekleştirilmesi için bir işlemci bulunmaktadır.

– Ses Kartı: Sistemdeki verileri ikilik sistemden alarak özel bir işleme sayesinden duyabileceğimiz şekle getiren, dolby, stereo, çok kanallı gibi özel ifadelerle belirtilen efektlerin oluşması için merkezi bir işlem ünitesine sahiptir.

– Tv Kartı: Yine yayından aldığı verileri ikilik sisteme dönüştürerek işlemci üstünden ekran kartına aktarılmasını sağlayan merkezi bir işlem birimine sahiptir.

Bu örneklerin sayısı sürekli arttırılabilir yani anlıacağımız yapılan her şey için bir işlemci biriminin gerekli olduğudur. Ve işlemcilerin ne işe yaradığı yukarıdaki örneklerdede daha iyi oalrak anlaşılmıştır.
İşlemci Üniteleri Nelerdir?

İşlemcinin iç yapısına biraz bakacak olursak çeşitli ünitelerden teşkil edildiği gözükmektedir. Öncelikle kendi içinde bir belleğe sahiptir bu bellekte hafızasında bulunan komutlar (komut seti) ve işlem sırasında geçici bilgilerin saklanması için boş hafıza kısımları bulunmaktadır. Üniteleri biraz daha geniş açacak olursak.

– Data Yolları: İşlemcinin içindeki bölümleri birbirine bağlayan ve bilgi akışının olduğu kısımlar olarak nitelendirebiliriz. Yeni nesil işlemcilerde data yolları çok daha büyük yapılarak (32 Bit, 64 Bit, 128 Bit) büyük verileri daha kısa sürede işlemeye olanak sağlamaktadırlar. Örnek olarak 64 bitlik veri yoluna sahip bir işlemcide tek döngüde 64 bit uzunluktaki bir veri bir yerden bir yere aktarılabilir.

– Cache (Ön Bellekler): Normal olarak işlemci işlemleri gerçekleştirirken bir yerdeki bilgiyi alıp bir kısmını işeldikten sonra bilgilerin o anda tutulacağı ram adını verdiğmiz yerlere gönderir fakat işlemlerdevam ederken önceden ram e atmış olduğu bilgilerden bazılarına gereksinim duyabilir. Fakat işlemci ile ram arasındaki veri transferi işlemcinin kendi içindeki ram bölümündeki beri transferinden çok daha uzundur. Bu nedenle bu tarz gereksinimleri karşılamak için işlemciler dahili bir ram bellek ile (cache – ön bellek) üretilmektedirler. Öneli bilgiler ram bölümüne gönderilirken cache kısmındada saklanmaktadır ve bir işlem sırasında gereksinim duyulduğunda bu kısımda bilgiler alınmakta veya bu kısma aktarılmaktadır.

– ALU: (Aritmetic Logic Unit – Matematiksel Mantık Birimi) olarak ta adlandırılabile bu bölüm ise işlemci içindeki işlemci oalrak nitelendirilebilir. İşlemci içinde 2 lik sistemde işlemlerin yapıldığı bölümdür ve tüm işlemler aslında toplama, çıkarma, çarpma, bölme gibi işlemlerin türevi olduğundan komut setleri ile gelen işlemler burdan gerekli şekilde işlenerek çıkartlılmaktadır.
İşlemcinin İç Yapısı Nasıldır ve Nasıl Tasarlanır?

İşlemciler aslında transistör adını veridiğimiz yarı iletken elemanların birleştirilmesi ile oluşmaktadır. Başlarda 100 -200 transistör birleştirilerek yapılan işlemciler, teknolojinin gelişmesi ise 1 Milyar ve daha fazla transistör birleştirilerek yapılabilir hale geldi. Aşağıdaki resimde yüzlerce milyon transistöre sahip bir işlemcinin yapısını görmektesiniz.

İşlemciler transistör

Yukarıdaki resimde aslında yüzmilyonlarca transistör bulunmatadır. Bunlar küçültülerek monte edildikleri için çok fazla sayıda transistör silicon wafer (silikon yüzey) adını verdiğimiz bu küçük yüzey üzerine sığdırılabilmektedirler. İşlemciler tasarlanırken birçok aşamadan geçmektedirler. Tasarım fabrikalarında 200 e yakın ayrı band dan geçerek üretimleri sonlanmaktadır. Öncelikle transistörlerin monte edilecekler pürüzsüz silikon yüzeyler oluşturulmakta ve elektronik departmanlarda hazırlanan transistör yerleşim planı ve bağlantı şekiller birçok aşamadan geçerek son halini almaktadır. Transistörlerin bulunduğu alanlar mor ötesi (ultraviyole) ışıklarla aşındırılarak negatif ve pozitif malzemeler eklenerek doldurulmakta ve transistörler oluşturulmaktadır.

Transistörler arasındaki bağlantılar ise yine aşındırma yönteminden sonra aliminyum zerrecikler yardımıyla birleştirilmektedir. Fakat günümüz teknolojisinde artık bu şekilde birleştirilmelerin yapılamıyacağı küçüklüklere inildiği için yakın gelecekte karbon bağlantı yöntemi kullanılacaktır. Bu yöntemle enerjinin taşınmasını sağlayan elektronilar karbon yolalr üzerinden akacaktır. bunun haricinde silikon yüzey üzerindeki bağlantıları dışarı ile bağlamak için bir ara yol bölümüm birde iç yapıyı dış etkenlerden koruma için kılıf montajı yapılmaktadır. Silikon yüzeydeki bağlantıları, dışarı taşıyan bağlantılara bağlamak için altın kaynak teknolojisi kullanılmaktadır.

Günümüzde belli başlı işlemci üreticileri bulunmaktadır. Bunların en başında glenler Intel, AMD, Via, Nvidia, Ati, IBM ve daha saymadığımız birçok firma gelmektedir. Bu şifrekteler sürekli olarak ürünlerini güçlendirerek piyasa sunmaktadırlar. Yeni nesil işlemcilerde sıkcalıkta çok önemli bir faktördür, işlemci sıcaklıkları ile ilgili problemlerin artmasından dolayı firmalara bununla ilgili oalrak yapısal mimari değişim çalışmalarına gitmişlerdir. İşlemcilerin tarihi gelişimi ve performans bilgileri ile ilgili makaleler bu bölüm altında sürekli olarak yayınlanacaktır.

Anakart

Bilgisayarın en temel donanımlarından biri olan anakart (motherboard) hakkında bilinmesi gerekenler, çalışma mantığı, üzerinde bulunan temel parçalar ve görevleri hakkında detaylı bilgiler ve açıklamalar aşağıda bulunmaktadır.

Anakart Nedir?

Bilgisayar donanımlarını birbirlerine bağlamak ve koordineli halde çalışmalarını sağlamak için kullanılan bir donanımdır. Parçaların aralarında iletişim kurmasını ve gerekli işlemlerin gerçekleşmesini sağlamak için anakartlar üzerinde harici işlemci yanında kart işlemcileri de bulunmaktadır. Chipset olarak ta adlandırılan bu işlemcilerin bilgisayar performansı üzerinde çok etkili oldukları bilinmektedir. Dahili parçaları birbirine bağlamanın yanında bilgisayarı dış çevre ile iletişimini (ses, görüntü, veri) sağlamak içinde üzerinde portlar bulunmaktadır. Kısaca bilgisayarların olmazsa olmaz parçasıdır. Günümüzde birçok anakart üreticisi firma (intel, asus, gigabyte, msi, dfi vs..) genellikle birkaç chipset üreticisinin işlemcilerini kullansalar bile kartlar üzerindeki diğer donanım ve araçlar ile birbirlerine karşı üstünlük sağlamaya çalışmaktadırlar.

Anakartların Temel Parçaları ve Görevleri

Diğer bilgisayar donanımlarını ve dış dünya ile iletişimi sağlamak için anakart üzerinde çeşitli portlar ve entegreler (işlemci ve diğer) bulunmaktadır. Aşağıdaki resimde örnek bir anakart devresinin üstten görüntüsü bulunmaktadır.

Anakart Genel Görünüm

Yukarıdaki resimde gözüken anakart ile diğer anakartlar arasında mantık ve çalışma prensibi olarak çok fazla fark yoktur. Devre üstünde bulunan parçalardan diğer anakartlarda’da bulunan anakartların ortak parçaları olan adlandırılan çalışma birimlerini inceleyecek olursak;

Anakart İşlemcisi – Dahili İşlemci (Chipset): Yukarıda da kısaca bahsettiğimiz gibi, averi ekrankartı üzerinden görüntüye dönüştürülürken bu entegreler üzerinden transfer yapılmaktadır. Bilgisayara takılı olan parçalar genellikle farklı hızda ve türde iletişim birimlerine sahipleridir. Birbirleriyle direk olarak haberleşemezler işte burda da yine chipset’ler devreye girmektedir. Aradaki bu farklılıkları ortak bir merkezde toplayarak parçaların uyum içinde haberleşmelerini sağlamaktadır. Aşağıdaki resimde yukarıdaki anakartın Kuzey Köprüsü işlemcisi yani kart üzerindeki iki dahili genel işlemciden biri gözükmektedir.nakartlarda parçalar arasındaki veri transferlerini ve anakartı dışarı ile çeşitli bağlantılarını sağlamak için anakart işlemcisi olarak ta adlandırılan chipset işlemcileri bulunmaktadır. Örnek olarak harddisk üzerindeki bir veri işlemci ile işlenirken veya işlemcideki bir

Anakart Chipset Görünümü

Dahili işlemci (chipset) hızları çok yüksek olduğu için ve mimarileriyle de ilgili olarak ısınmalar gözükmektedir. Bu nedenle parçalar için soğutucu modüller kullanılmaktadır. Birçok aletin aynı zamanda haberleşmesini ve birbirlerine veri transferi yapmasını sağlayan bu entegreler anakartların en temel parçalarındandır. Şu anda birkaç büyük firma (intel, nvidia, via ..) bu chipsetlerin üretimini üstlenmiştir. Anakart üreticilerinin bir çoğru bu firmaları özellikle intel ve nvidianın chipsetlerini kullanmaktadır.

Dahili Parça Portları

Bu portlar bilgisayar kasası içinde bulunan ve genellikle sadece dış bağlantılarını gördüğümüz kartların ve parçaların bağlandığı portlardır. Aşağıdaki anakart resminde numaralandırdığımız portlar ve görevleri aşağıda verilmiştir.

Anakart Parçaları

1.) PCI Portları: Bu portlar bilgisayara satın aldığımız, ekran kartı dışındaki kartları bağlamak için kullandığımız portlardır. Örnek olarak ses kartı, televizyon – tv kartı, ethernet kartı, güvenlik kartı gibi kartlar bu portlara bağlanmaktadır. PCI portunun veri hızı 33 MHz veya 66 MHZ düzeyindedir. 124 pi ile tek seferde 32 bitlik bir veri transferi sağlamaktadır. 3.3v veya 5v düzeyinde çalışma gerilimine sahip olup 32bit adresleme yapabilmektedir (4GB). Son olarak ta saniyede 133MB veri transferi yapabilmektedir.

2.) PCI Express Portları: Bu portlar PCI slotunun yerini almak için tasarlanmıştır ve çok yakın zamanda artık kartlarda sadece bu portlar kullanılacaktır. Veri transfer hızları ve ergonomisi sebebiyle PCI ile kıyaslanmaz derece güçlüdür. PCI Express 1.1 ve PCI Express 2.0 versiyonları mevcuttur. PCI Express 1.1 de 2.5GB/Saniye veri transfer hızı PCI Express 2.0 da ise bunun iki katı yani 5GB/saniye veri transfer hızları yapılabilmektedir. Yeni üretilen dahili kartlar (ses, tv, mpeg decoder vs…) artık bu teknolojiye uygun olarak üretimlerini arttırmaktadırlar.

3.) PCI EXPRESS X16 Portu: Bu slot ise AGP ye alternatif olarak geliştirilmiştir. Temelde PCI EXPRESS mantığını kullanmaktadır fakat katman sayısı çok fazla olduğu için veri transfer hızları inanılmaz boyutlara ulaşmıştır. Bazı anakrtlarda iki adet bu slottan bulunmaktadır. Temel mantık iki ekran kartını aynı anakarta bağlayarak görüntü işleme kalitesini dahada yükseltmektir. Ekran kartları için tasarlanan PCI EXPRESS X16 slotu saniyede 4GB veri transferi sağlamaktadır. 16 hat kullanmakta ve her hat saniyede 250MB veri transferi sağlayabilmektedir. Yeni nesi ekran kartlarının tamamı bu slot yapısına uygun olarak üretilmektedir.

4.) IDE – ATA Portu: Bu port ise bilgisayarımıza CDRom, CRrewriter, DVDRom, IDE Destekli Harddiskleri bağlamak için kullanılmaktadır. Integrated Drive Elektronics – Dahili Sürücü Elektroniği terimlerinin kısaltması ile elde edilmiş olan bu arabirimin üst versiyonları 100MHZ hıza ve 48 bit ile 144PB depolama kapasitesine sahiptir. Paralel ATA olarak adlandırılan bu arabirimde veriler 40 gözlü kablolar ile iletilmekte ve aynı kablo üstüne birden fazla IDE destekli parça takılabilmektedir.

5.) Sata ve Sata 2 Portları: Bu portlar ise ATA arabiriminin paralel moddan seri moda ve bazı geliştirilmeler yapılmasıyla elde edilmiştir. Veri transfer hızları çok büyük ölçüde artmakla birlikte yeni sürümde sata 2.0 ile 3.0Gb/saniye veya 300MB/saniye veri transferi sağlayabilmektedir. Kullanılan kablo teknolojisi ile kasa içinde daha ergonomik bir kullanım sağlanmaktadır. 4 Pin ile harddisk anakart arasında veri iletişimi sağlanmaktadır. Yakın zamanda sata 3.0 ın çıkması ile birlikte veri transfer hızı 6.0Gb/Saniye düzeyine çıkacaktır. Bu portlar anakart işlemcilerine direk bağlantılı değildir. Kablolardan gelen veriler öncelikle bu iletişim protokolü için özel olarak üretilen sata kontrolcü entegreleri tarafından işlenip chipsete aktarılmaktadır.

6.) Distek Sürücü Bağlantı Portu: Bu porta ise disket sürücüler bağlanmaktadır. Son derece sınırlı bir transfer hızına sahiptir ve ergonomik olarak kullanışlı değildir. Yeni nesil pclerde artık bu slot kullanılmamaya başlanmıştır.

7.) Güç Bağlantı Portu: Kasada bulunan güç kaynağından (power supply) anakarta gerekli olan gücü sağlamak için yapılacak bağlantıda kullanılacak olan porttur. Sağlam bir şekilde karta monteli olup kart için gerekli olan +5v -5v +12v güçleri buradan sağlanmaktadır.

Dahili parçalar için kullanılan portları ve çalışma şekillerini yukarıda anlattık. Diğer sabit parçalar ve bağlantı portları ile ilgili bilgiler aşağıda bulunmaktadır.

Dahili Parça Portları – İşlemci ve Ram

Bu soketlerin diğer bağlantılardan farkı, anakart üzerinde takılı kalmaları ve bilgisayarın en önemli parçalarından ikisi olmalarıdır. Bilgisayar üzerinde yürütülen ana işlemleri hepsi bu iki parça üzerinde yapılmaktadır.

İşlemci – CPU Portu: İşlemci kendisine gelen komut ve bilgileri uygun şekilde işleyerek çıktıları ram ve diğer gereken parçalara aktarmaktadır. Bilgilerin büyük kısmı ram üzerinde toplanacağı için bu iki parça arasında çok fazla sayıda bağlantı vardır ve genellikle birbirine yakın pozisyonda tasarlanırlar. Aşağıdaki resimde örnek bir işlemci slotu gözükmektedir.

Anakart İşlemci Slotu

Bu slotlar genellikle değişik standartlarda üretilirler. Günümüzdeki en önemli iki işlemci üretici firmanın ürettiği ve kullandığı genel standartlar;
Intel İşlemcileri için: Soket 370, 423, 478, 479, 486, 495, 603, 604, 611, LGA 775
AMD İşlemcileri İçin: 563, 754, 939, 940, AM2, AM2+, AM3, 1207 gibi soketler kullanılmaktadır. Bizim resmimizde bulunana soket LGA 775 soketidir. Bu soket türlerinde erkek bacaklar anakart üzerinde bulunmaktadır.

İşlemciler çalışırken ısı seviyeleri yükseldiği için soğutulmaya kesinlikle ihtiyaçları vardır. Hatta pasif değil fan montajı ile aktif olarak soğutulmaları gerekmektedir. Soğutucu bağlanabilmesi içinde yuva çevresinde belirli bir boşluk bulunmaktadır. Ayrıca yuvanın çevresinde bulunan parçalar genellikle güç mosfetleri ve regulatör devreleridir. İşlemcilerde voltaj dalgalanmasının çok ufak değerlerde olması yada hiç olmaması tercih edilmektedir. Bu nedenle güç kaynağı regulasyonu yanında anakart üreticileri işlemci için kendi özel geliştirdikleri regulatör devrelerinde kullanmaktadırlar.

Ram Portu – DIMM Port: Yukarıdada kısaca açıkladığımız gibi işlemci ve ram slotları birbirine genellikle yakın üretilirler çünkü aralarında çok fazla kablo bağlantısı vardır ve bilgisayar hızını en çok etkileyen elemanlardır. Ram parçasına kısaca değinecek olursak, normalde bilgileri harddisk üzerinden okuyup işlemek ne kadar hızlı olursa olsun ekranda takılmalar ile karşılaşırız çünkü bir sayfadan diğerine geçerken harddisk üzerindeki verinin alınıp işlenmesi, harddsikin erişim süresinden dolayı gecikir. Fakat ram’lar, üzerindeki bilgileri anında ekrana ve gerekli birimlere aktarma yeteneklerine sahiplerdir. Dolayısıyla gerekli bilgiler işlemci tarafından işlenip ram’e aktarılır ve oradan da gerektiği zaman kullanılırlar. Örnek verecek olursak bilgisayarımızda bir program çalıştırdığımız zaman bu program harddsik züerinden uygun şekilde işlenerek ram bellek üzerine aktarılmaktadır. Program üzerinde herhangi bir işlem yaparken aslında program ram üzerinden çalışmaktadır. Aksi taktirde herhangi bir işlemde veya sayfa değişiminde her defasında harddsik kullanılıyor olsaydı çok fazla zaman kaybımız olurdu.

Anakart Ram DIMM Slotu

Yukarıda resimde örnek bir 240 Pin DIMM Ram slotu – DDR2 gözükmektedir. Soket yapılarına gelecek olursak. Ram soket yapı standartları aşağıdaki gibidir;
SDRAM Standartları: 72 pin SO-DIMM, 100 pin DIMM, 144 pin SO-DIMM, 168 pin DIMM
DDR SDRAM Standartları: 200 pin SO-DIMM, 240 pin DIMM bu standartlar DDR2 ve DDR3 içinde kullanılmaktadır.
Boyut olarak 256MB, 512MB, 1GB, 2GB, 4GB gibi standartlar vardır. Anakartların adresleme yeteneklerine bağlı olarak 16GB veri büyüklüğünde ram takılabilecek 4 slot bulunabilir. Ramler üzerindeki bellek entegreleri sayesinde çok büyük verileri kaydedebilirler ve sadece elektrik varken veriler üzerinde durur. Herhangi bir elektrik kesintisinde üstündeki veriler sıfırlanır. Yeni anakartlarda genellikle 4 tane DIMM slotu bulunmaktadır. Dimm slotları kullanılırken eğer elimizde iki tane ram varsa aynı bölgedeki iki slota takılmazlar. 1 tanesi sarıya takılır diğerdie ikinci sarıya takılır. 3 ram varsa işlemciye yakın olan ilk kırmızıya takılır. Ram takma işlemlerini yaparken gerekli belgeleri okumanızı tavsiye ederiz.

Harici Parça Portları

Bu portlar ise bilgisayarımızın içindeki verileri ve bilgilerin dış dünya ile haberleştirilmesini sağlar. Örnek; ses, internet, mouse, klavye gibi parçalar bu slotlara bağlanarak çalışmaktadır. Aşağıdaki resimde bulunan bağlantı portları ve görevlerini inceleyecek olursak.

Anakart Dış Bağlantı Portları

1.) Klavye ve Mouse Portu: Bu portlar ile klavye ve mouse gibi aygıtlarımızı pc’ye bağlarız. Dışarıdan gireceğimiz bilgiler ve yapmak istediğimiz herşeyi kontrol eden bu iki aleti anakarta bağlayan yuva burasıdır. Bu aygıtlar ayrıca USB portu üzerinden de bağlanabilmektedir.

2.) Paralel Port: Eski bir iletişim birimidir ve yeni nesil bilgisayar anakartlarında kullanılmamaya başlanmaktadır. Çok küçük veri transfer hızlarıyla (Baud rate) çalışmaktadırlar.

3.) Seri Port: RS232 olarak ta adlandırılabile bu port’ta eski bir bağlantı arabirimidir ve yine paralele port gibi yeni nesil kartlarda kullanılmamaya başlanmaktadır. Seri protta veri transferi RX ve TX olarak adlandırılan iki bacak vasıtasıyla iletilmektedir.

4.) USB Portu: Yeni nesil iletişim teknolojisi olarak kullanılan USB 480Mbit/Saniye veri transfer hızına ulaşmaktadır. Bağlantı kablo sayısının az olması ve ergonomik bir bağlantı yapısıyla hemen hemen tüm al

C Programlama Dersi – VIII

Bu yazıda öğrenecekleriniz:
– Kısa Devre Değerlendirme
– Önişlemci Komutları
– #define Önişlemci Komutu
– #undef Önişlemci Komutu
– #ifdef ve #ifndef Önişlemci Komutları
– #if, #else, #endif, #elif Önişlemci Komutları
– #include Önişlemci Komutu

Kısa Devre Değerlendirme


Kısa devre değerlendirme, ne yazık ki pek iyi bir çeviri olmadı ve bu yüzden hiçbir anlam ifade etmeyebilir. İngilizce’de, Short Circuit Evaluation olarak geçen bu konu, mantıksal ifadelerle ilgilidir.

Hatırlarsanız, daha önce ki derslerimizde iki farklı AND ve OR operatörü görmüştük. Bu yapılardan biri AND için && işaretini kullanıyorken, diğeri sadece tek & simgesini kullanıyordu. Keza, OR ifadesi bir yerde, || şeklinde gösteriliyorken, diğer yerde, tek bir | simgesiyle ifade edilmekteydi. Bu işaretler, aynı sonucu üretiyor gibi görünseler de, farklı şekilde çalışırlar.

Çift şekilde yazılan operatörler, ( yani && ve || ) kısa devre operatörleridir. İngilizce, Short Circuit Operator olarak isimlendirilirler. Tek sembolle yazılan operatörlerden farkı, işlemleri kısaltmalarıdır.

Bir koşul içersinde AND ( && ) operatörü kullandığınızda, koşulun sol tarafı yanlışsa, sağ tarafı kontrol edilmez. Çünkü artık sağ tarafın doğru veya yanlış olmasının önemi yoktur; sonuç her şekilde yanlış olacaktır.

Benzer bir mantık OR ( || ) operatörü içinde geçerlidir. Eğer sol taraf doğruysa, sağ tarafın kontrol edilmesine gerek yoktur. Çünkü OR operatöründe taraflardan birinin doğru olması durumunda, diğerinin önemi kalmaz ve sonuç doğru döner.

Aşağıdaki örnekleri inceleyelim:


&& Operatörü

 
#include<stdio.h>
int main( void )
{
	int i, j;
	i = 0;
	j = 5;
	if( i == 1 && j++ ) {
		printf( "if içersine girdi\n" );
	}
	else {
		printf( "if içersine girmedi\n" );
		printf( "i: %d, j: %d\n", i, j );
	}
	return 0;
}
 
if içersine girmedi
i: 0, j: 5




& Operatörü

 
#include<stdio.h>
int main( void )
{
	int i, j;
	i = 0;
	j = 5;
	if( i == 1 & j++ ) {
		printf( "if içersine girdi\n" );
	}
	else {
		printf( "if içersine girmedi\n" );
		printf( "i: %d, j: %d\n", i, j );
	}
	return 0;
}
 
if içersine girmedi
i: 0, j: 6

Gördüğünüz gibi, program çıktıları birbirinden farklıdır. Bunun sebebi, ilk örnekte, i == 1 koşulu yanlış olduğu için, && operatörünün ifadenin sağ tarafına bakmamasıdır. İkinci örnekteyse, & operatörü, koşulun her iki tarafına da bakar. Bu yüzden, j değişkenine ait değer değişir. Benzer bir uygulamayı, OR için || ve | kullanarak yapabilirsiniz.

ÖNEMLİ NOT: Özetle işlemlerinizi hızlandırmak istiyorsanız; AND kullanacağınız zaman, && operatörüyle çalışın ve yanlış olması muhtemel olan koşulu sol tarafa koyun. Eğer OR operatörü kullanacaksanız, doğru olma ihtimali fazla olan koşulu, ifadenin soluna koyun ve operatör olarak || ile çalışın. Bu şekillde yazılan bir program, kısa devre operatörleri sayesinde, gereksiz kontrolden kaçınarak işlemlerinizi hızlandıracaktır.

Elbette & veya | operatörlerinin kullanılması gereken durumlarda olabilir. Her n’olursa olsun, koşulun iki tarafınında çalışmasını istiyorsanız, o zaman & ve | operatörlerini kullanmanız gerekmektedir.



Önişlemci Komutları

Bir program yazdığınızı düşünün… Bu programda, PI değerini birçok yerde kullanmanız gerekiyor. Siz de PI değeri olması gereken her yere, 3.14 yazıyorsunuz. Oldukça sıkıcı bir iş. İleride PI’yi, 3.141592653 olarak değiştirmek isterseniz daha da sıkıcı hâle dönüşebilir. Veya canınız istedi, printf(  ) fonksiyonu yerine ekrana_yazdir(  ) kullanmaya niyetlendiniz… İşte bu gibi durumlarda, Önişlemci Komutlarını ( Preprocessor ) kullanırız. Önişlemci komutlarının amacı, bir şeyi başka bir şekilde ifade etmektir.

Konuya devam etmeden önce ufak bir uyarı da bulunmakta yarar var. Önişlemci komutlarını, değişkenler veya fonksiyonlarla karıştırmamak gerekiyor. Değişkenlerin ve fonksiyonların daha dinamik ve esnek bir yapıları varken, önişlemci komutları statiktir. Programınıza direkt bir kod yazdığınızı düşünün. Bu kod herhangi bir şey (sembol, program parçası, sayı, karakter vs…) olabilir. Örneğin, her yerde PI’nin karşılığı olarak 3.14 girmek yerine, PI diye bir sembol tanımlarız ve bunun görüldüğü her yere 3.14’ü koyulmasını isteriz. Önişlemci komutları bu gibi işlerde, biçilmiş kaftandır.



#define Önişlemci Komutu

#define komutu, adından da anlaşılabileceği gibi tanımlama işlemleri için kullanılır. Tanımlama komutunun kullanım mantığı çok basittir. Bütün yapmamız gereken, neyin yerine neyi yazacağımıza karar vermektir. Bunun için #define yazıp bir boşluk bıraktıkan sonra, önce kullanacağımız bir isim verilir, ardından da yerine geçeceği değer.

Altta ki program, PI sembolü olan her yere 3.14 koyacak ve işlemleri buna göre
yapacaktır:

 
/* Çember alanını hesaplar */
 
#include<stdio.h>
#define PI 3.14 
int main( void )
{
	int yaricap;
	float alan;
	printf( "Çemberin yarı çapını giriniz> " );
	scanf( "%d", &yaricap );
	alan = PI * yaricap * yaricap;
	printf( "Çember alanı: %.2f\n", alan );
	return 0;
}

Gördüğünüz gibi, PI bir değişken olarak tanımlanmamıştır. Ancak #define komutu sayesinde, PI’nin aslında 3.14 olduğu derleyici (compiler) tarafından kabul edilmiştir. Sadece #define komutunu kullanarak başka şeylerde yapmak mümkündür. Örneğin, daha önce dediğimizi yapalım ve printf yerine, ekrana_yazdir; scanf yerine de, deger_al isimlerini kullanalım:

 
/* Yarıçapa göre daire alanı hesaplar */
 
#include<stdio.h>
#define PI 		3.14
#define ekrana_yazdir 	printf
#define deger_al 	scanf 
int main( void )
{
	int yaricap;
	float alan;
	ekrana_yazdir( "Çemberin yarı çapını giriniz> " );
	deger_al( "%d", &yaricap );
	alan = PI * yaricap * yaricap;
	ekrana_yazdir( "Çember alanı: %.2f\n", alan );
	return 0;
}

#define komutunun başka marifetleri de vardır. İlerki konularımızda göreceğimiz fonksiyon yapısına benzer şekilde kullanımı mümkündür. Elbette ki, fonksiyonlar çok daha gelişmiştir ve sağladıkları esnekliği, #define tutamaz. Bu yüzden #define ile yapılacakların sınırını çok zorlamamak en iyisi. Ancak yine de bilginiz olması açısından aşağıda ki örneğe göz atabilirsiniz:

 
/* Istenen sayida, "Merhaba" yazar */
 
#include<stdio.h>
#define merhaba_yazdir( x ) int i; for ( i = 0; i  " );
	scanf( "%d", &yazdirma_adedi );
	merhaba_yazdir( yazdirma_adedi );
	return 0;
}	



#undef Önişlemci Komutu

Bazı durumlarda, #define komutuyla tanımladığımız şeyleri, iptal etmek isteriz. Tanımlamayı iptal etmek için, #undef komutu kullanılır. Örneğin #undef PI yazdığınız da, o noktadan itibaren PI tanımsız olacaktır. #define ile oluşturduğunuz sembolleri belirli noktalardan sonra geçerliliğini iptal etmek veya yeniden tanımlamak için #undef komutunu kullanabilirsiniz.



#ifdef ve #ifndef Önişlemci Komutları

Önişlemci komutlarında bir sembol veya simgenin daha önce tanıtılıp tanıtılmadığını kontrol etmek isteyebiliriz. Tanıtılmışsa, şöyle yapılsın; yok tanıtılmadıysa, böyle olsun gibi farklı durumlarda ne olacağını belirten yapılar gerekebilir. Bu açığı kapatmak için #ifdef (if defined – şayet tanımlandıysa) veya #ifndef (if not defined – şayet tanımlanmadıysa) operatörleri kullanılır.

 
#include<stdio.h>
#define PI 3.14
int main( void )
{
	// Tanımlı PI değeri, tanımsız hâle getiriliyor.
	#undef PI 
 
	int yaricap;
	float alan;
	printf( "Çemberin yarı çapını giriniz> " );
	scanf( "%d", &yaricap );
 
	// PI değerinin tanımlı olup olmadığı kontrol ediliyor.
	#ifdef PI 
		//PI tanımlıysa, daire alanı hesaplanıyor.
		alan = PI * yaricap * yaricap;
		printf( "Çember alanı: %.2f\n", alan );
	#else 
		//PI değeri tanımsızsa, HATA mesajı veriliyor.
		printf("HATA: Alan değeri tanımlı değildir.\n");
	#endif 
	
	return 0;
}

Yukardaki örneğe bakacak olursak, önce PI değeri tanımlanıyor ve sonrasında tanım kaldırılıyor. Biz de sürprizlerle karşılaşmak istemediğimizden, PI değerinin tanım durumunu kontrol ediyoruz. Tek başına çalışan biri için gereksiz bir ayrıntı gibi gözükse de, ekip çalışmalarında, bazı şeylerin kontrol edilmesi ve istenmeyen durumlarda, ne yapılacağı belirlenmelidir. Yukarda ki programı şöyle de yazabilirdik:

 
#include<stdio.h>
int main( void )
{
	int yaricap;
	float alan;
	printf( "Çemberin yarı çapını giriniz> " );
	scanf( "%d", &yaricap );
 
	// Şu noktaya kadar tanımlı bir PI değeri bulunmuyor.
	// #ifndef opertörü bu durumu kontrol ediyor.
	// Eğer tanımsızsa, PI'nin tanımlanması sağlanıyor.
	#ifndef PI		
		#define PI 3.14
	#endif 
 
	alan = PI * yaricap * yaricap;
	printf( "Çember alanı: %.2f\n", alan );
 
	return 0;
}



#if, #else, #endif, #elif Önişlemci Komutları

Bazen bir değerin tanımlanıp, tanımlanmadığını bilmek yetmez. Bazı değerler, bayrak (flag) olarak kullanılır. Yani eğer doğruysa, böyle yapılması lâzım, aksi hâlde böyle olacak gibi… Bazı programlar, önişlemci komutlarından yararlanır. Değişken yerine, önişlemcileri kullanarak tanımlanan simgeler, bu programlarda flag görevi görür.

Konumuza dönersek, #if, #else, #endif yapısı daha önce işlemiş olduğumuz if-else yapısıyla hemen hemen aynıdır. if-elif yapısı da if-else if yapısına benzer. Her ikisinin de genel yazım kuralı aşağıda verilmiştir:

#if – #else Yapısı: #if – #elif Yapısı:
 
#if koşul 
	komut(lar) 
#else 
	komut(lar) 
#endif
 
#if koşul 1 
	komut(lar) 1 
#elif koşul 2 
	komut(lar) 2 
.
.
.
#elif koşul n-1 
	komut(lar) n-1 
#else 
	komut(lar) n 
#endif

Bir program tasarlayalım. Bu programda, pi sayısınının virgülden sonra kaç basamağının hesaba katılacağına karar veren bir mekanizma olsun. Soruyu,şu ana kadar gördüğümüz, if – else gibi yapılarla rahatça yapabiliriz. Önişlemci komutuyla ise, aşağıdakine benzer bir sistem oluşturulabilir:

 
/* Daire alanını hesaplar */
 
#include<stdio.h>
#define HASSASLIK_DERECESI 2
int main( void )
{
	int yaricap;
	float alan;
	printf( "Çemberin yarı çapını giriniz> " );
	scanf( "%d", &yaricap );
 
	// Hassaslık derecesi, pi sayısının virgülden kaç 
	// basamak sonrasının hesaba katılacağını belirtir.
	// Eğer hassaslık derecesi bunlara uymuyorsa, alan 
	// değeri -1 yapılır.
	
	#if ( HASSASLIK_DERECESI == 0 )
		alan = 3 * yaricap * yaricap;
	#elif ( HASSASLIK_DERECESI == 1 )
		alan = 3.1 * yaricap * yaricap;
	#elif ( HASSASLIK_DERECESI == 2 )
		alan = 3.14 * yaricap * yaricap;
	#else
		alan = -1;
	#endif
 
	printf( "Çember alanı: %.2f\n", alan );
	return 0;
}



#include Önişlemci Komutu

#include oldukça tanıdık bir operatördür. Her programımızda, #include önişlemci komutunu kullanırız. Şayet kullanmasak, printf(  ) veya scanf(  ) gibi fonksiyonları tekrar tekrar yazmamız gerekirdi. #include komutu, programımıza bir başlık dosyasının (header file) dâhil edileceğini belirtir. Bu başlık dosyası, standart giriş çıkış işlemlerini içeren bir kütüphane olabileceği gibi, kendimize ait fonksiyonların bulunduğu bir dosya da olabilir.

Eğer sistem kütüphanelerine ait bir başlık dosyasını programınıza dâhil edeceksek,küçüktür ( < ) ve büyüktür ( > ) işaretlerini kullanırız. Örneğin stdio.h sisteme ait bir kütüphane dosyasıdır ve Linux’ta /usr/include/stdio.h adresinde bulunur. Dolayısıyla stdio.h kütüphanesini programımıza eklerken, #include<stdio.h> şeklinde yazarız. Kendi oluşturduğumuz başlık dosyaları içinse, durum biraz daha farklıdır.

Çalışma ortamımızla aynı klasörde olan bir başlık dosyasını, programımıza eklemek için #include “benim.h” şeklinde yazarız. İlerki derslerimizde, kendi başlık dosyalarımızı oluşturmayı göreceğiz. Ancak şimdilik burada keselim…



Önemli Noktalar…

Konuyu noktalarken, söylemek istediğim bazı şeyler bulunuyor. Olabildiğince, önişlemci komutlarından  #include komutu hariç  uzak durun. Çünkü bu komutlar, esnek bir yapıya sahip değiller ve bu durum, bir noktadan sonra başınızı ağrıtacaktır. Önişlemci komutlarıyla yazılmış kodları takip etmek oldukça zordur ve debug edilemezler. Java gibi gelişmiş dillerde, #define komutu bulunmaz. Modern dillerde, bu yapıdan uzaklaşılmaya başlanmıştır.

Yukarda saydıklarıma rağmen, bazı durumlarda, önişlemci komutlarını kullanmak uygun olabilir. Kaldı ki bu komutların kullanıldığı birçok yer bulunuyor ve biz kullanmasak bile, bilmeye mecbur durumdayız. Sözün özü; bu konuyu es geçmek uygun değil. Ancak üzerine düşmek oldukça gereksiz.



  <<   C Programlama Dersi – VII                                               C Programlama Dersi – IX   >>


C Programlama Dersi – VII

Bu yazıda öğrenecekleriniz:
– Bu bölümde, şimdiye kadar işlenmiş konulara dair örnek sorular bulunmaktadır.

Örnek Sorular

Soru 1.a: Aşağıdaki programın çıktısı nedir?

Cevap 1.a:

#include<stdio.h>
int main( void )
{
	int i = 0;
	for( ; i < 12; i++ ) {
		if( ( i++ + 1 ) == 5 ) 	
			printf( "%d\n",i );
		else 
			if( i % 2 == 0 ) break;
			else if( i % 3 == 0)
				continue;
			else 
				printf("%d\n", i );
	}
	return 0;
}

Soru 1.b: Aşağıdaki programı doğru olarak yazınız.

Cevap 1.b:

#include<stdio.h>
int main( void )
{
	int sum;
	float average;
	int weight_1, weight_2;
	printf( "1.agirlik> " );
	scanf( "%d", &weight_1 );
	sum += weight_1;
	printf( "2.agirlik> " );
	scanf( "%d", weight_2 );
	sum += weight_2;
	average = sum / 2;
	printf( "Ortalama: %.2f\n", average );
	return 0;	
}

Soru 2: Bir üçgende, iki kenarın toplam uzunluğu, üçüncü kenardan az
olamaz. Ayrıca iki kenarın birbirinden farkının mutlak değeri, üçüncü kenardan
büyük olmamalıdır. Bu bilgileri kullanarak, verilen üç kenar uzunluğuna göre bir üçgen
çizilip çizilmeyeceğini gösteren programı yazınız. Girilecek kenar uzunlukları
tam sayı olacaktır.

Cevap 2:

/* Girilen 3 tamsayinin bir ucgenin kenari olup olmadigi kontrol edilir */
 
#include<stdio.h>
int main( void ) 
{
	int a, b, c;
	int temp;
	
	printf("Birinci kenar uzunlugu> ");
	scanf("%d", &a);
	printf("Ikinci kenar uzunlugu> ");
	scanf("%d", &b);
	printf("Ucuncu kenar uzunlugu> ");
	scanf("%d", &c);
	
	/* a ile b den buyuk olan a ya kucuk olan b ye atanir */
	if(a < b) {
		temp = a;
		a = b;
		b = temp;
	}
	
	if( ((a + b)  c) )
		printf("Bu kenar uzunluklarina sahip bir ucgen olamaz.\n");
	else
		printf("Bu kenar uzunluklarina sahip bir ucgen cizilebilir.\n");
	
	return 0;
}

Soru 3: Klavyeden girilecek bir sayının asal sayı olup olmadığını ekrana
basan bir program yazınız.

Cevap 3:

/*
Bir sayının asal olup olmadığını bulmak için çeşitli metodlar 
vardır. Aşağıda bu metodlardan basit bir tanesi yazılmıştır. 
Eğer sayının yarısına kadar kontrol etmek yerine, kareköküne 
kadar olan sayıları test ederseniz, yine aynı sonuç çıkacaktır. 
Ancak anlaşılma konusunda sorun olmaması için soru bu şekilde 
çözülmüştür.
*/
#include<stdio.h>
int main( void ) 
{
	int sayi, i;
	//Sayıyı ilk başta asal kabul ediyoruz.
	//asal_mi değişkeni 1 ise, sayi asaldir. 
	int asal_mi = 1;
	
	//Klavyeden, test edilmek üzere bir sayı alınıyor.
	printf( "Bir sayı giriniz> " );
	scanf("%d",&sayi);
	
	//Girilen sayının, başka sayılara göre sırayla modunu
	//alıyoruz. Bir sayının modunu aldığınızda, kalan 0 ise
	//bu sayının bölünebildiğine ve dolayısıyla 
	//asal olmadığına dair bilgi verir. Bu işlemi yapabilmek 
	//için 2'den başlayarak, sayının yarısına kadar olan 
	//bütün değerler deneniyor. 
	for( i = 2; i <= sayi/2; i++ ) {
		if( sayi%i == 0 ) {
		//Sayı i değişkenine kalansız bölünmektedir.
		//Dolayısıyla, sayı asal değildir ve döngüyü 
		//sürdürmeye gerek yoktur.
			asal_mi = 0;
			break;
		}
	}
	//Sayının asal olup olmama durumuna göre, çıktı yazdırılıyor.
	if( asal_mi == 1 ) 
		printf( "%d sayısı asaldır.\n", sayi );
	else
		printf( "%d sayısı asal değildir.\n", sayi );
		
	return 0;
}

Soru 4: Klavyeden girilecek 0 ile 999 arasında bir tam sayının, yazıyla
ifade eden ( örneğin 49, ‘kırkdokuz’ gibi ) bir program oluşturunuz.

Cevap 4:

/*
Girilen sayının, nasıl okunduğunu ekrana yazdıran programdır. 
Fonksiyon kullanımıyla daha efektif olarak yazılabilir.
Ancak henüz işlenmeyen bir konu olduğundan, basit bir şekilde 
yazılmıştır.
*/
#include<stdio.h>
int main( void )
{
	int sayi;
 
	//Klavyeden girilecek sayinin 0 ile 999 sınırlarında 
	//olup olmadığı kontrol ediliyor. Eğer değilse, 
	//uyarı verilip, yeni bir sayı isteniyor. Bu işlem 
	//doğru bir değer girilene kadar devam ediyor.
	do {
		printf( "Sayıyı giriniz> " );
		scanf("%d",&sayi);
		if( sayi>999 || sayi<0 )
			printf("Girdiğiniz sayı uygun değildir.\n"
				"0 ile 999 arasında olmalıdır.\n");
		else
			break;
	}while( 1 );
 
	printf( "%d sayısı, '",sayi );
 
	//Verilen sayıyı, yazıyla ifade edebilmemiz için, 
	//yüzler, onlar ve birler basamaklarına ayırmamız
	//gerekmektedir. 
 
	//Sayının yüzler basamağı ayrıştırılıyor.
	//Bunun için sayıyı, 100'e bölmek yeterli.
 
	//YÜZLER BASAMAĞI:
	switch( sayi/100 ) {
		case 9: printf( "dokuzyüz" ); 	break;
		case 8: printf( "sekizyüz" ); 	break;
		case 7:	printf( "yediyüz" ); 	break;
		case 6: printf( "altıyüz" ); 	break;
		case 5: printf( "beşyüz" ); 	break;
		case 4:	printf( "dörtyüz" ); 	break;
		case 3: printf( "üçyüz" ); 	break;
		case 2: printf( "ikiyüz" ); 	break;
		case 1: printf( "yüz" ); 	break;
	}
 
	//Onlar basamağını bulmak için, sayının 
	//yüze bölümünden kalan değeri, 10'a 
	//bölüyoruz. Yüzler basamağını bir önceki 
	//adımda ele aldığımız için, bu adımda, 
	//sayının yüze bölümünü değil, bölümünden 
	//kalanı kullandık.
 
	//ONLAR BASAMAĞI:
	switch ( (sayi%100)/10 ) {	
		case 9: printf( "doksan" ); 	break;
		case 8: printf( "seksen" ); 	break;
		case 7: printf( "yetmiş" ); 	break;
		case 6: printf( "altmış" ); 	break;
		case 5: printf( "elli" ); 	break;
		case 4: printf( "kırk" ); 	break;
		case 3: printf( "otuz" ); 	break;
		case 2: printf( "yirmi" ); 	break;
		case 1: printf( "on" ); 	break;
	}
 
	//Birler basamağını bulabilmek için, sayının
	//10'a bölümünden kalana bakıyoruz.
 
	//BİRLER BASAMAĞI:
	switch ( (sayi%10) ) {	
		case 9: printf( "dokuz" ); 	break;
		case 8: printf( "sekiz" ); 	break;
		case 7: printf( "yedi" ); 	break;
		case 6: printf( "altı" ); 	break;
		case 5: printf( "beş" );	break;
		case 4: printf( "dört" ); 	break;
		case 3: printf( "üç" ); 	break;
		case 2: printf( "iki" );	break;
		case 1: printf( "bir" );	break;
	}
 
	//Eğer sayı 0 ise, yukarda ki düzeneğe 
	//uymayacağından, onu ayrıca ele alıyoruz.
	if( sayi == 0 )
		printf( "sıfır" );
 
	printf( "' şeklinde okunur.\n" );
	
	return 0;
	
}

Soru 5: Dört basamaklı bir sayının rakamları ters yazılıp, 4 ile çarpılırsa,
çıkan sonuç, kendisiyle aynıdır. Dört basamaklı bu sayıyı bulunuz.

Cevap 5:

/*
Dört basamaklı bir sayının rakamları, ters yazılıp, 4 ile 
çarpılırsa, sayının kendisine eşit olmaktadır. Bu program, 
bahsedilen dört basamaklı bu sayıyı bulmaktadır. 
*/
#include<stdio.h>
int main( void )
{
	//Dört basamaklı bir sayının tersinin dört katına
	//eşit olmasını hesaplamamız gerektiğinden, her 
	//basamağı ayrı ayrı düşünmemiz gerekmektedir. 
	//Bilinmeyen bu sayıyı, abcd olarak düşünebiliriz.
	int a,b,c,d;
	int sayi, sayinin_tersi;
	for( a = 0; a < 10; a++ )
		for( b = 0; b < 10; b++ )
			for( c = 0; c < 10; c++ )
				for( d = 0; d < 10; d++ ) {
	//Burada sayinin degeri bulunmaktadir.
	sayi = a * 1000 + b * 100 + c * 10 + d;
					
	//Burada da sayinin tersi hesaplanmaktadir.
	sayinin_tersi = d * 1000 + c * 100 + b * 10 + a;
					
	//Sayinin tersinin 4 katinin ilk sayiya 
	//esit olup olmadigi kontrol ediliyor. 
	//Ayrica sayinin 0 olmamasi gerekmektedir.
	//Bu kontrol de yapilmaktadir.
	if( sayi == 4 * sayinin_tersi && sayi != 0 ) { 
					
	//Sayi ve uygun olan tersi gosterilir:
	printf( "Sayı: %d, tersi: %d\n", sayi, sayinin_tersi );
						
	//return ifadesi programin daha fazla devam
	//etmemesi icin burada kullanilmistir. 
	//Program donguye devam etmez ve burada kesilir.
	//return, main fonksiyonunu sonlandirir.
						return 0;
					}
				}
	//Uygun bir sayi bulunamazsa, program burada sonlanacaktir.
	return 0;
}

Soru 6: Fibonacci serisinin ilk iki elemanı 0 ve 1’dir. Bundan sonra
gelen sayılar, kendisinden önceki iki sayının toplamıyla bulunur. Yani seri elemanları
0 1 1 2 3 5 8 13 21 … şeklinde gitmektedir. Verilecek adım sayısına göre, Fibonnaci
serisinin elemanlarını gösterecek bir program yazınız.

Cevap 6:

/* Fibonacci sayilarini ekrana yazar */
 
#include<stdio.h>int main( void ) 
{
	int a = 0; /* a[n]   */
	int b = 1; /* a[n+1] */
	int c;     /* a[n+2] */
	int n;
	int i;
	
	printf("Fibonacci serisi kacinci elemana kadar yazilsin> ");
	scanf("%d", &n);
	
	for( i = 1; i <= n ; i++ ) {
		printf( "%4d. Eleman: %d\n", i, a );
		c = a + b;
		a = b;
		b = c;
	}
	
	return 0;
}

Soru 7: Verilecek kenar uzunluğuna göre, yıldız (*) işareti kullanarak
kare çizen, bir program yazınız.

Cevap 7:

/* '*'ler kullanarak kenar uzunlugu verilen kareyi cizer */
 
#include<stdio.h>
int main( void ) 
{
	int kenar;
	int i;
	int j;
	
	printf("Karenin kenar uzunlugu: ");
	scanf("%d", &kenar);
	
	/* Gecerli bir deger mi */
	while((kenar  20)) {
	
		printf("Lutfen 0 ile 20 arasinda bi deger giriniz.");
		printf("Karenin kenar uzunlugu");
		scanf("%d", &kenar);
	}
	
	/* karenin cizilmesi */
	for(i = 1; i <= kenar; i++) {
	
		if(kenar == 0)
			break;
		
		/* alt ve üst kenarlarin cizimi */
		if((i == 1) || (i == kenar)) {
		
			for(j = 1; j <= kenar; j++)
				printf("*");
			printf("\n");
			continue;
		} /* if sonu */
		
		/* sag ve sol kenarlarin cizimi */
		for(j = 1; j <= kenar; j++)
			if((j == 1) || (j == kenar))
				printf("*");
			else
				printf(" ");
		
		printf("\n");
	} /* for sonu */
	
	return 0;
}

Soru 8: Aşağıdaki eşkenar dörtgen çıktısını üretecek bir program
yazınız:

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

Cevap 9:

/* '*'ler yardimiyla eskenar dortgen cizer */
 
#include<stdio.h>
int main( void ) 
{
	int i, j;
	
	for(i = 1; i <= 5; i++) {
		for(j = 1; j <= 9; j++)
			if((j  (i + 4)))
				printf(" ");
			else 
				printf("*");
		
		printf("\n");
	}
	for(i = 4; i >= 1; i--){
		for(j = 1; j <= 9; j++)
			if((j  (i + 4)))
				printf(" ");
			else 
				printf("*");
		
		printf("\n");
	}
	
	return 0;
}

Soru 9: Hipotenus’u 500 birime kadar olan dik üçgenlerin, kenar uzunluklarını
gösteren bir program yazınız. Kenar uzunlukları, sadece tam sayı olacaktır.

Cevap 9:

/* Hipotenusu 500'e kadar olan pisagor uclulerini ekrana yazar. */
 
#include<stdio.h>
int main( void ) 
{
	int a; /* birinci dik kenar */
	int b; /* ikinci dik kenar */
	int hipotenus;
 
	for(a = 1; a < 500; a++)
		for(b = a; b < 500; b++)
			for(hipotenus = b+1; hipotenus <= 500; hipotenus++)
				if( (a*a + b*b) == hipotenus*hipotenus )
					printf("%5d%5d%5d\n", a, b, hipotenus);
	return 0;
}	


  <<   C Programlama Dersi – VI                                                 C Programlama Dersi – VIII   >>


C Programlama Dersi – VI

Bu yazıda öğrenecekleriniz:
– Sayı tabanları
– Bit Bazında ( Bitwise ) Operatörler
– AND ( & ) Operatörü
– OR ( | ) Operatörü
– NOT ( ~ ) Operatörü
– XOR ( ^ ) Operatörü
– Kaydırma ( Shift ) Operatörleri
– Operatör Öncelikleri

Sayı Tabanları

Bilgisayar programlamayla, matematik arasında çok güçlü bir ilişki vardır. Geçmişe bakarsanız, bilgisayar alanında önemli adımların, hep matematik kökenli insanlar tarafından atıldığını görürsünüz. Bir bilgisayar programcısı için, matematikten uzak durmak düşünülemez.

Bugün ki dersimizde, biraz matematik içersine gireceğiz ve sayı sistemleriyle, Boole Cebiri (Boolean Algebra) konularını ele alacağız.

Genel kabul görmüş sayı sistemleri vardır ve içlerinde en yaygını, hepimizin gündelik hayatta kullandığı 10’luk sayı sistemidir. Yazması, okunması ve işlem yapması son derece kolay olduğundan bunu daha çocuk yaşta öğrenir ve bu şekilde sürdürürüz. Ancak bilgisayarlar bizim gibi işlem yapabilme yetisine sahip değildir. Onlar için iki ihtimal vardır. Bir şey ya 1’dir ya da 0. Bunu ikilik sayı sistemi olarak adlandırırız. Yani bizim yazdığımız bütün sayılar, bütün harfler ve aklınıza gelen-gelmeyen bütün işaretler, bilgisayar için 0 ve 1’in kombinasyonlarından ibarettir.İşte bu yüzden bizlerin, ikilik sayı sistemine hakim olması gerekir.

Sayı sistemlerini genel olarak aşağıdaki gibi ifade edebiliriz:

Burada, N sayı tabanına göstermektedir. k sayının hangi hanesinde olduğumuzu ifade ederken, dk ise, ilgili sayıdaki rakamı temsil eder. Şimdi basit bir örnek yapalım ve ikilik tabandaki 10011 sayısının, 10 tabanındaki eş değerini bulalım:

( d4d3d2d1d0 )2 = ( d0 . 20 ) + ( d1 . 21 ) + ( d2 . 22 ) + ( d3 . 23 ) + ( d4 . 24 )
( 10011 )2 = ( 1 . 20 ) + ( 1 . 21 ) + ( 0 . 22 ) + ( 0 . 23 ) + ( 1 . 24 ) = 19

ikilik sayı sistemi dışında, 16’lık (Hexadecimal) sayı sistemi de oldukça önemli bir başka tabandır. 16’lık sayı sisteminde, rakamları ifade etmek için 16 adet sembole gereksinim duyarız. Bu yüzden 0 ile 9 arasında olan 10 rakamı kullandıktan sonra, A, B, C, D, E ve Fharflerini de rakam olarak değerlendiririz.

Decimal: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hexadecimal: 0 1 2 3 4 5 6 7 8 9 A B C D E F

Hexadecimal/16’lık sayı tabanıyla ilgili aşağıdaki örneklere göz atalım:

( 3FC )16 = ( 3 . 162 ) + ( F . 161 ) + ( C . 160 ) = 768 + 240 + 12 = 1020
( 1FA9 )16 = ( 1 . 163 ) + ( F . 162 ) + ( A . 161 ) + ( 9 . 160 ) = 4096 + 3840 + 160 + 9 = 8105
( 75 )16 = ( 7 . 161 ) + ( 7 . 160 ) = 112 + 5 = 117

16’lık sayı sisteminin diğer bir ismi Hexadecimal olduğundan, bazı yerlerde, bunu ifade etmek için 16 yerine ‘H’ harfi de kullanılabilir:

( BA3 )16 = ( BA3 )H ;   ( A1E )16 = ( A1E )H gibi…

Tabanlar arasında dönüştürme işlemi, üzerinde duracağımız bir başka konudur. Elinizde 16’lık sayı sisteminde bir sayı varsa ve bunu 2’lik sayı sistemiyle yazmak isterseniz önce 10’luk sayı sistemine çevirip daha sonra 2’lik sayı sistemine dönüştürebilirsiniz. Ancak 16’lık ve 2’lik sayı sistemlerini çok daha kolay birbirine dönüştürmeniz mümkündür. Aşağıdaki tabloda 16’lık sayı sistemindeki rakamlar ve bunun 2’lik sayı sistemindeki karşılığı verilmiştir:

Hex: 0 1 2 3 4 5 6 7 8 9
Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

Hex: A B C D E F
Binary 1010 1011 1100 1101 1110 1111

Bu durumu bir örnekle şöyle gösterebiliriz:

( A3F1 )H A 3 F 1
1010 0011 1111 0001

16’lık tabandaki her rakamın, 2’lik tabandaki karşılığını koyduğumuzda yukardaki eşitliği elde ediyoruz ve buna göre ( A3F1 ) = ( 1010 0011 1111 0001 )2 eşitliğini kurabiliyoruz. (2’lik tabandaki sayıya ait boşluklar, sayının daha rahat okunması için bırakılmıştır.) Bu tarz dönüşümler, 2 ve 2’nin katında olan sayı tabanlarında rahatlıkla yapılabilir.

Hatırlarsanız, değişken tiplerinde, işaretli ve işaretsiz değişken tanımlamalarından bahsetmiştik. Şimdi olayın biraz daha derinine inelim. Bir char, 1 byte alan kaplar ve 1 byte, 8 bit’ten oluşur. Aşağıdaki kutuların her birini bir bit ve kutuların oluşturduğu bütünü bir byte olarak düşünün:

 a7   a6   a5   a4   a3   a2   a1   a0 

Yukardaki kutuların toplamı olan bir byte, char değişkeninin kapladığı alanı temsil etmektedir. Pozitif sayıları ifade etmeyi zaten öğrenmiştik. Sayının karşılığını, 2’lik tabanda yazarak, gerekli sonuca ulaşırız. Ancak sayımız Negatif değerliyse, işler biraz farklılaşır. Burada devreye işaret biti (sign bit) devreye girer. Yukardaki şekilde, diğer kutulardan farklı renkte olan a7 işaret bitidir.Özetle, a7 0 ise, sayı pozitiftir. Eğer a7 1 ise, sayı negatiftir.

İkilik tabandaki işaretli bir sayının, 10’luk tabandaki karşılığını şu şekilde bulabiliriz:

( a7a6a5a4a3a2a1a0 )2 = ( a7 . -27 ) + ( a6 . 26 ) + ... + ( a1 . 21 ) + ( a0 . 20 )

İkilik tabanda yazılmış ( 10000011 )2 sayısı, işaretsiz olarak düşünülürse, 131’e eşittir. Ancak işaretli bir sayı olduğu düşünülürse, karşılığı, -125 olacaktır. Konunun pekişmesi açısından aşağıdaki örneklere göz atabilirsiniz:

* ( 1011 1011 )2 = -69 (Sayı işaretliyse)
  ( 1011 1011 )2 = 187 (Sayı işaretsizse)
* ( 1100 1101 )2 = -51 (Sayı işaretliyse)
  ( 1100 1101 )2 = 205 (Sayı işaretsizse)
* ( 0110 1101 )2 = 109 (Sayı işaretliyse)
  ( 0110 1101 )2 = 109 (Sayı işaretsizse)

Negatif bir sayının 2’lik tabandaki karşılığını bulmak için, önce (i) sayıyı pozitif olarak ikilik tabanda yazarız. Daha sonra, (ii) ikilik tabanda yazılmış sayının 1 yazan rakamları 0, 0 yazan rakamları 1’e çevrilir. Son olarak (iii) çıkan sayıya, 1 eklenir. Bu size istediğiniz sayının ikilik tabanındaki eşini verecektir. Şimdi bir uygulama yapalım ve -7 sayını ikilik tabana çevirmeye çalışalım:

i ) -7 ==> ( 7 )10 = ( 0000 0111 )2

ii ) ( 0000 0111 ) ==> ( 1111 1000 )

iii ) ( 1111 1000 ) + 1 = ( 1111 1001 )
==> ( -7 )10 = ( 1111 1001 )2

Bit Bazında ( Bitwise ) Operatörler

Bit bazında operatörlerin, İngilizce’deki karşılığı Bitwise Operators ( yani Bit bit Operatörler ) olarak geçmektedir. Bit bazında operatörler, ikilik sayı tabanında yapabileceğimiz işlemleri temsil eder. Kullanılan operatörleri aşağıda inceleyeceğiz.

AND ( & ) Operatörü

AND operatörü, kendisine verilen iki değişkenin bütün bitleri 1’e eşit olduğu takdirde, geriye 1 döndürür. Aksi halde -yani en ufak bir fark varsa- 0 değeri dönmektedir.

p q p&q
0 0 0
0 1 0
1 0 0
1 1 1
x 0 0
x 1 x

Şimdi, AND ( & ) operatörünü 25 ve 14 sayılarını karşılaştırmak için kullanalım:

  25 ==> ( 0001 1001 )2 
  14 ==> ( 0000 1110 )2 
&
----------------------------
   8 ==> ( 0000 1000)2 

OR ( | ) Operatörü

İki değişkenden herhangi biri 1 içeriyorsa, geriye 1 döner. Eğer her ikisi de 0
içeriyorsa, geriye 0 dönmektedir.

p q p|q
0 0 0
0 1 1
1 0 1
1 1 1
x 0 x
x 1 1

Daha önce kullandığımız 25 ve 14 sayıları üzerinde OR ( | ) işlemi kullanalım:

  25 ==> ( 0001 1001 )2 
  14 ==> ( 0000 1110 )2 
|
----------------------------
  31 ==> ( 0001 1111)2 

ÖNEMLİ NOT: Bit bazında kullanılan, AND( & ) ve OR ( | ) operatörleri, koşullu ifadelerde kullanılan, AND( && ) ve OR ( || ) ifadelerinden farklıdır. Şayet, & veya | bir koşullu ifade gibi kullanmaya kalkarsanız, işlem yine yapılacaktır. Ancak bunu yapmanız tavsiye edilmez. İlerki konularımızda neden uygun olmadığı, short-circuit ile ilgili bilgi verilirken açıklanacaktır.

NOT ( ~ ) Operatörü

NOT ( ~ ) Operatörü, kendisine verilen sayıya ait bit’leri tam tersine çevirir. Yani 0 gördüğü yeri 1; 1 gördüğü yeri 0 yapar.

p ~p
0 1
1 0

  25 ==> ( 0001 1001 )2 
~
----------------------------
 230 ==> ( 1110 0110 )2 

XOR ( ^ ) Operatörü

XOR ( Exclusive OR ) Operatörü, sadece ve sadece karşılaştırma yapılan bitlerden biri, 1 değerine sahipse, geriye 1 döndürür. Eğer karşılaştırma yapılan bit’lerden her ikisi de 0 veya 1’se, o zaman sonuç 0 olarak çıkar.

p q p^q
0 0 0
0 1 1
1 0 1
1 1 0
x 0 x
x 1 ~x

  25 ==> ( 0001 1001 )2 
  14 ==> ( 0000 1110 )2 
^
----------------------------
  23 ==> ( 0001 0111 )2 

Kaydırma ( Shift ) Operatörleri

Kaydırma operatörleri, özellikle Assembly ile uğraşanlara tanıdık gelecektir.Bunları kullanarak son derece hızlı çarpma ve bölme yapılabilir. C’deyse benzer amaçlarla kullanmanız elbette mümkündür. İki çeşit kaydırma operatörü vardır:

i)  Sola Kaydırma – Shift Left ( << )

ii) Sağa Kaydırma – Shift Right ( >> )

Her iki durumda da genel kullanım şekli aşağıdaki gibidir:

    [ Tam Sayı ][ Operatör ][ Kaydırma Adım Sayısı ]

Aşağıdaki örnek, sola kaydırma operatörü kullanılarak yapılan bir işlemi göstermektedir. x değişkeni, 10 tabanında 22 sayısını tutmaktadır. 2 adım sola kaydırılması sonucu, sayı 88 olmuş ve y’ye atanmıştır.

x = ( 0001 0110 )2 ==> 22
y = x << 2  
y = ( 0101 1000 )2 ==> 88

Operatör Öncelikleri

Hatırlarsanız, aritmetik işlemlerde önceliklerin olduğunu ve örneğin çarpmanın, toplamadan daha önce yapılacağını anlatmıştık. Benzer bir durum, operatörler içinde geçerlidir. Altta bulunan tabloda, hangi operatörün daha önce işleme alındığını bulabilirsiniz:

OPERATÖR ÖNCELİK SIRASI
 DÜŞÜK   |   ^   &   <>   +  –   * / %   !  ~  –  ++  —   (  )   YÜKSEK 

Aşağıda bulunan tablo, ilişkisel ve mantıksal operatörlerde ki öncelik sırasını göstermektedir:

İLİŞKİSEL ve MANTIKSAL OPERATÖR ÖNCELİK SIRASI
 DÜŞÜK   ||   &&   == !=   > >= < <=   !   YÜKSEK 

Yukardaki tablolarda, aynı hücrede olan operatörlerin işlem öncelikleri aynıdır. Önce hangisi yazılmışsa, ilk olarak o dikkate alınır. Ama bunun dışında tanınan bir işlem önceliği bulunmamaktadır.

Aşağıdaki örnek, operatör önceliklerini pekiştirmek açısından incelenebilir:

7 & 13 ^ 11 % 4 * 2 < 7 & 13 ^ 6 < 5 ^ 48 = 53

Şimdi de benzer bir örneği, C programı yazarak yapalım:

#include<stdio.h>
int main( void ) 
{
	printf( "İşlem Sonucu: %d\n", 117 & 11 << 2 * 3 );
	return 0;
}	

Yukardaki program, 64 sonucunu vermektedir. Programı çalıştırdığınızda, ikilik düzeyde işlemler yapılacak ve 64 cevabına ulaşılacaktır. Siz de hesaplayarak, aynı yanıtı bulabilirsiniz.

Bir sonraki dersimizde, konu anlatımı olmayacak. Onun yerine bol bol örnek yapıp, şimdiye kadar işlediğimiz konuların üzerinden geçeceğiz. Görüşmek üzere…



  <<   C Programlama Dersi – V                                                   C Programlama Dersi – VII   >>