31 Ekim 2016 Pazartesi

printf () ve scanf()


printf () - Tip belirleyici (conversion specifier)

% işareti ile başlar ve bir veya iki karakterden oluşur (%d gibi). Ekrana yazdırılmak istenen değişkenin tipi, % işaretinden sonra belirtilir. Ayrıca biçim ifadesinin içine, sola - sağa yaslama, noktadan sonra x basamak yaz vb gibi isteklerimizi belirten karakterler de ekleyebiliriz.

Gerçek sayıların yazdırılmasında, noktadan sonra yazılacak basamak sayısı durumların ifade edilmesi için ve tamsayıların aynı hizada yazdırılması için nokta operatörü veya rakamlar kullanılır.Aynı şekilde karakter katarlarının sağa ya da sola dayalı yazdırılması için veya bir karakter katarındaki karakterlerin kaç tanesinin yazdırılacağını belirtmek için de yine nokta, eksi gibi operatörlerin ve rakamların çeşitli kombinasyonları kullanılır.




 scanf() Fonksiyonu


Birçok programda ekrana verilerin bastırılmasının yanı sıra klavyeden veri okunması gerekebilir.
scanf() fonksiyonu klavyeden veri okumak için kullanılan fonksiyondur. Tip belirleyicileri printf fonksiyonu ile aynı mantıkta kullanılır ve % sembolü ile ifade edilir.

Örneğin klaveden bir x tamsayısı okumak için aşağıdaki ifade kullanılır:

    scanf("%d", &x);


C'de Operatörler

Operatörler

Operatörler, değişkenler veya sabitler üzerinde matematiksel ve karşılaştırma işlemlerini yapan simgelerdir. Yani bir operatör bir veya daha fazla değişken üzerinde işlem yapan semboldür.

C programlama dilinde 4 tip operatör bulunmaktadır.
Aritmetik Operatörler
Atama Operatörleri
Karşılaştırma Operatörleri
Mantıksal Operatörler



a = b + 10;
c = d + c * e –f /g + h % j;
z = u[1] * u[2];
x = 10;
a = b = c = 0;


Bu operatörler bir değişkene, bir sabit veya bir aritmetik ifade atamak (eşitlemek) için kullanılır.




Birleşik atama: Bazı ifadelerde işlem operatörü ile atama operatörü birlikte kullanılarak, ifadeler daha kısa yazılabilir.




Eğer ifade
     değişken = değişken [operatör] aritmetik ifade;
şeklinde ise, daha kısa bir biçimde
    değişken [operatör]= aritmetik ifade;
olarak yazılabilir.













C'de Sabitler


Sabitler

Sabit bildirimi, başlangıç değeri verilen değişken bildirimi gibi yapılır.
Ancak, veri tipinin önüne const anahtar sözcüğü konmalıdır.
Sabit içerikleri program boyunca değiştirilemez. Yalnızca kullanılabilir.
Genellikle, sabit olarak bildirilen değişken isimleri büyük harflerle, diğer değişken isimlerinin ise küçük harflerle yazılması (gösterilmesi) C programcıları tarafından geleneksel hale gelmiştir.

const float PI = 3.142857;
const double NOT= 12345.8596235489;
const int EOF= -1;
const char[] = "devam etmek için bir tuşa basın...";

C'de Değişkenler

Değişkenler


Değişken, program içinde kullanılan değerlere bellek üzerinde açılan alanlardır. Bu alanlar bir değişken ismi ile anılır. Değişken isimlendirilmeleri, tanımlayıcı kurallarına uygun biçimde yapılmalıdır. C’de tüm değişkenler kullanılmadan önce programa bildirilmelidir.
Bu bildirim esnasında, değişkenin veri türü belirlenir.

Örnek:
veri_türü değişken_adı;
int sayac;



Örnekler
int x;
int x1, y1, z1;
long d, d1;
char c;
char c1, c2, c3;
float a;
float a1, a2, a3;
int u[3];
float k[10*20];
int x = 1;
int x1 = 10, y1 = 20, z1 = 30;
char c = ‘a’;
float a = 123.45;



C'de Veri Türleri


Veri Türleri

Veri tipi (data type) program içinde kullanılacak değişken, sabit, fonksiyon isimleri gibi tanımlayıcıların tipini, yani bellekte ayrılacak bölgenin büyüklüğünü, belirlemek için kullanılır.
Bir programcı, bir programlama dilinde ilk olarak öğrenmesi gereken, o dile ait veri tipleridir. Çünkü bu, programcının kullanacağı değişkenlerin ve sabitlerin sınırlarını belirler.


C programlama dilinde 5 tane temel veri tipi bulunmaktadır.
char: karakter veriler
int: tamsayı veriler
float: tek duyarlıklı kayan noktalı sayılar
double: Çift duyarlıklı kayan noktalı sayılar
void: Değer içermeyen verilerdir.


Bazı özel niteleyiciler temel tiplerin önüne gelerek onların türevlerini oluşturur:
short
long
unsigned
Niteleyiciler değişkenin bellekte kaplayacağı alanı değiştirilebilirler.
Kısa (short), uzun (long), ve normal (int) tamsayı arasında yalnızca uzunluk farkı vardır. Eğer normal tamsayı 32 bit (4 bayt) ise uzun tamsayı 64 bit (8 bayt) uzunluğunda ve kısa tamsayı 16 biti (2 bayt) geçmeyecek uzunluktadır.


İşaretsiz (unsigned) ön eki kullanıldığı taktirde, veri tipi ile saklanacak değerin sıfır ve sıfırdan büyük olması sağlanır. İşaretli ve işaretsiz verilerin bellekteki uzunlukları aynıdır. Fakat, işaretsiz tipindeki verilerin üst limiti, işaretlinin iki katıdır.

Kısa ve uzun tamsayı tutacak tanımlayıcılar için int anahtar kelimesinin yazılmasına gerek yoktur.
short s;  /* short int s; anlamında */
long k;   /* long int k;  anlamında */


Bir C programı içerisinde, veri tiplerinin bellekte kapladığı alan sizeof operatörü ile öğrenilebilir. İlgi çekici olan, bu alanların derleyiciye??? ve işletim sistemine??? bağlı olarak değişiklik göstermesidir.





C Programlama Dili Elemanları

Tanımlayıcılar:

Programcı tarafından oluşturulurlar.
Programdaki değişkenleri, sabitleri, kayıt alanlarını, özel bilgi tiplerini vb. adlandırmak için kullanılan kelimelerdir.
Tanımlayıcılar, yerini tuttukları ifadelere çağrışım yapacak şekilde seçilmelidir.
İngiliz alfabesindeki A-Z veya a-z arasındaki 26 harf ile 0-9 arası rakamlar kullanılabilir.
Sembollerden sadece alt çizgi _ kullanılabilir.
Tanımlayıcı isimleri harfle veya alt çizgiyle başlayabilir.
Tanımlayıcı ismi, rakamla başlayamaz veya sadece rakamlardan oluşamaz.
Tanımlayıcılar boşluk karakterini içeremezler.

Anahtar Sözcükler
C dilinde 32 adet anahtar sözcük vardır ve hepsi küçük harfle yazılır. Anahtar sözcükler tanımlayıcı olarak kullanılamazlar.






Diğer mühendislik alanlarında durum nasıl?


Diğer mühendislik alanlarında durum nasıl?
(Yazılımcıdan istenilenler diğer bir alandaki insanlardan istenseydi nasıl bir hikaye çıkardı.)

Sayın mimar;
Lütfen bana bir ev inşa ediniz.Ama tam olarak ne istediğimden emin değilim.Bu nedenle kendi taktirinizi kullanınız.
Evimde 2 ila 45 adet yatak odası olsun. Yatak odalarını kolaylıkla ekleyip kaldırabileyim bir şekilde planlayınız. Siz bana planları getirin ben nihaiyi kararları ona göre vereyim. Ayrıca her bir plan için tek tek maliyet dökümlerini de getirmeyi unutmayınız.Böylelikle bende bana uygun olanı seçebilirim.
Şunu da aklınızda tutun ben sonuçta maliyeti düşük olanı seçeceğim.Maliyeti şu anki evden daha düşük olmalı. Şu anda yaşadığım evde çeşitli aksilikler var(Mutfak ile ilgili sorunlarım var. Ben evde yürüdüğümde eşyalar sallanıyor ayrıca yalıtımda çok iyi değil.)
Ayrıca bu evi yıllık olarak tutmak istiyoruz yani önümüzdeki sene maliyeti daha düşük bir ev bulursak çıkarım haberiniz olsun. Tararımı yaparken de yıllık masrafları oldukça az tutun fazla paramız yok.
Lütfen en son malzemeleri kullanın ve en güzel şekilde tasarlamaya çalışın.Eğer böyle yaparsanız ev gerçekten çok güzel olur. Aaa unutmadan, mutfakta benim 1952 model Gibson buz dolabını barındıracak şekilde olsun.
Evin güvenliği bizim için çok önemli; kanunlar karşısında belirlenmiş yönetmeliklere göre evi hazırlayın yoksa olmaz. Benim eşimin annesi yılda en az bir kere bizi ziyarete gelir geldiğinde ev ile ilgili tasarım ve diğer konularda her hangi bir eksiklik bulmaya çalışacaktır aman dikkat edelim.
Eğer anneciğim her hangi bir yerini beğenmez ise o kısım ile ilgili değiştirme hakkımı elimde tutmak isterim. Lütfen şu anda beni küçük tararım ayrıntıları ile rahatsız etmeyin. Bu tasarım sizin işiniz karışmak istemem. Büyük resmi düşünün ona göre tasarlayın. Bu arada eşim yeşil renkli halıları sever tasarım buna da aklınızda tutun.Ev ile ilgili kaynak sorununu düşünmeyin. Sizin ilk önceliğiniz detaylı bir ev planı ve tanımlamaları oluşturmak. Tabi şunu da beklerim,  ben tasarımı seçtikten sonra 48 saat içinde çatının ilk şekli oluşmuş olsun.
Evi tasarlarken önce ve sonra olabilecek isteklerimi göz önemde bulundurun. Bu evi satmak istiyorum o nedenle potansiyel alıcıları için cazip olmasını da dikkat edin.
Bizim yan komşularda evlerini geçen sene yenilediler onların evlerinin de çok güzel yönleri var. Onların ayrıca büyük bir yüzme havuzları var. İnanıyorum ki güzel bir tasarım ile maliyetleri yukarı çekmeden buna benzer bir yüzme havuzu yapabilirsiniz.
Tasarımları  komple bir set olarak hazırlayın, yeni nesil inşaatçılık yöntemleri kullanabilirsiniz, bakın sizin için ne büyük bir kolaylık bu günlerde böyle anlayışlı müşteri bulmak çok zor. Ama tasarımla ilgili konuları değiştirmeyin yoksa maliyet artar aman maliyetlere dikkat.
Böyle bir proje üzerinde çalışmaktan çok mutlu olduğunuzu düşünüyorum. Bunun gibi tasarımları çok özgür bir şekilde yapılacak olmak ve yeni inşaat yöntemleri kullanmak güzel olsa gerek.
Unutmadan bu arada karım biraz önce söyledi evde olacak bu işlerden ötürü çok ses çıkmasın. Tabi mimar sissiniz nasıl olacağını da siz bizden daha iyi bilirsiniz.
Daha önceden inşaat yaptırma işine girdim ama olmadı umarım bu sefer olur.Eğer siz yapamazsanız başka bir mimar bulurum.
Belki de bu evi yenilemek yerine güzel bir tatil yapsam daha iyi olur neyse başladık bir kere beni bilgilendirin. Sizden haber bekliyorum.






