Mega Code Archive

 
Categories / Delphi / Forum
 

Neoturk- quickbasic nostalji notlari

herkese merhaba, nostaljiye devam............. -------------------------------- -written by neoturk / 01.01.1995 QUICK BASIC PROGRAMLAMA DİLİ Quick basic microsoft firmasının çıkarmış olduğu bir programlama dilidir. GW-Basic programlama dilinin daha gelişmiş bir halidir. Neyse fazla edebiyata gerek yok. Derse başlayalım.... Şimdi abicim önce sana qb'de kullanilan tüm komutlarin (yani işe yarar komutlarin) bir listesini veriyorum. Aklima geldikçe yenilerini yazacam ama fazla yeni komut yok zaten. Program örneklerine geçecem. Dur bakalim daha menüleri anlatmadan olum yaaa ne komutlara geçiyon hemen?! önce bi "tab" tuşunun ne işe yaradigini söyle bakalim.... abicim tab tuşu sag taraftan sol tarafa geçiş yapar, tab tuşu önemli bir tuştur...!?! Kullanılan genel komutlar listesi: Cls: ekranı siler. Color: yazı rengini belirler Locate: yazının hangi satır hangi sütuna yazılacağını belirler. Print: ekrana herhangi bir yazıyı yazar. Input: kullanıcıdan bir şey girilmesini ister. Input$: kullanıcıdan bir tuşa basılmasını bekler. Sleep: kullanıcıdan bir tuşa basılmasını bekler. Beep: ses çıkartır. Sound: ses çıkartır. İf-then-else: kullanılan üçlü komut stili. Eğer-ise-değilse anlamına gelir. Select case: ilgili aralıklara ilişkin seçim yapar. Dim: dizi açmada kullanılır. Gosub-return: basit bir alt program modülü hazırlar. int: sayısal ifadenin tam sayı kısmını alır, küsüratını atar. Kullanılan döngü komutları listesi: For-next: ikili komut takımı. Birlikte kullanılır. Do-loop-until: üçlü komut takımı. Birlikte kullanılır. Karaktersel fonksiyonlar listesi: Chr$: ilgili ascii kodun karakter karşiligini verir. Asc: ilgili karakterin ascii kod karşiligini verir. Len: yazının kaç karakter olduğunu bulur. Str$: sayısal ifadeyi yazıya döndürür. Val: yazısal ifadeyi sayıya döndürür. Left$: yazının soldan olan kısmı ile ilgilenir. Right$: yazının sağdan olan kısmı ile ilgilenir. mid$: yazının orta olan kısmı ile ilgilenir. String$: ilgili karakterden n adet yanyana birleştirir. Space$: n adet boşlugu yanyana birleştirir. Tab: n. Colona imleci konumlandırır. Dosyalama komutları: Open: dosyayı açar. Close: dosyayı kapatır. Get: dosyadan veri okur. Put: dosyaya veri yazar. Grafiksel komutlar: Screen: ekran çözünürlüğünü ayarlar. Line: çizgi çizer. Circle: çember çizer. Pset: nokta çizer. Evet sevgili abicim. Şimdilik aklima gelen komutlar bu kadar. Bu komutlarla her türlü programi yazabilirsin. Bunun için tek ve altin bir kural var. ANTRENMAN SENI 1 NUMARA YAPAR. Bitti. Quick Basic program paketi nerede kuruludur normalde ? Qb programı normal kurulduğu zaman c:\bc7 dizinine kurulur. Ve qb programını çalıştıran program c:\bc7\bin dizini altında qbx.exe diye bir program var. Bu programı çalıştırdığın zaman qb programlama editörü açılır. Ve işlemlere başlanır. Püf: c:\bc7\bin dizini içinde new-vars.bat diye bir dosya vardır. Bu dosyayı 1 kereliğine mahsus çalıştırman gerekiyor. Yani qbx.exe'yi çalıştırmadan önce new-vars.bat dosyasını çalıştırıyorsun. Bu dosya gerekli sistem kaynaklarını düzenler. Bunu çalıştırmazsan yazdığın programı EXE'ye çeviremezsin. Bu dosyayı çalıştırdıktan sonra qbx.exe yi çalıştırırsan yazdığın programı exe'ye çevirebilirsin. Püf: quickbasic ile qbasic farklı şeylerdir. Quickbasic son model basictir. Qbasic ise dandirikten bir basictir. Ben quickbasic'e qb diyecem yazılarda. Ona göre haaa... Qbx in menülerinde ne vardır ? Files: Dosyalar Edit: düzenle View: görünüm Search: ara Run: çalıştır Debug: hata ayıkla Calls: özel çağrımlar Utility: araçlar Options: seçenekler Help: yardım. Editörü kısaca bir tanımlarmısınız lütfen ? Ekran ilk çıktığında 2 ye bölünmüş haldedir. 1. Bölüm programı yazacağın yerdir. Yani imlecin bulunduğu yer. Üst kısımdır. 2. Bölüm ise immediate yazan penceredir. Yani anında yardımcı görüntü almak içindir. Genelde imeediate penceresi pek kullanılmaz. Birinci pencerenin üst kısmında untitled yazar. Bu şu demektir. Henüz yazdigin programa bir işim verilmemiş ve kaydedilmemiş demektir. Programa bir isim verdigin zaman verdigin o isim untitled'in yerine geçer. Editörde kullanılan kısayol tuşları nelerdir ? Alt+artı_tuşu: immediate penceresini alta indirir. Alt+eksi_tuşu: immediate penceresini yukarı çıkarır. F6: program penceresi ile imeediate penceresi arasında geçiş yapar. Shift+F5: yazdığın programı baştan çalıştırır. En çok kullanılan tuş budur. F4: çalıştırdığın programın en son ekran görüntüsünü gösterir. Herhangi bir tuşa basınca editöre geri dönülür. F2: Alt programların listesini gösterir. F1: imlecin bulunduğu komutu değerlendirerek yardım menüsünü açar. F8: kullanılmasına hiç gerek yok. Programı satır satır çalıştırır. Yaw exe ne demek ? source ne demek ? anlatsana kardeşim ! Editörde yazdığın programı kaydettiğin zaman uzantısı .BAS olur. Yani senin programının kaynak=source (sors) kodu demektir. Kaynak kodu sadece qbx editöründe açarak shift+F5 tuşu ile çalıştırabilirsin. Hazırladığın programı yani kaynak kodu her ortamda hazır çalışır duruma getirmek istiyorsan bunu .EXE ye çevirmen gerekir. Yazdığın programı .exe ye çevirmek için run/make_exe_file menüsüne tıklayabilirsin. Enter enter deyip programı exe'ye çevirmiş olursun. Make_exe_file emrini verdikten sonra 3 adet dosya oluşur. Örneğin bir program yazdın ve adını emin.bas verdin. Bunu make_exe_file yaparsan, 1.emin.bas dosyası, zaten var olan kaynak kodun, 2.emin.obj dosyası, bu dosya gereksizdir. Silebilirsin. 3.emin.exe dosyası, yazdığın programın exe'ye çevrilmiş hali. Bu üç dosya, hangi dizinde çalışıyor isen o dizinde otomatik oluşturulur. Peki yazdığım program nereye kaydedilir ? exe'ye çevrilen programım nerde ? Yazdığın programı hangi dizin içine kaydetmiş isen, exe'ye çevrilmiş hali o dizine atılır. Hepsi bir arada bulunur. Püf: qbx programını çalıştırmadan önce kendine dos'ta bir dizin aç. O dizinin içine gir. Örneğin cd c:\emin, Ve sonra c:\bc7\bin\new-vars.bat komutunu aynen yaz ve uygula. Ayarlar otomatik yapılır, sonra qbx yazıp enter. Yazdığın program c:\emin dizinine kaydedilir ve exe'ye çevrilmiş hali de bu dizinde bulunur. Dikkat: new-vars.bat dosyası diye bir şey bulamazsan (c:\bc7\bin dizini içinde) nv.bat dosyasına bak. Ben ismini kısa olsun diye nv.bat diye değiştirmiş olabilirim. Püf: c:\bc7 dizini içinde normal olarak 5 dizin bulunur. Ve quick basic (qbx) e ait dizinlerdir. Bu dizinler bulunmak zorundadır ve exe'ye çevrimek için qbx tarafından özel olarak kullanılırlar. 1. c:\bc7\bin 2. c:\bc7\binb 3. c:\bc7\lib 4. c:\bc7\src File menüsünü anlatırmısınız lütfen ? * New Program: yeni bir program yazmak için kullanılır. O anki editördeki programı kapatır. * Open Program...: daha önce yazdığın programı açar. Merge...: yazdığın programı başka bir programın sonuna text formatında birleştirir. * Save: yazdığın programı kaydeder. * Save As...: yazdığın programı farklı isimle kaydeder. Save All: tümünü kaydeder. ------------------ Create File...: dosya oluşturur. Load File...: dosya yükler Unload File...: dosyayı kapatır. (bu üç madde gereksiz) ------------------ * Print...: yazıcı çıktısı alır. * DOS Shell: Geçici olarak dos'a çıkar. Editöre geri dönmek için exit yazıp enter. ------------------ * Exit: qbx programından çıkar. Püf: (*) ile belirttiklerim en çok kullanacağın menülerdir. Diğerleriyle işin olmaz zaten. Ben bile kullanmıyorum. Edit menüsünü anlatırmısınız lütfen ? * Undo Alt+Bksp: yaptığın son işlemi geri alır. Geri al. Redo Ctrl+Bksp: geri aldığını ileri alır. İleri al. * Cut Shift+Del: kes * Copy Ctrl+Ins: kopyala * Paste Shift+Ins: yapıştır Clear Del: sil ------------------- * New SUB...: yeni bir alt program açar. SUB = alt demektir. New FUNCTION...: yeni bir fonksiyon modülü açar. Püf: bu menüde kısayol tuşlarını zaten sana söylüyor editör. Bildiğin tuşlar zaten. Bksp=backspace (geri al ) tuşu. View menüsünü anlatırmısınız lütfen ? * SUBs... F2 : alt programların listesini verir. Next SUB Shift+F2 : bir sonraki alt programa geçiş yapar. Split : ekranı ikiye böler/bölmez ----------------------- Next Statement : sonraki çalışacak olan komutu söyler. * Output Screen F4 : son çıktıyı gösterir. ----------------------- Included File : başka modüllü programi ekler. Included Lines : başka satirlari ekler. Gereksiz 2 menü... ----------------------- Search menüsünü anlatırmısınız lütfen ? * Find...: bul. Selected Text Ctrl+\: seçilmiş yaziya göre bul. * Repeat Last Find F3: aranan kelimeyi bir daha kaldığın yerden itibaren ara. * Change...: değiştir. Label...: etiket adına göre bul. Run menüsünü anlatırmısınız lütfen ? * Start Shift+F5: programı çalıştırır. Restart: programı yeniden çalıştırır. Continue F5: programa kaldığı yerden çalışmaya devam eder. Modify COMMAND$...: komut satırı parametresi tanımlar. --------------------- * Make EXE File...: yazdığın programı exe'ye çevirir. Make Library...: yazdığın programı kütüphaneye çevirir. --------------------- Set Main Module...: Başka bir ana modül ekler. Diğer menüler gereksiz. Fazla bir işine yaramayan menüler olduğu için yazma gereğini duymadım. Options/syntax_checking menüsünde çentik işaretli olursa yazdigin yanliş deyime qbx hemen müdahale eder ve seni uyarir. Karşina çikan uyari mesaji önemsizdir. Esc ile kapatabilirsin. Sürekli bu uyari mesajini almak istemiyorsan eger çentik var ise bu çentigi kaldirmalisin. Peki bana bazı hata mesajları veriyor. Ben ingilizce anlamam kardeşim Türkçe konuş ! 1 NEXT without FOR ¦ 52 Bad file name or number 2 Syntax error ¦ 53 File not found 3 RETURN without GOSUB ¦ 54 Bad file mode 4 Out of DATA ¦ 55 File already open 5 Illegal function call ¦ 56 FIELD statement active 6 Overflow ¦ 57 Device I/O error 7 Out of memory ¦ 58 File already exists 8 Label not defined ¦ 59 Bad record length 9 Subscript out of range ¦ 61 Disk full 10 Duplicate definition ¦ 62 Input past end of file 11 Division by zero ¦ 63 Bad record number 12 Illegal in direct mode ¦ 64 Bad file name 13 Type mismatch ¦ 67 Too many files 14 Out of string space ¦ 68 Device unavailable 16 String formula too complex ¦ 69 Communication-buffer overflow 17 Cannot continue ¦ 70 Permission denied 18 Function not defined ¦ 71 Disk not ready 19 No RESUME ¦ 72 Disk-media error 20 RESUME without error ¦ 73 Feature unavailable 24 Device timeout ¦ 74 Rename across disks 25 Device fault ¦ 75 Path/File access error 26 FOR without NEXT ¦ 76 Path not found 27 Out of paper ¦ 80 Feature removed 29 WHILE without WEND ¦ 81 Invalid name 30 WEND without WHILE ¦ 82 Table not found 33 Duplicate label ¦ 83 Index not found 35 Subprogram not defined ¦ 84 Invalid column 37 Argument-count mismatch ¦ 85 No current record 38 Array not defined ¦ 86 Duplicate value for unique index 40 Variable required ¦ 87 Invalid operation on null index 50 FIELD overflow ¦ 88 Database needs repair 51 Internal error ¦ 89 Insufficient ISAM buffers bunlar qbx'in standart hata kodları tablosu. Bunların açıklamalarını yazacağım. Çoğu işine yaramayacak ama beş on tanesi sıkça göreceğin mesajlar. Ben yine de hepsini yazayım bari... 1. for deyimini kullanmışsın ama next ifadesini unutmuşsun. 2. Yazım hatan var. Tanıyamadığım bir komut yazmışsın kardeşim. 3. Gosub ile alt programı çağırmışsın ama return komutunu unutmuşsun. 4. Read deyimiyle veri okutuyorsun güzel, ama bana verdiğin veri sayısı az be dostum. 5. Hatalı bir işlem oluştu. Sayı taşması, sıfıra bölme, mantıksız bir işlem ya da acayip bir hata. Program doğru çalışıyor ama yaptırdığın işlem her neyse ben onu yapamadım. Mantığını kontrol et. 6. Sayısal işlemin abartı oldu. Ya çok küçük ya çok büyük bir sayı elde ediliyor. Ben bu sayıyı kullanamıyorum. 7. Dostum, yazdığın program çok fazla bellek istiyor. Programını çok uzun yazmışsın. Bellek yetmiyor. Kısaltmaya çalışsan fena olmaz. Çalıştıramam, çok üzgünüm. 8. Etiket'in tanımlı değil. Öyle bir etiket yok. 9. Kullandığın dizide taşma var. Dizi sınırını aştın. 10. Aynı alt programı 2 kere tanımlamışsın. Birini sil. 11. Sıfıra bölme hatası. 12. Hatalı iletim modu. (valla şu ana kadar bu hata mesajını hiç alamadım her nasıl bir hataysa artık) 13. Tip uyuşmazligi var. Sayisala karaktersel işlem mi yaptiriyon ? kullandigin türe dikkat etsene kardeşim. Emin$=12345 diye bi mantik yani. Elmayla armut toplanir mi.... 14. Valla boşluk sinirinda taşma var. Çok fazla miktarsa benden boşluk karakterini kullanmami istiyon. (35.000 tane mesela... limit 32727 dir.) 15. - 16. formülüze işlemin çok karişik. Biraz düzelt de anlayim yaw. 17. Programı kaldığın yerden çalıştırmak istiyon ama ben kaldığım yerden devam ettiremiyom. Sen en iyisi shift+F5 e bas da yeniden başlat. 18. Fonksiyonun tanımlı değil. 19. On error komutunu kullanmışsın da Resume komutun nerde ? 20. Yaw resumeyi kullanmışsın ama yine de mantığında yanlışın var dostum. Düzelt yaw. 21. - 22. - 23. - 24. valla ilgili bir sürücüye bakmamı istiyon ama hala bir cevap alamadım. (ekran kartı, cpu vs) 25. ilgili cihaz hatalı, çalışmıyor. 26. O kadar da çok for-next döngüsü açılmaz ki kardeşim ? başka bir yöntem dene sen. 27. Yazıcıda kağıt yok, bitmiş. 28. - 29. While komutunu kullanmışsın, hani bunun wend'i ? 30. Wend komutunu kullanmışsın, hani bunun While'ı ? 31. - 32. - 33. iki tane aynı isimde etiket oluşturmuşsun. 34. - 35. benden alt programı çalıştırmamı istiyon. Peki nerde senin alt programın ? yazmamışsın ki ... 36. - 37. deyim sayacı hatalı... dandik bir hata mesajı. Hala göremedim daha. 38. Dizi kullanmak istemişsin ama diziyi önce bi tanimla bakalim. 39. - 40. deyime ulaşilamadi. Yeniden bi dene sen. Bu da dandik. 41. - 42. - 43. - 44. - 45. - 46. - 47. - 48. - 49. - 50. dosya açmaya çalışıyorsun ama saha taşması var. 51. İçten kaynaklanan bir hata var. Benden değil haa ! benim sorunum değil. Makinadan gelen bir sorun bu. 52. Dosyayı kapatmadan aynı dosyayı bir daha açmak istiyon. Ya da açmak istediğin dosyayı bulamıyom. Adını cinsini bir kontrol et bakam. 53. Dostum, ilgili dosyayı bulamıyom. Bi kontrol et. 54. Dosya açma modu hatalı. 55. Lam dosya zaten açık. Bi daha ne diye açmaya çalışıyon! 56. Saha işlevi aktif. Bu da dandik bi mesaj. 57. Valla makinada bi sorun var. Okuyamıyom. 58. Zaten dosya üstündesin ve işliyorsun. Ayni dosyayi yeniden açmanin geregi ne ? 59. Dosyadan veri okuyacan belli bir uzunlukta, ama bana belirtiğin sahadan daha büyük bir saha okumaya çalışıyon. Kurallara uy be dostum. Sen baa ne diyon, bi de ne yapıyon. Hala halaaaa... 60. - 61. dostum kusura bakma, harddiskte boş yer yok, veriyi dosyaya yazamiyom. 62. Veri oku diyon baa dosyadan, ama istediğin kadar veri dosyada yok, adam gibi veri istesene kardeşim. 63. Dosyadaki kayıt numarası hatalı. Kayıt numarasını kontrol et. 64. Ne biçim dosya adı veriyon yaw ? adam gibi dosya adı versene baa ! 65. - 66. - 67. çok fazla miktarda dosya açmaya çalışıyon. (32 dosyadan fazla yani) 68. valla dediğin sürücüyü ben anlayamadım nedir neyin nesidir. Yazıcı mı ? ekran mı ? kartı tanıyamadım.... 69. buffer bellekte taşma var. Dandik bir mesaj. 70. Diskete veri yazdırmak istiyon ama disketin çentiğini bi kapat bakam. Nasıl yazacın çentik açık olursa ? 71. Dostum disket nerde ? 72. Disketin bozulmuş, okuyamiyom. 73. Hiç bi şey anlayamiyom, bilmiyom sorunun ne oldugunu. 74. Disketin adını değiştiremedim. 75. Belirttiğin dizindeki dosyayı açamadım. Sen bi bak bakam bi öyle bir dizinin var mı ? 76. Dostum, bana belirttiğin yol adı yanlış. Diğer mesajlar dandikten mesajlar.... Bu mesajlar tüm hata mesajlarıdır. Karşına mutlaka bunlardan bir tanesi çıkacaktır zaten. Yaw kullandığın bazı deyimler var, alt program felan diyon? nedir bunlar? Alt program: belli bir işi yapmak üzere yazilmiş küçük kod bloguna denir. Bu işi yaptirmak istedigin zaman bu kod parçasini kullanirsin, yani onu çagirirsin. Buna alt program denir. Diger adlari da kütüphane, modül, library (laybreri) dir. Ana program: editörde yazdığın programa denir. Alt programlar geri planda saklanır. Bunların listesini görmek için F2 tuşuna basmalısın. Püf: ne kadar çok alt program kullanırsan, ve bunları iyi organize edersen, programı o kadar çok hızlı ve etkin yazarsın. Komut: qbx in kullandığı tanıdığı, bir işi yapan ifadelerdir. Deyim: bir şeyi tanimlamak için yazilan ifadedir. Örnek olarak atama deyimleri, aritmetik deyimler, karşilaştirma deyimleri vs... Fonksiyon: belli bir işlemi yaptiktan sonra geriye sayisal ya da karaktersel bir deger döndüren alt programa denir. Fonksiyonlar alt programlardan daha hizli çalişir ve genelde matematiksel işlemler için kullanilir. Derlemek: programı derlemek demek exe'ye çevirmek demektir. 'programı derledim, yarın sana getirecem....' Bug (bag): hata demektir. 'abi programımda bag var, onu çöziyim getirecem...' bug=böcek demektir. Programda bulunan mantıksal hatalara denir. Dizi: Aynı türden verileri bir küme içinde tutan yapıya denir. Programımı exe'ye çevirdim. Çevirirken bazı yazılar çıktı bu ne işe yarar ? Run/make_exe_file seçeneği ile (enter enter geçiyoruz) programı exe'ye çevirirken bir takım rapor mesajı yazılır. Ancak bu raporu kısa bir an için görürsün. Sonra editöre geri döner. Raporu görmek için, editöre geri döndükten sonra F4 tuşuna basarsan rapor menüsünü dos ekranında aşağıdaki gibi görebilirsin. BC D:\HE\DENEME.BAS/O/Ot/Lr/FPi/T/C:512; Microsoft (R) BASIC Compiler Version 7.10 Copyright (C) Microsoft Corporation 1982-1990. All rights 45828 Bytes Available 45744 Bytes Free 0 Warning Error(s) 0 Severe Error(s) LINK @~QBLNK.TMP Microsoft (R) Segmented-Executable Linker Version 5.10 Copyright (C) Microsoft Corp 1984-1990. All rights reserv Object Modules [.OBJ]: /EX DENEME Run File [DENEME.exe]: D:\HE\DENEME.EXE List File [NUL.MAP]: Libraries [.LIB]: c:\bc7\lib\BCL71ENR.LIB; Bu ne diyor yaw ? Yazdığın deneme.bas programın deneme.exe olarak exe'ye çevrildi. 0 Warning Error(s) 0 Severe Error(s) ne yazım hatası, ne de mantıksal hataların var. 0-0 hiç hata yok. Mantıksal hata derken, qbx'e göre mantıksal hatalar yani. Programı yazmaya devam edersen (45744 Bytes Free) 45744 byte daha kullanabilirsin diyor. Program büyüdükçe bu sayı düşer. Bu sayı 0 olduğu zaman yazdığın programı exe'ye çeviremez qbx. O zaman yazdığın program çok büyük ve yer kalmıyor demek. Bunu çözmenin tek bir yolu vardır. Programını başka başka programlar halinde ayrı paketleri exe'ye çevirmek ve birbirlerini çağırmaktır. Bitti... exe hikayesi de böyle. Yaw yazdığım bazı komutlara yazım hatası veriyor ama ben doğru yazdıııım ? Print doğru prınt yanlış (küçük harf (ı) geçersizdir) Input doğru İnput yanlış (büyük harf (İ) geçersizdir) Program yazarken yazdığım komutun büyük ya da küçük harf olması önemli mi ? Hayır önemli değil. Print (enter) dediğin zaman otomatik olarak PRINT olarak değişecektir zaten. Bu da doğru yazdığının bir işaretidir Bir komut üzerinde F1 tuşu ile ya da help menüsünden yardim aldim, yardim penceresini nasil kapatacam peki ? Esc tuşuna basarsan editöre geri dönersin Tamam kardeşim, bu kadar teori yeter. Icraata geçelim, TAB tuşuymuş.... hala halaaa, olum ne yapayim ben TAB tuşunu !.. Ben shift+F5 tuşuna bastigimda program çalişir diyorsun, nasil çalişiyor yani ? Yazdığın program ilk satırsan başlayarak son satıra kadar satır satır hızlı bir şekilde çalıştırılır. En son satır da çalıştırıldıktan sonra ekranın en alt kısmına 'Press any key to continue = devam etmek için bir tuşa basın' yazısı çıkar ve herhangi bir tuşa basaraka editöre geri dönülür. Püf: yazdığın programı hayali olarak satır satır göz önünde çalıştırdıktan sonra shift+F5 e basıp, hayal ile gerçeği mukayese etmek seni 1 numara yapar Değişkenler: Değişken: bir yazıyı ya da bir sayıyı içinde barındıran sembolik bir ifadedir. Ve bu sombolik ifadenin içeriği her an değiştirilebilir. İşte bu sembolik ifadeye değişken denir. Örnek: Emin$="Benim adım Emin Yilmaz" Dogumtarihi=1976 Burada 'emin$' ve 'dogumtarihi' sembolik ifadeleri birer değişkendir. Dikkat: değişken adlarında türkçe karakterler kullanılamaz. Örnek, doğumtarihi=1976 yanlış. Ğ harfi geçersizdir. Peki bu sembolik ifade nedir ? neyi ifade ediyor yani ? 'Emin$' değişkeni, 'Benim adım Emin Yilmaz' yazısını aklında tutar. 'dogumtarihi' değikeni, 1976 sayısını aklında tutar. Peki değişkenin içeriğini değiştirmek mümkün mü ? Tabii ki mümkün. Örnek: Dogumtarihi=1976 (dogumtarihi değişkeni 1976 sayısını aklında tutsun) ....... ....... ....... dogumtarihi=2000 (dogumtarihi değişkeni şimdi 2000 sayısını aklında tutsun, öncekini sil) Değişkenler kaça ayrılır ? Değişkenler 2'ye ayrılır. 1. karaktersel (string = sitring) değişkenler 2. sayısal değişkenler 2.a) tam duyarlı değişkenler 2.b) çift tuyarlı değişkenler 2.c) tam sayı değişkenler karaktersel değişkenler: içinde yazı ifadelerini tutan değişkenlerdir. Değişken adının sonuna $ (dolar) işareti konur ve istenilen yazı = (eşittir) simgesiyle atanır. Atanılan yazı ise " (tırnak) işaretleri arasına alınır. Örnek: Emin$="benim adım emin yilmaz" Emin değişken adı $ karaktersel değişken olduğunu söylüyoruz. "benim adım emin yilmaz" bu yazıyı aklında tut diyoruz. Püf: karaktersel değişkene atanan yazının karakter sayısı en fazla 32767 adet olabilir. Yani yazdığın yazının max uzunluğu 32767 karakter olabilir. (hayat hikayeni yazabilirsin, hayathikayem$="bir zamanlar çok uzak köyde iken......" ) Püf: değişken adının uzunluğu önemsizdir. İstediğin kadar uzun değişken adı da verilebilir. Ancak bu değişken adının ilk 32 karakteri göz önünde bulundurulur program tarafından. Örnek: benimilkdogdugumdabanaverilenad$="Emin" yazabileceğin gibi bidbvd$="Emin" de yazılabilir. İkisi de aynı işi yapar. Değişken adı seçmek bir zevk ve sanat meselesidir Sayısal Değişkenler: İçinde sayı değerini tutan değişkenlerdir. Değişken adının sonuna 3 adet sembol konulabilir. Örneğin sayısal değişkenimizin adı 'sonuc' olsun. 1.Sonuc=1000 2.Sonuc#=1000 3.Sonuc%=1000 1. ifadede 'sonuc' adlı sayısal değişkenimiz tek duyarlı bir sayısal türdür. Tek duyarlı demek, küsüratlı virgüllü ancak çok büyük sayılar olmayan sayı türü demektir. Sonuc=1000 dediğimiz zaman, qbx 1000 sayısını aslında 1000.00000000 (8 tane 0) olarak aklında tutar. Büyük sayı derken 2 küsür milyara kadar olan sayıları kastediyorum. Bu sayı türü tek duyarlıdır. Sonuc#=1000 dediğimiz zaman, qbx 1000 sayısını aslında 1000.0000000000000000 (16 tane 0) olarak aklında tutar. Ve istenildiği kadar büyük sayılar verilebilir. Trilyon, katrilyon... bu sayı türü çift duyarlıdır. Sonuc%=1000 dediğimiz zaman, qbx 1000 sayısını tam 1000 olarak tutar. Küsüratını almaz. Bu sayı tür tamsayı türüdür. Tek duyarlı değişken isimlerinin sonuna herhangi bir sembol konulmaz. = sembolünden sonra istenilen değer atanabilir. (-2 milyar küsür ile +2 milyar küsür olabilir) Çift duyarlı değişken isimlerinin sonuna # (diyez) sembolü konur. Ve = sembolünden sonra istenilen sayı değeri atanabilir. Her türlü miktarda sayıyı kabul eder. Tam sayı değişken isimlerinin sonuna % (yüzde) sembolü konur ve = sembolünden sonra istenilen sayı değeri atanabilir. Tam sayı değişken türünde -32768 ile +32767 arası değerler atanabilir. Bu sınırın dışına çıkılırsa overflow (sayı taşma) hata mesajını alırsın. Program hata verir. Tek duyarlı ve Çift duyarlı değişkenler her türlü küsüratı tutabilirken tamsayı değişkenler küsürat tutmaz. Peki niye bu kadar çeşitli sayi türü var yaw ? sayi sayidir kardeşim, ne diye 3 e bölmüşler sayilari ? İşin tekniğinde kullanılan byte sayısı ve hız kavramı vardır. Bu 3 örnekte en hızlı işlem yapan sayı türü Tamsayı'dır. Hız sıralaması olarak: 1. tam sayılar 2. tek duyarlı sayılar 3. çift duyarlı sayılar bu yüzden, programcı tasarruflu olmalıdır. Bunun yanısıra programın hızlı çalışması gerektiği anlar olabilir. O zaman kullanılacak sayısal değişken türüne dikkat edilmelidir. Örnek olarak, 1 den 1000 e kadar sayıların karelerinin toplamını ekrana yazdıran bir program yazdığımızı düşünelim. Programcı şu mantığı izlemelidir. İstenilen sayısal aralık 1-1000 arasında. Bu yüzden ben bu işlemi hızlı yaptırabilirim. Tamsayı değişken türünü kullanarak bu soruyu çözerim. Eğer bu soruyu çözmek için çift duyarlı değişken kullanılırsa programın çalışma hızı düşer. Kıyaslamalı örnek veriyorum: Ekrana 1 den 30000 e kadar olan sayıların karelerini yazan program: CLS FOR m%=1 to 30000 LOCATE 12,35 PRINT m%*m% NEXT Şimdi ikinci versiyonunu yazalim: CLS FOR m#=1 to 30000 LOCATE 12,35 PRINT m#*m# NEXT 1. versiyonda 'm' değişkenin % ifadesi ile tam sayı olduğunu qbx'e belirtiyoruz. Ve qbx ona göre hafızayı ayırıyor. (2 byte alan kaplar) 2. versiyonda 'm' değişkeninin # ifadesi ile çift duyarlı sayı olduğunu qbx'e belirtiyoruz. Ve qbx ona göre hafızayı ayırıyor. (8 byte alan kaplar) 1. program 2. Programdan daha hızlı işlem yapacaktır. Belki biz farkına varmayız ama milisaniyeler birleşirse 2 sn yapar. 2 sn 2 sn'dir. Ve byte miktarını da tasarruflu kullanmamız gerekir. Programcı bu problemi çözerken istenilen sayı aralığını dikkate alarak tam sayı aralığına düştüğüne dikkat etmelidir. Ve o yüzden % ifadesini kullandık, tam sayı değişken olduğunu söyledik. qbx'de 3 tane sayısal tür var, Delphi'de 16 tane sayısal tür var, yaaa.... Adamlar profesyonel programcılık istiyor yani anlayacağın. Değişken kullanımlarına ait örnek bir program: NOT: Yazdığın programlı GÜZEL bir isimle kendine ait bir dizine kaydet. COLOR 15,1 CLS A=10 B=20 C=a+b D=(a*50+500)/33 Kdv%=d ikramiye#=kdv%*25:sonuc#=ikramiye#+5000 ozelpara=sonuc+1000 print "İkramiye tutarı =";ikramiye# print "sonuc tutarı =";sonuc# print "ozelpara tutarı =";ozelpara püf: ben küçük harfle print yazıyorum ama sen bu programı yazarken print yazısı PRINT yazısına otomatik dönecektir bir alt satıra geçtiğinde. Püf: print komutunun pratik yazılışı ? (soru işareti) dir. ?"ikramiye tutarı=";ikramiye# yazıp entere basarsan aynı satırı elde edeceksin (Shift+F5 ile çalıştırmadan önce analiz edelim akıldan) Programı satır satır çalıştıralım akıldan: Color 15,1 yazı rengi beyaz, zemin rengi mavi olsun. Cls Ekranı sil. Zemin rengini de geri plana ver. İmlecin posizyonunu da 1. Satır, 1. Colona al. (bunlar CLS komutunun özelliğidir) A=10 değişkeni tanımladım. Değişken adı A. Tek duyarlı. 10 değerini tutsun. B=20 değişkeni tanımladım. Değişken adı B. Tek duyarlı. 20 değerini tutsun. C=a+b a ile b'nin değerini topla, C'ye ata. Değişken adı C. Tek duyarlı. A=10 idi, B=20 idi, a+b=30 yapar, C= 30 oldu. Püf: ATAMALAR HER ZAMAN SAĞDAN SOLA DOĞRU OLUR. SAĞDAKİ İŞLEMİ HESAPLAR VE SOLDAKİ DEĞİŞKENE AKTARIR. D=(a*50+500)/33 bu işlemi yap, sonucu D degişkenine aktar. Degişken adi D, tek duyarli. Işlemin sonucu 30.30303 dür. Ve D degişkeni bu degeri tutar. Püf: ilk önce parantez içleri otomatik hesaplanır, sonra dıştaki işlemler yapılır. Ayrıca matematiksel opsiyonlar şunlardır: * : çarp / : böl +: topla - :çıkar (...): işlem önceligini belirler. Parantezler işlem önceligini belirler. Birden fazla parantez takimi iş içe kullanilabilir. Açilan parantezlerle kapatilan parantez sayisi ayni olmalidir. Aksi halde yazim hatasi oluşur. Örnek parantez kullanimi (abarti olarak) a=(((200+4547)/54+25)*500) gibi olabilir. Püf: değişken isimlerinin büyük ya da küçük harf olması birşeyi değiştirmez. Zaten bir değişken adını küçük harften büyük harfe çevirirsen programda o değişken adının hepsi aynı boyuta otomatik olarak çevrilecektir zaten Kdv%=d Kdv değişkeninin tam sayı olduğunu % işareti ile söylüyoruz ve D değişkeninin değerini kdv değişkenine aktarıyoruz. D değeri yine korunuyor. (NOT: Atama işlemlerinde VERİ KAYBI diye bir şey söz konusu değildir) Kdv değeri 30 olur. Sadece 30 (küsüratını almaz) Çünkü tam sayılarda küsürat tutulmadığı için D deki değerin tam sayı kısmını alır kdv değişkeni. Çünkü kdv değişkeni tam sayı değişken. ikramiye#=kdv%*25:sonuc#=ikramiye#+5000 ikramiye değişkenin sonuna # sembolunu koyduğumuz için çift duyarlı olduğunu söylüyoruz. Ve kdv değeri ile 25 değerini çarpıp sonucu ikramiye değişkenine aktarmasını söylüyoruz. İkramiye değişkeninin değeri 750 olur. : (iki nokta üst üste) sembolu alttaki satırı yukarı yazmak için kullanılır. Yani; ikramiye#=kdv%25 sonuc#=ikramiye#+5000 satırları ile ikramiye#=kdv%*25:sonuc#=ikramiye#+5000 satırı aynı işi yapar. : sembolü ile 2 satır kullanmak yerine 1 satır kullanıyoruz. Bu bir zevk meselesidir ve programa bir artısı ya da eksisi yoktur. İstenilen şekilde satırlar yazılabilir.... sonuc değişkenin çift duyarlı olduğunu # sembolü ile söylüyoruz. Ve sağ taraftaki işlemi hesaplatıp, sonuc değişkenine aktarıyoruz. Sonuc değeri 5750 olur. DİKKAT: Sonuc değişkeni derken, sonuc# olarak var olduğunu biliyoruz. Yani sembolünü tutuyoruz aklımızda. ozelpara=sonuc+1000 haaa... şimdi buraya dikkat !! programda mantık hatası var burda. Programımız düzgün çalışır, yazım hatası yok, ama mantık hatası var. Ufak bir dikkatsizlik örneğidir bu satır.... diyoruz ki, ozelpara değişkenine sonuc değeri+1000 sonucunu aktar. İyi güzel de, 'sonuc' diye bir değişken türümüz yok. Evet, sonuc diye bir değişkenimiz vardı, ama o değişkenimizin türü # yani çift duyarlı idi. Buradaki satırdaki sonuc değişkeni o tanımladığımız sonuc# değerini tutmaz !.. Püf: TANIMLANMAMIŞ YA DA DEGERI BILINMEYEN YENI BIR DEGIŞKEN KULLANILDIGI ZAMAN ONUN DEGERI OTOMATIK OLARAK 0 (SIFIR) DIR. Bu satırda bahsi geçen 'sonuc' değişkeninin değeri tanımlı olmadığı için 0 (sıfır) dır.... Ama sonuc# diye bir değişkenimiz var. Onun değeri 5750. Püf: KULLANMAK İSTEDİĞİMİZ DEĞİŞKENİ SEMBOLÜ İLE BİRLİKTE HATIRLATMAMIZ GEREKİR. AKSİ HALDE TANIMLANMAMIŞ VARSAYILIR VE SIFIR DEĞERİNİ ALIR. Şimdi ozelpara degeri kaç olur ? Ozelpara = 0 + 1000 = 1000 değerini tutar. (halbuki ozelpara=sonuc#+1000 yazılsaydı, ozelpara=5750+1000=6750 değerini tutardı) print "İkramiye tutarı =";ikramiye# ekrana (imlecin bulunduğu yere, imlec nerdeyse artık...) "ikramiye tutarı =" cümlesini yaz, ve hemen yanına (bu işi ; (noktalı virgül) yapar) ikramiye değişkeninin değerini yaz. Yani ekrana; İkramiye tutarı =750 yazar. Ve imleci bir alt satıra atar. (her print satırından sonra imleç otomatik olarak 1 alt satıra iner, ekranda satır biterse sayfa otomatik yukarı kayar) print "sonuc tutarı =";sonuc# sonuc#, sembolü hatırlatarak kullandığımıza dikkat et. Yani sonuc değişkeninin değerini yazdırmak için sonuc# yazıyoruz. Değişken adı sonuc, ama yazarken sonuc# diye yazacaz. print "ozelpara tutarı =";ozelpara ..... sonuç olarak ekrandaki görüntü, ikramiye tutarı=750 Sonuc tutarı=5750 Ozelpara tutarı=1000 Şeklinde olmasi beklenmektedir son tahminlere göre.... Şimdi shift+F5 'e bas ve programi çaliştir. Vatana millete hayırlı ve uğurlu olsun UNUTMA, AKILDAN ANALİZ SENİ 1 NUMARA YAPAR ve HIZ KAZANDIRIR !!! Değişken isimlerinde nelere dikkat edilmelidir ? Karaktersel ya da sayısal bir değişkenin adı " Sayı " Sembol Simgeleriyle başlayamaz. Yani, #ciftduyarlisayim=...., 123sayisi=..., 15Emin$="....", gibi kullanımlar yanlıştır ve qbx bunu kabul etmez. Karaktersel bir değişken ismi mutlaka bir harf ile başlamalıdır. Bu şekilde isimlendirilen her türlü karaktersel değişken adı geçerlidir. Emin1$="benim ilk adım" Emin2$="benim ikinci adım" Emin3$="benim üçüncü adım" Emin$="benim adım emin" Eminelalmis$="BEDİİ YİLMAZ" Yukarıdaki 5 karaktersel değişken ismi doğru kullanılmış olup hepsi de birbirinden farklı yazıları tutar. Sayısal değişken isimleri de mutlaka bir harf ile başlamalıdır. A=10 B=20 Pisayisi=3.1415 Oncekitoplam1=1500 H123=1250 Yukarıdaki 5 sayısal değişken ismi doğru kullanılmış olup hepsi de birbirinden farklı sayıları tutar. Buraya kadar öğrendiğin ana mantık, değişkenlerin matematiksel olarak kullanımları ve atamaların nasıl olduğu konusu idi. Şimdi komutlara geçelim: CLS (ekranı sil) Kullanımı: CLS Tek başina kullanilan bir komuttur. Ekrani silmeye yarar. Örnek: CLS Ekranı siler, zemin rengini ayarlar (color ile hangi zemin rengi verilmiş ise o zemin rengi ile ekranı boyar). İmleci 1. Satır 1. Colona otomatik getirir. Ve yazılan yazılar buradan itibaren yazılmaya başlar. COLOR (yazı rengi) Kullanımı: COLOR [renk],[fon] Püf: [] arasındaki parametreler kullanıcının isteğine kalmış demektir. Kullanılsa da olur, kullanılmasa da olur demektir. Eğer kullanılmayan bir parametre olursa yani kullanıcı ilgili bir parametreyi komutun yanına yazmazsa qbx onu varsayılan neyse onu alır. 2 parametresi vardır. 1. Parametre yazı rengini ayarlar, 2. Parametre zemin (fon) rengini ayarlar. Yazıların rengini belirler. Bu komut kullanıldıktan sonra yazdırılacak olan tüm yazılar burada belirtilen renk ve zemin değerlerini kullanır. Örnek: COLOR 15,4 Renk parametresi 1-31 arası değerler alabilir. Ve her bir sayı bir rengi temsil eder. 0. siyah 1. Soluk mavi 2. Soluk yeşil 3. Soluk mavi 4. Soluk kırmızı 5. Soluk pempe 6. kahve 7. soluk beyaz 8. gri 9. parlak mavi 10. parlak yeşil 11. parlak mavi 12. parlak kırmızı 13. parlak pempe 14. sarı 15. parlak beyaz bu değerlerden herhangi birisine 16 daha ilave edilirse ve kullanılırsa o renk yanıp sönen renk olur. Örneğin sarı rengini yanıp sönerek kullanmak istersek 14+16=30 Color 30 dememiz gerekir. Fon (Zemin) rengi ise 0-7 arası değerler alır. 0. Siyah 1. Soluk mavi 2. Soluk yeşil 3. Soluk mavi 4. Soluk kırmızı 5. Soluk pempe 6. kahve 7. soluk beyaz Örnekler: Color 15 (yazı rengi beyaz olsun, fon rengi neyse o kalsın) Color 15,4 (yazı rengi beyaz, fon rengi kırmızı olsun) Color ,2 (yazı rengi neyse o kalsın, zemin rengi yeşil olsun) Color 31 (yazı rengini yanıp sönen parlak beyaz yap) Color ,1 (yazı rengi neyse o kalsın, zemin rengini mavi yap) Color 0,7 (yazı rengi siyah, zemin rengi beyaz olsun) Aşagidaki programi yaz ve incele: COLOR 15,4 : CLS PRINT "MERHABA" PRINT "NASILSINIZ ?" PRINT PRINT "BEN DE İYİYİM TEŞEKKÜR EDERİM" COLOR 11 PRINT "ŞU ANDA NE RENK OLDU YAZI ?" COLOR 14 PRINT "PEKİ ŞİMDİ ?" COLOR 15,2 PRINT "BU YAZININ ZEMİN RENGİNİ DEĞİŞTİRDİM" PRINT "AMA TÜM EKRANIN ZEMİN RENGİNİ DEĞİŞTİREREM ŞİMDİ" PRINT "BUNUN İÇİN CLS KOMUTU KULLANILMALIDIR" COLOR 30,5 PRINT "O YÜZDEN DEVAM ETMEK İÇİN BİR TUŞA BAŞIN" T$=INPUT$(1) COLOR 11,1 : CLS PRINT "ŞIMDI ZEMIN VE YAZI RENGI NE OLDU ?" LOCATE (imleci konumlandır) Kullanımı: LOCATE [satır],[sutun] İmleci ekranı satır,sutun'a konumlandırır. Ve yazdırılacak olan yazı buradan itibaren yazdırılır. Satır değeri 1-23 arası, sutun değeri 1-80 arasında olmalıdır. LOCATE 12,35 (12. Satır, 35. Sutuna konumlan) LOCATE 15 (15. Satır, 1. Sutuna konumlan) LOCATE 20 (20. Satır, 1. Sutuna konumlan) Aşagidaki programi uygula ve denemeler yap: COLOR 15,0 : CLS LOCATE 12,25 PRINT "BEN PROGRAMCILIK ÖĞRENİYORUM" PRINT (ekrana yaz) Kullanımı: PRINT [ifadeler] Print komutu çok parametre alır, her türlü karmaşık ifadeyi ekrana yazdırabiliriz. İfadeler kısmına neler gelebilir ? -sabit yazılar -değişkenler -karaktersel fonksiyonlar -matematiksel işlemler ifadeler kısmına hiçbir şey girilmezse PRINT deyimi boş bir satır atarak alt satıra geçer. Püf: Programa açıklama satırı vermek için ' (tek tırnak) işareti kullanılır. Satırın başına konur ve qbx bu satırı yokmuş farzeder. Yani biz bu satırı kendimize açıklama olarak kullanırız. 'Bu programda print komutu uygulamaları vardır. 'Programı Emin Yilmaz yazmıştır. COLOR 15,0:CLS sayi1=100:sayi2=200:sayi3=400 isim$="BEDİİ YİLMAZ" PRINT "Merhaba" PRINT PRINT "BENİM ADIM=";isim$ PRINT "ADIM KAÇ KARAKTERDEN OLUŞUYOR ?" PRINT "ADIM ="+STR$(LEN(isim$))+" KARAKTERDEN OLUŞUYOR" PRINT "1. Sayı değeri =";sayi1 PRINT "2. Sayı değeri =";sayi2 PRINT "3. Sayı değeri =";sayi3 PRINT "BU SAYILARIN TOPLAMI:" PRINT "TOPLAM ="; (sayi1+sayi2+sayi3) PRINT "3. SAYININ KAREKÖKÜ ="; SQR(sayi3) PRINT "1. SAYININ KARESİ ="; sayi1*sayi1 PRINT "YANYANA VİRGÜLLÜ KULLANIMI" PRINT sayi1, sayi2, sayi3 PRINT "YANYANA NOKTALI VİRGÜL KULLANIMI" PRINT sayi1; sayi2; sayi3 PRINT "TAB KULLANIMI" PRINT TAB(10); sayi1;TAB(20); sayi2;TAB(30); sayi3 PRINT TAB(20);"20.yer";TAB(40);"40.yer";TAB(60);"60.yer" INPUT ( Kullanıcıdan veri girmesini iste) Kullanımı: INPUT [Açıklama satırı];[değişken_ismi] Kullanıcının veri girip (sayısal ya da karaktersel olabilir. Farketmez.) ENTER tuşuna basarak girilen veriyi belirtilen değişkene aktarır. Açıklama satırına yazılan yazı ekranda aynen görülür. Değişken_ismi yazan yere mutlaka bir değişken adı belirtilmelidir. Açıklama satırı verilmese de olur. Genelde verilir. Açıklama satırı " (tırnak) işaretleri arasında yazılır. Input komutu kullanıldığında ekranda '?' simgesi otomatik olarak görülür. Püf: Açıklama satırı imlec neredeyse orada görünür. Örnekler: CLS INPUT "Adınızı Girin ";ad$ PRINT "Girmiş olduğunuz isim "+ad$+" dir." Püf: ? nin olmasını istemiyorsak ';' yerine ',' (virgül) kullanırız. CLS INPUT "Adınızı Girin ",ad$ PRINT "Girmiş olduğunuz isim "+ad$+" dir." Örnek Program: Girilen 5 tane sayının toplamını bulan ve bunların ortalamasını yazan, %10 unu hesaplayan bir program yazalım. CLS PRINT "Bu program girilen 5 adet sayıyı toplar." PRINT "bu sayıların toplamını söyler." PRINT "bu sayıların ortalamasını da söyler." PRINT "ayrıca %10 unu da hesaplar." PRINT '... bu satır boş bir satır bırakır. Tek tırnak satırını qb programı görmez. Toplam=0 '... toplam değişkeni ilk başta sıfırdır. INPUT "1. Sayıyı girin ", sayi1 INPUT "2. Sayıyı girin ",sayi2 INPUT "3. Sayıyı girin ",sayi3 INPUT "4. Sayıyı girin ",sayi4 INPUT "5. Sayıyı girin ",sayi5 Toplam=sayi1+sayi2+sayi3+sayi4+sayi5 CLS '... ekranı sil PRINT "Girdiğiniz sayıların toplamı ="; toplam Ortalamasi=toplam/5 Yuzdeonu=toplam*0.1 PRINT "Girdiğiniz sayıların ortalaması ="; ortalamasi PRINT "Girdiğiniz sayıların %10 u ="; yuzdeonu PRINT "program sona erdi..." Püf: Locate komutunu kullanarak input komutundaki açıklama ve veri isteme sahasını ekranda istediğimiz yere alabiliriz. Örnek: (1. Kademede yazılmış bir program kodu aşağıda. Kademe sayısı arttıkça kalite ve deneyim artar. 1.Kademe en yeni, en ilkel yöntem demektir.) LOCATE 10,20 '... 10.satır 20.sütuna imleci konumla INPUT "Bir sayi girin ", sayi Püf: Yukarıdaki örneklerde görüldüğü gibi hep sayi girişi istedik. Peki biz kullanıcıdan sayi girmesini beklerken adam gıcıklık olsun diye abuk subuk (akslsdkgaşkw) gibi bir şey girerse ne olur ? Şimdi sayı istenilen yerde abuk subuk bir şey girip Enter tuşuna bas. Şöyle bir yazı görürsün Redo from start - yeniden giriş yap. Uygun giriş değil. Bu mesajı qb otomatik verir. Halbuki biz ne kadar programa hakimiyet kurarsak o kadar kaliteli program yazmış oluruz. KURAL: Bir programda ne kadar az hata payı varsa o kadar kaliteli yazılmış demektir. Kıyaslama yapmak için başkalarının yazdığı programlarda hep hata arayacaksın. Programcı her türlü kombinasyonu düşünüp PROGRAMLAMIŞ mı ? Şimdi bu hatalı olayımızı şöyle düzeltebiliriz. (bir kademe daha kalite artırarak 2. Kademeye geçelim) CLS LOCATE 10,20 INPUT "Bir sayı girin ",sayi$ Değişken tanımlarını hatırlıyorsun değil mi ? Karaktersel değişkenlerin sonuna $ işareti geliyordu. Yani bunların içine yazılan herşey bir kelime,cümle,karakter olarak algılanıyordu. Sayısal değişkenler ise %, (hiç) ve # işaretleri alıyordu ve sadece sayıları hafızasında tutuyordu. Şimdi yukardaki örnekte biz kullanıcıdan sayı istiyormuş gibi yapıyoruz. Kullanıcı ne girerse girsin bilgisayarın gözünde bu bir 'cümle' dir. Ya da 'kelime' dir. Bunlara karakter = string diyoruz. (daha çok string deyimini kullanacaz, literatürde böyle geçer. Tüm dillerde böyledir. ) Kullanıcının gireceği 123 sayısı aslında kullanıcıya sayı gibi görünür veri girerken, halbuki bilgisayar girilen 123 ifadesini "123" şeklinde (tırnak içinde yazdım dikkat. String ifade demektir.) string olarak hafızada tutacaktır. Yani bir kelime olarak (123 kelimesi) saklanacaktır. Kullanıcı ise sayı girdiğini zannedecektir. Şimdi bu girilen sayıya 2000 TL kdv farkı eklemek isteyelim. Ve INPUT komutunun altına şu satırı ekleyelim. PRINT "Toplam Sonuç (2000 TL kdv eklenmiş hali) "; val(sayi$)+2000 Şeklinde olacaktır. Ne yaptık ? Val(sayi$) ifadesi şunu yapar; sayi$ stringini (yazısal içeriğini) sayısalmış gibi düşün, girilen stringi o anlik için sayısal olarak düşün. İşte bu kadar. Şimdi orada düşünülen sayı ve 2000 aritmetiği var. Yani a+b 'yi toplatıp ekrana yazdırdık. Şimdi kullanıcı isterse gerçekten sayı girsin, istersen absdfasd gibi saçma girsin, bilgisayar bunları val() komutu ile sayısal şeklinde düşünür. Ve girilen abuk subuk yazıların sayısal değeri otomatik olarak sıfırdır. Bu da demek oluyor ki her türlü işimizi görebiliriz!. Yukarıdaki programın son hali şu şekildedir. CLS LOCATE 10,20 INPUT "Bir sayı girin ",sayi$ PRINT "Toplam Sonuç (2000 TL kdv eklenmiş hali) "; val(sayi$)+2000 Püf: Kullanıcı hiçbir şey girmeden boş olarak ENTER'e basarsa o değişkenin içeriği 0 kabul edilir otomatik olarak. Tüm bu varyasyonları birer birer uygulayarak ve veri girerek denemelisin. Şimdi özel bir durum var, Sayı istenirken abuk subukları anladık da, peki , (virgül) girişi yapılırsa nasıl olacak ? yani diyelim ki abc,sdfs gibi bir veri girip ENTER tuşuna basalım. Ekrana şöyle bir otomatik mesaj gelecektir. Redo from start - olmadı gardeş, adam gibi veri gir Haydaaa... yaw ekranın içine ediyor bu mesaj. Ekranımı bozuyo. Nasıl yapacaz ? ,(virgül) ifadesi özel bir karakterdir. Ve bu tip programlemlere neden olur. Çünkü bu virgülün çok anısı ve mazisi vardır. Şimdi bir kademe daha artırarak tüm bu sorunların üstesinden gelelim ve adam gibi 3. Kalitede program yazalım. Böylece hiçbir sorunumuz kalmasın veri girişi yapılırken. (yani geçici sorunlar demek istedim. Elbetteki daha bir çok kademe var. Benim yazdığım modülleri hatırla...) CLS LOCATE 10,20 LINE INPUT "Bir sayı girin ",sayi$ PRINT "Toplam Sonuç (2000 TL kdv eklenmiş hali) "; val(sayi$)+2000 Ne değişti ? INPUT komutunun yanına LINE kelimesi eklendi. Bu satır şunu yapar. Kullanıcı ne girerse girsin (özellikle virgül de giriyorsa) hepsini al. Hata mata verme. Adam gibi kabul et. Püf: LINE eki eklendiğinde INPUT ifadesinde kullanılan değişken adı mutlaka string olmalıdır. Yani $ işareti ile bitmelidir. Aksi halde LINE komutu çalışmaz ve hata verir. İşte yukardaki program parçacığı (3. Kademede) hemen hemen her türlü sayısal işlemi yapan bir modüldür. O kadar edebiyat yaptık ne öğrendik ? LINE INPUT "...........", degisken_adi$ Satiri her türlü girişi alır ve bunu da val(degisken_adi$) komutu ile sayısalmış gibi düşündürerek rahatça işlem yaparız. Birçok acemi qbx (quickbasic) programcısı bunları pek bilmez. Ve onların yazdığı programlarda test edeceğin 3 basit sorgu sual var. Adamın programına baktığın zaman şunları dene, input ile soru soran bir yer bul, 1. adam '?' simgesini kaldırmış mı ? 2. adam sayı istiyorken sen abuk subuk bir şeyler gir. Redo from startı engellemiş mi ? (ben bir çok acemi programcının o güzelim ekranını bu şekilde bozmuştum. Bu marifet mi peki ? EVET MARİFET !) 3. adam ilk 2 maddeyi yapmışsa, bir de virgül girişi yap. Bakalım LINE INPUT kullanmış mı ? (adamın bilgi seviyesini gösteren kriterlere dikkat ediyorsun değil mi ? programın görüntüsü adamın seviyesini belirler. Diğer programcıların yaptığı gibi hata arayan birisinin hata bulamaması seni takdire boğar.) Püf: Eğer line input komutunda açıklama getirilmesini istemiyorsan şöyle bir ifade kullanabilirsin. LINE INPUT "",degisken_adi$ ""' (açıklama yazma) ÖDEV: Nüfus cüzdanı verilerini alıp bunları ekrana alt alta yazdıran güzel bir program yaz. Kullanacağın komutlar: LOCATE, PRINT, COLOR, LINE INPUT, CLS İşte 5 komutla bu işi yapabilirsin. Ben sana bir örnek vereyim: COLOR , 0 '... yazı rengini boşver zemini siyah al. CLS '... ekranı sil '... aşağıdaki satırlarla ilk önce nüfus cüzdanı ekranı görüntüsü oluşturuyorsun. COLOR 15,0 LOCATE 1,5: PRINT "Nüfus Cüzdan NO :" LOCATE 2,10: PRINT "Seri NO :" .... COLOR 14,0 LOCATE 1,25:LINE INPUT "",ncuzdanno$ LOCATE 2,25:LINE INPUT "",serino$ ... CLS PRINT "Girilen nüfus cüzdanının seri numarası"; serino$ PRINT "Girilen nüfus cüzdanının nosu "; ncuzdanno$ Gibi... Püf: Şimdilik bu INPUT komutunda daha fazla ileriye gidemeyiz. Çünkü son noktasına geldik. INPUT komutunun dez avantajları şunlardır: - Tab, ok tuşları vs gibi tuşlara basılıp basılmadığını kontrol edemezsin. - Kullanıcı ENTER tuşuna basmadığı sürece INPUT komutundan program çıkmaz. ENTER tuşuna basılmasını bekler. - Ekrandaki hücrelerde istediğin gibi dolaşamazsın. Sadece şu şekilde olur. Sırayla ENTER tuşuyla ekranda 1 kereliğine mahsus tek tek ilgili locate ifadelerini kullanarak veri girişi yaptırabilirsin. Yani kullanıcı seri olarak ard arda verileri giriyor. Veriyi yazıyor ENTER. Veriyi yazıyor ENTER. Ama hatalı bir veriye geri dönemiyor. Artık buna da programcının bir çözüm bulması gerekir. 9 Bu da kademeyi artırmasıyla olur. İlerde... Eh biraz moral bozulacak tabii. Bu işler o kadar da kolay gözükmüyormuş dimi ? Püf: Eğer gerçekten küsüratlı sayı girilmesi gerekiyorsa virgül ayıracını nokta ile yapmak gerekir. Yani kullanıcı 123.89 (nokta) şeklinde veriyi girmelidir. Bu kural tüm diller için geçerlidir. 123,89 yanlış bir giriştir. 123 olarak görür bilgisayar. INPUT$ (n adet kere tuşa basılmasını bekle) Kullanım: degisken_adi$=INPUT$(n) n adet kere klavyeden tuşa basılmasını bekler. Ve basılan tuşları yanyana birleştirerek bir string oluşturur. bu stringi de kullanmak üzere biz bir string (karaktersel) değişkene aktarırız. Bu değişkeni kullanıp kullanmayacağımız ise bize kalmış bi şey... püf: Basılan karakterler tabii ki ekranda görünmez. Değişkende tutulmuştu ya, bu değişkeni kullanarak ekrana yazdırabiliriz. Örnek: CLS PRINT "Şimdi sizden 5 harfe basmanızı istiyorum." tuslar$=INPUT$(5) PRINT "Yazmış olduğunuz kelime "; tuslar$; " idi." Bu komutu şifre girişlerinde kullanabiliriz. CLS PRINT "ŞİFREYİ GİRİN :" Sifre$=INPUT$(10) IF sifre$="HACKEREMIN" THEN PRINT "ŞİFRE DOĞRU" ELSE PRINT "ŞİFRE YANLIŞ" Bizim şifremiz HACKEREMIN 10 karakterli olduğu için 10 kere tuşa basılmasını istiyoruz. Büyük küçük harfi kullanıcı kendisi belirlemeli. Şifremizin doğru olması için büyük harfle ve tam 10 karakterli olması gerekir. Püf: ENTER tuşu gibi garip tuşlar bu komutta komikliklere neden olur. 10 kere tuşa bastıktan sonra otomatikman sonraki satıra geçer zaten. : Yani kullanıcı bizim belirttiğimiz sayı kadar tuşa basması gerekir. ENTER tuşu da bir tuş sayılır ama saçmalar biraz... : Örnek: Kullanıcının tek bir tuşa basmasını beklersek, ..... .... bekle$=INPUT$(1) .... .... yukardaki satırda kullanıcının neye bastığı bizi hiç ilgilendirmez. Bir tuşa basmış işte. İstediğimiz oldu yani. : [ Hangi tuşa bastığını da istersek biliriz ] mesela şöyle bir fikir de olabilir, hani o moralimizi bozan INPUT komutuna karşılık kendi inputumuzu az da olsa şöyle yazabiliriz. Işte sana şimdi aklıma gelen basit bir yazı yazma programı: CLS PRINT "Yazı yazma programı" PRINT "ESC TUŞU PROGRAMDAN ÇIKAR." PRINT "ENTER TUŞUNU DA GÖREBİLİRSİNİZ. BASIN VE DENEYİN." PRINT "SONSUZ DÖNGÜ İÇİNDE PROGRAM SİZDEN SÜREKLİ" PRINT "BİR TUŞA BASMANIZI BEKLER" PRINT "VE BU HARFLERİ YANYANA YAZAR." PRINT DO TUS$=INPUT$(1) IF TUS$=CHR$(27) THEN EXIT DO PRINT TUS$; LOOP PRINT "ESC TUŞUNA BASTINIZ VE DO-LOOP DONGUSUNDEN ÇIKTINIZ" PRINT "PROGRAM LOOP SATIRININ ALTINDAN DEVAM ETTI." Programı yaz ve dene. Basit bir editör oldu işte. Bunları daha ince düşünürsek kendi modüllerimizi yazabiliriz demektir bu. Kendi şehrini kuracaksın. Yukarda neden 'tus$;' ifadesinde ';' noktalı virgülü kullandım ? kullanmasan ne olur ? kullanırsan ne olur ? bunu silerek ve ekleyerek dene ve gör. Ayrıca silme,tab,F1-F10, gibi agresif (çift karakterli tuşlar) bu komutta çalışmazlar. Yani yazılan bir yazıyı silmek istediğimizde 'ha tamam yazı yazıyor güzel. Ya şu harfi yanlış yazmışım. Üzerine gideyim de bir düzelteyim' derseniz daha çook işiniz var demektir. Çünkü ok tuşlarına, silme tuşlarına vs tuşlarına basılıp basılmadığını kontrol edip, hafızadaki o stringsel ifadeyi gözden geçirip ona göre işlem yapmalısınız. Bunlar ne kadar da zormuş demeyin. Programcılığa yeni başlıyorsunuz. Bu dediklerimi 1 kereliğine zorlanarak yaparsınız. Sonra da sürekli kullandığınız zaman rahatlığını anlarsınız. İşte bunlara Alt Program veya Modül diyoruz. Alt Program arşivi çok olan programcı hızlı ve güvenilir programlar yazar. UNUTMAYIN: PROGRAMCILIK VAHŞİ ATA BENZER. EVCİLLEŞTİRİRSENİZ SİZİ HER YERE GÖTÜRÜR. SLEEP (Bir tuşa basılana kadar bekle-uyu) KULLANIMI: SLEEP (saniye) Saniye kadar işlemi durdurur, bekler. SLEEP Bu komut herhangi bir tuşa basılana kadar bekler. SLEEP 1 1 sn bekler, sonra bir sonraki komuttan çalışmaya devam eder. Örnek: CLS PRINT "BİR TUŞA BASAR MISINIZ ?" SLEEP PRINT "HERHANGİ BİR TUŞA BASTINIZ" PRINT "LÜTFEN BEKLEYİN... BİRAZ DÜŞÜNÜYORUM..." SLEEP 5 PRINT "TAMAM DÜŞÜNDÜM." PRINT "PROGRAM BİTTİ" Püf: SLEEP komutunda hangi tuşa basıldığını öğrenemeyiz. Sadece bir tuşa bastırmak için veya biraz bekletmek için kullanırız. BEEP (bip sesi çıkar) KULLANIM: BEEP Bip sesi çıkartır. Sabit bir ses tonudur. Kullanıcıyı uyarı amaçlı kullanılır. Örnek: CLS PRINT "DEVAM ETMEK İÇİN HERHANGİ BİR TUŞA BASIN..." SLEEP BEEP PRINT "SESİ DUYDUN MU ?" SOUND (tanımlanan düzeyde ses çıkar) KULLANIM: SOUND [frekans,süre] Frekans değeri 32-32767 arası bir değer olabilir. Bu sayı arttıkça ses tizleşir. Süre yazan yere saniye cinsinden değer girilir. Örnek: CLS SOUND 100,.1 SOUND 2000,.5 SOUND 10000,1 PRINT "KONSER BİTTİ." IF-THEN-ELSE (Eğer ... ise .... yap ... değilse .... yap ) KULLANIM: Bu komut şartları kontrol etmek için kullanılır. İki türlü kullanımı vardır. 1. Normal tek satırlı şartları kontrol etmek için. 2. Blok şeklinde şartları kontrol etmek için. 1. Normal tek satırlı şartları kontrol etmek için kullanımı: IF şart THEN işlem1 ELSE işlem2 Anlamı şudur: Eğer şart ifadesi sağlanırsa işlem1 de yazılı komutu çalıştır, aksi halde işlem2 deki yazılı komutu çalıştır. Püf: Else deyimi kullanılmayadabilir. Örnek-1: CLS PRINT "IF KOMUTUNU ÖĞRENİYORUM." LINE INPUT "BİR SAYI GİRİN",sayi$ girilensayi=val(sayi$) '... val komutu ile karakteri sayıya çevirdik. IF girilensayi>100 THEN PRINT "GİRDİĞİNİZ SAYI 100 DEN BÜYÜK" IF girilensayi<100 THEN PRINT "GİRDİĞİNİZ SAYI 100 DEN KÜÇÜK" IF girilensayi=100 THEN PRINT "GİRDİĞİNİZ SAYI 100." Örnek-2: CLS PRINT "IF KOMUTUNUN BİR ÇOK KULLANIM YERİ VARDIR." LINE INPUT "ŞİFREYİ GİRİN ", sifre$ IF sifre$="EMIN" THEN PRINT "ŞİFRE DOĞRU" ELSE PRINT "ŞİFRE YANLIŞ" Örnek-3: Kullanıcıdan bir sayı isteyelim. Eğer girdiği sayı 10000 den büyük ise bu sayının %25 ini ekrana yazsın, aksi halde %50 'sini ekrana yazsın. CLS PRINT "BAŞKA BİR IF KULLANIM ÖRNEĞİ" LINE INPUT "TUTARI GİRİNİZ ",tutar$ girilentutar=val(tutar$) IF girilentutar>=10000 THEN sonuc=girilentutar*0.25 ELSE sonuc=girilentutar*0.5 PRINT "SONUÇ =";sonuc Şart ifadeleri neler olabilir ? > büyük ise <> farklı ise < küçük ise <= küçük veya eşit ise >= büyük veya eşit ise = eşit ise örnek: IF a<>10 THEN .... ( a sayısı 10 'dan farklı ise) Tek satırlı IF-THEN komutları tek satırlık kontrol işlemleri için uygundur. Ancak bazı durumlarda yetersizdir. Bu yüzden genellikle blok yapıdaki IF-THEN komutları kullanılır. 2. Blok yapıdaki IF-THEN komutu: Mantık olarak 1. Maddedeki ile aynıdır. Bloklu IF yapısının avantajı, işlem1 veya işlem2 yazan yere istediğimiz kadar extra komut yazabiliriz. Böylece istediğimiz işlemleri şarta bağlı olarak yaptırabiliriz. Kalıbı şöyledir: IF şart THEN İşlem1a İşlem2a İşlem3a .... ELSE İşlem1b İşlem2b İşlem3b .... END IF Not: IF bloklu yapısı mutlaka END IF deyimi ile biter. Aksi halde hata mesajı alırsın. Buradaki mantık şudur. Eğer şart ifadesi sağlanmış ise, o zaman işlem1a,işlem2a,işlem3a,... komutlarının hepsini sırayla çalıştır. ( yani 'a' bloğunu çalıştır.). Aksi halde işlem1b,işlem2b,işlem3b,... komutlarının hepsini sırayla çalıştır. ( Yani 'b' bloğunu çalıştır. ) Örnek: CLS LINE INPUT "HERHANGİ BİR SAYI GİRİNİZ",sayi$ sayi=val(sayi$) IF sayi<>12345 THEN PRINT "Girmiş olduğunuz sayı 12345 değil...." PRINT "Bu yüzden girdiğiniz sayının %10 unu hesaplarım." hesaplanan=sayi*0.1 PRINT "Hesaplanan sonuç =";hesaplanan ELSE PRINT "Girmiş olduğunuz sayı 12345 dir." PRINT "Bu yüzden girdiğiniz sayının %20 sini hesaplarım." hesaplanan=sayi*0.2 PRINT "Hesaplanan sonuç =";hesaplanan END IF PRINT "PROGRAM SONA ERDI..." Püf: END IF ifadesini IF komutunun altına yazdığıma dikkat et. Görüntü açısından bloklu ifadeler biraz daha sağa içeri yazılır. Blok sonlarını belirten ifadeler, bloğu açan komutun altına yazılır. Buradaki örnekte IF komutunun (bloğu başlatan) altına hizasına END IF (bloğu kapatan) komutun yazılması gibi. a ve b blokları ise sağa dayalı olarak yazılmıştır. Bu şekilde kodlama daha etkin ve düzeltme gerektiğinde daha etkin sonuçlar oluşturur. Aynı programı aşağıdaki gibi de yazabilirdik. Ancak kodlama kurallarına aykırı olurdu. Program çalışır fakat ilerde bir gün program düzeltilmek istendiğinde karışıklıklara neden açabilir. İncele, CLS LINE INPUT "HERHANGİ BİR SAYI GİRİNİZ",sayi$ sayi=val(sayi$) IF sayi<>12345 THEN PRINT "Girmiş olduğunuz sayı 12345 değil...." PRINT "Bu yüzden girdiğiniz sayının %10 unu hesaplarım." hesaplanan=sayi*0.1 PRINT "Hesaplanan sonuç =";hesaplanan ELSE PRINT "Girmiş olduğunuz sayı 12345 dir." PRINT "Bu yüzden girdiğiniz sayının %20 sini hesaplarım." hesaplanan=sayi*0.2 PRINT "Hesaplanan sonuç =";hesaplanan END IF PRINT "PROGRAM SONA ERDI..." Aynı program. Hiçbir farkı yok. Ancak blok nerede açılıyor nerede kapanıyor dikkatli bakılırsa belli olur, ki; bu çok basit bir kod. İç içe yazılabilen IF-THEN-END IF blokları da var. Hepsi aynı hizada yazılırsa hata bulması zorlaşır ve kafa da bulanır 9 Püf: Program yazarken komutların hangi hizada nereye yazıldıkları hiç önemli değildir. Program kodunun hizalama görüntüsü programcıya kalmıştır. : Püf: Hizalama yapmak istediğinde TAB tuşunu kullanabilirsin. Bildiğin gibi qbx editörü bu konuda oldukça iyidir. Ve imleci alt alta hizaladığında bunun farkına varırsın. Bunun için gerçekten TAB tuşu oldukça etkin bir hizalama görevi yapar. Bunu program yazarken denemelisin : (Acemiler gibi BOŞLUK tuşunu kullanarak hizalama yapılmaz tabii ki 9) İç içe IF-END IF blokları da açılabilir. Ancak her IF komutu bloğunun END IF ile kapatılacağını unutmamalısın. Zaten unutursan qbx sana hata mesajıyla bunu bildirecektir : Püf: IF-END IF bloklu yapısında illa ELSE bloğunu kullanmayabilirsin. İhtiyacın olduğu sürece ELSE kullanılır. Örnek: IF a>=100 THEN COLOR 15 PRINT "........" PRINT "..........." Hesapla=a*123 END IF gibi... iç içe IF-END IF blok yapısına bir örnek: IF şart1 THEN IF şart2 THEN komut1a komut2a komut3a ... ELSE komut1b komut2b komut3b ... END IF '... şart2 nin END IF'i IF şart3 THEN komut1c komut2c komut3c ... ELSE komut1d komut2d komut3d ... END IF '... şart3 ün END IF'i ELSE Komut1e Komut2e END IF '... ANA BLOĞUN END IF'i. Şart1'in yani. Yukarıdaki örnek tam teşekküllü bir IF-END IF bloklu yapısına ait bir örnek kalıptır. Açılan IF deyimi bloklarının END IF ile kapatıldığına dikkat et. Yukarıdaki kalıp ne diyor ? Eğer şart1 şartı sağlanırsa aşağıdaki bloğu çalıştır. Aşağıdaki blok derken ELSE ifadesine kadar olan a,b,c,d bloklarının hepsi. Şimdi baştan alalım; eğer şart1 şartı sağlanırsa: - eğer şart2 şartı sağlanırsa a bloğundaki komutları çalıştır. - eğer şart2 şartı sağlanmamışsa b bloğundaki komutları çalıştır. İki bloktan birisi mutlaka çalışacak ama. A ya da B bloğu. Hangisi şartı sağlarsa artık. Sonra şart3 şartına bak; - eğer şart3 şartı sağlanırsa c bloğundaki komutları çalıştır. - eğer şart3 şartı sağlanmamışsa d bloğundaki komutları çalıştır. İki bloktan birisi mutlaka çalışacak ama. C ya da D bloğu. Hangisi şartı sağlarsa artık. eğer şart1 şartı sağlanırsa yukarıdaki olasılıkların hepsine bakacaktı. Şart1 şartı sağlanmazsa o zaman program a-b-c-d bloklarını otomatikman atlayacak ve direkt şart1'in ELSE bloğuna yani e bloğuna giderek e bloğundaki komutları çalıştıracak. İşte böyle bol ihtimali olan IF-ENDIF blokları da fazlasıyla ileri programlarda bulunmaktadır. Bu olayı daha da abarmak mümkündür. : Abartılı bir örnek: IF şart1 THEN '... şart1 olmuşsa aşağıdaki ihtimallere bak. Olmamışsa ELSE'ye git. | IF şart2 THEN | | .... şart2 olursa burayı çalıştır.işin bittikten sonra şart3'e bak. | END IF | IF şart3 THEN | | .... şart3 olursa burayı çalıştır | | ELSE | | ..... şart3 olmamışsa burayı çalıştır | END IF | bu kısımda şart1 taraması bitmiş durumdadır. ....devam yazan yere atla. ELSE '... şart1 olmamışsa aşağıdaki bloktaki tüm satırlara bakılır. | IF şart4 THEN | | .... şart4 olmuşsa burayı çalıştır | | ELSE | | .... şart4 olmamışsa burayı çalıştır | END IF | IF şart5 THEN | | .... şart5 olmuşsa burayı çalıştır. | | ELSE | | ..... şart5 olmamışsa burayı çalıştır. | END IF | bu kısımda şart1'in ELSE kısmı bitmiş durumdadır. ...devam'a git. END IF ..... devam Yukarıdaki kalıptaki gibi bir programı mutlaka yazacaksındır. Yazım tekniğime dikkat ettin mi ? 1. iç içe intizamlı yazım tipi. Hangi blok nerede iş yapıyor, görülüyor. 2. Hangi ENDIF deyimi hangi IF 'i kapatıyor görülüyor. Şimdi yukarıdaki kalıbı acemice HIZALAMA YAPILMADAN kodlandığını varsayalım. ACEMİCE bir örnek: IF şart1 THEN IF şart2 THEN .... END IF IF şart3 THEN .... ELSE ..... END IF ELSE IF şart4 THEN .... ELSE .... END IF IF şart5 THEN .... ELSE ..... END IF END IF Bir şey anlaşılıyor mu ? pek sanmıyorum.... : Püf: Bir programı yazıp çalıştırdın. O anda programı yarıda kesip koda dönmek isteyebilirsin. O zaman CTRL+PAUSE/BREAK tuşuna basarsan program yarıda kesilir ve koda döner. Örnek Program: Bilgisayar aklından rastgele bir sayı tutsun. Bu tuttuğu sayı 1 ila 100000 arasında bir sayı olsun. Ve kullanıcı da bu sayıyı tahmin etmeye çalışsın. Bilirse de ekrana 'BRAVO BİLDİNİZ!' yazsın. (öğreneceğimiz 4 komut daha var. Bu programı yazabilmemiz için) RANDOMIZE TIMER: Bilgisayarın rastgele sayı üretim durumunu değiştirir. 1 kereliğine mahsus programın ilk satırına yazılır. RND: Rastgele bir sayı üreten komuttur. (RANDOM=RND) Püf: Literatürde RANDOM kelimesi diye bir kelime vardır. RANDOM, Rastgele bir sayı demektir. Konuşmalarda geçer. RANDOM bir sayı olsun, buna göre işlem yapsın... INT: Küsüratlı sayının virgülden sonraki kısmını atar ve tamsayı kısmını alır. DO-LOOP: DO ve LOOP. DO olmadan LOOP işe yaramaz. LOOP olmadan DO işe yaramaz. Bu iki komut birlikte kullanılır ve DO-LOOP (DU-LUP) döngüsü adıyla tanınır. DO ... komutlar .... EXIT DO LOOP DO-LOOP arasında kalan komutlar sürekli olarak baştan tekrar tekrar çalıştırılır. Buna sonsuz döngü denir. Bu döngüden çıkmak istediğimizde, arada kalan kısma herhangi bir yere EXIT DO komutunu kullanırız. Ve programı bu komutu gördüğünde LOOP komutunun altından çalışmaya devam eder. (Yukarda önceki örneklerin birinde kullanmıştım.) Şimdi programı yazalım. Yanlarına ' (tırnak) işaretiyle açıklamalarını yazacağım. Bunları qbx programı görmeyecektir. Yazabilirsin de yazmayabilirsin de. Yazmanı öneririm. CLS RANDOMIZE TIMER '... rastgele sayı üretim sistemini başlat tutulansayi#=int(RND*100000+1) '... 1-100000 arası bir sayı seç, tamsayısını al. Hak=0 '... kullanıcının kullandığı hak sayısını tutması için kullandım. PRINT "SAYI TAHMIN OYUNU." PRINT "BEN BİR SAYI TUTTUM. 1-100000 ARASINDA." PRINT "BUNU BULMAYA ÇALIŞ BAKALIM" DO Hak=hak+1 '... kullanıcının hakkını +1 artır. PRINT '... boş bir satır at. LINE INPUT "EVET TAHMININI GİR BAKALIM >", tahminsayisi$ tahminsayisi#=VAL(tahminsayisi$) '... girilen yazıyı (tahminsayisi$) sayıya çevir. IF tutulansayisi#=tahminsayisi# THEN PRINT "BRAVO ! TEBRIKLER" PRINT hak;" SAYIDA BİLDİNİZ." EXIT DO '... DO-LOOP döngüsünden çık ELSE '... girilen sayı yanlış ise PRINT "YANLIŞ TAHMİN." IF tahminsayisi#>tutulansayi# THEN PRINT "SAYINI KÜÇÜLT...." ELSE PRINT "SAYINI BÜYÜLT..." END IF '... yukardaki IF yapısının sonu. END IF '... en yukardaki IF yapısının sonu. LOOP PRINT "DÖNGÜDEN ÇIKTINIZ. PROGRAM SONA ERDİ" Programcılıkta kalite olan konular nelerdir ? 1. Dizileri çok iyi kullanmak. (İleride anlatacam) 2. Dosyalama işini çok iyi yapmak. (İleride anlatacam) 3. Çok iyi formülüze etmek. (Her türlü anlamı çıkarabilirsin. Yeri gelince anlatcam) Şimdi IF komutunda kullanılan MANTIKSAL deyimleri görelim. 2 tane en çok kullanılan mantıksal deyim vardır. AND: 've' anlamına gelir. (end okunur) OR: 'veya' anlamına gelir. (or okunur) Örneğin: IF a>100 AND b>200 THEN ... a sayısı 100'den büyük ve aynı zamanda b sayısı da 200 den büyük ise .... IF a=1 AND b=45 AND c<>98 THEN .... a sayısı 1, b sayısı 45 ve c sayısı 98 değilse ..... IF a=1 OR b=45 THEN ... a sayısı 1 veya b sayısı 45 ise ... IF (a=1 OR b=45) AND (c=90 OR D=45) THEN ... a sayısı 1 veya b sayısı 45 iken aynı zamanda (VE) c sayısı 90 veya D=45 ise ... yukarıdaki örnek KOMPLEX (BİRLEŞİK) bir şart ifadesidir. Şartımızı sağlayacak ihtimaller şunlardır. a=1 ve c=90 iken şart sağlanır. a=1 ve d=45 iken şart sağlanır. b=45 ve c=90 iken şart sağlanır. b=45 ve d=45 iken şart sağlanır. Bunun dışındaki değerler şartı sağlamaz. Şimdi gelelim diğer bir komuta. Ancak anlatacağım komuta geçmeden önce bir örnek üzerinde daha çalışalım: Şöyle bir mantık istensin bizden. 1. Girilen sayı 1-200 arasında ise ekrana 'kdv oranı %25 alındı' yazsın. 2. Girilen sayı 201-500 arasında ise ekrana 'kdv oranı %35 alındı' yazsın. 3. Girilen sayı sadece 600 ise ekrana 'kdv oranı %45 alındı' yazsın. Bunun kalıbını IF komutuyla şöyle yapabiliriz. CLS LINE INPUT "SAYIYI GİRİN >",sayi$ sayi=VAL(sayi$) IF sayi>=1 AND sayi<=200 THEN PRINT "ORAN %25 ALINDI" IF sayi>=201 AND sayi<=500 THEN PRINT "ORAN %35 ALINDI" IF sayi=600 THEN PRINT "ORAN %45 ALINDI" İstenen mantığı bu şekilde çözebiliriz. Ancak bu şekildeki bir çözüm o kadar da sağlıklı (etkin) değildir. (: Bu ASLA IF DEYİMİ KULLANMA ANLAMINDA DEĞİLDİR) Çünkü bu çözüm mantığı bu şekildeki istenen tüm mantıkları çözmez. Niye ? Niyesini söyleyeyim. Bir de bizden 4. Şart olarak şunu da isteselerdi. Şart 4. Girilen sayı bunların hiç biri değilse oranı %55 al. Hadi bakalım buyrun. 9 Ayıkla pirincin taşını.... IF deyimiyle yine çözülür. Ama bak sağlıklı olmadığını sana göstereyim. IF sayi>=1 AND sayi<=200 THEN PRINT "ORAN %25 ALINDI" ELSE IF sayi>=201 AND sayi<=500 THEN PRINT "ORAN %35 ALINDI" ELSE IF sayi=600 THEN PRINT "ORAN %45 ALINDI" ELSE PRINT "ORAN %55 ALINDI" '... şart4 ün çözümü burası END IF END IF END IF Yukarıdaki kod kalıpsal olarak düzgün yazılmış. Ama çözüm tekniği olarak yetersiz. Evet, şart 4 ü de çözdük. Peki şimdi şart 5 olsun bakalım. Şart 5. Girilen sayı 450 ise oranı %65 al. İşte şimdi sıçtık 9 Yukarıdaki kod bayağı bir uzar ve IF'ler END IF ler birbirine girer.... Evet, toparlanalım ! SELECT CASE: Bu komut belirli aralıklardaki seçimlere göre programı yönlendirir. (Türkçeye çevrildiğinde DAVA SEÇ anlamına geliyor. Hakim bey amcamız :) KULLANIMI: SELECT CASE degiskenadi CASE aralik1: işlem1 CASE aralik2: işlem2 .... CASE ELSE 'hiçbir aralık değilse burayı çalıştır. END SELECT 1. degiskenadi yazan yere karar vereceğimiz (kıyas yapacağımız) sayısal veya karaktersel değişkenin adı yazılır. 2. CASE aralik1 demek, kıyas yaptığımız değişken aralik1'e düşüyorsa işlem1'i çalıştır, aralik2'ye düşüyorsa işlem2'yi çalıştır demek. 3. CASE ELSE, yukarıdaki aralıkların hiçbirine düşmüyorsa aşağıdaki bloku çalıştır demek. 4. Her SELECT CASE komutu mutlaka END SELECT komutu ile biter. Yukarıdaki 5 şartlı mantığımızı bu komutla çözelim. CLS LINE INPUT "SAYIYI GİRİN >",sayi$ sayi=VAL(sayi$) SELECT CASE sayi '... girilen sayıya bakarak karar ver. CASE 1 TO 200 '.... girilen sayı 1-200 (dahil) arasında ise aşağıyı çalıştır. PRINT "ORAN %25 ALINDI" '... buraya alt alta daha birçok komut yazılabilir. CASE 201 TO 500 '... girilen sayı 201-500 (dahil) arasında ise aşağıyı çalıştır. PRINT "ORAN %35 ALINDI" '... buraya alt alta daha birçok komut yazılabilir. CASE 600 '... girilen sayı 600 ise aşağıyı çalıştır. PRINT "ORAN %45 ALINDI" '... buraya alt alta daha birçok komut yazılabilir. CASE 450 '... girilen sayı 450 ise aşağıyı çalıştır. PRINT "ORAN %65 ALINDI" '... buraya alt alta daha birçok komut yazılabilir. CASE ELSE '... girilen sayı yurkardaki aralıkların hiçbiri değilse aşağıyı çalıştır. PRINT "ORAN %55 ALINDI" '... buraya alt alta daha birçok komut yazılabilir. END SELECT Püf: TO (okunuşu-tu) ifadesi CASE deyiminde kullanıldığında aralık belirtir. 1 TO 200. 1'den 200'e kadar (200 dahil). Kodun esnekliğini görüyorsun değil mi ? Hazır ve beleş bloklar var. Arasına istediğin kadar komut ekle tınlamaz. Ve istediğin her türlü aralığı rahatça tanımlayabilirsin. CASE ELSE deyimi de 'yukardakilerin hiçbiri değilse' anlamına gelir. Kodlama sistemime de dikkatini çekerim. Bloksal ifadeler olduğu için göze okunaklı gelmesi için sağa içe dayalı alt alta hizalı bir şekilde yazdım. Hepsini sol tarafa toplayıp alt alta yazarsak Acemilik yapmış oluruz. İlerde baktığımızda anlamayabiliriz : Yukarıdaki örnek bloksal içerikli kodlanmış bir koddur. SELECT CASE ifadesini şöyle de kullanabiliriz. CLS LINE INPUT "SAYIYI GİRİN >",sayi$ sayi=VAL(sayi$) SELECT CASE sayi '... girilen sayıya bakarak karar ver. CASE 1 TO 200: PRINT "ORAN %25 ALINDI" CASE 201 TO 500:PRINT "ORAN %35 ALINDI" CASE 600 :PRINT "ORAN %45 ALINDI" CASE 450 :PRINT "ORAN %65 ALINDI" CASE ELSE :PRINT "ORAN %55 ALINDI" END SELECT Bu da aynı işi yapar. Tek farkı, : (ikinokta üst üste) kullandık. Bunun anlamı şudur, 'ben tek bir komut çalıştıracam' diyoruz. Yukarıdaki kodlama sistemi bloklu olmayan sistemdir. Pek tavsiye edilmez. Biz yine de : (ikinokta üstüste) leri kaldırıp, tek komutlu ifademizi CASE deyimlerinin altına sağa içten yazıp bloklu halde bırakalım. Bakarsın extra komutlarla süslemek isteyebiliriz. O zaman hemencecik alt alta yazarız komutlarımızı. Yani, SELECT CASE sayi CASE 1 TO 200 CLS COLOR 14 '.... SARI RENGİ KULLAN PRINT ".........." ..... eklemek istediğimiz diğer işlemler, komutlar buraya yazılır. CASE 201 TO 500 CLS COLOR 12 '... KIRMIZI RENGİ KULLAN (Cimbom :) PRINT ".........." ..... eklemek istediğimiz diğer işlemler, komutlar buraya yazılır. END SELECT ...gibi bloklu kullanım daha esnektir. Püf: SELECT CASE ifadesinde herhangi bir aralık çalıştırıldıktan sonra diğer aralıklara qbx hiç bakmadan direkt olarak END SELECT'in altına sıçrar ve oradan çalışmaya devam eder. Çünkü herhangi bir aralıktaki blok çalıştırılınca SELECT CASE görevini tamamlamış olur. Diğer aralıklar gözardı edilir. Eh zaten normali de budur : Örnek: Girilen sayı 1,3,5,25,32 ve 90 ise ekrana "TAMAM" yaz, aksi halde "HAYIR" yaz. Bu işi de IF deyimiyle yaparız, CLS LINE INPUT "SAYIYI GİRİN >",sayi$ sayi=VAL(sayi$) IF sayi=1 AND sayi=3 AND sayi=5 AND sayi=25 AND sayi=32 THEN PRINT "TAMAM" ELSE PRINT "HAYIR" END IF AND operantını kullanarak (ve..ve..ve..ve..) tümü birden olursa ekrana TAMAM yazdık. Aksi halde HAYIR yazdırdık. Yukarıdaki kodu SELECT CASE ile yazarsak, CLS LINE INPUT "SAYIYI GİRİN >",sayi$ sayi=VAL(sayi$) SELECT CASE sayi CASE 1,3,5,25,32:PRINT "TAMAM" CASE ELSE: PRINT "HAYIR" END IF Yukarıdaki kod aynı işi yapmayacaktır. CASE 1,3,5,25,32 ifadesi şu anlama gelir. Girilen sayi 1 veya 3 veya 5 veya 25 veya 32 ise TAMAM yaz, hiçbiri değilse HAYIR yaz. VE ile VEYA farklı şeylerdir.... Eğer bizden istenen mantık, girilen sayı 1 veya 3 veya 5 veya 25 veya 32 olursa şunu şunu yap, denseydi o zaman yukardaki kod çok işimize yarardı. SONUÇ: İstenen mantığa göre hangi komutu kullanabileceğimize karar vermek programcının elindedir. Ya başarır, ya batırır : SELECT CASE deyimini illa da sayısal kıyaslamar için kullanmayız. Karaktersel kıyaslamalar için de yapabiilriz. CLS LINE INPUT "BİR İSİM GİRİN >",isim$ SELECT CASE isim$ CASE "HUSAM" PRINT "O BİR HACKER'DİR." PRINT "ŞİFRE KIRAR..." CASE "EMİN" PRINT "HACKER'IN SUPER ABİSİDİR." PRINT "HACKER ONUNLA GURUR DUYAR." CASE "EMIN","SERPIL" PRINT "HACKER'IN BİRİCİK YEĞENİDİR." PRINT "HACKER YEĞENLERİNİ ÇOK SEVER." CASE ELSE PRINT "GİRDİĞİNİZ İŞİM GEÇERSİZ..." PRINT "TANIYAMADIM MAALESEF..." END SELECT CASE "EMIN","SERPIL": girilen isim EMIN veya SERPIL ise demektir. Küçük büyük harf ayrımı yapılmamaktadır. O yüzden bire bir (1-1) isimlerin doğru girilmesi şarttır. Eğer ayrım yaptırmak istiyorsak şöyle bir satır kullanmamız gerekirdi: CASE "EMİN","emin": EMİN veya emin girilmişse... ÇOK ÖNEMLİ NOT: Aklına takılan veya merak ettiğin sorular olursa bir kağıda YAZARAK NOT AL. Bana bildir. ANTRENMAN SENİ 1 NUMARA YAPAR ! Şimdi başka bir konuya geçelim. DÖNGÜLER. Örnek: Bana ekrana alt alta 20 tane 'BEDİİ YİLMAZ' yazısını yazdır. Bu programı şu ana kadar öğrendiğin şekilde şöyle yaparsın. CLS PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" PRINT "BEDİİ YİLMAZ" 20 tane aynı PRINT ifadesini kullanarak ismini yazmış oldun. KURAL: Acemi programcılar uzun kod kullanırlar. (yukarda görüldüğü gibi :) Peki bunu kısa bir şekilde nasıl yapacaz ? CLS FOR m=1 TO 20 PRINT "BEDİİ YİLMAZ" NEXT Bitti işte. Çalıştırdığın zaman aynı çıktıyı alırsın. Döngüler ne zaman kullanılır ? 1. Aynı işi tekrarlamak istediğimizde 2. Sayısal artırmalı ve azaltmalı işlemlerde 3. Formülüzasyon kullanımında FOR-NEXT DÖNGÜSÜ: KULLANIMI: FOR sayisaldegiskenadi=baslangic TO bitis STEP aralik ...İşlemler bloğu NEXT 1. sayisaldegiskenadi'ni mutlaka belirtmemiz gerekir. 2. = ifadesinden sonra bir başlangıç değeri belirtiriz 3. TO ifadesinden sonra bir bitiş değeri belirtiriz. 4. İsteğe bağlı olarak STEP ifadesinden sonra aralik değeri belirtiriz. 5. FOR deyiminin hemen altına yapmasını istediğimiz işlemleri yazarız. 6. NEXT deyimini FOR döngüsünün bitiş satırını belirtmek için kullanırız. Yukardaki programa kaba bir bakış atalım, FOR m=1 TO 20 PRINT "BEDİİ YİLMAZ" NEXT Degisken adi: m (ben küçüklüğümden beri bu harfi kullanırım. Buraya istediğin herhangi bir isim girebilirsin. a,b,z,t,l,elma,para,tutar vs... amaç bir isim girilmesi) Başlangıç değerimiz: 1 Bitiş değerimiz: 20 İcraat yapılacak komutlarımız: PRINT "BEDİİ YİLMAZ" NEXT komutu FOR döngüsünü kapatmamız içindir. Kullanılması zorunludur. Programı adım adım akıldan çalıştırıyoruz: m değerinin başlangıç değerini 1 al. Tamam. Alt satıra geç. Komutları çalıştır. Ekrana BEDİİ YİLMAZ yaz. tamam. NEXT ifadesini gördü. Program kendisine şunu sorar: m değeri bitiş değerine ulaştı mı ? yani m değeri 20 oldu mu ? Hayır olmadı. m değeri hala 1. O zaman bi daha FOR satırına git. (NEXT-sonrakine git demektir ingilizcede) Tekrar FOR satırına geldik. Şimdi qbx, otomatikman m değerini +1 artırır. m kaç oldu ? m değeri +1 artırıldı ve m=2 oldu. Tamam. Bir alt satıra geç. Ekrana BEDİİ YİLMAZ yaz. Tamam. NEXT ifadesini gördü. Program kendisine şunu sorar: m değeri bitiş değerine ulaştı mı ? yani m değeri 20 oldu mu ? Hayır olmadı. m değeri en son 2 idi. O zaman bi daha FOR satırına git. Tekrar FOR satırına geldik. Şimdi qbx, otomatikman m değerini +1 artırır. m kaç oldu ? m değeri +1 artırıldı ve m=3 oldu. Tamam. Bir alt satıra geç. Ekrana BEDİİ YİLMAZ yaz. Tamam. .... m değeri Bitiş değerine eşit oluncaya kadar bu DÖNGÜ sorgulaması böylece devam eder. Ve son olarak m=20 (bitiş değerimiz) olduğunda son bir kez daha ekrana BEDİİ YİLMAZ yazar. Sonra NEXT ifadesine geldiğinde şöyle devam eder. NEXT ifadesine geldik. m değeri 20 oldu mu ? (for döngüsü der ki NEXT'e, kardeş ben m=20 oldum ve son bir kez çalıştırdım bana söylenen satırları. Bana gelme bi daha :) NEXT ifadesi de der ki: Tamamdır kardeş. Sen 20 kere istenen işlemi yaptın. Ben de sana gelmiyom. Program benim altımdaki satırdan çalışmaya devam edecek. der ver NEXT deyiminden sonraki satırdan itibaren program çalışmaya devam eder. Yani döngü 20 kere çalıştırılıp bitirilmiş oldu ve NEXT'den sonra devam eder. Peki niye +1 artırılıyordu m değeri ? Çünkü biz STEP deyimini kullanmadık. STEP deyimini kullanmazsan FOR-NEXT döngüleri otomatik olarak +1 artırılarak bitiş değerine kadar çalıştırılırlar. Şimdi STEP deyimini kullanalım bakalım, nasıl bir şeymiş.... CLS FOR m=1 TO 20 STEP 2 PRINT "BEDİİ YİLMAZ" NEXT STEP 2 dedik. Bu şu demektir. m değerini her seferinde +2 artırarak işleme devam et. (+1 değil). Bitiş değerini geçersen döngüyü bitir. Diyoruz. O zaman bu döngü kaç kere çalışır sence ? m = 1,3,5,7,9,11,13,15,17,19,21 değerlerini alacak tek tek. Yani 11 kere işlem yapacak. (rakamları tek tek sayarsan 11 eder). Yani ekrana 11 tane BEDİİ YİLMAZ yazacak. İşte STEP deyimi m'nin artım miktarını belirler. e kardeşim madem ekrana 11 kere BEDİİ YİLMAZ yazdırmak istiyosan şöyle yapsak olmaz mı ? CLS FOR m=1 TO 11 PRINT "BEDİİ YİLMAZ" NEXT Olur tabii ki. Zaten doğrusu da budur. STEP deyiminin kullanım alanları başka mantıklarda mevcuttur. Bu örneğimiz için STEP deyimi gereksizdi. Ama illa da STEP değerinin işe yaradığı bir mantığı görmek istiyorsan aşağıdaki programı çalıştır ve sonucuna bak. SCREEN 12 CLS FOR m=0 TO 640 STEP 10 '... dikey çizgileri 10 ar boşluklar halinde çiz LINE (m,0)-(m,450),4 '... 4 (kırmızı renk demek) NEXT FOR m=0 TO 450 STEP 10 '... yatay çizgileri 10 ar boşluklar halinde çiz LINE (0,m)-(640,m),4 '... 4 (kırmızı renk demek.) Bunları biliyorsun. NEXT Ekranı 10'ar karelere yatay ve dikey bölmek için kullandık.... Döngüler her yerde her zaman çok işimize yarar. Bir çok kullanım alanı vardır. Mesela; FOR m=1 to 10000: NEXT Yukarıdaki satır ne yapar ? Boş yere m'yi 1 den 10000'e kadar saydırır. Ne işimize yarayacak ? Birazcık işlemleri yavaşlatma ve bekletme için kullanabiliriz. CLS FOR m=1 TO 11 FOR n=1 to 100000:NEXT '... bu satır kendi başına FOR-NEXT. Zaman bekler. PRINT "BEDİİ YİLMAZ" NEXT Püf: İç içe FOR-NEXT döngüleri kullanabiliriz. Ancak degisken isimleri birbirinden farklı olmalıdır. Dikkat et, m ve n isimleri farklı. Ve her FOR döngüsünü bir NEXT kapatıyor. Başka bir örnek, ekrana 100 tane rastgele 1-100 arası sayılar yazsın. (Bunlar da ne işimize yarayacak deme : ilerde çok işine yarayacak.) CLS RANDOMIZE TIMER FOR m=1 to 100 '... 100 kere PRINT INT(RND*100+1) '... 1-100 arası rastgele sayı seç ve ekrana yaz NEXT Örnek: Ekrana 0 den 100 e kadar olan sayıların içinde 8'in katları olan sayıları yaz. Yani 0 dan başla ve 8'er 8'er artırarak 100'e kadar yaz. CLS FOR m=0 to 100 STEP 8 PRINT m NEXT İşte bu kadar basit. Bu örneği geliştirebilirsin. CLS:FOR m=0 to 100 STEP 8:PRINT m:NEXT Aynı işi yapar. Sadece program yazma stili farklı : ( ikinokta üstüste kullanarak komutları yanyana yazabileceğimizi söylemiştim.) Ben alt alta yazma taraftarıyım. Müdahale etmen gerektiğinde daha kolay olur. Başka bir örnek: 1 den 10 a kadar olan sayıların çarpım tablosunu yapalım, şöyle olmasını isteyelim, 1x1 = 1 1x2 = 2 1x3 = 3 ... 2x1 =2 2x2 =4 2x3 =6 ... ve bunlar ekrana yazarken kullanıcıdan herhangi bir tuşa basarak tek tek yazdırılmalarını isteyelim. Mantık olarak ne lazım ? 1 den 10'a kadar olan sayılarla (1. Döngümüz) 1 den 10'a kadar olan sayıları (2.Döngümüz) çarptıracaz. Demek ki 2 tane döngü açacaz ve bunların çarpımlarını ekrana yazdıracaz. Bak ne kadar basit olacak, CLS FOR m=1 TO 10 '... 1.döngümüz FOR n=1 TO 10 '... 2. Döngümüz PRINT m;"x";n;"=";m*n Tus$=INPUT$(1) NEXT '... 2. Döngünün next'i NEXT '... 1. Döngünün next'i PRINT "PROGRAM BİTTİ" NEXT'leri karıştırma. En sondaki FOR'u En üstteki NEXT kapatır. FOR (dıştaki döngü) | FOR (içteki döngü) | | ... | NEXT NEXT Şeklindedir. PRINT ifadesindeki esnek kullanıma dikkat et. ; kullanımı var (yanyana yazdırmak için). m ile n'nin çarpımını da hemencecik yazdırıyoruz. Ve bir tuşa basılmasını istiyoruz. İç içe FOR-NEXT döngülerinde, en içteki döngü işini bitirdikten sonra sıra dıştaki döngüye gelir. Dıştaki döngü bitinceye kadar içteki döngü bir daha çalıştırılır. Sonuçta PRINT deyimi m x (çarpı) n kadar yani 10 x 10 =100 kere işlem yapar : Eh, biraz matematiksel oluyor ama öğrenmen gerek. Hesaplarda işine yarayacak. Evet şimdi diğer bir döngü komutuna geçelim. DO-LOOP-UNTIL: Sonsuza kadar işlem yapmak üzere döngü açar. Kullanım: DO ... komutlar ... LOOP UNTIL şart DO-LOOP arası komutlar sürekli olarak sırayla çalıştırılır. Taa ki 'döngüden çık' emri verinceye kadar bu komutlar tekrar tekrar çalıştırılır. Örnek: Ekrana rastgele bir sürü sayı yazdırılmasını isteyelim. Ve rengarenk olsun. Taa ki kullanıcı ESC tuşuna basıncaya kadar bu işlem cevap etsin. CLS RANDOMIZE TIMER DO COLOR INT(RND * 15), INT(RND * 7) PRINT INT(RND * 10000) FOR m = 1 TO 100000: NEXT LOOP UNTIL INKEY$ = CHR$(27) Şimdi bu programın ne yaptığına bakalım. Yazı rengini 0-15 arası seçiyor. (15 dahil değil. 15'in de dahil olmasını isteseydik INT(RND*15+1) yazmamız gerekecekti. Çünkü 0-15 arası seçim yap demişiz. 14.9999 seçer ama asla 15 seçmez. +1 li şekilde yazarsak 14.9999 seçer, bi de +1 ekler ve 15.9999 yapar. Bunun tamsayı kısmını al demişiz. İşte o zaman 15 'i seçerdi... bu da bir düşünce tekniğidir. Günün birinde neden ben 15'i de seçtiremiyorum deme yani... : ) Yaz fon rengini de 0-7 arası seçiyor. (7 dahil değil). Ekrana rastgele 0-10000 arası sayı yazdırılıyor, tamsayı olarak. INT ifadesini kaldırırsan küsüratları da görürsün. 1 den 100000'e kadar işlem bekletiliyor. Yukarda anlatmıştım. Bekletme döngüsü. DO-LOOP arasında kalan komutlar sürekli olarak çalıştırılıyor. COLOR,PRINT ve FOR-NEXT. Taa ki kullanıcı ESC tuşuna basıncaya kadar bu işlemler tekrar tekrar sonsuza kadar devam ediyor. DO: Altta kalan komutların hepsini sırayla çalıştır demek. LOOP: DO'ya geri dön. Baştan tekrarla demek. UNTIL: (... e kadar) Eğer şart sağlanırsa DO-LOOP döngüsünden çık demek. ESC tuşuna basılıp basılmadığını nasıl anlıyoruz peki ? INKEY$ komutu klavyeden o an için her hangi bir tuşa basıldıysa o tuşun kodunu tutar. (Her tuşun bir kodu vardır. Bunları anlatacam) CHR$(27): 27 nolu kodun karşılığı olan tuş demektir. 27 nolu kod ESC tuşuna karşılık gelmektedir. UNTIL INKEY$=CHR$(27) ifadesi ile şunu söylüyoruz programa. ...taa ki kullanıcı klavyeden ESC tuşuna bastığı an ( = eşittir ) DO-LOOP döngüsünden çık. Diyoruz. DO-LOOP döngüsü çok esnek bir döngüdür. Esnek Döngü derken, her amaç için kullanılır. Ve bazı durumlarda (mantıklarda) oldukça kullanılışlıdır. Ayrıca DO-LOOP döngüsünde bir de EXIT DO komutu vardır. DO ... komutlar ... EXIT DO ... LOOP (xxx) DO-LOOP arasında herhangi bir satıra EXIT DO yazarsak, program bu satırı gördüğü anda LOOP satırının hemen bir altındaki satırdan [ (xxx) olan yerden] çalışmaya devam eder. EXIT DO: DO-LOOP döngüsünden çık demektir. Bazı durumlarda EXIT DO komutu oldukça kullanışlıdır. Yukarıdaki programı aynı şekilde aşağıdaki gibi de yazabilirdik. Program yine aynı işi yapacaktır. Ancak kodlama sistemi birazcık değişiyor. İşte bu kodlamaların değişmesi PROGRAMCILIKTA AYRICALIK oluşturur. CLS RANDOMIZE TIMER DO COLOR INT(RND * 15), INT(RND * 7) PRINT INT(RND * 10000) FOR m = 1 TO 100000: NEXT IF INKEY$ = CHR$(27) THEN EXIT DO LOOP UNTIL komutunu kaldırıp, yerine, EĞER klavyeden basılan tuş ESC ise EXIT DO olsun. (yani DO-LOOP tan çık diyoruz.) Tabii ki direkt olarak EXIT DO yazamazdık. Çünkü o zaman DO-LOOP arası komutlar 1 kere çalışacaktı. Ama biz bir şart belirtiyoruz ki ancak o zaman EXIT DO ile döngüden çıkılsın. Aşağıdaki koda dikkat et: CLS RANDOMIZE TIMER DO COLOR INT(RND * 15), INT(RND * 7) PRINT INT(RND * 10000) FOR m = 1 TO 100000: NEXT EXIT DO LOOP (burda program bitiyor) Yani burada şimdi ekrana sadece 1 kereliğine mahsus renkli bir sayı yazdırılacak, sonra EXIT DO deyimini gördüğü için LOOP'un sonundan itibaren çalışmaya başlayacak. Başka bir komut olmadığı için de program sona ermiş olacak. NOT: Komutları kullandığın yerler, ve oluşturduğun mantık DİKKAT İSTER ! Örneğin; 'İşlem yapmaya devam etmek istiyor musunuz ? (E/H)' gibi bir mantıkta kullanıcı evet derse tüm işlemler yeniden tekrarlansın. Hayır derse (H tuşuna basarsa klavyeden) program sona ersin. Şu ana kadar bu mantığı çözecek bir mantığı göstermedim sana. Şimdi yavaş yavaş ufkumuzu açalım. (Programcılıktaki kademeleri hatırlıyorsun değil mi ? Kademeler üst üste birikecek ve TECRÜBE olacak sana) CLS DO LINE INPUT "1. SAYIYI GİRİN"; sayi1$ sayi1# = VAL(sayi1$) LINE INPUT "2. SAYIYI GİRİN"; sayi2$ sayi2# = VAL(sayi2$) toplam# = sayi1# + sayi2# PRINT "GİRDİĞİNİZ SAYILARIN TOPLAMI ="; toplam# PRINT "İŞLEME DEVAM ETMEK İSTİYOR MUSUNUZ ? (E/H)" tus$ = INPUT$(1) IF tus$ = "H" OR tus$ = "h" THEN EXIT DO LOOP PRINT "Program sona erdi. İyi günler..." Programı inceleyelim; (programı önce yaz ve çalıştır. Biraz kullan) tus$ = INPUT$(1) satırına kadar olan satırlar bildiğin satırlar zaten. 2 tane sayi istiyoruz kullanıcıdan ve bunların toplamını Toplam# adlı değişkene aktarıyoruz. tus$ = INPUT$(1) satırı kullanıcının klavyeden bir tuşa basmasını (bekliyordu hatırlıyorsun dimi ?) istiyordu. Şimdi burada kullanıcı klavyeden mutlaka herhangi bir tuşa (mike mike basacak). Sonra aşağıdaki satır çalışacak. IF tus$ = "H" OR tus$ = "h" THEN EXIT DO Klavyeden basılan tuşun değeri tus$ değişkeninde tutuluyor. Diyoruzki bu satırımızda, Eğer basılantuş H'ye veya h'ye eşit ise (Büyük küçük harf ayrımı yaptığımıza dikkat et. Bunu yapmak zorundayız. Çünkü kullanıcı H harfine bastığında Capslock'u kapalı durumda olabilir, ya da tersi. O zaman Biz illa Büyük harfe basmasını istiyormuşuz gibi bir durum olurdu, yani pek iyi olmazdı anlayacağın. Her neyse... Ne türde H harfine basarsa bassın, 'küçük ya da büyük olması bizim için farketmez' diyoruz yani. Eğer küçük ya da büyük H harfine bastığı taktirde DÖNGÜDEN ÇIK diyoruz. Yani başka bir işlem yaptırmıyoz. LOOP'un sonuna gider. Ve program biter. Kodu incele. Ha peki kullanıcı E'ye ya da dandirikten herhangi bir tuşa basarsa ne olur ? Tüm işlemler yeni baştan çalıştırılır. Kullanıcının neye bastığı bizim hiç umrumuzda değil. Ama kullanıcılar genelde KURALLARA UYAN TİPLER olduklarından genelde E harfine basarlar. Ve işlem yeniden başlatılır. Halbuki biz E ye basıp basmadığına bakmıyoruz bile. Kullanıcı G,J,A,W,L gibi harflere bassa da bunların hepsi E yerine geçer : Anladın dimi numarayı ? NOT: Program yazarken, genelde İLÜZYON hileleri kullanılır. E senaryosunda olduğu gibi yani. IF tus$ = "H" OR tus$ = "h" THEN EXIT DO Bu satırı aynı şekilde aşağıdaki gibi de yazabiliriz. IF UCASE$(tus$)="H" THEN EXIT DO Aynı işi yapacaktır. Bu satırı IF tus$ = "H" OR tus$ = "h" THEN EXIT DO satırının yerine yaz. UCASE$(...): UP-CASE'den gelir.Yani parantezin içindeki veriyi büyük harfmiş gibi düşün demek. Parantezin içine karaktersel bir veri gelmesi gerekiyor. IF UCASE $(tus$)="H" THEN EXIT DO Parantezin içindeki veri karaktersel bir veridir. (Tus$ verisi). Bunu büyük harfte düşün diyoruz. Ve büyük harfte düşündüğümüz için de ="H" büyük harf H'ye eşit mi ? sorusunu soruyoruz. İşte yukarıdaki satır daha kısa bir kod oldu. Kullanıcının Capslock büyük harf küçük harf derdi ile uğraşmamıza gerek yok. Ne şekilde olursa olsun H harfine bastığı anda yukarıdaki işlem geçerli olacaktır. Şimdi şöyle bir soru sorabilirsin: Ya bu küçük harf büyük harf mevzusu da nerden çıktı yaw ? Çok mu önemli yani ? Evet önemli, bak: IF tus$ = "H" OR tus$ = "h" THEN EXIT DO veya IF UCASE$(tus$)="H" THEN EXIT DO satırını, IF tus$ = "H" THEN EXIT DO Şeklinde değiştir. Sonra programı yeniden çalıştır. Ve Capslock ışığını da söndür. Program sana soru sorduğunda H harfine bas. (program senin küçük harf h'ye bastığını algıladı) ne oldu ? Yine işleme devam ediyor. Programdan çıkmadı, işleme devam ediyor hala... Şimdi herhangi bir kullanıcı programı bu şekilde kullansa ne der ? PROGRAMDA HATA VAR KARDEŞİM ! Ben H harfine basıyorum hala işleme devam ediyor. (İYİ DÜŞÜN ! Bu hata, büyük hatalara sebebiyet verebilirdi. Kullanıcıdan 200 tane veri istediğini varsayalım. Kullanıcı bu 200 veriyi girip işlemlerin sonucuna baktıktan sonra programdan çıkmak isteyebilirdi. Ama yaptığımız bu küçük harf algılama hatasından dolayı kullanıcıya tekrar o 200 soru sorulur. O zaman kullanıcı programdan çıkamaz. Çıkması için tekrar 200 soruya cevap verip bu sefer gerçekten büyük harf H'ye basması gerekirdi. İşte bu da çileden çıkma bakışlarına neden olur 9 ) O yüzden yazacağımız programlarda kullanıcıyı da iyi düşünmemiz lazım. Unutma, her zaman en geniş düşünce ufkunu programa yansıtmalısın ! Yani her şeyi düşünmek gerekir, ha tabi bu arada programı kullanan kişi, senin neler düşündüğünü bilmez, bilemez, herşeyi bilgisayarın yaptığını sanır. Bu düşünce tabii ki yanlış. İşte biz programcılar bu yüzden FARKLIYIZ aslan ABİM BENİM ! Şimdi başka bir konuya geçelim. Klavyeden basılan tuş olayı. E yani bu olay önemli. Kullanıcı hangi programı kullanırsa kullansın mutlaka klavyeden bir tuşa basacak. Ve biz o basılan tuşu bilip ona göre işlem yapacaz. Şimdiye kadar hangi tuşa basma komutlarını gördük ? TUS$=INPUT$(1) bu satır klavyeden 1 tuşa basılmasını bekler ve basılan tuşu da TUS$ karaktersel değişkenine aktarır. SLEEP bu komut da klavyeden bir tuşa basılmasını bekler. (fazla basıldığında BEEP sesi çıkartır) ama basılan tuşun ne olduğunu bilemeyiz bu komutta. TUS$=INKEY$ bu satır da o an için ( o an derken, şimdi(=bu) satır çalıştığı anda kullanıcının hangi tuşa bastığını bilir ve içinde saklar. (basılan tuşun kod değerini saklar yani. Biz o kod değerine bakarak hangi tuşa bastığını anlarız. ESC örneğinde olduğu gibi yani.) Şimdi gelelim sorumuza ? Biz gerçekten klavyeden herhangi bir tuşa bastırmak istediğimizde hangisini kullanacaz ? CEVAP: Şu anda hiç biri işimize yaramaz ! 9 Evet, gerçekten yaramaz. Neden yaramaz ? Çünkü klavyede bulunan ve basılabilen tuşlar 2 'ye ayrılır. Bunları anlatacam birazdan. Geçici cevabımız şudur: Gerçekten hangi tuşa basıldığını anlamamız için INKEY$ komutunu kullanırız. Biraz daha farklı bir şekilde kullanacaz tabii ki.... Şimdi gelelim KLAVYEDE BASILABİLEN TUŞLAR'a: Klavyede basılabilen tuşlar vardır. Bir de basılamayan tuşlar vardır. Gerçekten bazı özel karakterler vardır ve bunlar klavye üzerinde yer almaz. Bunları biz KODLAYARAK basmışız gibi yaparız. Bilgisayarın MS-DOS ortamında tanıdığı karakter sayısı TOPLAM 256'dır. Yani toplam 256 adet karakterimiz vardır. Ve bu karakterlerin her birinin de bir sayısal kod karşılığı vardır. Örneğin 65 nolu karakter kodu A'ya, 32 nolu karakter kodu BoşlukTuşuna, 46 nolu karakter .(nokta)'ya işaret eder. Bu kod aralığı 0-255 (dahil) arasında değişir ve sayarsan 256 tane olduğunu görürsün. 000 (nul) 016 (dle) 032 sp 048 0 064 @ 080 P 096 ` 112 p 001 (soh) 017 (dc1) 033 ! 049 1 065 A 081 Q 097 a 113 q 002 (stx) 018 (dc2) 034 " 050 2 066 B 082 R 098 b 114 r 003 (etx) 019 (dc3) 035 # 051 3 067 C 083 S 099 c 115 s 004 (eot) 020 (dc4) 036 $ 052 4 068 D 084 T 100 d 116 t 005 (enq) 021 § (nak) 037 % 053 5 069 E 085 U 101 e 117 u 006 (ack) 022 (syn) 038 & 054 6 070 F 086 V 102 f 118 v 007 (bel) 023 (etb) 039 ' 055 7 071 G 087 W 103 g 119 w 008 (bs) 024 (can) 040 ( 056 8 072 H 088 X 104 h 120 x 009 (tab) 025 (em) 041 ) 057 9 073 I 089 Y 105 i 121 y 010 (lf) 026 (eof) 042 * 058 : 074 J 090 Z 106 j 122 z 011 (vt) 027 (esc) 043 + 059 ; 075 K 091 [ 107 k 123 { 012 (np) 028 (fs) 044 , 060 < 076 L 092 \ 108 l 124 | 013 (cr) 029 (gs) 045 - 061 = 077 M 093 ] 109 m 125 } 014 (so) 030 (rs) 046 . 062 > 078 N 094 ^ 110 n 126 ~ 015 ¤ (si) 031 (us) 047 / 063 ? 079 O 095 _ 111 o 127  128 Ç 144 É 160 á 176 _ 192 + 208 _ 224 Ó 240 ­ 129 ü 145 æ 161 í 177 _ 193 - 209 _ 225 ß 241 ± 130 é 146 Æ 162 ó 178 _ 194 - 210 Ê 226 Ô 242 131 â 147 ô 163 ú 179 ¦ 195 + 211 Ë 227 Ò 243 ¾ 132 ä 148 ö 164 ñ 180 ¦ 196 - 212 È 228 õ 244 133 à 149 ò 165 Ñ 181 Á 197 + 213 229 Õ 245 § 134 å 150 û 166 Ğ 182 Â 198 ã 214 Í 230 µ 246 ÷ 135 ç 151 ù 167 ğ 183 À 199 Ã 215 Î 231 247 ¸ 136 ê 152 İ 168 ¿ 184 © 200 + 216 Ï 232 × 248 ° 137 ë 153 Ö 169 ® 185 ¦ 201 + 217 + 233 Ú 249 ¨ 138 è 154 Ü 170 186 ¦ 202 - 218 + 234 Û 250 · 139 ï 155 ø 171 ½ 187 + 203 - 219 _ 235 Ù 251 ¹ 140 î 156 £ 172 ¼ 188 + 204 ¦ 220 _ 236 ì 252 ³ 141 ı 157 Ø 173 ¡ 189 ¢ 205 - 221 ¦ 237 ÿ 253 ² 142 Ä 158 Ş 174 " 190 ¥ 206 + 222 Ì 238 ¯ 254 _ 143 Å 159 ş 175 " 191 + 207 ¤ 223 _ 239 ´ 255 yukarıdaki tabloda MS-DOS ortamında bulunan tanımlı 256 karakter ve kodlarıyla birlikte gösterilmiştir. Sol taraftaki sayılar kodu temsil eder, sağ taraftaki sayılar o koda karşılık gelen karakteri temsil eder. Ha aklıma gelmişken söyleyeyim, bu tablo bilgisayar programlamanın IBRANICE'si gibi bir şeydir. Bir çok acemi programcı bunları pek önemsemez ve o kadar da bilmez. Atıp tutarlar, ama icraata gelince yapamazlar. Bunların çoğunu hatta tümünü diyim akıldan ben biliyorum. Ne işimize yarayacak ? sorusunu sorabilirsin, çok işimize yarayacak. Hem de çok ! Cevabı şöyle bir şey olurdu heralde ? Biz niye yemek yeriz ? : İşte biz bu tabloya ASCII KOD TABLOSU diyoruz. Hani bilgisayar kursu veren dersanelerde öğrencilere kafadan ezberletilir ya '256 tane karakter vardır. Buna ASCII KOD TABLOSU denir' ama bilinmez ve gösterilmez.... Bu karakter takımında bizim işimize en çok yarayan kesimi 32 ve sonraki kodlardır. Yani 32-255 arası. İlk 32 kod özel koddur. Farklı amaçlar için kullanılır. Şimdi bu kısmı anladın sanırım. Özetlersek 256 tane karakterimiz var. 'Karakterimiz var' dedim dikkatini çekerim. Kaç tane tuşumuzun olduğunu ise inan ben de bilmiyorum : Tuş derken basılabilen tuşların sayısı. Yani a,d,e,h,TAB,SOLA OK, YUKARI OK, ENTER,TAB,F11,F10,F7,BACKSPACE (silme tuşu), ALT+X,ALT+Q (oyunlarda çok kullanılır hani), CTRL+C,CTRL+INSERT,CTRL+X gibi basılabilen tuşlar yani.... Şimdi 27 nolu kodun ESC olduğunu söylemiştik. Bu kod yukarda ASCII tablosunda gösteriliyor dikkat edersen. Ama ilk 32 kod özel demiştim. Belli başlı önemli tuşları söyler orda. Ama hepsi yok dimi ? : Yani bir DELETE tuşunun kodunu görebiliyor musun ? Göremezsin, boşuna bakma.... E peki ne yapacaz ? Bize bu tuşların kodları lazım yaw ??? Tabii ki lazım, PULLDOWN (açılıp kapanan DOS menülerinde hatırlıyorsun değil mi ? DELETE tuşuna basarken 'sileyim mi ?' sorularının sorulduğunu, veya ok tuşlarını kullanırken imlecin liste üzerinde hareketini... Bunların hepsi programlanır abi. Ama 1 kere yaparsın, modül olur. Sonra bu modülle program yazarsın.) Senin daha fazla uğraşmaman için benim kullandığım genel tuş kodlarını yazıyorum sana. Bunları çok eskiden çıkarmışım... CHR$(27) '... esc CHR$(13) '... enter CHR$(0) + CHR$(72) '... up üst ok CHR$(0) + CHR$(80) '... down alt ok CHR$(0) + CHR$(75) '... left sol ok CHR$(0) + CHR$(77) '... rıght sağ ok CHR$(0) + CHR$(79) '... ende end tuşu CHR$(0) + CHR$(71) '... home home tuşu CHR$(0) + CHR$(83) '... delete delete tuşu CHR$(8) '... backspace (silme tuşu) CHR$(9) '... tab CHR$(0) + CHR$(15)'... shftab shift+tab CHR$(0) + CHR$(73)'... pgup CHR$(0) + CHR$(81)'... pgdown CHR$(0) + CHR$(82)'... insert CHR$(0) + CHR$(59)'... f1 CHR$(0) + CHR$(60)'... f2 CHR$(0) + CHR$(61)'... f3 CHR$(0) + CHR$(62)'... f4 CHR$(0) + CHR$(63)'... f5 CHR$(0) + CHR$(64)'... f6 CHR$(0) + CHR$(65)'... f7 CHR$(0) + CHR$(66)'... f8 CHR$(0) + CHR$(67)'... f9 CHR$(0) + CHR$(68)'... f10 CHR$(0) + CHR$(133)'.. f11 CHR$(0) + CHR$(134)'.. f12 CHR$(0) + CHR$(146)'.. ctrl+insert CHR$(0) + CHR$(147)'.. ctrl+del CHR$(0) + CHR$(119)'.. ctrl+home CHR$(0) + CHR$(117)'.. ctrl+ende CHR$(0) + CHR$(132)'.. ctrl+pgup CHR$(0) + CHR$(118)'.. ctrl+pgdown Yukarıdaki kodlar klavyedeki basılabilen bazı tuşların KODLARIDIR. İşine yarayacak. Klavyedeki basılabilen tuşlar da 2'ye ayrılır. 1. Tek karakterli tuşlar 2. Çift karakterli tuşlar Yukarıdaki tuş kodlarında dikkat edersen bazı tuşlar (özellikle F tuşlar, CTRL gibi tuş takımları) çift karakterlidir. Yani iki kodun yanyana gelmesiyle olur. Normal yazı yazarken bastığımız tuşlar ise ASCII kod tablosunda kodlarıyla belirtilmiştir. Bunlar da tek koddan oluşurlar yani tek karakterlidirler. İşte tüm tuşlar ASCII kod tablosuna sığmadığı için çift karakterli kodlama sistemi ortaya çıkmış. Bunu da öğrenmiş ol : Şimdi bu konuya kısa bir ara verelim ve bir önceki konumuza dönelim. Hangi tuşa basıldığını hangi komutla anlayacaktık ? bunun cevabını geçici olarak (şimdilik) INKEY$ komutu tam olarak yapar demiştik. Şimdi neden TUS$=INPUT$(1) satırının tüm tuşları algılayamadığını görebiliyor musun ? Çünkü klavyeden tek bir tuşa basılmasını istiyoruz. (1) ifadesiyle... Ama 2 karakterli tuşlar var ? onları göremeyecek o zaman bu satır... TUS$=INPUT$(2) yaparsak da (klavyeden 2 karakter oku) bu sefer tek karakterli tuşları göremeyiz, okutamayız, algılatamayız yani. İşte bu yüzden en sağlıklı komut INKEY$'dır. SON KARARIMIZ : Evet, INKEY$'ı nasıl kullanacaz ? Daha önceki örneklerde gördük. TUS$=INKEY$ satırı şeklinde kullanacaz. Ama bu satır o anlık işimizi görür. Bak, CLS PRINT "HERHANGİ BİR TUŞA BASIN" TUS$=INKEY$ PRINT "BASTIĞINIZ TUŞ =";TUS$ Bu programı çalıştırmanla birlikte hemen sona erdiğini göreceksin. Bu süre zarfında klavyeden bir tuşa basıldıysa eğer, basılan tuşun içeriği (hangi tuşsa yani) TUS$ değişkenine aktarılır. E ben bu süre zarfında (mikro saniyede) dur bakalım nasıl hemen bir tuşa basacam yaw ? CEVAP: BASAMAZSIN ZATEN : Peki nasıl yapcaz ? İşte şimdi daha önceki öğrendiğimiz bazı mantıkları kullanacaz. Daha doğrusu çok basit bir mantık. Ne dedik, o an için klavyeden bir tuşa basılıp basılmadığını algılar dedik. Demek ki sürekli olarak şunu yaptırmamız gerek. 'Kullanıcı şu anda klavyeden bir tuşa basıyor mu ?' işte bu soruyu programa her MIKROSANİYEDE bir sormamız gerekiyor. Yani devamlı bu soruyu sordurmamız lazım. Bunu nasıl yapcaz ? Çok basit, DO-LOOP ne güne duruyor. Esnek olduğunu söylemiştim. Ha bu arada Amerika'yı benimle keşfetmen senin için yararlı olacağı kanısındayım. Ayrıntılı yazmaya çalışıyorum, ki senin de program yazarken ufkun açılsın. Bu anlattığım tekniklerin hepsi kendi buluşumdur : İftiharlar söylemek istiyorum. Bunların cevaplarını kalıplar halinde sana verirdim ama işine yaramayacağını düşündüm. Bu yüzden bu sana vereceğim kalıpları ayrıntılı olarak anlatarak neyin nereden geldiğini anlatmak istedim. Çünkü şu ana kadar sana gösterdiğim tekniklerin bir çoğu kitaplarda yazmaz. Yazsa bile o programı yazan programcının mantığını anlatır, ve ben TÜRKİYE'DE DOS PROGRAMCILIĞINDA KENDİME RAKİP TANIMIYORUM desem o kadar da bencillik etmiş olmam herhalde, tekniğimi sana da aktarmak istiyorum aslan abicim benim ! ÖĞRENMEYİ SEN İSTEDİN ! Şimdi gelelim sorumuzun cevabına: Sürekli olarak 'Klavyeden basılan tuşu algıla' ifadesini nasıl söyleriz ? şöyle söyleriz: DO TUS$=INKEY$ LOOP UNTIL TUS$<>"" Evet yukarıdaki KOD ! İşte yukarıdaki kod bizim ana hatlarımızdan birisi. Ana hatlar diyorum, programcılıkta öyle kodlar eline geçer ve yazarsın ki, o kodları bazen kendin bulamazsın çözümünü. Bir yerlerden gördüğün zaman hayret edersin... Unutamayacağın kodlar mutlaka olacaktır senin de.. Herneyse, Yukarıdaki kod parçası ne işe yarar biliyor musun ? "Klavyeden herhangi bir tuşa basılıncaya kadar bekler. Ve hangi tuşa basılırsa basılsın biz o tuşu algılatabiliriz." İşte yukarıdaki cümlem ana hat cümlelerinden birisidir. Bu cümlelerin alt alta olduğu bir altın kitap hayal edebilirsin beynimi : eee, böyle bu işler... Bilgi yani.... Yukarıdaki kodu biraz daha açalım, DO-LOOP sonsuz döngüsü içinde program sürekli olarak TUS$=INKEY$ satırını çalıştırılıyor. Bu satır şunu yapıyor. Klavyeden basılan tuşu al, tus$ değişkenine aktar. UNTIL tus$<>"" ifadesi de şunu söylüyor, tus$ değişkeninin içeriği "" (hiç) den farklı ise döngüden çık. Yani toparlarsak, kullanıcı klavyeden bir tuşa basılana kadar bekler. Bir tuşa bastığı anda UNTIL satırı devreye girer ve DO-LOOP döngüsünden çıkılır. Basılan tuş ise tus$ değişkeninde saklanır. Bu değişkeni programın diğer satırlarında kullanabiliriz yani. (kullanıcı hangi tuşa basmış acaba ? diye sorduğumuzda hemen tus$ değişkeninin içeriğine ya da kod karşılığına bakarız). Yukarıdaki kodu ben genellikle tek satır halinde yazarım. Ve bu tek satırın hepsini birden sanki tek bir komutmuş gibi görürüm. Farklı bir bakış açısı : DO:TUS$=INKEY$:LOOP UNTIL TUS$<>"" Aynı kod. Sadece yazım stili farklı. Ben tek satırlısını tercih ediyorum. Şimdi basılan tuşlara ilişkin basit bir örnek yapalım, CLS DO DO: TUS$ = INKEY$: LOOP UNTIL TUS$ <> "" TUS$ = UCASE$(TUS$) SELECT CASE TUS$ CASE "A": PRINT "A TUŞUNA BASTINIZ" CASE CHR$(9): PRINT "TAB TUŞUNA BASTINIZ" CASE CHR$(0) + CHR$(59): PRINT "F1 TUŞUNA BASTINIZ" CASE CHR$(0) + CHR$(72): PRINT "ÜSTOK TUŞUNA BASTINIZ" CASE CHR$(0) + CHR$(83): PRINT "DELETE TUŞUNA BASTINIZ" CASE CHR$(13): PRINT "ENTER TUŞUNA BASTINIZ" CASE CHR$(27): PRINT "ESC TUŞUNA BASTINIZ. ÇIKIYORUM": END END SELECT LOOP İşte sana çok güzel bir kod. Öncelikle iç içe DO-LOOP döngülerini kullandığıma dikkat et. Her DO komutu LOOP ile biter. Bunu zaten biliyorsun. FOR-NEXT gibi yani. DO: TUS$ = INKEY$: LOOP UNTIL TUS$ <> "" Bu satır başlı başına bir DO-LOOP satırı. Ve yaptığı iş, klavyeden bir tuşa basılıncaya kadar bekler. Bir tuşa basıldığı anda bu satırın altındaki satırdan çalışmaya başlar. (Neden tek satırlıyı tercih ettiğimi anladın mı ? komple bir komutmuş gibi mantık dizaynı yaptığım için) DO ... ... LOOP Bu da en baştaki DO-LOOP döngüsü. Sonsuz bir döngü. Sürekli olarak arasında kalan komutlar çalıştırılacağı için sürekli olarak da klavyeden bir tuşa basılma satırını da çalıştıracağı için, taa ki ESC tuşuna basılıncaya kadar program çalışmaya devam eder. SELECT CASE deyimini anlatmıştım zaten. Burada karaktere göre seçim yaptırıyoruz. CHR$ ifadeleri kafanı karıştırmasın. Onlar karakterin (basılan tuşun) kodunu temsil ediyor. Ve çift karakterli tuşları da algılattığımızı farkettin sanırım. Hem tek karakterliler var, hem çift karakterliler var. Sonuçta hepsini algılatabiliyoruz. Sana yukarda verdiğim tuş kodlarını bu programa ekleyerek denemeler yapabilirsin. TUS$=UCASE$(TUS$) Bu satır da güzel bir koddur. Yaptığı iş şudur, tus$ değişkenimizin içindeki tuşu BÜYÜK HARFE ÇEVİR ve önceki değeriyle değiştir. Küçük harf ise büyük harfe çevir. Büyük harf ise zaten büyük harf. Büyük harfe çevirme işlemi çift karakterli tuşları etkilemez. Sonuçta alan memnun, satan memnun. Bu satır da bir değişkenin içeriğini BÜYÜK HARFE çevirir yani. Ufak bir örnek, ÖRNEK 1: LINE INPUT "BİR İSİM GİRİNİZ ";ISIM$ ISIM$=UCASE$(ISIM$) PRINT "İSMİNİZ :";ISIM$ ÖRNEK 2: LINE INPUT "BİR İSİM GİRİNİZ ";ISIM$ PRINT "İSMİNİZ :"; UCASE$(ISIM$) Şimdi yukardaki 2 örneğe çok iyi dikkat et. İkisi de aynı işi yapar. Ama farklı amaçlar için kullanılırlar. Ve kodlama stili bir imajdır, her yiğidin bir yoğurt yiyişi vardır derler ya, işte program yazarken kurduğun mantık ve kodlama stili de senin yoğurt yiyişindir. Örnek1 i çalıştır ve isim olarak emin elalmis yaz. Ekrana EMİN ELALMIS yazacaktır. Örnek2 i çalıştır ve isim olarak husamettin yaz. Ekrana HUSAMETTIN yazacaktır. Şimdi aralarındaki fark şu; Örnek1 de ISIM$ değişkeninin içinde EMİN ELALMIS yazısı barınacaktır. Örnek2 de ISIM$değişkeninin içinde husamettin yazıcı barınacaktır. Örnek1 de damardan giriş var. Yani ekrana EMİN ELALMIS yazarken, gerçekten ISIM$ değişkeninin içeriğini de EMİN ELALMIS (büyük harfe çevrilmiş haliyle) olarak tutuyoruz. Halbuki kullanıcı emin elalmis olarak girmişti... Biz girdiği ufak harfli cümleyi kalıcı olarak büyük harfe çevirdik. Ve ISIM$ değişkenini ekrana yaz dediğimizde gerçekten büyük harfe çevrilmiş olarak yazıldığını gördük. Örnek2 de ise ilüzyon tekniği var. Kullanıcının girmiş olduğu küçük harfli yazıyı ekrana sırf büyük harfli şekle dönüşmüş halde görüntüsünü yazdırdık. Yani o anlık için yazıyı büyük harfe çevirdik ve ekrana yazdık. Ama ISIM$ değişkenimizin içeriği hala küçük harfte duruyor. Yani ekrana büyük harfle yazdırdık diye ISIM$ değişkenimizin içeriği de büyük harfle aynı şekildedir DİYEMEYİZ, DEMEYİZ. Ok ? İşte neyi nerde nasıl ve ilerde ne amaçla kullanacağımıza karar vermemiz gerekir. Yukarıdaki iki örnek de aynı işi yapıyor EKRANDA. Ama programın gidişatı için bir şey söylemek zor. Duruma göre Örnek1 daha etkin olur, duruma göre Örnek2 daha etkin olur. Yani şöyle söyleyeyim, Diyelim ki sen örnek2 yi kullandın. Sonra birkaç satır sonra tekrar büyük harfle ekrana yazdırmak istedin girilen yazıyı. Tekrar şu satırı kullanman gerekir PRINT "İSMİNİZ :"; UCASE$(ISIM$) O anlık için ISIM$ değişkeninin içerğini büyük harfli şekilde ekrana yaz dedin. Program KODUNUN görüntüsü şöyle olacaktır, LINE INPUT "BİR İSİM GİRİNİZ ";ISIM$ PRINT "İSMİNİZ :"; UCASE$(ISIM$) .... başka komutlar, işlemler ....... PRINT "İSMİNİZ :"; UCASE$(ISIM$) Yukarıdaki kod gibi olacaktır. Yani. Ama ben şöyle yapardım. Örnek1 deki gibi kullanırdım. Aşağıdaki kodu tercih ederdim. LINE INPUT "BİR İSİM GİRİNİZ ";ISIM$ ISIM$=UCASE$(ISIM$) PRINT "İSMİNİZ :";ISIM$ .... başka komutlar, işlemler ....... PRINT "İSMİNİZ :"; ISIM$ Farkı nedir ? Yaptığı iş aynı. Ama senin yazdığın kod (yani örnek2 deki gibi bir seçim) çok çok uzarsa, büyük bir program yazıyor olsan başına bela olur.... İşin içinden çıkamazsın ve gerektiğinde program içersinde heran her istediğin değişikliği yapamazsın. Nasıl bela açar ? Cevabını söyleyeyim: Sen ekrana her BÜYÜK HARFLİ YAZDIRMA ihtiyacı duyduğunda ISIM$ değişkenini o anlık için PRINT "İSMİNİZ :"; UCASE$(ISIM$) Şeklinde bir satırla işini görüyorsun. Ama ISIM$ değişkeninin içeriği aslında büyük harfe çevrilmiyor. Büyük harfli görüntüsü ekrana yazdırılıyor. Ve düşün ki senin programında bir çok yerde (satırda) bu şekilde kullanımın var. E bu da sana gereksiz bir sürü altyapı-üstyapı karayollarına benzer karmaşık bir hal oluşturur. Gün gelir moralin bozulur ve yazdığın programın hakimiyetini kaybedersin. O zaman herşey BİTER ! O yazdığın programdan hayır gelmez. Gelelim benim kodlama seçimime. Ben ne yaptım ? ISIM$ değişkenimin içeriğini gerçekten büyük harfe çevirdim. Aşağıdaki satır ile, ISIM$=UCASE$(ISIM$) Gerçekten değişkenimin içeriğini büyük harfe çevirdim. Sonra ekrana yazdırdım aşağıdaki satır ile PRINT "İSMİNİZ :"; ISIM$ .. uzun uzun UCASE$ komutlarını da saf dışı bıraktım. Bir kere büyük harfe çevirmişim, gerisi tamam. Nerde ISIM$ görürse program, bilecek ki daha önceden büyük harfe çevrilmiş zaten. KODLAMA FARKINI anladın değil mi ? NOT: Değişkenlerini çok iyi takip edeceksin. Program yazarken, akıldan, hangi değişkenim ne durumda ? içinde ne tutuluyor ? şeklinde kafanda biraz boş yer açmalısın. Elbetteki başlarda zorlanırsın, ama eğer bu yeteneğini geliştirirsen HER ZAMAN ÇOK HIZLI PROGRAM YAZARSIN. UNUTMA ! Herkez programcılık öğrenir, ama herkez senin gibi olamaz !! Ha aklıma gelmişken söyleyeyim, girdiğimiz isimler dikkat edersen emin elalmis ve husamettin idi. emin yilmaz ve hüsamettin değil : Neden ? Çünkü UCASE$ komutu türkçe harfleri (ı,ğ,ü,ş,ö,ç) büyük harfe çevirmez. Bu harfler aynen kalır. Haydaaa ? e bana büyük harfe çevirme işlemi lazım ? nasıl olacak ? Bu işi yapan kodu da biz yazacaz. Farkında mısın, genelde komutlar pek yeterli olmuyor. Bu, tüm diller için böyledir. Bu yüzden programcılar her zaman kendi KOMUTLARINI yazarlar. İşte az önce yukarda bahsettiğim bir "tuşa basılıncaya kadar bekle" komutunu yazmıştık. İlerde "büyükharfe çevir" komutumuzu da yazacaz. Biraz sabır... Kütüphane nedir ? "bir tuşa basılıncaya kadar bekle" "sana vereceğim cümleyi büyük harfe çevir. Türkçe harfleri de büyük harfe çevir." ".1 sn aralıklarla işlemini yap. Bilgisayarın modeli beni ilgilendirmez. Hız sorunum yok. Hangi bilgisayar olursa olsun .1 (saniyenin onda biri) kadar bekle." "bilgisayarın BIOS seri numarasını öğren" "girilen sayıyı yazıyla oku. 123 girilmiş ise "yüzyirmiüç" şeklinde bana yazısal şeklini gönder." "ayarladığım kutuyu ekrana çiz. Çerçeveleri de olsun." "basit puldown'umu çalıştır." "kullanıcıdan sadece sayı girmesini iste." .... gibi işimize yarayan işlemlerin tümünün KODLARININ toparlanmış haline KÜTÜPHANE denir. Kütüphanelerden çok bahsettim. Önemini sanırım şimdi daha iyi kavradın. Beraber yazdığımız programlarda neden bu kadar hızlı program yazdığımı anlıyorsun değil mi ? hatta ben biraz daha olayı abartmıştım, program yazan program şeklindeki kütüphanelerimin olduğunu biliyorsun. İşte bu kütüphane olayı bir birikimdir. Moralini istemeyerek bozacam biraz ama, amerikayı mutlaka yeniden keşfetmelisin. Takıldığın yerde ben sana yardımcı olacam. Benim tekniğimi kapmalısın !! Bu şekilde işimize yarayan modülleri (programcıkları) yazmazsan hiçbir programı gerçekten yazamazsın. Piyasa da bunun sıkıntısını çeken bir çok programcı (!?) var. SONUÇ: Komutlar program yazmak için değildir ! Komutlarla KÜTÜPHANE oluştururuz. Kütüphanelerimizle Program yazarız ! Şimdiye kadar ben komut anlattım. Bu komutlarla program yazman bayağı zahmetli olacak senin için. Ancak 1 tane modülümüz var. Modul 1: "bir tuşa basılıncaya kadar bekle" DO:TUS$=INKEY$:LOOP UNTIL TUS$<>"" Modul 2: "Cümleyi büyük harfe çevir, türkçeler de dahil" SONISIM$="" FOR m=1 TO LEN(ISIM$) Harf$=MID$(ISIM$,m,1) '... bu komutu ilerde gösterecem. Korkma : SELECT CASE Harf$ CASE "ı": SONISIM$= SONISIM$+"I" CASE "ğ": SONISIM$= SONISIM$+"Ğ" CASE "ü": SONISIM$= SONISIM$+"Ü" CASE "ş": SONISIM$= SONISIM$+"Ş" CASE "i": SONISIM$= SONISIM$+"İ" CASE "ö": SONISIM$= SONISIM$+"Ö" CASE "ç": SONISIM$= SONISIM$+"Ç" END SELECT NEXT Gibi... Modüller birleşir ve kütüphane(ler) oluşur. Kütüphanesi zengin olanın program yazma hızı da gelişir. Biz modüllere bir isim veririz. Mesela Modül-1 'imize biz diyelim ki TUSBEKLE. İşte bu TUSBEKLE komutuna biz ALT PROGRAM diyeceğiz. GOSUB komutu alt programları çağırır. İlerde anlatacam. (SUB alt demektir. GO git. Alt'a Git, işin bitince geri dön, kaldığın yerden çalışmaya devam et. İşini bitir gel yani.) İşte sana yeni bir komut oldu bile ! Ve program yazmak artık şu şekli alır. GOSUB TUSBEKLE .... LINE INPUT "BİR İSİM GİRİN";ISIM$ GOSUB BUYUKHARFECEVIR PRINT "BÜYÜK HARFLİ İSMİNİZ ="; SONISIM$ .... şeklinde yarı qbx, yarı kendi komutlarından oluşmuş bir program yapısı ortaya çıkar. Yukarıdaki kod sistemi sadece bir örnektir. Denemeye çalışma, çünkü kalıp olarak göstermek istedim. Deneyeceğin programları yazacağım. Ancak sadece görüntüsüne bakmanı istedim. Koyu ile belirttiğim satırlar bizim kendi komutlarımız oldu. Gördün mü ? Şimdi, sana bu zamana kadar anlattığım her şey 1. Kademe ile ilgiliydi. GOSUB komutu kullanımı (yani alt program kullanımı) 2. Kademeye işarettir. Kademe sayısı arttıkça kalite ve hız artar. 3. Kademede GOSUB komutu ortadan kalkacak ve yerine SUB dediğimiz gerçekten kaliteli yapılar gelecek. Kendini başkalarıyla ya da benimle kıyaslamak istersen şöyle bir örnek vereyim. Çoğu kişi kanımca 2. Kademededir. 3. Kademeyi kullananların sayısı azdır. (Çünkü kafaları o kadar basmas, ve öğrenecekleri bir kişi de yoktur.) Benim seviyemi soracak olursan, ben 4. kademedeyim : Bunu söylemek istedim, çünkü farkları çok iyi anlamanı istiyorum. Şimdi gelelim her zaman her yerde ihtiyaç duyacağımız KARAKTERSEL KOMUTLAR: Karaktersel fonksiyonlar listesi: Chr$: ilgili ascii kodun karakter karşiligini verir. Asc: ilgili karakterin ascii kod karşiligini verir. Len: yazının kaç karakter olduğunu bulur. Str$: sayısal ifadeyi yazıya döndürür. Ltrim$: karaktersel değişkenin sol boşluklarını atar, kırpar. Rtrim$: karaktersel değişkenin sağ boşluklarını atar, kırpar. Val: yazısal ifadeyi sayıya döndürür. Left$: yazının soldan olan kısmı ile ilgilenir. Right$: yazının sağdan olan kısmı ile ilgilenir. mid$: yazının orta olan kısmı ile ilgilenir. String$: ilgili karakterden n adet yanyana birleştirir. Space$: n adet boşlugu yanyana birleştirir. Using : sayısal ifadeleri virgüllü formatta düzenli yazmak için kullanılır. Tab: n. Colona imleci konumlandırır. Bu komutları genelde ekrana düzenli yazdırma ve bazı mantıklarda kullanmak için kullanacaz. CHR$(n): n nolu ASCII kodun karakter karşılığını söyler. Örnek: PRINT "96 nolu ASCII kodun karşılığı =";CHR$(96) PRINT "65 nolu ASCII kodun karşılığı =";CHR$(65) Örnek: Diyelim ki 32-255 arası ASCII kod tablosunu görmek istiyorsun. Bunun programını yazalım. CLS FOR m=32 TO 255 PRINT m; " nolu kodun karşılığı = "; CHR$(m) DO:TUS$=INKEY$:LOOP UNTIL TUS$<>"" IF TUS$=CHR$(27) THEN END NEXT Bir tuşa basılıncaya kadar tek tek kodların karakter karşılıkları yazılacaktır. Eğer kullanıcı ESC tuşuna basarsa ( =CHR$(27) ) program sona erecektir. ASC(x$): x$ karakterinin ASCII kod karşılığını verir. CHR$ ın tersini yapar. Not: Karaktersel değişkenlerin $ simgesiyle anıldığnı hatırla. $ demek buraya tırnak ("") içinde bir karakter gelecek demek. Bunları ilk konularda anlatmıştım. Örnek: PRINT "A harfinin ASCII kod karşılığı =";ASC("A") PRINT "a harfinin ASCII kod karşılığı =";ASC("a") Örnek: Klavyeden basılan bir tuşun ASCII kod karşılığını ve Kaç karakterden oluştuğunu söyleyen (tek karakterli bir tuş mu yoksa çift karakterli bir tuş mu) programı yazalım. Bu programla merak ettiğimiz bası tuşların ASCII kod karşılığını da öğrenelim. Böylece herhangi bir tuşun kod karşılığını kendi yazdığımız programla öğrenip, bu öğrendiğimiz tuşun kodunu başka programlarda 'Kullanıcı ... tuşuna basarsa şu işi yap' diyebilecez. CLS DO PRINT "Klavyeden herhangi bir tuşa basınız..." PRINT "Programdan çıkmak için CTRL+BREAK tuş kombinasyonunu kullanın." DO:TUS$=INKEY$:LOOP UNTIL TUS$<>"" IF LEN(TUS$)=2 THEN PRINT "Bastığınız tuş çift karakterli bir tuş." PRINT "Bu tuşun kodu = 0 + ";ASC(RIGHT$(TUS$,1)) ELSE PRINT "Bastığınız tuş tek karakterli bir tuş." PRINT "Bastığınız tuş ="; TUS$ PRINT "Bu tuşun kodu = ";ASC(TUS$) END IF LOOP İşte sana yukarda çok güzel ve oldukça işine yarayacak bir kod. Klavyeden basılan herhangi bir tuşun kodunu bu program vasıtasıyla öğrenebilirsin. Programda bilmediğin 2 tane komut var. Bunları ilerde anlatcam. Kısaca söyleyeyim IF LEN(TUS$)=2 THEN basılan tuşun uzunluğu 2 karakter ise (LEN uzunluğunu söyler - LENGTH = uzunluk ) RIGHT$(TUS$,1) basılan tuşun sağdan ilk karakterini al. (2 karakterli tuşlar için bu satırı kullandığıma dikkat et. Basılan tuş 2 karakterli olursa bize 2.karakteri lazım, kodunu öğrenmemiz için) ASC(TUS$) tuşun ASCII kodunu söyle. Şimdi programı çalıştır ve sırayla A,TAB,boşluk,ENTER,ESC tuşlarına bas. Ekrana o tuşun kodunu yazacaktır. Örneğin; Basılan tuş = A Kodu = 65 NOT: ENTER, ESC gibi tuşlar ekrana yazdırılamaz. Ama algılanır. Yani sen ENTER tuşuna bastığında ekrana 'Enter tuşuna bastınız' diyemiyoruz. Ama kodunu söylüyoruz. Zaten bizim işimize tuşların kendileri değil, kodları gerekli olacak. Yukarıdaki örneklerde tuşlar tek karakterli tuşlardır. NOT: Tek karakterli tuşların tek kodu olur, çift karakterli tuşların çift kodu olur. A tuşuna bastığında sana Kodu=65 diyor program. Yani A tuşunun ASCII kodu 65'dir ve tek koddan ibarettir diyor. Şimdi çift karakterli tuşlara bas. Ok tuşlar, F tuşlar, END, HOME, DELETE, CTRL+bir_tuş, ALT+bir_tuş. Bunların karakter karşılığı ekrana gelmeyecektir. Ancak şöyle bir mesaj gelecektir. Tuş kodu = 0 + 59 (F1 tuşuna bastığında alacağın mesaj bu olacaktır) Burdan şu yorumu yapacaz, demek ki F1 tuşu 2 koddan oluşuyor. Birinci kodu =0 , ikinci kodu 59. Bunu şu şekilde ifade ederiz CHR$(0)+CHR$(59). İşte bu satır 'F1 tuşuna basılmış ise' anlamına eşittir. Tek karakterli tuşların kodunu ise CHR$(o_tuşun_kodu) şeklinde kullanırız. Örneğin A tuşunu algılatmamız için CHR$(65) deriz. Sana verdiğim tuş kodlarını ben böyle bulmuştum. Karşılaştırabilirsin ve yazmadığım diğer tuşların kodlarını da kendin çıkarabilirsin. Bu tuş kodları bazı programlarda işine fazlasıyla yarayacaktır. Şimdi bu kodların kullanımına ilişkin basit bir örnek daha yapalım. Yani bu kodları nasıl ve nerede kullanacaz ? Örnek: CLS DO PRINT "Herhangi bir tuşa basınız" DO:TUS$=INKEY$:LOOP UNTIL TUS$<>"" SELECT CASE TUS$ CASE CHR$(27) PRINT "ESC tuşuna bastınız. Programdan çıkıyorum" END CASE CHR$(0)+CHR$(59) PRINT "F1 tuşuna bastınız" CASE CHR$(0)+CHR$(83) PRINT "DELETE tuşuna bastınız" CASE CHR$(65) PRINT "A tuşuna bastınız (Büyük harf A 'ya bastınız)" CASE CHR$(13) PRINT "ENTER tuşuna bastınız" CASE CHR$(32) PRINT "Boşluk çubuğuna bastınız" END SELECT LOOP NOT: Sadece şu tuşları gördüremeyiz. SCROOLLOCK, PRINTSCREEN, CAPSLOCK, SHIFT TUŞLARI. Bunların tesbiti daha detaylı işlemlerle yapılır. Ancak DOS ortamında bunlara gerek yok. Gerek olursa bana söyle, kodlarını gönderirim. Şu anda fazla gereği yok. Evet, klavyeden bir tuşa basılma hikayesi de bitti. Bunları nerelerde mi kullanacaz ? . Kullanıcı ESC tuşuna basmışsa programdan çıkmak istiyor musunuz ? sorusunu sorabiliriz. . Kullanıcı ENTER tuşuna basmışsa gerekli işlemi yaptırabiliriz. . Kullanıcı F1 (yardım) tuşuna basmışsa gerekli yardım penceresini açıp yardım ederiz : Beraber hazırladığımız programlarda hani bilgi giriş hücrelerimiz vardı. Adı Soyadı : _________ İşte bu bilgi giriş hücresi aslında benim kütüphanemde bulunan kendi INPUT komutuma ait bir üründür. Ve kullanıcının klavyeden bastığı her tuşu algılatıp ona göre imleci hareketlendiriyordum. Ki, burada tüm olasılıklar vardı. Silme tuşu, yazı yazma, end,home tuşları, enter tuşuna basınca sonraki hücreye sıçrama vs... Bu modülleri yazmak gerçekten sabır ve dikkat ister. Bir kere zaman harcarsın, ama sonunda her zaman her istediğini yapan kendine ait harika komutların olur. NOT: Dos programcılığında (dos ortamında yazılan programlarda) programcıların genel sorunları şudur: (İnan bana bir çok kişi aşağıda gördüğün maddeler konusunda epeyce bir sıkıntı çekerler ve yazdığı programları karşı tarafa kabul ettiremezler) Örnek bir form oluşturalım ekrana Adı Soyadı : ___1_____ Adresi : ___2_____ Telefonu : ___3_____ Adı Soyadı, Adresi ve Telefonu yazıları PRINT komutuyla ekrana dizayn edilebilir. 1,2,3 nolu yerler veri giriş haneleridir. Ben şunun olmasını istiyorum, 1 nolu hanede imleç bekleyecek, kullanıcı ENTER tuşuna bastığında 2 nolu haneye imleç sıçrayacak. 2 nolu hanedeyken 3'e, 3 nolu hanedeyken 1'e sıçrama yapılacak. Buraya kadar istenilen mantık LINE INPUT komutunu LOCATE ile konumlandırarak yaptırabiliriz. Ancak bir sorunumuz var, hem de baba bir sorun !! : Aşağıdaki ufak programı yaz ve çalıştır: CLS PRINT "YARDIM ALMAK İÇİN F1 TUŞUNA BASIN" PRINT "PROGRAMDAN ÇIKMAK İÇİN ESC TUŞUNA BASIN ?" LOCATE 10,20:PRINT "Adı Soyadı :" LOCATE 10,35:LINE INPUT "",adsoy$ Form dizaynı idare eder ha ? : Ama istediğimizi yaptıramıyoruz maalesef.... ESC tuşuna bastığında yazdıkların siliniyor, programdan çıkması imkansız. F1 tuşuna bastığında hiçbir halt olmuyor. (olmaz da zaten çünkü kodlamadık, kodlayamayız da -bu örnek için konuşuyorum-) Burda işleri berbat eden bir komutumuz var. LINE INPUT komutu. Evet, bu komut kullanıcıdan bir veri girip mutlaka ENTER tuşuna basılmasını bekler. Yukarıda verdiğim basit form örneğini şimdi bu LINE INPUT komutuyla yapalım. CLS PRINT "YARDIM ALMAK İÇİN F1 TUŞUNA BASIN" PRINT "PROGRAMDAN ÇIKMAK İÇİN ESC TUŞUNA BASIN ?" LOCATE 10,20:PRINT "Adı Soyadı :" LOCATE 11,20:PRINT "Adresi :" LOCATE 12,20:PRINT "Telefonu :" LOCATE 10,35:LINE INPUT "",adsoy$ LOCATE 11,35:LINE INPUT "",adres$ LOCATE 12,35:LINE INPUT "",telno$ CLS PRINT "Girdiğiniz verileri söylüyorum" PRINT "ADI SOYADI:"; adsoy$ PRINT "ADRESİ :"; adres$ PRINT "TELEFON :"; telno$ PRINT PRINT "Programımız sona erdi..." Evet, bu şekilde bu kod uzar gider, güzel formlar oluşturulur ve ekrandaki satır sütunlar düzenli verilerek veri giriş haneleri yapılabilir. Ve dikkat edersen mecburi olarak ENTER tuşunu kullanarak bir sonraki haneye geçiş yapabilirsin. LINE INPUT KOMUTUNUN DEZ AVANTAJLARI NELERDİR ? 1. Kullanıcının mutlaka ENTER tuşuna basmasını beklemek zorundasın 2. Kullanıcının bastığı hiçbir tuşu algılatamazsın. Çünkü LINE INPUT komutu basılan tuşları direkt olarak hem ekrana yazar, hem de belirttiğin karaktersel değişkenin içine yazar. 3. Kullanıcı istediği zaman OK TUŞLARIYLA yukarı aşağı dolaşamaz 4. Hatalı veri girerse eğer (önceki bir haneye) bunu düzeltemez. Ta en başa dönüm verileri yeniden düzgün bir şekilde girmesi gerekir. 5. Kullanıcı programdan istediği an çıkamaz ! Taa ki tüm LINE INPUT komutlarını ENTER ile geçtikten sonra, programcının 'veri girişlerinizi yaptınız. programdan çıkmak istiyor musunuz ?' sorusuna, kullanıcının 'EVET ÇIKMAK İSTİYORUM !!!' demesiyle son bulur. 6. Karakter giriş sınırlaması veremezsin. Kullanıcı isterse 255 karakterlik bir veri girebilir. Ve gıcıklığına senin ekranını bozar ! (yani 'kullanıcı maximum 15 karakter girsin adsoyad hanesine' diye bir şey diyemezsin 9) İşte yeni başlayan DOS programcılarının EN BAŞTA SIKINTILARI BUNLARDIR! : İlginçtir, yazdığım programlara göz atan diğer DOS programcılarının ilk baktıkları (kontrol ettikleri) nokta, OK TUŞLARI ile rahat rahat veriler üzerinde gezinmesi ve sınırlı sayıda giriş izninin verilmesi, kullanıcıyı benim yönlendirmem idi.... Yüzlerindeki ifadeyi görmeni isterdim : E, neyapalım... Tecrübe bunlar .... İşte bu özellikleri yapamadıkları için yazdıkları programları genelde pek beğendiremezler. Gerçi bir çok bahane uydururlar, 'E kardeşim önce sen verini bi doğru gir bakalım, sonra verilerini program kaydedecek zaten...' gibi saçma sapan acemice bahaneler yüzünden pek de işe yarar programlar yazamazlar.... Benim taa zamanında DOS PROGRAMCILIĞINDA NEYİ YAPMAM LAZIM ? sorusuna bulduğum ve şu anda da gururla andığım düşüncelerim şunlardı: 1. Piyasada kullanılan en revaçta DOS programları neler ? LOGO, ETA paket muhabese programları. 2. Adamlar neden revaçta peki ? Pulldown menü sistemi, çerçeveler, verilerin sağlıklı olarak formlarda istediği gibi girilebilmesi, F1 tuşuna basınca yardımın gelmesi, F10 tuşuna basınca kaydedilmesi, ok tuşları ile sekreterin hatalı girdiği bir veriyi düzeltmesi. 3. Hareketli menülerin kullanılması. Ok tuşlarıyla BAŞLAT menüsü gibi menülerden ilgili maddeyi seçerek ENTER tuşuna basması ve form gelince verilerin alınması. İşte bunların hepsini zamanında iyice analiz ettim ve gerekli olan tüm kütüphanelerimi hazırladım. Sen de çok iyi biliyorsun ki DOS ortamında yazamayacağımız program yok.... Biraz daha felsefeye kaçacam, kusura bakma : 1. Acemi programcı her zaman kaçar 9 2. Usta programcı her zaman yapmaya çalışır ! 3. Acemi programcı hemen pes eder 9 4. Usta programcı sabır eder uğraşır 5. Acemi programcı her zaman kolaya kaçar, çünkü zoru başaramaz. Kolaya kaçtığı için de yazdığı program kaliteli olmaz. (LINE INPUT örneğinde olduğu gibi) 9 6. Usta programcı her zaman en iyisini yapmaya çalışır, zoru başarır. Benim işim herkesin zor dediği yerde başlar ! der :: Görsel programlama dillerinde de bu mantıklar geçerlidir. Bir çok kişinin görsel programlara yönelmesinin nedeni; 1. Gerçekten güzel görüntülerin elde edilmesi (ses, müzik, resim vs kullanım kolaylığı) 2. Formların güzel bir şekilde hazırlanabilmesi Diyebiliriz. Ancak iş kod yazmaya gelince yine bizim ACEMİ PROGRAMCIMIZ afallayacaktır. Çünkü DOS taki mantığını yine eli mahkum DELPHI'de ya da C++'da yazması gerekecektir. KODSUZ bir FORM BEŞ PARA ETMEZ !! : Kim ne derse desin arkadaş ! Usta Programcı KOD YAZAN PROGRAMCIDIR ! Bitti... : saygılarımla_ xxnt03@lycos.co.uk saygılarımla_