Bilgisayar Programlamaya Giriş I İST 105 DERS NOTLARI Abdullah YALÇINKAYA 2012
İST 105 Bilgisayar Programlamaya Giriş Amaç: 1. Bilgisayar donanımı ve bilgisayar yazılımlarının tanıtılması 2. Programlama dilleri ve program geliştirme tekniklerinin tanıtılması 3. Temel problem çözme tekniklerinden olan yukarıdan aşağı tasarım tekniğinin tanıtılması ve bu teknikle algoritmaların yazılması. Bilgisayar Nedir? Bilgisayar, mantıksal ve aritmetik işlemleri çok hızlı biçimde yapan bir araçtır. Günümüzün bilgisayarları, saniyede milyonlarca aritmetik işlem yapabilecek kapasitededir. İlk üretilen bilgisayarlar, oldukça büyük ve yavaştı. Ama gün geçtikçe küçüldüler ve güçleri de hızla arttı. Örneğin, yirmi-otuz yıl önce bir odaya sığabilecek bir bilgisayarın yaptığı işlerden çok daha fazlasını, bugünkü kişisel bilgisayarlar, daha hızlı bir şekilde yapabilmektedir. Bu yüzden, bilgisayarlar günümüzde çok değişik alanlarda ve ortamlarda kullanılmaktadır. Hemen-hemen her evde ve işyerinde artık bilgisayar görmek mümkündür. Bir bilgisayar sisteminin fiziksel yapısını oluşturan fare, klavye, ekran, işlemci, disk, bellek gibi parçaların hepsi birden bilgisayar donanımı olarak adlandırılmaktadır. Bilgisayarın çalışmasını denetleyen birer komutlar kümesi olan programlar da bilgisayar yazılımı olarak adlandırılır. Bir bilgisayar sisteminin, bu iki parçaya da ihtiyacı vardır. Her biri, diğeri olmadan hiçbir işe yaramaz. Günümüzde, donanım fiyatları hızla düşmekte, ama yazılım maliyetleri tam tersine artmaktadır. Bu dersteki amacımız bilgisayar yazılımı geliştirmek olduğundan, biz yalnızca bilgisayar yazılımı ile ilgileneceğiz. Ancak kısaca bilgisayar donanımından da söz etmek yararlı olacaktır. 2 Abdullah YALÇINKAYA
Bilgisayar Donanımı Gördüğümüz ve dokunabildiğimiz bütün parçalar bilgisayar donanımını oluşturur. Modern bir bilgisayar donanımı, aşağıdaki beş ana parçadan oluşur. CPU (Central Processing Unit - Merkezi İşlem Birimi): Bu birim, bilgisayarın çalışmasını düzenleyen ve programlardaki komutları tek tek işleyen birimdir. İşlem hızına göre çeşitli modelleri vardır. Örneğin, Pentium işlemci, 486 işlemci ya da Sparc işlemci dediğimizde, bilgisayarın Merkezi İşlem Birimi (MİB - İşlemci) anlaşılmalıdır. RAM (Random Access Memory Rastgele Erişimli Bellek veya Ana Bellek): RAM, bir giriş cihazından veya bir ikincil depolama cihazından okunan veri ve programların, çalıştırılan programlardan elde edilen sonuçların ve bir ikincil depolama cihazına veya bir çıkış cihazına gönderilmeye hazır olan çıktıların tutulduğu yerdir. Kısaca, programların ve verilerin kullanıldığı zaman depolandığı yerdir. MİB işlemlerini, ana bellekte saklanan bu verilere ulaşarak yapar. Buradaki rastgele erişim ifadesi bilgisayarın bellek içerisindeki herhangi bir adrese doğrudan gidip bilgileri okuyabileceği veya yazabileceği anlamında kullanılmaktadır. Ana bellekte veriler geçici olarak tutulur; başka bir deyişle bilgisayar kapatıldığında bu veriler silinir. Çok kullanıcılı sistemlerde bilgisayar bir kullanıcı için herhangi bir işi yapmayı bitirdiğinde, ana bellekteki aynı kısma diğer kullanıcılar için işlenmesi gereken veri ve programlar yerleşir. Ana bellek diğer bilgi saklama araçlarına oranla biraz daha pahalıdır. Ana belleğin temel görevleri şöyle özetlenebilir. 1. Hali hazırda çalışan programların program deyimleri ve bu programların ihtiyaç duyduğu verileri tutmak. 2. İşletim sistemi yüklendikten sonra ana bellekte sürekli olarak kalması gereken işletim sistemi bileşenlerini tutmak. 3 Abdullah YALÇINKAYA
3. Programlar tarafından üretilen sonuçları tutmak. 4. Sabit disklere veya harici bir cihaza gönderilmeye hazır olan çıkış bilgilerini tutmak. Bellekte yerleşik olan veri ve programlara ihtiyaç halinde tekrar ulaşabilmek için ana bellekteki her bölgenin bir adresi vardır. Ana belleğin büyüklüğü; aynı anda çalışabilecek program sayısını ve programların çalışma hızını etkiler. Dış Bellek Birimleri (Secondary Memory Devices): Ana bellekteki bilgiler (elektrik gücüne bağlı olarak), geçici süre saklanabildiği için, uzun süre kalıcı olarak saklamak istediğimiz bilgileri dış bellek birimlerinde depolarız. Bu araçlardan bazıları: CD (Compact Disc Yoğun Disk), DVD (Digital Versatile Disk Çok Yönlü Sayısal Disk), Harici diskler ve sabit disklerdir. Burada saklanan bilgiler, elektrik kesilmesinden etkilenmez. Tipik bir kişisel bilgisayarın sabit diski, gigabyte (GB) cinsinden ölçülen milyarlarca harfe denk gelen verileri saklayabilir. Girdi Birimleri (Input Devices): Kullanıcı, bu birimler aracılığıyla, bilgisayara verileri girer. Girdi birimlerinden bazıları, klavye, fare ve oyun konsoludur. Çıktı Birimleri (Output Devices): Bilgisayarın kullanıcıya ileteceği sonuçları göstermek için kullandığı birimlerdir. Bunlardan bazıları ekran ve yazıcıdır. Bilgisayar Yazılımı Bilgisayar yazılımı (program), bilgisayara bir işi yaptırmak için verdiğimiz komutlar kümesidir. Yazılımları genel olarak iki kategoride sınıflandırabiliriz: 4 Abdullah YALÇINKAYA
İşletim sistemleri: Kullanıcı ile bilgisayar arasındaki iletişimi sağlayan programlardır. Bilgisayar sisteminin bütün hareketlerini denetler ve sistemdeki MİB ve ana bellek gibi kaynakların yönetimi ile ilgilenirler. Örneğin, sizin kullandığınız Windows XP ya da Windows 7 birer işletim sistemidir. Diğer bazı işletim sistemleri şunlardır: PARDUS, UNIX, DOS, SOLARIS, MACINTOS. Uygulama Programları: İşletim sistemi dışında kalan diğer programlara verilen genel bir addır. Örneğin, Word, havayolları rezervasyon sistemi, bilgisayar oyunları, programlama dillerinin derleyicileri, birer uygulama programıdır. Programlama Dilleri Bir problemi çözmek için gerekli olan komutlar çok değişik programlama dilleri kullanılarak yazılabilir. Bazı programlama dillerinde yazılan programlar, doğrudan bilgisayarda MİB tarafından anlaşılabilir. Diğer bazı dillerde yazılan programlar ise o dilin derleyicisi tarafından işlemcinin anlayacağı dile çevrilir. Programlama dillerini üç genel kategoriye ayırabiliriz: Makine dilleri Assembly dilleri Yüksek seviyeli programlama dilleri Makine dili: Her bilgisayarın işlemcisinin anlayacağı kendi makine dili vardır. Örneğin, Pentium işlemcinin makine dili, Sparc işlemciden farklıdır. Makine dilindeki bir komut, bit (0 ya da 1) gruplarından oluşur. Örneğin, makine dilinin bir komutu iki değerin toplanması ya da bir değerin ana belleğin bir bölgesinde saklanması gibi basit işlemleri içerir. İnsanların makine dilinde program yazması hemen hemen olanaksızdır. Örneğin, makine dilinde iki sayının toplanması, 01000110011101000111101010000010010101101000010 biçiminde ifade edilir. 5 Abdullah YALÇINKAYA
Assembly dili: Bir assembly dili, makine dilindeki komutları ingilizce benzeri bir dille ifade eder. Genelde assembly dilindeki her komut makine dilindeki bir komuta denk düşer. Assembly dilindeki bir program ASSEMBLER diye bilinen bir yazılım tarafından makine diline çevrilir. Assembly dilinde program yazmak da makine dilinde olduğu gibi zor ve zaman alıcıdır. Assembly dilinde iki sayının toplanması, LOAD A ADD B STORE C biçiminde ifade edilir. Yüksek Seviyeli Programlama Dilleri ( YSPD ): Makine dilinde çok sayıda komutla yapılabilecek bir iş, yüksek seviyeli programlama dilinin bir komutu ile yapılabilir. Bu yüksek seviyeli diller, İngilizce ya da Türkçe gibi doğal bir dil değil, kendi yapısı ve dilbilgisi kuralları olan, insanlar için anlaşılması kolay olan dillerdir. Yüksek seviyeli programlama dilinde yazılan bir program, derleyici (Compiler) dediğimiz yazılımlar tarafından, makine dilindeki denk bir programa dönüştürülür. Bilgisayar tarafından çalıştırılacak olan program, makine dilindeki programdır. Bazı yüksek seviyeli programlama dilleri arasında PASCAL, DELPHI, FORTRAN, BASIC, C, C++, COBOL, LISP ve PROLOG sayılabilir. Bu dillerin birkaçında, iki sayının toplanması şöyle ifade edilir: C:=A+B; (PASCAL) C=A+B; (C) C=A+B (FORTRAN) 6 Abdullah YALÇINKAYA
Bazen yüksek seviyeli programlama dilinde yazılmış bir program, makine diline çevrilmek yerine başka bir ara dile çevrilebilir. Bu ara dildeki komutlar, hiçbir makineye bağımlı değildir. Bu ara dildeki programlar, o dilin yorumlayıcısı (interpreter) olarak bilinen yazılımlar tarafından çalıştırılır. Bunun amacı, ara dildeki programların değişik bilgisayarlarda hiçbir değişikliğe uğramadan kullanılabilmesidir. Yazılım Geliştirme Bir program, bir problemi çözmek için yazılan komutlar kümesidir. Bu komutlar, İngilizce ya da Türkçe gibi dillerde değil, bilgisayar sisteminin anlayacağı bir dildedir. Bir program yazmadan önce, ilk yapacağımız iş, o problemi nasıl çözeceğimize karar vermek ve çözümün adımlarını belirlemek olmalıdır. Bu işte bize yardımcı olabilecek çeşitli problem çözme teknikleri vardır. Bu tekniklerden yararlandığımızda, yarattığımız çözümü bir programa dönüştürmek kolay olacaktır. En temel problem çözme tekniği, yukarıdan-aşağı tasarım yöntemidir. Bu yöntemde ilk verilen problem, küçük alt problemlere bölünür. Bu alt problemler, gerekirse, daha küçük (basit) alt problemlere bölünürler. En sonunda elde edilen alt problemler, ayrı ayrı çözülürler ve bu çözümler ana problemin çözümünü elde etmek için birleştirilirler. Bu yöntem, algoritma yazımından söz ederken örneklerle açıklanacaktır. Bir problemi çözmek için yazacağımız programı oluştururken, genelde, aşağıdaki yazılım geliştirme aşamalarından geçmek zorundayız: 1. Problemin Anlaşılması ve Çözümlenmesi: İlk yapacağımız iş, problemin tam olarak ne olduğunu anlamaktır. Bu nedenle, problemin çözümünden neler beklediğimizi ve yaratacağımız çözümün girdi ve çıktılarının neler olacağını kesin olarak belirlemeliyiz. 7 Abdullah YALÇINKAYA
2. Tasarım (Design): Bu aşamada, problemi çözmek için kullanılacak çözüm adımlarını gösteren bir liste yapmamız gerekir. Bir problemin çözüm adımlarını gösteren bu listeye algoritma denir. Böyle bir liste tasarlarken, yukarıdan-aşağı tasarım tekniğini kullanırız: Önce problemin ana adımları çıkarılır; daha sonra, her adım için, gerekiyorsa, daha detaylı bir çözüm tasarlanır. Böylece bir problem için bir algoritma geliştirmiş oluruz. Bir programlama diline çevirmeden önce, bu algoritmanın doğru bir çözüm olduğu kanısında olmalıyız. Bu aşamayı atlayarak doğrudan programlamaya geçmek, büyük programlar yazarken işimizi çok zorlaştıracaktır. 3. Kodlama (Coding): Bu safhada kâğıt üzerinde geliştirdiğimiz algoritmayı bir programlama diline çeviririz. Bizim durumumuzda bu dil xxx olacaktır. Bu yüzden, xxx programlama dilinin yapısını bilmemiz gerekecektir. Algoritmamızın her adımı, ona karşılık gelen xxx program parçasına çevrilecektir. 4. Sınama ve Kanıtlama (Testing and Verifying): Geliştirdiğimiz programın doğruluğunu sınayarak istediğimiz gibi çalışıp çalışmadığını görmek zorundayız. Bu amaçla, program üzerinde çeşitli testler yaparak, programın o testlere nasıl karşılık verdiğine bakarız: Bunu sağlamak için program değişik girdilerle çalıştırılır ve ürettiği sonuçlara bakılır. Sonuçlar beklendiği gibiyse, programın doğru çalıştığı kanıtlanmış olur; değilse doğru çalışmayan parçaları bularak düzeltmemiz gerekir. 5. Algoritmalar Algoritma, bir problemin çözümünün adımlarını gösteren formal bir dilde yazılmış tasarımdır. Kullanılan dil Türkçe ve İngilizce gibi doğal bir dildir ama sınırlı bir yapısı vardır. Bir algoritmada bulunması gereken temel öğeler şunlardır: sıra, karar verme yapıları ve yineleme. Sıra: Çözüm adımları bir sıraya dizilmiş olarak verilmelidir. Bu sıra çözüm adımlarının hangi sırayla uygulanacağını gösterir. Bir adımın içerdiği alt adımlar numaralama düzeniyle açıkça belirlenir. 8 Abdullah YALÇINKAYA
Karar Verme Yapıları: Bazı çözüm adımları seçeneğe bağlı olarak uygulanır. Her adımın hangi koşulla uygulanacağı açıkça belli olmalıdır. Adım numaralarından seçeneğe bağlı olarak uygulanacak adımın konulan koşulun sağlanması ya da sağlanmaması durumunda mı uygulanacağı belli olmalıdır. Yineleme: Bazı adımların birkaç kez yinelenmesi gerekebilir. Bu amaçla yinelenecek adımlar yineleme adımının alt adımları olmak zorundadır. Yineleme adımı alt adımların hangi koşullarda yineleneceğini gösteren bir mantıksal ifade kullanmalıdır. Yineleme adımının yapısından yinelenecek adımların hangi koşullarda yineleneceği ve yineleme işleminin ne zaman duracağı belli olmalıdır. Algoritmaların Numaralanması: Yukarıdaki temel öğeler aşağıdaki gibi algoritma adımlarını numaralama yöntemi ile başarılabilir: Sırayla çözülecek adımlara, birbirini izleyen sıra numaraları verilebilir. Örneğin, a, b ve c adımlarının sırayla uygulanacağını gösterir. Eğer bir adım, alt adımları kapsayacaksa, alt adımlar, o adımın numarasını da kapsayacak şekilde numaralanır. Örneğin, a, b, b1,b2 ve c adımlarının sırayla uygulanacağını gösterir. Seçeneğe bağlı uygulanacak adımlar aşağıdaki gibi numaralanabilir. Bu yapı, seçeneğe bağlı olarak, N adımının alt adımlarının uygulanacağını gösteren bir yapıdır. Bu adımı uygulamak için, N adımındaki mantıksal-ifade'nin doğru olup olmadığı bulunur. Eğer mantıksal-ifade doğruysa N.T. adımı uygulanır; doğru değilse N.F. adımı uygulanır. Bazı karar verme yapılarında N.F. adımı bulunmayabilir, bu durumda N adımındaki mantıksal-ifade yanlış ise uygulamak için N den sonraki (N+1) adımına gidilir ve adımların uygulanması oradan devam eder. Bazen N.T. (veya N.F.) birden fazla adım içerebilir, bu durumda bu adımları N.T.1, N.T.2,... gibi numaralandırırız. 9 Abdullah YALÇINKAYA
Yineleme: Yineleme adımı için aşağıdaki gibi bir yapı kullanabiliriz. Bu yapıda mantıksalifade doğru olduğu sürece N.1, N.2,..., N.m adımları sırayla yinelenir. Her yinelemeden sonra mantıksal-ifade kontrol edilir ve eğer doğru ise yineleme işlemi devam eder; doğru değilse bir sonraki (N+1) adıma gidilir. Şimdi, açıkladığımız yazılım geliştirme aşamalarının en önemlileri olan ilk üç adımı birkaç örnekle göstereceğiz. Verilen bir problemi nasıl çözümlediğimizi, tasarım aşamasını ve en sonunda algoritma yazılımını anlatacağız. Örnek 1: Problem: Verilen üç sayının ortalamasının bulunması. Problemin Anlaşılması ve Çözümlenmesi: Bu problemde bize üç doğal sayı verilecek ve biz üç sayının ortalamasını bulacağız. Bulduğumuz sayıyı kullanıcıya bildireceğiz. Girdiler: üç doğal sayı S1, S2 ve S3 Çıktılar: bu üç doğal sayının ortalaması Tasarım: Bu problemi yukarıdan-aşağı tasarım yöntemini kullanarak çözeceğiz. Çözüm adımlarını bir algoritma gibi göstereceğiz. İlk önce problemimizi aşağıdaki üç ana adıma ayıracağız. 1. doğal sayıları oku 2. ortalamayı bul 3. ortalamayı kullanıcıya bildir Birinci adımı biraz daha ayrıntılı vermemiz gerekir. Yani bu durumda alt problemimiz üç doğal sayının okunması olmuştur. Bu adımdaki problemi aşağıdaki gibi çözebiliriz: 10 Abdullah YALÇINKAYA
1. doğal sayıları oku 1.1. ilk doğal sayı S1 i oku 1.2. ikinci doğal sayı S2 yi oku 1.3. üçüncü doğal sayı S3 ü oku İkinci adımda ortalamayı nasıl bulacağımızı belirterek aşağıdaki gibi detaylandırabiliriz: 2. ortalamayı bul 2.1. ortalamayı ortalama = (S1 + S2 + S3) / 3 formülü ile hesapla Eğer üçüncü adımının yeterince basit olduğunu kabul edersek, sonuç algoritmamız aşağıdaki gibi olacaktır: 1. doğal sayıları oku 1.1. ilk doğal sayı S1 i oku 1.2. ikinci doğal sayı S2 yi oku 1.3. üçüncü doğal sayı S3 ü oku 2. ortalamayı bul 2.1. ortalamayı ortalama = (S1 + S2 + S3) / 3 formülü ile hesapla 3. ortalamayı kullanıcıya bildir Örnek 2: Problem: Verilen üç sayının en büyüğünün bulunması Problemin Anlaşılması ve Çözümlenmesi: Bu problemde üç doğal sayı okuyacağız ve bu üç sayının en büyüğünü bulacağız. Bulduğumuz en büyük değeri kullanıcıya bildireceğiz. Girdiler: üç doğal sayı S1, S2 ve S3 Çıktılar: bu üç doğal sayının en büyüğü Tasarım: İlk önce aşağıdaki algoritmanın üç ana adımını yazar ve sonra birinci adımı ve ikinci adımı onların alt adımlarındaki gibi çözeriz. Çözüm olarak aşağıdaki algoritmayı elde ederiz. 11 Abdullah YALÇINKAYA
1. doğal sayıları oku 2. en büyük sayıyı bul 3. en büyük sayıyı kullanıcıya bildir Alt adımlarla birlikte aşağıdaki gibi algoritma genişletilir. 1. doğal sayıları oku 1.1. ilk doğal sayı S1 i oku 1.2. ikinci doğal sayı S2 yi oku 1.3. üçüncü doğal sayı S3 ü oku 2. en büyük sayıyı bul 2.1. eğer S1 < S2 2.1.T. eğer S2 < S3 2.1.T.T. en büyük sayı S3 tür 2.1.T.F. en büyük sayı S2 dir 2.1.F. eğer S1 < S3 2.1.F.T. en büyük sayı S3 tür 2.1.F.F. en büyük sayı S1 dir 3. en büyük sayıyı kullanıcıya bildir Örnek 3: Problem: Verilen bir pozitif doğal sayının faktöriyelinin bulunması Problemin Anlaşılması ve Çözümlenmesi: Bu problemde bir pozitif doğal sayı okuyacağız ve bu sayının faktöriyelini kullanıcıya bildireceğiz. Girdiler: bir pozitif doğal sayı S Çıktılar: S! 12 Abdullah YALÇINKAYA
Tasarım: Bir sayının faktöriyeli (S!), birden o sayıya kadar olan bütün doğal sayıların çarpımına eşittir. Yani, S! = 1 x 2 x... x (S-1) x S Bu kısa anımsatmadan sonra algoritmamızı tasarlamaya başlayalım. İlk ana adımlar: 1. Sayıyı oku, S 2. S! hesapla 3. S! kullanıcıya bildir Birinci ve üçüncü adımlar yeterince basit, ancak ikinci adımın detaylandırılması gerekiyor. Yukarıdaki formülü, yineleme yapısını kullanarak hesaplayabiliriz. Buna göre, ikinci adım aşağıdaki alt adımlara bölünebilir. Bu çözüm için, iki değişken kullanıyoruz. İlki S! değerini tutacak (SFakt), diğeri ise (Sayaç), 1 den S ye kadar sayıların değerini tek tek alacak. 2. S! hesapla 2.1. SFakt i 1 e eşitle 2.2. Sayacı 2 ye eşitle 2.3. Sayaç <= S olduğu sürece 2.3.1. SFakt ı Sayaç ile çarp ve sonucu SFakt ın yeni değeri yap 2.3.2. Sayacı bir arttır Burada, 2.3.1 ve 2.3.2 adımları, 2 den S e kadar tekrarlanacaktır. Sonunda, sayaç S den bir büyük olacağı için tekrarı kontrol eden mantıksal ifade yanlış olacaktır ve bu adımlar bir daha yinelenmeyecektir. 13 Abdullah YALÇINKAYA