Eğer yazılım içerisinde bir hata bulmuş ve diğerlerini keşfedemiyorsanız ne olur?

Parody “Ormanda bir ağaç düşerse gerçekten ses yapar mı?”
Görülemeyen hata hatamıdır?
Görülemeyen hatalara örtük(gizli) hata“latent bugs”

Bulunan bütün hatalar çözümlenemezmi ? Neden?

Yeterli bilgi birikimi eksikliği!
Bazen yeterli zaman yoktur!
Bazı son tarihler ertelenemez.
Bazen çok riskli olabilir!
Murphy’nin koduna dokunma
Buna değer mi!
Bazı ek özellikle bekleyebilir!
Neden bir sonraki sürüm için müşteriden ücret almayalım ki?
Kod ile ilgili bir hata olmaya bilir!
Tanımlama yanlışlığından olabilir

Birazda Terminoloji.


Verification: Biz ürünümü doğrumu yapıyoruz?
Yazılım şartnamedeki özellikleri ve tanımlamaları karşılanıyor mu?
Validation: Doğru ürünü mü yapıyoruz?
Ürün kullanıcı ihtiyaçlarını karşılıyor mu?
Kalite Güvencesi
Yöntem ve standartlar uygulayarak; yazılım sürecleri içinde meydana gelen hataları önle.

Yazılım Testine İlişkin


Murphy kanunu: (Eğer yazılım hatalı bir sonuç üretiyorsa bundan yazılımı üreten kişiler sorumludur ve bu sorunu onlar halletmelidir!
Bu kural Edward Murphy tarafından yazılım geliştirimi ile ilgili bir ölçü geliştirmek için ortaya atılmıştır.)

“Program testti, ancak hataların varlığını göstermek için kullanılır onların yokluğunda göstermek için değil!” Edsger Wybe Dijkstra 



“Test ile hata bulabilirsin ama hala daha fazlası vardır”
Hatalar nerelerden kaynaklana bilir.
Programcılar kötü günleri olabilir.
Programcılar aynı hataları yapmak eğilimindedir.
Bazı hatalar buzdağının sadece ucu gibidir.
Boris Beizer yaklaşımı: Daha fazla yazılım daha fazla testti beraberinde getirir “pestisit paradoksu”. Bu nedenle Boris Beizer bağışıklık testleri kavramını ortaya attı. Çözüm sürekli yazılımın farklı bölgelerinde yazılım kullanımı ile ve test kodu ile yazılımları test edin.

Yazılım Testi ile ilgili zorluklar.


Kaç tane test case oluşturulmalı? (Cevabı o kadar kolaymı?)
Yazılımın mevcut olan bütün girişlerinin doğru olarak alındığından emin olup.
Bütün girişleri ve çıkışları kontrol etmek.
Tanımlamaların doğru olduğu bilinmesi
Yazılım üretiminin ilk safhasında oluşan isterler yorumlamaya açık olması
Yazılım içerisine alınan giriş sayıları çok fazla olması.
Yazılımda oluşturulan çıkış sayıları çok fazla olması.
Yazılım içerisinde oluşan yol (path) sayısı çok fazla olması.
Girişleri test etmedin ve bir hata ile karşılaştın ne olur?
(Risk:Güven kaybı,para,zaman,vb . Bu yüzden testi yapan kişi üzerinde baskı kodlayan kişiye göre daha fazladır.)
Yazılım geliştirmede isterler oldukça sıra dışı ve özgürdür.
(Rekabet çok fazladır, Yaşam döngüleri çok hızlıdır. Yazılımı değiştirme yazılımcılara dışarıdan bakan kişiler için “kolaydır.”)

Yazılım Testine İlişkin…

Yazılımın testi yazılım risk temelli olarak yapılmalıdır.
  • Eğer yazılım içerisindeki bütün girişleri test edemez ise yazılım içerisinde risk almış olursun!

Daha fazla hata bulduğunda daha fazla test yapmalısın. (Ne Kadar? Kaç tane test case oluşturulmalı.)
  • Bulunan bütün hataların düzeltildiği söylenemez. (Neden Bütün Hataları düzelttiğimiz söylenemez?)
Tanımlamalar nihaiyi değildir.
Yazılım geliştiriciler arasında Yazılım testleri popüler değildir.
  • Yazılım Test mühendisinin amacı: Hataları bulmak,Hataları erken safhalarda oluşmadan bulmak.Hataların düzeltildiğinden emin olmak.
  • Popülerlik için ipuçları: Hataları erken bul.,Ani sinirlenme.,Kötü haberleri erkenden proje yöneticisine ulaştırma
Yazılım testi bir disiplindir ve yazılım projeleri içerisinde profesyonelce incelenmelidir.
  • Yazılım kolay ve yönetilebilir olduğunda(parçaları birbirinden ayrılmış) yazılımı test etmek daha kolaydır. Aksi durumlarda test işlemi daha zordur.
  • Günümüzdeki yazılımlar çok büyük ve karmaşık o nedenle test için
    • Yöntemler
    • Araçlar

Yazılım Test Modellileri ve Yazılım Geliştirme Modelleri

Yazılım geliştirme modelleri her zaman kullanılır mı?İdeal midir?

Plato’nun “ideal” ile ilgili ilginç benzetmeleri

"Fiziksel nesneler ve fiziksel olaylar, ideal veya mükemmel formların gölgeleridir. Onlar ölçeğine yaklaşabildiği kadar mükemmeldirler."

Waterfall modeli mükemmelidir?

Müşterinin ihtiyaçları hiçbir zaman tam olarak tanımlanamaz! Mükemmel olmamasının ikinci neden ise; bütün durumların gerçekleştirilmesi için yeterli zaman ve kaynak yoktur.
Bu nedenlerden dolayı sadece waterfall modeli değil hiç bir yazılım geliştirme modeli mükemmel değildir. Ancak yazılım geliştirmede seçilecek bir yazılım geliştirme modeli kullanılmalıdır.


Klavyeden girilen bir sayının tek mi yoksa çift mi olduğunu tespit eden programın algoritmasını geliştirelim.

Klavyeden girilen bir sayının tek mi yoksa çift mi olduğunu tespit eden programın algoritmasını geliştirelim.
Bu algoritmanın;
Sözde Kodunu yazınız.
Akış Şemasını çiziniz.



BAŞLA
x değerini oku
Eğer x mod 2 = 0 ise ekrana "çift" yaz değilse "tek" yaz.
BİTİR

Ekrana 667 defa “Yazılım Mühendisliği” yazan programın algoritmasını yazınız.


BAŞLA
Sayac = 0
Sayac = Sayac + 1
Ekrana "Yazılım Mühendisliği" yaz.
Eğer Sayac <= 667 ise 3. Adıma GİT
BİTİR

Yarıçap değeri klavyeden girilen bir dairenin alanını bulup, sonucu ekrana yazan programın algoritmasını yazınız.

Yarıçap değeri klavyeden girilen bir dairenin alanını bulup, sonucu ekrana yazan  programın algoritmasını yazınız.

BAŞLA
r değerini oku
A = 3 * r * r
A’yı yaz.
BİTİR

Verilen algoritmaların ekran çıktısını bulunuz.

Aşağıda verilen algoritmaların ekran çıktısını bulunuz.

BAŞLA
a = 3 , b = 4
T = a + b
a = a – 1
Eğer a > 0 ise 3’e GİT
T’yi yaz.
BİTİR


BAŞLA
a = 8 , b = 5
c = a + b
Eğer c > 0 ise 3’e GİT
c’yi ekrana yaz.
BİTİR

2.Dereceden bir denklemin Köklerini bulan Algoritma


BAŞLA
Denklemin a, b, c katsayılarını oku.
Diskriminant = b * b – 4 * a * c
Eğer Diskriminant < 0 ise “kökler sanal” yaz, GİT 9
K = Diskriminant1/2
x1 = (-b + K) / (2 * a)
x2 = (-b – K) / (2 * a)
x1, x2 yaz.
BİTİR

Kenar değerleri klavyeden girilen bir üçgenin, ne çeşit bir üçgen olduğunu bulan algoritmayı geliştirelim.

Bu algoritmanın;
Sözde Kodunu yazınız.
Akış Şemasını çiziniz.

Not: 
a = b ve b = c ise "Eşkenar Üçgen"
a = c veya b = c ise "İkizkenar Üçgen"
Diğer durumda ise "Çeşitkenar Üçgen"


BAŞLA
a, b, c değerlerini oku.
Eğer (a = b) ve (b = c) ise “eşkenar üçgen” yaz, GİT 6
Eğer (a = c) veya (b = c) ise “ikizkenar üçgen” yaz, GİT 6
“çeşitkenar üçgen” yaz
BİTİR

Bir ücretlinin sicil numarası, çalışma saati ve saat ücreti klavyeden girilmektedir.

 Ücretlinin bu bilgilerle maaşını hesaplayan algoritmayı geliştirelim.
Bu algoritmanın;
Sözde Kodunu yazınız.
Akış Şemasını çiziniz.

Not: Maas = Calisma_Saati * Saat_Ucreti şeklinde hesaplanır.



