BÖLÜM 3 BASIC`DE DOSYALAMA İŞLEMLERİ Basıc'de çalışırken herhangi bir işlem dosyalama stili ile yapılacaksa (Veriler dosyalara kaydedilip, gerektiğinde kullanılacaksa) bu durumda iki ayrı çalışma metodu kullanılabilir. Bu metotlardan hangisinin tercih edileceği ise yapılacak işin durumuna ve dosyalama sistemlerinden hangisinin bu işe uygunluğu ile ilgilidir. Disket ünitesi ile çalışan bilgisayarlarda iki dosya çeşidi kullanılabilir. Bunlar: 1- Sequentel (Sıralı) Dosyalar. 2- Random (Rastgele erişimli) dosyalar. Bu iki dosya tipinin birbirlerine göre avantaj ve dezavantajlarını inceleyelim: Sıralı dosyada bilgiler dosyaya giriş sırasına göre kaydedilirler ve istenilen bilgiye ulaşmak için dosya baştan aranılan bilgiye keder okunmalıdır. Random dosyalarda kayıt yine ayni mantıkla yapılır ancak istenilen bilgiye kayıt numarası ile direkt olarak ulaşılabilir. Buna karşın random dosyalar sıralı dosyalara göre disket üzerinde daha fazla yer tutarlar. Kasetli ünitelerde ise yalnızca sıralı dosya açılabilir ve bu sistemler dosyalama sistemi için oldukça yavaş çalışırlar. Bunlarda hızı artırmak için önce bütün dosyayı ram`a aktarmak sonra da iş bitince bütün dosyayı yeniden kaydetmek uygun olur. Dosyalama işlemleri hakkında aşağıdaki hususların bilinmesi gerekir: - Açılan her dosya işlem bittikten sonra kapatılmalıdır. - Yazma için açılan sıralı dosyaya sadece kayıt yapılabilir. Kayıt amacıyla açılmış sıralı dosyadan veri okunmak istenilirse hata oluşur. - Açılmış bir dosya tekrar açılmaya çalışılırsa hata oluşur. - Daha önceden açılmamış bir dosyadan veri okunmak, yada böyle bir dosyaya veri girilmek istenirse hata oluşur. - Oluşturulmamış bir dosyaya ulaşılmaya çalışılırsa hata oluşur. - Diskette daha önce kullanılmış bir isimle dosya açılmaya çalışılırsa hata oluşur. Şimdi bu bilgiler ışığında dosyalama ile ilgili komutları örneklerle inceleyelim: OPEN: OPEN "mod",[#]dosya no,"dosya adı"[,random dosya uzunluğu] Bu komut ile diskette bir dosya oluşturulabilir veya daha önceden oluşturulmuş bir dosyaya ulaşılabilir. (Kasetli ünitelerde kanal numarası belirtilmelidir.) Mod ifadesi aşağıdakilerden birisi olabilir: O : Sequentel dosyaya çıkış (yazma) modu I : Sequentel dosyadan giriş (okuma) modu. R : Random dosya giriş/çıkış modu. A : Dosya sonu. 48
Dosya numarası sayısal ifadesi bilgisayarın izin verdiği büyüklüğe ulaşan tamsayıdır.(genellikle 1,2,3 kullanılır) Dosya adı yazısal bir ifade olup genellikle 6 veya 8 karakter uzunluğunda olabilir. Random dosya uzunluğu ifadesi 1 ile (8`li bilgisayarlarda) 32767 arasında olabilir ve random dosyada bir kayıt numarası altında kaydedilecek olan verilerin bite cinsinden değerini beliler. OPEN "O",#1,"TELEFON" :1 numaralı telefon isimli sıralı dosyaya veri kaydetmek için açar. OPEN "R",#3,"ALİ",60 :Kayıt uzunluğu 60 olan 3 numaralı, ALİ isimli dosyayı açar. CLOSE: CLOSE [[#Dosya no][,dosya no][,...]] Bu komut ile açık durumda olan dosyalar kapatılır. Eğer önünde belirli bir dosya numarası verilmezse o anda açık olan bütün dosyaları kapatır. CLOSE CLOSE #2 : Açık durumda olan bütün dosyaları kapatır. : 2 numaralı dosyayı kapatır. INPUT#: INPUT <#Dosya numarası>,<değişken listesi> Belirtilen dosya numarası ile açılmış olan sıralı dosyadan veri okumak için kullanılır.önündeki değişken listesi dosyadaki kayıtların durumu ile(yazısal veya sayısal) uyum sağlamalıdır.aksi Taktirde tip uyuşmazlığı hatası oluşur. INPUT #2,A$,TEL : Açık durumdaki 2 numaralı sıralı dosyadan bir yazısal değişkeni alıp A$`e ve hemen ardından gelen sayısal değişkeni de TEL`e eşitler. PRINT#: PRINT <#Dosya Numarası>,<Değişken listesi> Önündeki kayıt numarası ile belirtilen ve daha önceden açılmış olan dosyaya kayıt yapmak için kullanılır. Değişken listesi sayısal ve yazısal değişkenlerden oluşabilir. 49
PRINT #2,A$,BRUT :2 numaralı dosyaya önce A$ ve hemen ardından BRUT değişkeninin değerlerini kaydeder. Şu ana kadar olan bilgilerimizle bir sıralı dosya programı yapabiliriz. Öyleyse bir telefon rehberi örneğini inceleyelim: 5 REM SIRALI DOSYA İLE YAPILMIŞ TELEFON REHBERİ ÖENEĞİ 10 DIM A$(1000),TEL(1000) 20 CLS 30 REM << MENU HAZIRLAMA >> 40 LOCATE 10,35 50 PRINT "1- O K U M A " 60 LOCATE 13,35:PRINT "2- K A Y I T" 70 LOCATE 16,35:PRINT"3- A R A M A" 80 LOCATE 20,35 : INPUT"SECIMINIZ";S 90 ON S GOTO 120,240,430 100 PRINT"3'DEN KUCUK BIR SAYI SECINIZ" 110 GOTO 80 120 CLS 130 INPUT"KAC KAYIT GORMEK ISTIYORSUNUZ";N 140 OPEN "I",1,"DOSYA.SEQ" 150 FOR I=1 TO N 160 INPUT#1,A$(I),TEL(I) 170 IF A$(I)="ZZZZZ" THEN 200 180 PRINT I;TAB(4)A$(I);TAB(35)TEL(I) 190 NEXT I 200 CLOSE 1 210 PRINT"BASA DONMEK ICIN BIR TUSA BASINIZ" 220 Z$=INKEY$:IF Z$="" THEN 410 230 GOTO 20 240 REM << K A Y I T >> 250 CLS 260 INPUT "KAC KAYIT YAPACAKSINIZ";N 270 FOR I=1 TO N 280 PRINT"ADI SOYADI ";:INPUT A$(I) 290 PRINT"TELEFON NO ";:INPUT TEL(I) 300 NEXT I 310 OPEN "O",1,"DOSYA.SEQ" 320 FOR I=1 TO N 330 PRINT#1,A$(I) 340 PRINT#1,TEL(I) 350 NEXT I 360 A$(N+1)="ZZZZZ":TEL(N+1)=11111 370 PRINT#1,A$(N+1) 380 PRINT#1,TEL(N+1) 50
390 CLOSE#1 400 PRINT"BASA DONMEK ICIN BIR TUSA BASINIZ" 410 Z$=INKEY$:IF Z$="" THEN 410 420 GOTO 20 430 REM << A R A M A >> 440 PRINT"TELEFON NUMARASI OGRENECEKSENIZ...1":PRINT 450 PRINT"ISIM OGRENECEKSENIZ...2":PRINT 460 PRINT"TUSUNA BASINIZ" 470 A$=INKEY$:IF A$="" THEN 470 480 IF A$="1" THEN INPUT"ADI SOYADI";B$:GOTO 500 490 IF A$<>"2" THEN 440 ELSE INPUT "TELEFON NO=";B 500 OPEN"I",1,"DOSYA.SEQ" 510 FOR I= 1 TO 1000 520 INPUT#1,A$(I),TEL(I) 530 IF A$(I)="ZZZZZ" THEN 580 540 IF A$="1" AND B$=A$(I) THEN 570 550 IF A$="2" AND TEL(I)=B THEN 570 560 NEXT I 570 PRINT A$(I),TEL(I) 580 CLOSE#1 590 IF A$(I)<>"ZZZZZ" THEN 400 600 PRINT"ARADIGINIZ MEVCUT DEGIL" 610 GOTO 400 Şu ana kadar olan komutlarla ancak sıralı dosya yapılabilir demiştik. Öyleyse şimdi de random dosya yapabilmek için gerekli komutları görelim: LSET: LSET <dizi değişkeni>=<dizi ifadesi> Dizi ifadesini, boyutu önceden belirtilmiş olan dizi değişkeni ifadesinin içerisine soldan itibaren yerleştirir. Eğer dizi ifadesinin uzunluğu, dizi değişkeninin uzunluğundan fazla ise dizi ifadesinin yerleştirme neticesinde artacak olan kısmı atılır. Eğer tersi ise; yani dizi ifadesi, dizi değişkeni için açılan boyuttan uzun ise artan kısım boşluklarla tamamlanır. LSET A$=B$ :A$ değişkeninin boyutu önceden belirtilmiş olmak şartıyla B$ değişkeninin değerini A$ değişkeninin içerisine yerleştirir. A$ için 30 yer ayrılmış olsun. B$="MESLEK LİSESİ" olsun. Bu durumda yukarıdaki örnek komut neticesinde yerleşim şöyle olur. 51
A$="MESLEK LİSESİ..." Burada (.) işaretleri boşlukları temsil etmektedir. RSET: RSET <dizi değişkeni>=<dizi ifadesi> Dizi ifadesini, boyutu önceden belirtilmiş olan dizi değişkeni ifadesinin içerisine sağdan itibaren yerleştirir. Eğer dizi ifadesinin uzunluğu, dizi değişkeninin uzunluğundan fazla ise dizi ifadesinin yerleştirme neticesinde artacak olan kısmı atılır. Eğer tersi ise; yani dizi ifadesi, dizi değişkeni için açılan boyuttan uzun ise artan kısım boşluklarla tamamlanır. RSET A$=B$ :A$ değişkeninin boyutu önceden belirtilmiş olmak şartıyla B$ değişkeninin değerini A$ değişkeninin içerisine sağdan itibaren yerleştirir. A$ için 30 yer ayrılmış olsun. B$="MESLEK LİSESİ" olsun. Bu durumda yukarıdaki örnek komut neticesinde yerleşim şöyle olur. A$="...MESLEK LİSESİ" Burada (.) işaretleri boşlukları temsil etmektedir. FIELD: Kullanılış Formu : FIELD <#dosya numarası>,<alan listesi> Bu komut; random dosyalarda, açılmış olan dosyadaki 1 kayıt ifadesinin içeriğini bölümlendirir ve bu bölümlere daha önceden dizi değişkenine atanmış olan verileri yerleştirir. Alan listesi alan boyutları ve dizi değişkenleri olarak iki parça halinde düşünülebilir. Alan boyutları 0-255 arası tamsayılardır ve herbir değişken için ayrılan alanın uzunluğunu belirtirler. Fıeld önündeki alan boyutlarının toplamı, open önüöda belirtilen kayıt uzunluğuna eşit, veya (anahtarlı dosya ise en az iki) kısa olmalıdır. Dizi değişkeni ifadeleri ise yazısal değişkenlerden oluşur. Yazısal değişken kullanılmasının nedeni random dosyaya sayısal değişken kaydedilemeyişidir. FIELD #1,10 AS X$,15 AS Y$, 5 AS Z$ Bu örnek satırdaki ifadeye göre 2 numaralı dosyanın her bir kaydının ilk 10 karakteri X$,sonraki 15 karakteri Y$, ve sonraki 5 karakteri de Z$ değişkenine ayrılmıştır. Dizi değişkeni ifadelerinin yazısal olduğuna dikkat ediniz. 52
GET: GET <#dosya numarası>,[<kayıt numarası>] Get komutu daha önceden açılmış random dosyadan verilerin alınarak tampon hafızaya aktarılmasını sağlar. Diğer bir deyişle açılmış olan random dosyadan belirtilen numaralı kaydın okunmasını sağlar.kayıt numarası okunmak istenen kaydın numarasını belirten sayısal değişkendir. Eğer kayıt numarası kullanılmazsa 1 numaralı kayıt okunur. GET #2,I% : I%=6 ise bu satır sayesinde 2 numaralı açılmış olan random dosyadan 6. kayıt okunur. PUT: PUT <#dosya numarası>,[<kayıt numarası>] Put komutu daha önceden açılmış random dosyaya kayıt edilmek istenen verilerin tampon hafızaya aktarılmasını sağlar. Diğer bir deyişle açılmış olan random dosyaya belirtilen numaralı kaydın yazılmasını sağlar.kayıt numarası yazılmak istenen kaydın numarasını belirten sayısal değişkendir. Eğer kayıt numarası kullanılmazsa en son kayıt veya okumada kullanılan get önündeki kayıt numarası esas alınır. PUT #3,A% : A%=4 ise bu satır sayesinde 3 numaralı açılmış olan random dosyaya 3 numaralı kayıt bloğu kaydedilir. MKI$, MKS$, MKD$ Kullanılış Formları : <Yazısal Değişken>= MKI$<(2 bayt uzunluklu sayısal dizi)> <Yazısal Değişken>= MKS$<(4 bayt uzunluklu sayısal dizi)> <Yazısal Değişken>= MKD$<(8 bayt uzunluklu sayısal dizi)> Random dosyaya kayıt edilmek istenen okunan 2,4 ve 8 byte uzunluklu sayısal dizileri yazısal dizilere dönüştürürler.. 40 BRUT=2*(A+2*D) 50 FIELD #2, 10 AS A$, 4 AS B$ 60 BRUT$=MKS$(BRUT) 70 LSET B$=BRUT$ 80 LSET A$=X$ 90 PUT#1,I%. 53
CVI, CVS, CVD Kullanılış Formları : <Sayısal Değişken>= CVI <(2 bayt uzunluklu yazısal dizi)> <Sayısal Değişken>= CVS <(4 bayt uzunluklu yazısal dizi)> <Sayısal Değişken>= CVD <(8 bayt uzunluklu yazısal dizi)> Random dosyadan okunan 2,4 ve 8 byte uzunluklu yazısal dizileri sayısal değişkene dönüştürürler.. 50 FIELD #2, 10 AS A$, 4 AS B$ 60 GET #2 70 BRUT=CVS(B$). Şimdi bu komutlarla yapılmış bir telefon rehberi örneğini inceleyelim: Aşağıda istenenleri yapabilecek yetenekte olan bir basıc programını random dosya sistemiyle yapınız? İstenenler : - Program istenirse belirli bir miktar veriyi ekrana listelemeli - Bütün kayıtları ekrana listeleyebilmeli - İsme göre veya telefon numarasına göre arama yapmaya imkan vermeli 1 REM *** RANDOM DOSYA İLE TELEFON REHBERİ *** 10 DIM A$(1000),TEL(1000) 20 CLS 30 REM << MENU HAZIRLAMA >> 40 LOCATE 10,35 50 PRINT "1- O K U M A " 60 LOCATE 13,35:PRINT "2- K A Y I T" 70 LOCATE 16,35:PRINT"3- A R A M A" 80 LOCATE 20,35 : INPUT"SECIMINIZ";S 90 ON S GOTO 120,240,430 100 PRINT"3'DEN KUCUK BIR SAYI SECINIZ" 110 GOTO 80 120 CLS 130 INPUT"KAC KAYIT GORMEK ISTIYORSUNUZ";N 135 LL$="ZZZZZ" 140 OPEN "R",#1,"DOSYA",40 142 J$=SPACE$(30) 144 LSET J$=LL$ 145 FIELD #1, 30 AS A$, 10 AS TEL$ 150 FOR I%=11 TO (N+10) 160 GET #1, I% 54
170 IF A$=J$ THEN 200 180 PRINT I%;TAB(8)A$;TAB(40)TEL$ 190 NEXT I% 200 CLOSE #1 210 GOTO 410 240 REM << K A Y I T >> 250 CLS 260 INPUT "KAC KAYIT YAPACAKSINIZ";N 265 OPEN "R",1,"DOSYA",40 267 FIELD #1, 30 AS A$, 10 AS TEL$ 270 FOR I%=11 TO (N+10) 280 PRINT"ADI SOYADI ";:INPUT P$ 290 PRINT"TELEFON NO ";:INPUT L$ 292 LSET A$=P$ 294 LSET TEL$=L$ 330 PUT #1, I% 350 NEXT I% 360 S$="ZZZZZ":SS$="11111" 362 LSET A$=S$ 364 LSET TEL$=SS$ 370 PUT #1, I% 390 CLOSE #1 400 PRINT"BASA DONMEK ICIN BIR TUSA BASINIZ" 410 Z$=INKEY$:IF Z$="" THEN 410 420 GOTO 20 430 REM << A R A M A >> 440 PRINT"TELEFON NUMARASI OGRENECEKSENIZ...1":PRINT 450 PRINT"ISIM OGRENECEKSENIZ...2":PRINT 460 PRINT"TUSUNA BASINIZ" 470 T$=INKEY$:IF T$="" THEN 470 480 IF T$="1" THEN INPUT"ADI SOYADI";D$:GOTO 495 490 IF T$<>"2" THEN 440 ELSE INPUT "TELEFON NO=";B$ 495 R$=SPACE$(30):LSET R$=D$ 496 Y$=SPACE$(10):LSET Y$=B$ 497 O$="ZZZZZ" :OT$=SPACE$(30):LSET OT$=O$ 500 OPEN"R",1,"DOSYA",40 509 FIELD #1, 30 AS A$, 10 AS TEL$ 510 FOR I%=11 TO 1000 520 GET #1, I% 530 IF OT$=A$ THEN 580 540 IF T$="1" AND R$=A$ THEN 570 550 IF T$="2" AND Y$=TEL$ THEN 570 560 NEXT I% 570 PRINT A$,TEL$ 55
580 CLOSE #1 590 IF A$<>OT$ THEN 400 600 PRINT"ARADIGINIZ MEVCUT DEGIL" 610 GOTO 400 EK. ÖRNEKLER ALGORİTMA ÖRNEKLERİ 1. İki sayının toplamını bulan algoritmayı tasarlayınız? 2. GİR a 3. GİR a 4. Toplam=a+b 5. YAZ Toplam 6. DUR 2. İki sayının ortalaması bulan algoritmayı tasarlayınız? 2. GİR a 3. GİR b 4. Toplam=a+b 5. Ortalama=Toplam/2 6. YAZ Ortalama 7. DUR 3. Girilen iki sayıyı karşılaştıran algoritmayı tasarlayınız? 2. GİR a 3. GİR b 4. EĞER a>b İSE YAZ a,b den büyük :GİT7 5. EĞER a<b İSE YAZ b büyük :GİT7 6. YAZ eşit 7. DUR 56
4. Girilen farklı üç pozitif sayının en büyüğünü bulan algoritmayı tasarlayınız? 2. GİR a,b,c 3. enb=a 4. EĞER b>enb İSE enb=b 5. EĞER c>enb İSE enb=c 6. YAZ enb 7. DUR 5. Girilen bir sınır değerine kadar olan sayıların toplamının algoritmasını tasarlayınız? 2. t=0:s=0 3. GİR sınır 4. s=s+1 5. t=t+s 6. EĞER s<sınır İSE GİT 3 7. YAZ t 8. DUR 6. Girilen bir sınır değerine göre sınır değeri tek ise ortalama, çift ise çarpımını bulan algoritmayı tasarlayınız? 2. GİR sınır 3. x=sınır 4. Çift=0:tek=-1:s=0:top=0:carp=1 5. x=x-2 6. x=-1 İSE GİT 8 7. x=0 İSE GİT 13 8. GİT 4 9. tek=tek+2 10. s=s+1 11. top=top+tek 12. EĞER tek<sınır İSE GİT 8 13. YAZ toplam:dur 14. çift=çift+2 15. carp=carp*çift 16. EĞER çift<sınır İSE GİT 13 17. YAZ carp 18. DUR 57
7. Bir mağazada uygulanan indirim oranları 20 milyona kadar yapılan alışverişlerde %5,20 milyon üzeri ve 50 milyona kadar olan alışverişlerde %10, 50 milyondan sonrası için %15 indirim uygulanmaktadır. Müşterinin yaptığı alışveriş değerine göre ödeyeceği net rakamı bulan algoritmayı tasarlayınız? 2. GİR Toplam fiyatı: ;f 3. EĞER f<20.000.000 İSE a=(f*5)/100 f=f-a YAZ f DUR 4. EĞER f>20.000.000 ve f<=50.000.000 İSE a=f*0,10 f=f-a YAZ f DUR 5. EĞER f>50.000.000 İSE a=f*0,15 f=f-a YAZ f DUR 8. Girilen alt sınır ile üst sınır arasında üç ile bölünebilen sayıların ortalamasını bulan algoritmayı tasarlayınız? 2. n=0:t=0 3. GİR alt,ust 4. x=ust 5. x=x-3 6. EĞER x=0 İSE GİT10 7. EĞER x=1 İSE alt=alt+2: GİT10 8. EĞER x=2 İSE alt=alt+1: GİT10 9. GİT5 10. DÖNGÜ i=alt,ust,3 11. t=t+i 12. n=n+1 13. DÖNGÜ SONU i 14. Ort=t/n 15. YAZ Ort 16. DUR 58