BAŞLA
sicilNo, calismaSaati, saatUcreti oku.
maas = calismaSaati * saatUcreti
sicilNo, maas yaz.
BİTİR

Verilen bir sayının faktöriyelini hesaplayan algoritmayı hazırlayınız.

 Girilen sayı negatifse tekrar girilmelidir. Algoritma 0! sonucunu da hesaplayabilmelidir.
a.    Sözde kod
b.    Akış Şeması (Siz Çiziniz!)

Faktoryeli hesaplanacak sayı: N
Faktöryel sonucu: nFaktor
Sayaç değişkeni: sayaç

1.    BAŞLA
2.    nFaktor = 1
3.    sayac = 1
4.    N OKU
5.    N < 0 ise GİT 4
6.    sayac > N ise GİT 11
7.    nFaktor = nFaktor * sayac
8.    sayac = sayac + 1
9.    GİT 6
10.    nFaktor değerini YAZ
11.    BİTİR   

1'den 100'e kadar olan sayıların toplamını yazdıran algoritmayı hazırlayınız.

a.    Sözde kod
b.    Akış Şeması


1.    BAŞLA
2.    toplam = 0
3.    sayac = 1
4.    sayac>100 ise, GİT 8
5.    toplam = toplam + sayac
6.    sayac = sayac + 1
7.    GİT 4
8.    toplam YAZ
9.    BİTİR   


Kenar uzunlukları verilen dikdörtgenin alan hesabını yapan algoritmayı hazırlayınız.

Kenar uzunlukları negatif olarak girildiği durumda veri girişi tekrarlanacaktır.
a.    Sözde kod
b.    Akış Şeması

Dikdörtgenin uzun kenarı: a
Dikdörtgenin kısa kenarı: b
Dikdörtgenin alanı: Alan

1.    BAŞLA
2.    a OKU
3.    a<0 ise, GİT 2
4.    b OKU
5.    b<0 ise, GİT 4
6.    Alan = a * b
7.    BİTİR   


Klavyeden girilen iki sayıdan büyük olanını bulup ekrana yazdıran algoritma ve akış şemasını hazırlayınız.

a.    Sözde kod
b.    Akış Şeması

Birinci sayı: X
İkinci sayı: Y

1.    BAŞLA
2.    X OKU
3.    Y OKU
4.    X=Y ise, GİT 7
5.    X>Y ise, X YAZ
6.    Y>X ise, Y YAZ
7.    BİTİR   

İki sayının ortalamasını bulan algoritmayı hazırlayınız.

a.    Sözde kod
b.    Akış Şeması

Birinci sayı: X
İkinci sayı: Y
Ortalama: Ort

1.    BAŞLA
2.    X OKU
3.    Y OKU
4.    Ort = (X + Y) / 2
5.    Ort değerini yaz
6.    BİTİR   



Ösym Akış Diyagramı

Akış Diyagramlarını hayatın pek çok alınında görmek mümkün. Bunlardan biri Ösym'nin sınav klavuzu.


1-10 Arasındaki Tek Sayıların Toplamı


1.BAŞLA
2.Sayac = 1
3.Toplam  = 0
4.Eğer Sayac > 10, GİT 8
5.Toplam = Toplam + Sayac
6.Sayac = Sayac + 2
7.GİT 4
8.BİTİR




1-5 arasındaki sayıların ekrana yazdırılması


1.BAŞLA
2.Sayac = 1
3.Sayac değerini YAZ
4.Sayac = Sayac + 1
5.Eğer Sayac < 6, GİT 3
6.BİTİR



Üçgenin Alanını Hesaplayan Algoritma

1.BAŞLA
2.Taban değerini gir
3.Yükseklik değerini gir
4.Taban ile yüksekliği çarp ve sonucu ikiye böl
5.Çıkan sonucu yaz
6.BİTİR


Aynı örneğin sözde koda çevrilmiş hali
Sözde Kod


Taban için t, yükseklik için y, alan için A seç
1.BAŞLA
2.t değerini OKU
3.y değerini OKU
4.A = (t * y)/2
5.A değerini YAZ
6.BİTİR

İki Sayının Toplamı Algoritması

Düz Yazı

1.BAŞLA
2.Birinci sayıyı gir
3.İkinci sayıyı gir
4.İki sayıyı topla
5.Sayıların toplam değerini yaz
6.BİTİR

Aynı örneğin sözde koda çevrilmiş hali
Sözde Kod

Toplam için T, birinci sayı için X, ikinci sayı için Y seç
1.BAŞLA
2.X değerini OKU
3.Y değerini OKU
4.T = X + Y
5.T değerini YAZ
6.BİTİR

Akış Şeması

Tahtaya Adını Yazma Algoritması

Örneğin amacı, adımların tutarlılığını ve mantıksal sırasını göstermektir.
Burada emirler, belli sorgulamalar yapılarak ve mantıksal bir sıra içinde verilmiştir.
Yerinden kalk emri verilmeden kişiden yürümesi istenemez.
Kalemi almadan adını yaz emrinin verilmesi doğru olmaz.
Sorgulamalarla da işlemi yapıp yapmadığı kontrol edilmiştir.


1.BAŞLA
2.Yerinden kalk
3.Yönün tahtaya doğru mu?
    Hayırsa tahtaya dön
    Evetse 4. adıma git
4.Tahtaya doğru yürü
5.Tahtaya geldin mi?
    Hayırsa 4.adıma git
    Evetse 6. adıma git
6.Kalemi al
7.Adını yaz
8.BİTİR

Aslında bilgisayar bu tür işleri yerine getiremez.
Kullanıcılar bilgisayarlara belli girdiler verir.
Onlar da programcının verdiği adımlara göre bu girdiler üzerinde matematiksel ve mantıksal işlemler yaparak bir çıktı üretirler.

24 Ekim 2016 Pazartesi

Youtube Toplu (Çoklu) Video İndirme

Youtube üzerinden yayınlanan milyonlarca farklı videoyu indirmek için farklı araçlar ve yöntemler bulunmakta.Ancak liste şeklinde yayınlanan videoları tek tek indirmek çok vakit gerektirme.
İşte tamda bu amaç için geliştirilmiş bir site bulunmakta (http://youtubemultidownloader.com/playlist.html) Bu siteyi kullanarak youtube üzerindeki yüzlerce farklı videoyu tek bir seferde indirebilirsiniz.


Sitenin Kullanımı ile ilgili aşağıdaki videoyu izleyebilirsiniz.


Dos Komutları -2


start (Yeni bir Cmd ekranının açılmasını sağlar.)
tree (Dizin bilgilerini grafiksel olarak listelemeye yarar.)
ping (iki cihaz arasında bağlantının olup olmadığının kontrolü için yapılır.
Ping komutunda yazan (TTL =Time to Live) gönderilen verinin kaç nokta üzerinden geçerek hedefe ulaştığı gösterir.)
net user (Bilgisayardaki kullanıcıları gösterir.)
net user /add deneme 1234  (Deneme ismi ile 1234 şifresine sahip bir kullanıcı oluşturulur.
Oluşturulan kullanıcı Guest yetkisine sahiptir.)
net localgroup administrator deneme /add (Eğer bu kodu admin yetkisine sahip bir kullanıcı ile yaparsanız deneme kullanıcısı admin yetkisine sahip olur.)
net user /delete deneme Oluşturulan kullanıcı silinecektir. Bu kodun çalışması için admin yetkisine sahip bir kullanıcı ile kodu çalıştırmanız gerekecektir.
tracert www.yahoo.com Yahoo sitesinin ip bilgisi ile bu ip bilgisine hangi ipler üzerinden erişildiğinin bilgisi verilmektedir.
cd Desktop\Videos ( Desktopta Videos diye bir dizin varsa çoklu dizin girişi imkanı sağlar.)
Tab tuşu (Kllanılarak hızlı cümle tamamlaması sağlanabilir.)
dir Desktop\Videos (Desktop içerisinde Videos diye bir dizin varsa çoklu dizin listeleme imkanı sağlar.)
dir/a (Mevcut dizindeki gizli dizinleri göstermesini sağlar.)
dir *.png (Arama (Sadece uzuntısı png olanları listemek için kullanılır))
dir a*.* (Arama (Sadece a ile başlayan dosyaları listemek için kullanılır.))
cls Ekranı temizlemek için kullanılır.
ipconfig/?  (? istenilen komut ile ilgili detaylı bilgi öğrenmek. için kullanılır.)
mkdir Deneme (Dizin oluşturma)
rmdir (Dizin Silme)
rmdir /s (İçinde veri olan dizini silme)
Path (Bilgisayardaki programların çalışma diznlerini listeler.)
wmic logicaldisk get name (Bilgisayardaki ana dizinlerin isimlerini göstermektedir.
arttrib /? (Dosya tip ve biçimlerini öğrenme.)
echo hey > deneme.txt (Text dokumanı oluşturma)
arttib +h deneme.txt (Dosyayı gizili dosya haline dönüştürme.)
del deneme.txt (Dosya silme)
type deneme.txt (Dosyanın içini görme)
echo sanada merhaba >> deneme.txt (Dosyanın içeriğine ekleme)
dir > diricerigi.txt Dizin içeriğini ekrana yazdırma
copy deneme.txt dosyaadi (Dosya kopyalama için kullanılır)
copy deneme.txt e: (Başka bir dizine dosya kopyalama)
xcopy deneme2 deneme (Dosya içerisindeki bilgileri başka bir dosyaya kopyalama)
xcopy deneme2 deneme /s (Dizinler ile birlikte dosya içerisindeki bilgileri başka bir dosyaya kopyalama)
move deneme2 deneme (Dosya taşıma)
rename dosyanineskiadi dosyaninyeniadi (Yeniden isimlendirme)
exit (Cmd'den çıkış)

Fonksiyon Tanımı

Fonksiyon, belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten komut grubudur.
Her fonksiyonun bir adı ve fonksiyona gelen değerleri gösteren parametreleri (bağımsız değişkenleri) vardır. Bir fonksiyon bu parametreleri alıp çeşitli işlemlere tabi tutar ve bir değer hesaplar.


Bu değer, çıktı veya geri dönüş değeri (return value) olarak adlandırılır.  Bir fonksiyonun kaç girişi olursa olsun sadece bir çıkışı vardır.


C ve Fonksiyonlar


C programları fonksiyonlardan oluşurlar.Şu ana dek kullandığımız main() de bir fonksiyondur. Bu fonksiyonun bir başka fonksiyon içinden çağrılmasına gerek yoktur. Her C programında bir main() fonksiyonun yer alması gerekmektedir.main() fonksiyonu, program çalıştırıldığında otomatik olarak çağrılan bir fonksiyondur.
Bir main() fonksiyonu içinden bir başka fonksiyon çağrılabilir. Bir fonksiyon içinden bir başka fonksiyon çağrılabilir.Örneğin, fonksiyon1( ) isimli fonksiyondan fonksiyon2( ) isimli bir başka fonksiyon çağrılabilir.



Fonksiyonlara Genel Bakış


Fonksiyonlar karmaşık yapılı programların karmaşıklığını  azaltmak ve bu programları modüler bir yapıya kavuşturmak için kullanılırlar.
Fonksiyonlar, programcıların tekrarlanan kodlar yazmalarını önlerler.
Fonksiyon belirli bir adı olan program parçasıdır.
Fonksiyonların çalışabilmesi için bir başka fonksiyondan adı ile çağrılması gerekmektedir.

Fonksiyonlar


Gerçek hayattaki yazılım problemlerini çözen çoğu bilgisayar programları ve yazılımları, şu ana kadar öğrendiklerimizden çok daha geniş ve karmaşık bir yapıya sahiptir.
Tecrübeler bu tür geniş programları yazmanın en iyi yolunun, küçük parçaları ya da her biri orijinal programdan daha kolay kullanılabilecek modülleri (daha önceden hazırlanmış program parçacıkları) birleştirmek olduğunu göstermiştir.
Bu tekniğe, böl ve ele geçir (divide & conquer) denir.

Karakter Dizilerini Karşılaştırmak

İki karakter dizisinin birbirleriyle karşılaştırılarak, içerdiği karakterlerin aynı olup olmadıkları test edilebilir.
Bu amaçla strcmp() fonksiyonu kullanılır.
Karşılaştırma sonucunda, her iki karakter dizisi birbirinin aynı ise "0"; birbirinden farklı ise "1" değeri üretilir. Elde edilen bu değer kullanılarak programın akışı yönlendirilebilir.


Karakter Dizilerini Birleştirmek


İki karakter dizisini birleştirilerek tek bir karakter dizisi haline dönüştürmek için C'nin strcat() fonksiyonu kullanılır.
Bu fonksiyon, var olan bir karakter dizisinin sonuna bir başka karakter dizisini ekleyecektir.
Örneğin "abc" karakter dizisinin sonuna "def" karakter dizisi strcat() fonksiyonu kullanılarak eklenebilir.


Karakter Dizilerinin Uzunluğu Bulmak


Bazı uygulamalarda bir karakter dizisinin uzunluğunu bulmak gerekebilir.

Bir karakter dizisinin uzunluğunu, yani kaç karakter içerdiğini bulmak için C'nin standart strlen() fonksiyonu kullanılır.

Uzunluk bulunurken, içerdiği en son karakter olan NULL karakteri göz özüne alınmaz.

Örneğin, karakter dizisi "abc" değerlerini içeriyorsa, strlen() fonksiyonu bu uzunluk olarak "3" değerini döndürür.

Karakter Dizileri (Strings)

Bazı programlama dillerinde karakter dizilerini tutmak için özel veri türleri (string, vb.) bulunmaktadır.

Ancak C programlama dilinde böyle bir veri türü olmadığı için yerine karakterlerden oluşan bir boyutlu diziler kullanılır.

Karakter dizilerine özel olarak, karakter dizilerinin sonuna sonlandırıcı karakter olarak adlandırılan bir simge eklenir.

Sonlandırıcı karakter:
Dizinin bittiği yeri gösterir.
ASCII tablosunun sıfır numaralı ('\0') karakteridir.


Karakter dizilerine iki şekilde başlangıç değeri verilebilir:
    (1) char s[7] = {'d','e','n','e','m','e','\0'};
    (2) char s[7] = "deneme";

Birinci tanımlamada sonlandırıcı karakter programcı tarafından konmalıdır.

İkinci tanımlamada ise buna gerek yoktur. Çünkü, sonlandırıcı karakter bu atamayla, derleyici tarafından eklenir.

Bir karakter dizisini klavyeden okumak için C'nin standart gets( ) fonksiyonu kullanılır.

stdio.h dışında yeni bir kitaplığı C programına dahil etmeye gerek yoktur.

Bu fonksiyon herhangi bir indeks tanımlamadan karakter dizilerinin okunmasını sağlar.

Okuduğu karakter dizisinin sonuna satır sonu işaretini değil, NULL değerini yerleştirir.


gets() fonksiyonu, klavyeden girilen karakter dizilerini, herhangi bir ek tanımlamaya gerek duymadan bir dizi içine yerleştirir.

Dizinin her bir karakteri dizinin farklı bir hücresi içine yerleşir.

Örnek:
    char ad[20];
         ...
        gets(ad);

Çok boyutlu dizi örnekleri:

Çok boyutlu diziler tek boyuta indirgenerek bellekte tutulurlar.
Tek indisli dizilerde olduğu gibi, çok indisli dizilere de başlangıç değeri vermek mümkündür.
Örneğin 3 satır ve 4 sütunlu (3x4=12 elemanlı) bir x matrisinin elemanları şöyle tanımlanabilir:

int x[3][4] = {11,34,42,60, 72,99,10,50,  80,66,21,38};

int x[3][4] = {11,34,42,60,  /* 1. satır elemanları */
                       72,99,10,50,  /* 2. satır elemanları */
                       80,66,21,38}; /* 3. satır elemanları */

Çok Boyutlu Dizi

Bir dizi aşağıdaki gibi bildirildiğinde bir boyutlu (tek indisli) dizi olarak adlandırılır. Bu tip dizilere vektör denir.
    int x[5];
Bir dizi birden çok boyuta sahip olabilir. Örneğin iki boyutlu y dizisi şöyle tanımlanabilir:
    int y [5] [10];
İki boyutlu diziler matris olarak adlandırılır.
İlk boyuta satır, ikinci boyuta sütün denir. y matrisinin eleman sayısı 5x10=50 dir.



17 Ekim 2016 Pazartesi

Ms Dos ile Basit Matrix Ekranı

Örnekteki Ms_Dos Komutların Anlamı

@echo off  Cmd ekranındaki eski komutların görüntülenmesini engeller.
title Cmd ekranının başlık kısmındaki yazıyı değiştirir.
color Yazı rengini değiştirir.1 ile F arasındaki (Hexedecimal)sayılar verilebilir.Ör color c
pause
mode Ekran genişliğini ayarlar
:top 
echo Ekrana yazı yazdırmak için kullanılır.
%random%  Rasgele sayı oluşturmak için kullanılır.
goto top  C dilinde kullanılan goto deyimi ile aynı şekilde kullanılır.
Burada :top kullanılarak sonsuz döngü oluşturulmuştur.



Güvenli yazılım geliştirilmesinin temel adımı.

Tehlikeleri erkenden fark et ve önlem al (Eğer yangından koruyorsan yangına dayanıklı materyal kullan.)
Dezavantajı maliyet,zaman
Tehlike meydana geldiğinde var olan prosedürleri uygula eğer yok ise proje ekibi ile prosedürleri oluştur.
Dezavantajı maliyet,zaman
Varsa deneyimlerden yararlanıp pratikleri uygula.(Her bir sistemin ihtiyaçları ve gereksinimleri farklı olduğunu unutma)
Dezavantajı Risk,maliyet,zaman,performans

Hatalara Karşı

Hata toleransı = Kullanıcının rastgele bulduğu hatalardan ibaret olsun(Kodlayıcı yada test sorumlusu bulduğu bir hatayı göz ardı etmesin)
Buharlı motorları üreten mühendisler çok ağır masayı saatlerinde çalışıyorlardı(Onlarca sorun ortaya çıktı). Bu nedenle yazılım oluşturmada masayı saatleri belirle(Örnek Extreme Programming  pratiği haftada40 Saat).
Yazılım mühendisinin proje bilgisi çok iyi olmalı.Oluşabilecek  sıkıntıları erkenden fark edip ekibini kurtarmalı.

Nedenler

Yazılım Analojisi.
Yazılım analog N-sürümü programlama (NVP) denir:
Bizim N tane yazılım ekibimiz var. Her biriside yazılım ile ilgili ihtiyaçları bağımsız olarak kodluyorlar.
Her bir yazılım çalıştırılıyor ve bunların her biri bir oy alıyor.

NVP’lerin potansiyel sorunu nedir?
Tüm yazılım arızaları tasarım hatalarından kaynaklanmaz.
Genellikle, programcılar hataları yanlış yorumlayabilirler.
Gereksinimler; genellikle yanlış anlaşılır. Bu nedenle N ekipleri aslında doğru yorumu yapan grup sayıyı genellikle 0 yada 1 dir.

Algoritmayı Kurtarmak için temel olarak yapılması gerekenler.
Ortak hataları azaltmaz için algoritmayı parçalar halinde oluştur.
Kabul testlerini kodlayan kişi dışında bağımsız başka bir yazılımcıya oluştur.
Kodlama standartları belirle.




Mühendislik temelleri üzerinde çalışılmalı!

Kimse yenilik ve buluşların hayati olduğunu reddetmiyor, ama aynı zamanda mühendislik temeller üzerinde çalışmak gerekir:
Temel kuralları, ilkeleri ve yapısı
Değerlendirme kriterleri
Karşılaştırma yoluyla
Teorik sınırlarını ve yeteneklerini belirle
Üretim araçlarını belirle
Matematiksel modeller kullan ama gerçek dünyada örnekler üzerine kullanılacağını unutma.

Sorgulanan yeni yöntemler.

"Örgün yöntemlerde matematik vardır. Doğru matematik yöntemleri süreçleri iyileştirir. Bu nedenle, biçimsel yöntemler yazılım kalitesini arttıracaktır. “
Bunun doğru olduğunu net değil!
Hangi yöntem ile yazılım geliştirilecek?
Uygulayıcıların eğitim?
Siyasi konular? Maliyeti? Ölçek?
Aracı olgunluk ve uygunluğu?
Daha iyi sonuç sistemleri var mı? Güvenli? Daha küçük?
Büyük? Daha anlaşılır?

Analogies

Buhar motorları teknolojisi kazan geliştirilme teknolojisinin gerisinde kaldı.
Yazılım ile olan ilişkisi………………………….....

Ne yapılmalı?
Zaman testleri yapılmalı ve iyi mühendislik ilkeleri kullanılmalı:
Doğrulama testleri, onaylama testleri yapılmalı. İkili ve üçlü kontrol sistemleri kullanılmalı.
Süreçleri durdurmadan süreçler üzerinde kontroller yapılmalı.

Yazılım Mühendisliği Temelleri.
Kazan patlamaların nedenleri; çok az bilimsel anlayış vardı. Benzer şekilde, Yazılım mühendisliği disiplini çok yeni ve biz hala temeller üzerinde çalışıyoruz.
İyi bir tasarım nedir?
Yazılım bileşenlerinin belirleme.
Güvenlik kritik sistemler.
Formüllerle ve resmi yöntemlerin rolü
Doğrulama ve onaylama
Sistem evrim

Sorunlar
Bilginin paylaşılmaması (Şirketlerin bilgi paylaşımlarından korkmaları.) Analitik veri yok yada çok az!!!
Bilgi teknolojisi çok hızlı ilerliyor. Bunun sonucu pek çok farklı alanda yazılımlar kullanılıyor. (İsterler artıyor karmaşıklık artıyor.)
Yazılımları kontrol etmek,değerlendirmek ve geliştirmek için çok kısa bir zamanımız var.

Buhar motorları kısa tarihi

İskenderiye’de Heron, 60 MS buhar gücünü kullanmayı denedi.
Thomas Savery ilk buhar gücü ile çalışan motoru üretti.
16-17 YY. buhar motorlarına olan ilgi arttı.
Newcomen 1700 yılında bu motorların yaygın kullanımını için bir silindir ve piston tasarladı.
1786, James Watt büyük Newcomen diye adlandırılan motoru üretti.

Bu arada İngiltere’nin kuzeyinde sanayi devrimi ile ilgili büyük bir potansiyel vardı. Watt and Matthew Boulton isimli üreticiler yeni motor tasarımlarını bu bölgede geliştirdiler (Ağır sanayi atılımı). 1800 yılında Watt’ın patent süresi sona erdi ve yüksek basınçlı buhar motorlarını isteyen herkes üretebilecek hale geldi. (HPSEs). İki tasarım geliştirildi. UK & USA. Ayrı kondansatörler yerine buharın direk pistonları itebilecek şekilde geliştirilmesi sağlandı.

İlk başarılı kullanım buharlı teknelerde oldu.
Oldukça başarılı idi.
Verimliydi, Ucuzdu.
Tekne yolculukları ucuzlamıştı.
Ekonominin büyümesini sağlamış ve tekne şirketleri bu işlerden büyük paralar kazanmışlardı.
BOOM!!!!
Buharlı teknelerdeki yolcular ve mürettabat havaya uçtu.
Tekne içerisindeki basınç miktarı olması gereken oranı aştı….

Sorun neydi?

Yeterli eğitimi olmayan kişiler tarafından kullanım.
Hızlı ve ucuz malzeme kullanımı ve üretimi.
Kötü eğitimli operatörler.
Kötü kalite kontrolü.

Niye böyle oldu?
Sadece para odaklı olarak üretim yapıldı.

Patlamadan sonra neler oldu?

USA’da akademisyenlerden ve mühendislerden oluşan bir grup. Kallite standartları belirlemeye çalıştı. UK’da Watt and Boulton  şirketi bir erken uyarı sistemi geliştirdi. Ancak geliştirdikleri bu sistemi kendi buhar motorları sistemine adapte edemediler.

Buhar teknolojisi…

Bu teknolojinin zayıf noktası (Aşhil topuğu) kazanların buhar nedeni ile patlaya bilecekleri gerçeği.
Kazan teknolojisi buharlı motor teknolojisinin gerisinde kalmış olması.
Maliyeti uygun olmayan geliştirme çalışmaları yapılmış.

Süreç içerisinde
Yüksek basıncı altında çalışabilen, korozyona ve çürümeye dayanıklı malzeme kullanmaya ne gerek var;Ar-Ge çokta önemli değil.

Sonuç

Boom!!!
Buharlı kazanlar patlamaya devam etti.
Neden?
Mühendisler hala yüksek  basınç altında kazanların ne şekilde çalışması gerektiğini bilmiyorlardı. Ayrıca tasarım mühendisleri, sistemlerinin kullanımının nasıl olacağı anlamadı: - Yükleme ortamı - Operatör eğitimi
   - Açgözlülük, aşırı ve güven.

Peki kim suçlandı?
İşciler (Operatörler)

Peki kim suçlanmadı?
Tasarım Mühendisleri

Hükümetin müdahalesi
İşler çözümlenecek garantisi verildi.
Firmalar denetlenecek denildi.

Sonuç?
BOOM!!!
Sonrasında daha fazla buharlı motor üretildi.
1817 yılında UK’da komisyon kuruldu ve buharlı motorların tehlikeleri araştırıldı.
Komite kazanların daha fazla denetlenmesine karar verdi.

Ağır Kayıp
Sadece Amerika’da 1816 ile 1848 yılları arasında.
233  Kazan patladı
2562 İnsan öldü
2097 İnsan yaralandı
Yaklaşık $3,000,000 maddi kayıp oldu.


Araştırma
Philadelphia, the Franklin Institute 6 yıl patlamalar ile ilgili araştırma yapılır. USA devleti maddi olarak destekledi.

Araştırma Sonucunda
Üretimi düzenleyen bir mevzuat komite tarafından onaylandı.
Tararım için temel bazı kurallar geliştirildi.
Ölenlerin ailelerine tazminatlar verildi.
BOOM!!!
Patlamalar devam etti.
Toplumun hükümet üzerindeki baskısı arttı.
Ve mevzuata son şekli verildi!
Nihayet, 1852 yılında, ABD kongre vapur kazanları ile ilgili ağır şartlar gerektiren bir yasayı onayladı.Bu mevzuat ağır test şartlarını da içermekeydi.
Vapur kazan patlamaları azalmaya başlar! ... ancak güvensiz HPSEs hala lokomotif ve ağır sanayide kullanılıyor.


Daha sert standartları
Daha sonra, İngiltere'de parlamento standartları geliştiren bir tasarıyı onaylar.
1905 yılında, ölümlerin sayısı HPSE azalır. 14 Türkiye 383 Amerika Birleşik Devletleri En sonunda,
USA üretim ile ilgili standartları detaylandırır  ve test işine daha fazla önem veren bir standart oluşturur.

Yazılımlarla olan ilişkisi???
Biz bilgisayar çağındayız artık.
Bunların güvenlik açısından kritik yazılımla ne ilişkisi var. Paralelik nedir? (Yazılımlar patlar mı?)

Yazılım ve Güvenliği Kritik Uygulamalar

Güvenliğin önemli olduğu pek çok yerde(Hataya tahammülün olmadığı yada çok az olduğu yerlerde), “safety-critical” güvenlik açısından kritik yazılımlar kullanmaktayız. Eğer bu yazılımlar doğru olarak çalışmaz ise çok büyük sıkıntılarla karşılaşa biliriz. 

Bu yazılımların kullanıldığı yerlerden bazıları;
Nükleer reaktörler
Uçuş kontrol sistemleri
X-ray makinelerde yazılım kontrolörleri

Güvenlik öncelikli uygulamalarda; kapsamlı testler, kod incelemesi ve yazılım geliştirme yöntemleri daha titizlikle uygulanmalıdır. Şu ana kadar yapılan güvenlik öncelikli yazılımlardaki hata oranları diğer yazılımlara oranla daha düşüktür. Fakat bu yazılımların teknolojik olarak ve ekonomik olarak geliştirilmesi daha zordur. Bu yazılımları oluşturmak yıllar sürebilmektedir.

Yazılım Hataları

Yazılım geliştirme sürecinin herhangi bir aşamasında (temel olarak analiz, tasarım, kodlama, test, bakım) yapılan insani hatalardır. Hiçbir yazılımcı veya programcı isteyerek hata yapmaz. Dolayısı ile programı kendi kendine test ederken yaptığı hatayı da görmemesi normaldir. Sıfır hatalı bir yazılım üretmek pratikte mümkün değildir. Ancak doğru hata yönetimi yaparak hata sayısını azaltabilir ve hata oluştuğunda müdahale için daha hızlı olabilirsiniz. 

Uygulama geliştirme aşamasında hatalar 3 grupta değerlendirilir:

Syntax Error – Sözdizimi Hataları
Yazılan programda programlama dili kurallarına aykırı bir takım ifadelerden dolayı karşılaşılabilecek hatalardır.  Düzeltilmesi basit hatalardır. Hatanın bulunduğu satır derleyici tarafından rapor edilir.
Günümüz IDE’lerinde bu sıkıntılar neredeyse yok denecek kadar azdır. Özelikle kod editörlerinin gelişmiş yazım denetimi sayesinde yazılımcılar söz dizimi hatalarını derlemeye gerek bile kalmadan fark edebiliyorlar. Eğer bir derlemede Syntax Error alındı ise obje kod üretilememiştir demektir.

Run-time Error – Çalışma Zamanı Hataları
Programın çalıştırılması sırasında karşılaşılan hatalardır. Programcının ele almadığı bir takım aykırı durumlar ortaya çıktığında programın işletim sistemi tarafından kesilmesi ile ortaya çıkar. Bu tip hatalarda hata mesajı çoğunlukla çalışan işletim sisteminin dili ile verilir.
Eğer bu tip hataları kullanıcı ele almışsa, program programcının vereceği mesajlarla ve uygun şekilde sonlandırılabilir. Bu tip hataların nerelerde ve hangi şartlarda ortaya çıkabileceğini bazen kestirmek zor olabilir.
Örneğin; olmayan bir dosyayı açmaya çalışmak, var olmayan bir dosyanın üzerine yazmaya çalışmak, olmayan bir bellek kaynağından bellek ayırmaya çalışmak, olmayan bir donanıma ulaşmaya çalışmak vs.

Logic Error (Bug) – Mantıksal Hatalar (Böcek)
Karşılaşabileceğiniz en tehlikeli hatadır. Programlama mantığında bir takım şeylerin yanlış düşünülmesinden kaynaklanır. Hata test aşamasında veya müşteri kullanımı sırasında ortaya çıkar.
Örneğin: Hesaplanması gereken veya bulunması gereken değerlerin eksik veya yanlış hesaplanması mantıksal bir hatadır. Bu sorunun giderilebilmesi için analiz aşamasına kadar geri dönülmesi gerekebilir. Bazen bu hatanın nereden kaynaklandığını bulabilmek çok zor olmaktadır. 
Gerek serbest yazılım gerek ticari yazılımların tümünde bug dediğimiz mantıksal hatalar bulunur.
Günümüzde en etkin yazılım firmaları bile yazılımlarında bug olduğunu kabul eder ve zaman zaman bu bugları giderebilmek için ya yazılımlarına yama yazılımlar (Update, Patch) üretirler ya da o yazılımın yeni bir versiyonunu piyasaya sürerler.

Debug (Bugdan arındırma)
Mantıksal hataları giderebilmek ve yazılımdaki hataları (bug) bulabilmek için yapılan işlemin adıdır. Genellikle yazılan programın adım adım ve denetim altında çalıştırılmasıdır.
Programın her adımında ilgili değişkenlerin hangi değere sahip olduğunu görmeyi sağlayarak anormal bir durumu daha kolay izleyip bulmanızı sağlar.






Bağlayıcı (Linker) ve Çalıştırma (Execute)

Bağlayıcı: Derleyici tarafından object dosyasına çevrilen bir veya birden çok dosyanın birbirleri ile ilişkilendirmesi ve tek bir çalıştırılabilir dosyaya (Örneğin Windows exe) çevrilmesini sağlayan yazılımdır. Çalıştırma: Oluşturulan makine dili programının çalıştırılması adımıdır.



Yorumlayıcı (Interpreter) nedir?

Yorumlayıcı, kaynak kodu kısım kısım ele alarak doğrudan çalıştırır. Yorumlayıcılar standart bir çalıştırılabilir kod üretmezler. Yorumlama işlemi aşama aşama yapılmadığı için genellikle ilk hatanın bulunduğu yerde programın çalışması kesilir. Derleyicilerin tersine kodun işlenmeyen satırları üzerinden hiç geçilmez ve buralardaki hatalar ile ilgilenilmezler. Yorumlayıcılar genelde kaynak koddan, makine diline anlık olarak dönüşüm yaptıkları için, derleyicilere göre daha yavaş çalışırlar. Ayrıca kodu iyileştirme (optimizasyon) imkanı da çoğu zaman yoktur.

Derleyici (Compiler) nedir?

Derleyici, yazılan programın kaynak kodunu okuyup içerisinde mantıksal veya yazınsal hatalar olup olmadığını bulan, bulduğu hataları kullanıcıya göstererek programın düzeltilmesine yardım eden, hata yoksa programın çalıştırılması öncesinde kaynak kodu makine diline çeviren bir yazılımdır.

IDE Nedir? (Integrated Development Environment – Tümleşik Geliştirme Ortamı)

IDE bilgisayar programcılarının hızlı ve rahat bir şekilde program geliştirebilmesini amaçlayan, geliştirme sürecini organize edebilen birçok araç ile birlikte geliştirme sürecinin verimli kullanılmasına katkıda bulunan araçların tamamını içerisinde barındıran bir yazılım türüdür.
Tümleşik geliştirme ortamlarında olması gerekli en temel özellikler aşağıdaki gibidir:
Programlama diline göre sözdizimi renklendirmesi yapabilen kod yazım editörü.
Kod dosyalarının hiyerarşik olarak görülebilmesi amacıyla hazırlanmış gerçek zamanlı bir dizelge.
Tümleşik bir derleyici, yorumlayıcı ve hata ayıklayıcı.
Yazılımın derlenmesi, bağlanması, çalışmaya tümüyle hazır hale gelmesi ve daha birçok ek işi otomatik olarak yapabilmek amacıyla küçük inşa araçları.
En bilinen tümleşik geliştirme ortamları: Eclipse, Microsoft Visual Studio, Code::Blocks, Dev-C++, Anjuta, KDevelop, NetBeans…



Bilgisayarınızda yukarıdaki programlar olmadanda farklı dillerde geliştirilen kodları online olarak çalıştırabilirsiniz. Tek yapmanız gereken aşağıdaki online ide sitesine gidip, hangi dilde kod yazacağınıza karar verip kodları yazmak ve arkasından sitede sağ tarafta görülen yeşil Run tuşuna tıklamak. Yazdığınız kodlarda hata yakso kodlarınız direk o site üzerinden derlenerek çalışacaktır.

Online ide:  https://ideone.com/


 

Programlama Nedir?

Bir programı oluşturabilmek için gerekli komutların belirlenmesi ve uygun biçimde kullanılmasına programlama denir.
Programlama, bir programlama dili kullanılarak yapılır.
Bu programlama dili Java ve C# gibi yüksek seviyede bir dil olabileceği gibi C, Assembly ve bazı durumlarda makine dili de olabilir.
Yazılan kaynak kodu genellikle bir derleyici ve bağlayıcı yardımıyla belirli bir sistemde çalıştırılabilir hale getirilir. Ayrıca kaynak kodu, bir yorumlayıcı yardımıyla derlemeye gerek duyulmadan satır satır çalıştırılabilir.

Programlama aktivitesi genelde “Merhaba Dünya” (Hello World!) programı yazılmasıyla başlar.
Bir programlama dilini öğrenmekteki tek zorluk programlamanın ne olduğunu öğrenmektir. Bundan sonraki aşamalar daha basittir.

Program Nedir?

Var olan bir problemi çözmek amacıyla bilgisayar dili kullanılarak oluşturulmuş anlatımlar (komutlar, kelimeler, aritmetik işlemler, mantıksal işlemler vb.) bütününe «program» denir.

14 Ekim 2016 Cuma

Doğrusal Arama (Linear Search)


Dizinin ilk elemanından başlanarak dizinin her elemanı, arama değeriyle karşılaştırılır. Aranan değer bulunduğunda ilgili dizi elemanının indisi değer olarak döndürülür.  Aranan değer bulunamazsa -1 değeri döndürülür, Dizi herhangi bir şekilde sıralanmadığından değer ilk ya da son elemanda bulunabilir.  Dolayısıyla, program ortalama olarak, arama değeriyle dizinin elemanlarının yarısını karşılaştırmalıdır.




Dizilerde Arama ve Sıralama Algoritmaları

Arama ve sıralama algoritmaları (search and sort algorithms) programlama ve yazılım geliştirme dünyasında hem akademik hem de endüstri açısından önemli bir yere sahiptirler. Özellikle büyük veri kaynakları ile çalışırken,  aradığınız veriye en hızlı şekilde ulaşmanız doğru algoritmayı kullanmanıza bağlıdır.

Dizilerde Arama
Bir dizinin, belli bir arama değerine eşit olan bir değer içerip içermediğine karar vermek gerekebilir.
Dizinin belirli bir elemanını bulma sürecine arama denir.

Ders kapsamında iki tane arama tekniği üzerinde durulacaktır:
Doğrusal Arama (Linear / Sequential Search)
İkili Arama (Binary Search)

Dizi Kullanımlarında Dikkat Edilmesi Gereken En Önemli Nokta!

Dizi boyunca döngü kullanırken dizi indisi asla 0’ın altına inmemeli ve her zaman dizideki toplam eleman sayısından az olmalıdır (büyüklük-1).

Döngü devam şartının bu aralığın dışındaki elemanlara ulaşılmasını engellediğinden emin olmamız gereklidir.

Dizi sınırlarının dışındaki elemanları kullanmanın yaratacağı hatalar (genelde ciddi hatalardır) sistemden sisteme farklılık gösterir.

Dizilere Başlangıç Değeri Verme

Bir dizi, doğal olarak bazı veriler içerecektir. Diziye aynı anda birden fazla değer atanabilir. Bunun için söz konusu değerler { } işaretleri arasında virgül ile ayrılarak yazılırlar.

Örnek:
float  kutle[5] = { 8.471, 3.683, 9.107, 4.739, 3.918 };
int    maliyet[3] = { 25, 72, 94 };
double a[4] = { 10.0, 5.2, 7.5, 0.0};

Küme parantezleri sonlandırıcı ; karakteri ile bitmektedir. Bir dizinin uzunluğu belirtilmeden de başlangıç değeri atamak mümkündür.

Örnek:
int   a[] = { 100, 200, 300, 400 };
float v[] = { 9.8, 11.0, 7.5, 0.0, 12.5};
Derleyici bu şekilde bir atama ile karşılaştığında, küme parantezi içindeki eleman sayısını hesaplar ve dizinin o uzunlukta açıldığını varsayar.

Yukarıdaki örnekte, a dizisinin 4, v dizisinin 5 elemanlı olduğu varsayılır. Dizilere başlangıç değeri atarken, tüm elemanlara değer vermeden de atama yapmak mümkündür.

Örnek:
int sayilar[20] = {0};
Tüm dizi elemanlarına 0 değeri atanır…
int sayilar[20] = {1, 2, 3};
Dizinin ilk 3 elemanına 1, 2 ve 3 değerleri atanır. 4’ten itibaren olan dizi elemanlarına 0 değeri atanır…

Sayısal tipteki dizi elemanlarına 0 değeri, metin tipindeki dizi elemanlarına NULL değeri atanır.

Dizilerin Bildirimi

Bir dizi çok sayıda değişken barındırdığından, bunları birbirinden ayırt etmek için indis adı verilen bilgiler kullanılır.
Bir dizi, içerisinde çok fazla sayıda değişken barındırabilir.  Bunları birbirinden ayırt etmek için indis adı verilen bilgiler kullanılır. C Programlama Dili'nde, bir dizi hangi tipte tanımlanmış olursa olsun başlangıç indisi her zaman 0'dır. C Programlama Dili'nde, bir dizi hangi tipte tanımlanmış olursa olsun başlangıç indisi her zaman 0'dır.

Diziler tanımlanırken;
dizinin adı,
dizinin boyutu,
dizi elemanlarının hangi tipte olacağı belirtilmelidir.

Bir dizinin bildirim işleminin genel biçimi aşağıdaki gibidir:

   veriTipi dizi_adı[eleman_sayısı];

Örneğin; double türündeki 8 adet öğrenci notunu bellekte tutmak için aşağıdaki gibi bir dizi tanımlayabiliriz:
        double ogrenci_notu[8];

Şu andaki bilgilerimizle bunu nasıl yapabiliriz?

 double ogrenci_notu1;
 double ogrenci_notu2;
 double ogrenci_notu3;
 double ogrenci_notu4;
 double ogrenci_notu5;
 double ogrenci_notu6;
 double ogrenci_notu7;
 double ogrenci_notu8;


Dizinin ismi ogrenci_notu dur.

Dizinin 8 elemanı
ogrenci_notu[0], ogrenci_notu[1], ......, ogrenci_notu[7] şeklinde gösterilmiştir.

ogrenci_notu[0] içinde tutulan değer 45, ogrenci_notu[1] içinde tutulan değer 56, ogrenci_notu[7] içinde tutulan değer 90 dır.

Bu dizinin ilk iki elemanının içinde tutulan değerlerin toplamını yazdırmak isteseydik;
printf("Sonuc: %f", ogrenci_notu[0] + ogrenci_notu[1]);
Sonuc: 101

Bu dizinin yedinci elemanının değerini ikiye bölüp, oluşan sonucu x değişkenine atasaydık;
x = ogrenci_notu[6] / 2;

Dizinin yedinci elemanı ile yedinci dizi elemanı arasındaki farkı önemlidir. Dizi indisleri 0’dan başladığı için “dizinin yedinci elemanı” 6 indisine sahiptir. ”yedinci dizi elemanı” ise 7 indisine sahiptir ve aslında dizinin sekizinci elemanıdır.

Dizi Nedir?

Diziler, veri yapısı türlerinden bir tanesidir.(Array, Struct, Pointer, Class …) İçerisinde birden fazla, aynı tip ve isimdeki veriyi bellekte depolayabilen değişkenlere dizi denir.


İçerisinde birden fazla,
aynı tip ve
aynı isimdeki
veriyi bellekte depolayabilen değişkenlere dizi denir.

Örneğin; bir sınıftaki öğrencilerin notlarını saklamak için dizileri kullanmak mümkündür.

Sonsuz Döngüler

Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonsuz döngü olarak adlandırılır.
Örnekler:
    while(1) {
         printf("Sonsuz döngü...\n");
    }

     while(7>3) {
         printf("Sonsuz döngü...\n");
      }

    for(;;)
         printf("Sonsuz döngü...\n");



İç İçe Geçmiş Döngüler

Bir program içinde birbiri içine geçmiş birden çok döngü kullanılabilir. Bu durumda (bütün programlama dillerinde olduğu gibi) önce içteki döngü, daha sonra dıştaki döngü tamamlanır.
   
    for (i=1; i<n; i++){
            //1.dış döngü
        for (j=1; j<m; j++) {
            //2.iç döngü
        }
    }

Continue Deyimi

Bir döngüyü terk etmeden bir adımın atlanması söz konusu olduğunda kullanılan deyimdir.

Kullanım biçimi aşağıdaki gibidir:

    continue;

Break Deyimi

Döngü işlemi devam ederken döngünün koşuluna bağlı olmaksızın döngüden çıkılmasını sağlayan deyimdir.

Döngü içinde bu deyime sıra geldiğinde, break ardından döngü sonuna kadar olan tüm deyimler atlanır ve döngüye bir sonraki adımdan itibaren devam edilir.

Tüm döngü türlerinde kullanılabilir.

Kullanım biçimi aşağıdaki gibidir:

    break;
    

Do…while Döngüsü

while döngüsü ile aynı mantıkta çalışır.

Farkı, koşulun döngü sonunda sınanmasıdır.
Yani koşul sınanmadan döngüye girilir ve döngü en az bir kez yürütülür. Koşul olumsuz ise döngüden sonraki satıra geçilir.

Genel yazım biçimi aşağıdaki gibidir:   
    do
    {
          ...
          döngüdeki deyimler;
          ...
        } while (koşul);

Örnek 2

do {
    İşlem A;
         İşlem B;
         ..........

} while (koşul);

While Döngüsü

Bir koşulun gerçekleşmesi durumunda belirli işlemlerin tekrarlanması söz konusu ise while döngülerinden yararlanılır.
while döngüsünün çalışabilmesi için koşulun başlangıçta mutlaka doğru olması gerekir.
Genel yazım biçimi aşağıdaki gibidir:

while (koşul)
      {
       ...
        döngüdeki deyimler;
       ...
      }

Örnek 2

while (koşul ){
     İşlem A;
         İşlem B;
         ..........
}
İşlem C;
...........

For Döngüsü

Belirli sayıda tekrarı çalıştırmak için kullanılır. for döngüsü bir sayaçlı döngüdür. Yani çalışma sayısı bellidir. Döngü sayısını denetlemek için bir başlangıç ve bir bitiş değeri belirtilmektedir.
Normal durumda sayaç birer birer artmaktadır. 

Genel yazım biçimi aşağıdaki gibidir:

 for (başlangıç; koşul; artım){
       ...
        döngüdeki deyimler;
       ...
      }

Örnek 2

for (int i = başla; koşul; i=i+artış miktarı)
{   
    işlem A;
    işlem B;
    .......
}
    işlem C;

Diğer Örnekler





1’den 100’e kadar birer birer arttırma:
    for ( i = 1; i <= 100; i++)

100’den 1’e kadar birer birer azaltma:
    for ( i = 100; i >= 1; i--)

7’den 77’ye kadar yedişer yedişer arttırma:
    for ( i = 7; i <= 77 ; i += 7)

2, 5, 8, 11, 14, 17, 20 değerlerini alacak biçimde değiştirme:
    for ( j = 2; j <=20; j += 3)

Döngü

Programlamada en çok kullanılan özelliklerden biri de döngülerdir. Döngüler aracılığı ile belli şartlar gerçekleşinceye kadar veya gerçekleştikçe bir komut parçasını çalıştırmak mümkündür. Bir programda bir komut parçasının belli koşullar gerçekleştikçe veya gerçekleşinceye kadar defalarca icra etmesi gerekebilir. Bu defalarca çalışmayı sağlayan komutlara döngü (çevrim) yapıları denir. Döngü (loop) deyimleri, bir kümenin belli bir koşul altında tekrar edilmesi için kullanılır.

Döngü (loop) deyimleri, bir işlemi yerine getiren kod kümesinin belli bir koşul altında tekrar edilmesi için kullanılır.

Bir değişken belirli bir değerden başlayıp, son değeri alıncaya kadar belirtilen işlemler tekrarlanır.
Örn: n! değerinin hesaplanması (faktöriyel)

Genellikle bir programlama dilinde birden fazla döngü çeşidi bulunmaktadır. Döngü çeşitleri kullanım yerlerine göre kolaylıklar sağlamaktadır.Döngü yapıları genelde karşımıza iki tür olarak çıkar. Çalışma sayısının belli olduğu durumlarda sayaçlı döngüler, döngü sayısının değişken olduğu durumlarda ise koşullu döngüler kullanılır. C programlama dilinde sayaçlı döngü yapısına for döngüsü, koşullu döngü yapısına while ve do-while döngüleri örnek olarak verilebilir.

C programlama dilinde:
for,
while,
do...while
olmak üzere üç tip döngü deyimi vardır.

Diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar iç-içe döngü yapısı kullanılabilir.

10 Ekim 2016 Pazartesi

? Karşılaştırma Operatörü

Bu operatör, if-else karşılaştırma deyiminin yaptığı işi sınırlı olarak yapan bir operatördür.
Genel yazım biçimi:
   
    (koşul) ? deyim1 : deyim2;

İlk önce koşul sınanır. Eğer koşul olumluysa deyim1, olumsuzsa deyim2 değerlendirilir.
deyim1 ve deyim2 de atama işlemi yapılamaz. Ancak koşul deyiminde atama işlemi yapılabilir.
deyim1 ve deyim2 yerine fonksiyon da kullanılabilir.

Örnek:
    x = ( a > b ) ? a : b;

Yukarıdaki ifadede koşul a'nın b'den büyük olmasıdır. Eğer olumluysa x adlı değişkene a değeri atanır, Olumsuzsa x adlı değişkene b değeri atanır.
Örneğin if-else bloğu ile gösterimi:

if (a > b)
    x = a;
else
    x = b;


Örnek:
    int sayi = 15;
    x = ( sayi < 10 ) ? printf("yazi1") : printf("yazi2");

if-else ve switch-case Kullanımlarının Karşılaştırması

1. İşlevsellik: C programlama dilinde switch-case deyimi sadece char ve int veri türlerini destekler. Bu durum if-else deyimine göre dezavantajdır. switch-case deyimlerinde aralık kontrolü (x > 1000) yapılamaması yine bir dezavantajdır.

2. Performans: Her iki karşılaştırma deyiminin kullanımı farklı derleyicilerde ve farklı programlama dillerinde farklı performans sonuçları üretebilir. Genelde switch-case kullanımı daha performanslı çalışır.

3. Okunabilirlik: switch-case deyimlerinin kod okunabilirliği her zaman daha yüksektir.

switch-case Kullanım Hataları

break deyiminin kullanılmasının unutulması.
switch-case bloğundaki { } sembollerinin kullanımlarının unutulması.
default deyiminin ve içeriğinin kullanımının unutulması.
Kontrol edilen değişken ile verilen sabitlerin farklı tipte olması.
int ve char veri türleri dışında değişken tanımlamaya çalışmak (double, string)



switch…case Bloğu

Switch-case yapısı, bir değişkenin aldığı değerlere bağlı olarak program akışındaki belirli işlemlerin yerine getirilmesini sağlar. Aslında bu tür işlemleri if deyimi yardımıyla yerine getirebiliriz. Ancak bazı uygulamalarda if deyiminin kullanılması programın karmaşıklığını artırabilir ve okunabilirliğini azaltabilir.

Eğer bir değişkenin aldığı değer belirli sabitlerle karşılaştırılacak ve bunun sonucunda farklı işlemler yapılacak ise if deyimi yerine switch deyimi kullanmamız daha sağlıklı olacaktır. Önemli bir nokta, switch-case yapısı sadece char ve int veri türleri için kullanılabilir.


Bir değişkenin aldığı değerlere bağlı olarak, program akışındaki belirli işlemlerin yaptırılmasını sağlar.
Aslında bu tür işlemleri if deyimi yardımıyla yerine getirebiliriz.
Ancak bazı uygulamalarda if deyiminin kullanılması programın karmaşıklığını artırabilir ve okunabilirliğini azaltabilir.
Eğer bir değişkenin değeri belirli sabitlerle karşılaştırılacak ve bunun sonucunda farklı işlemler yapılacak ise if deyimi yerine switch deyimi kullanmamız daha sağlıklı olacaktır.
Sadece char ve int veri türleri için kullanılabilir.

Yazım Şekli
switch (değişken) {
    case sabit1:  
        deyim1
        break;
    case sabit2:
        deyim2
        break;
        …
    case sabitn:
        deyimn
        break;
    default:
         deyimd;
    }

değişken değeri sabit1 değerine eşitse  deyim1 çalıştırılır ve break kullanılarak bloktan çıkış yapılır.
değişken değeri herhangi bir sabite eşit değilse default  sabitinin deyimi deyimd çalışır.

if-else Kullanım Hataları

Hata-1
if sayi==10         //Söz dizimi hatası   
   printf ("Girilen sayi 10\n");

Koşul ifadesinde ( ) sembolleri kullanılmadığı için “syntax error” hatası alınır (Söz dizimi hatası).

Hata-2
if (sayi==10);            //Boş ifade
   printf ("Girilen sayi 10\n");

Koşul ifadesinden sonra ; sembolü kullanılmıştır. C derleyicisi için boş bir ifadedir. Sonraki satır bu satırdan bağımsızdır.

Hata-3
if (10<=sayi<=50)          //Mantıksal Hata   
Sonucu her zaman doğru olan mantıksal bir hatadır.

Koşul ifadesi soldan sağa doğru değerlendirilir. sayi değişkenin değeri 10 ile karşılaştırılır.
10’dan küçükse false yani 0 sonucu döner,
10’dan büyükse true yani 1 sonucu döner,
Her iki durum da (0 veya 1 sonucu) dönen değer 50’den küçük olacağı için bu ifade her zaman doğru sonuç verir.
Bunun yerine  ((sayi>=10) && (sayi<=50)) koşul ifadesi kullanılmalıdır.


Hata 4
if (sayi=10)             //Mantıksal Hata
Sonucu her zaman doğru olan mantıksal bir hatadır.
Koşul ifadesinde karşılaştırma operatörü == yerine, atama operatörü = kullanılmıştır.
 Atama sonucunda 10 değeri oluşur.
10 değeri 0’dan büyük olduğu için sonuç “true” dönecektir ve bu da yanlış bir sonuç üretecektir.

Atama operatörü yerine, == karşılaştırma operatörü kullanılmalıdır.

Koşullarda Hızlı Değerlendirme

C programlamada, koşulların mantıksal değerlendirmelerinde, beklenilen değere ulaşıldığında koşulun tamamı değerlendirilmeden koşuldan çıkılır.

VEYA kullanımında koşulun ilk kısmı DOĞRU (true) ise koşulun tamamı DOĞRU olacağı için koşulun ikinci kısmı değerlendirilmez.

VE kullanımında koşulun ilk kısmı YANLIŞ (false) ise koşulun tamamı YANLIŞ olacağı için koşulun ikinci kısmı değerlendirilmez.

Örnek: if ((a>b) && (a<c)) eğer (a>b) YANLIŞ ise (a<c) değerlendirilmez.

Örnek: if ((a>b) || (a<c)) eğer (a>b) DOĞRU ise (a<c) değerlendirilmez.

Yazdığınız programın performansı açısından koşulların nasıl değerlendirildiğini iyi bilip, ona göre koşul sırası koymamız gerekmektedir.

Örnek: if ((ögrenci_no==12345) && (ögrenci_isim="Veli"))

Bu örnekte en hızlı şekilde YANLIŞ (false) sonucu almak istiyorsak, en çok seçilebilir olan koşulu en sola yani başlangıca koymamız gerekmektedir.

İç içe if…else Blokları (Nested If)

if-else yapıları içerisine başka if-else yapıları yerleştirerek birden fazla koşul aynı anda test edilebilir.

if (sayi < 0)
   printf("Negatif sayı girdiniz\n");
else
     if (sayi > 0)
          printf("Pozitif bir sayı  girdiniz\n");
     else
         printf("Sıfır sayısını girdiniz\n");

Diğer bir kullanım şekli aşağıdaki gibidir:

     if(koşul_1) {
        deyimler; //(küme_1)          
      }
      else if(koşul_2) {
        deyimler; //(küme_2)
      }
      ….
      ….
      else if(koşul_n-1) {
        deyimler; //(küme_n-1)
      }
      else {
        deyimler; //(küme_n)
       }


Örnek: Girilen notun harf karşılığını bulma
Girilen not;
60 ile 65 arasındaysa DD
65 ile 70 arasındaysa DC
70 ile 75 arasındaysa CC
75 ile 80 arasındaysa CB
80 ile 85 arasındaysa BB
85 ile 90 arasındaysa BA
90 ile 100 arasındaysa AA
yazdıran bir program yazalım. Bunların dışındaysa «Uygun değer girmediniz!» şeklinde uyarı verip, programdan çıkacak.

Cevap:
Standart C kütüphanesinde bulunan printf() fonksiyonu, değişkenlerin tuttuğu değerleri, onların adreslerini veya bir mesajı ekrana belli bir formatta yazdırmak için kullanılan fonksiyondur.

scanf() fonksiyonu klavyeden veri okumak için kullanılan fonksiyondur.








if…else Bloğu

if ve else tek bir karşılaştırma deyimi olup else kullanımı isteğe bağlıdır.
Eğer bu koşul olumlu ise if den sonraki bölüm yürütülür ve else den sonraki bölüm atlanır.
 Koşul olumsuz ise if den sonraki küme atlanır ve eğer varsa, else den sonraki kümedeki işlemler gerçekleştirilir.


if (koşul)
   { Doğru ise İşlem1}
else
   { Yanlış ise İşlem2}

Aşağıdaki her iki örnek aynı işlemi gerçekleştirmektedir. Tek fark birinci örnekte { } sembollerinin kullanılmasıdır. Tek satır deyim içeren bloklarda, { } sembollerinin kullanılmasına gerek yoktur.


if (sayi < 0) {
   printf("Negatif sayı girdiniz\n");
}
else {
  printf("Sıfır veya pozitif bir sayı  girdiniz\n");
}


if (sayi < 0)
   printf("Negatif sayı girdiniz\n");
else
  printf("Sıfır veya pozitif bir sayı  girdiniz\n");

Koşul

Akış kontrollerinin ve koşul ifadelerinin hem programlama dillerinde ve hem de uygulama altyapısında her zaman önemli bir yeri vardır. İyi bir yazılım geliştiricinin koşul ifadelerini iyi bilmesi gerekir. Yazdığımız uygulamanın hangi koşulda nasıl davranacağını bilip buna göre bir akış kontrolü oluşturmamız gerekir.

Tüm programlama dillerinde olduğu gibi en temel koşul ifadesi «if-else» bloklarıdır.

Koşul ifadelerinin ve akış kontrollerinin programlama dillerinde ve uygulama altyapısında her zaman önemli bir yeri vardır.
Yazdığımız uygulamanın hangi koşulda nasıl davranacağını belirterek bir akış kontrolü oluşturabilmek için koşul ifadelerinin iyi bilinmesi gereklidir.

Tüm programlama dillerinde olduğu gibi en temel koşul ifadesi «if-else» bloklarıdır.

Sonucu DOĞRU veya YANLIŞ olan herhangi bir ifadeye “koşul” denir.
DOĞRU -> «1» ile gösterilir.
YANLIŞ -> «0» ile gösterilir.

Örnek:
if (kisi_boy > 170)
    printf("Uzun boylusunuz\n");

(kisi_boy > 170) ifadesi bir koşuldur.

Koşullar, karşılaştırma operatörleri ve mantıksal operatörler kullanılarak oluşturulurlar.


8 Ekim 2016 Cumartesi

Hanoi Kuleleri Oyunu C#.Net (WPF)

Uygulama C#.Net (WPF) ile geliştirilmiştir.

 
Hanoi Kuleleri Oyunu Nedir?
Hanoi kuleleri oyunu, basit ve matematik temelli bir bulmacadır. Oyun 3 sopa ve bu sopalar içerisinde bulunan halkalardan oluşur. Oyunun amacı bu halkaları sıralı bir şekilde en sağdaki sopaya sıralamaktır. Oyunda her seferinde sadece bir halka taşınabilir. Her hamlede sadece en üstte bulunan halka diğer bir sopaya taşınabilir. Diğer sopada daha önceden halkalar bulunabilir ancak hiçbir halka kendisinden küçük bir halkanın üzerine koyulamaz. 
En az hamde oyunu tamamlamakta diğer bir önemli konudur. 
En az hamle sayıları 
3 halka = 7 hamle 
4 halka = 15 hamle 
5 halka = 31 hamle 
6 halka = 63 hamle 
7 halka = 127 hamle 
8 halka = 255 hamle

Uygulamanın Bütün Kodları: http://www.fauset.hol.es/codes/HanoiTowers_Wpf.rar

7 Ekim 2016 Cuma

Printf ve Scanf

printf () - Tip belirleyici (conversion specifier)

% işareti ile başlar ve bir veya iki karakterden oluşur (%d gibi). Ekrana yazdırılmak istenen değişkenin tipi, % işaretinden sonra belirtilir. Ayrıca biçim ifadesinin içine, sola - sağa yaslama, noktadan sonra x basamak yaz vb gibi isteklerimizi belirten karakterler de ekleyebiliriz.
Gerçek sayıların yazdırılmasında, noktadan sonra yazılacak basamak sayısı durumların ifade edilmesi için ve tamsayıların aynı hizada yazdırılması için nokta operatörü veya rakamlar kullanılır. Aynı şekilde karakter katarlarının sağa ya da sola dayalı yazdırılması için veya bir karakter katarındaki karakterlerin kaç tanesinin yazdırılacağını belirtmek için de yine nokta, eksi gibi operatörlerin ve rakamların çeşitli kombinasyonları kullanılır.


scanf() Fonksiyonu

Birçok programda ekrana verilerin bastırılmasının yanı sıra klavyeden veri okunması gerekebilir. scanf() fonksiyonu klavyeden veri okumak için kullanılan fonksiyondur. Tip belirleyicileri printf fonksiyonu ile aynı mantıkta kullanılır ve % sembolü ile ifade edilir.
Örneğin klaveden bir x tamsayısı okumak için aşağıdaki ifade kullanılır:
    scanf("%d", &x);