<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Pir Zöhre Ana Forum - Pascal]]></title>
		<link>https://www.zohreanaforum.com/</link>
		<description><![CDATA[Pir Zöhre Ana Forum - https://www.zohreanaforum.com]]></description>
		<pubDate>Wed, 29 Apr 2026 09:01:02 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Pascal Programının  Genel Yapısı]]></title>
			<link>https://www.zohreanaforum.com/konu-pascal-programinin-genel-yapisi.html</link>
			<pubDate>Fri, 05 Dec 2008 14:10:55 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-pascal-programinin-genel-yapisi.html</guid>
			<description><![CDATA[Pascalın en önemli özelliklerinde birisi de yapısal bir programlama dili olmasıdır. Bu programınızı yazarken size maksimum esneklik sağlar. Aynı zamanda yazdığınız program parçalarını problemsiz bir şekilde birleştirmenizi de sağlar.<br />
<br />
Her pascal programının ana kodu mutlaka bir BEGIN deyimi ile başlar ve END. deyimi ile biter. (End den sonra nokta olduğuna dikkatinizi çekerim. Pascal derleyicisi için bu tüm programın bittiği yer anlamına gelir.) Eğer program içerisinde aynı blok içerisinde işlem görmesini istediğiniz kodlarınız varsa bunları bir BEGIN - END bloğu içerisine alırsınız. Fakat bu sefer END&#8217;den sonra noktalı virgül (<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" /> kullanmalısınız.<br />
<br />
Bir Pascal programının genel yapısı aşağıdaki gibidir.<br />
<br />
Program (* Program başlığı. Buraya yazacaklarınızın programa bir etlisi olmaz *)<br />
Uses (* Kullanılacak harici kütüphaneleri belirler*)<br />
Type (* Tip tanımalamalarının yapıldığı blok *)<br />
&#8230;<br />
Const (* Sabit tanımları ve ilk değer atamaları *)<br />
&#8230;<br />
Var (* değişken tanımlamalarının yapıldığı blok *)<br />
&#8230;<br />
Procedure (* Procedure ve functionlar ana programdan önce yazılırlar. *)<br />
Function    (* Onların içinde de yerel değişken ve tip tanımalamaları için *)<br />
<br />
   Const     (* tıpkı ana programda olduğu gibi bloklar kullanılır.*)<br />
   &#8230;<br />
   Var<br />
   &#8230;<br />
   Type<br />
   &#8230;<br />
<br />
   begin<br />
   &#8230;<br />
   end; { procedure veya function}<br />
<br />
begin {ana program }<br />
komutlar;<br />
<br />
&#8230;<br />
<br />
end.  ]]></description>
			<content:encoded><![CDATA[Pascalın en önemli özelliklerinde birisi de yapısal bir programlama dili olmasıdır. Bu programınızı yazarken size maksimum esneklik sağlar. Aynı zamanda yazdığınız program parçalarını problemsiz bir şekilde birleştirmenizi de sağlar.<br />
<br />
Her pascal programının ana kodu mutlaka bir BEGIN deyimi ile başlar ve END. deyimi ile biter. (End den sonra nokta olduğuna dikkatinizi çekerim. Pascal derleyicisi için bu tüm programın bittiği yer anlamına gelir.) Eğer program içerisinde aynı blok içerisinde işlem görmesini istediğiniz kodlarınız varsa bunları bir BEGIN - END bloğu içerisine alırsınız. Fakat bu sefer END&#8217;den sonra noktalı virgül (<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" /> kullanmalısınız.<br />
<br />
Bir Pascal programının genel yapısı aşağıdaki gibidir.<br />
<br />
Program (* Program başlığı. Buraya yazacaklarınızın programa bir etlisi olmaz *)<br />
Uses (* Kullanılacak harici kütüphaneleri belirler*)<br />
Type (* Tip tanımalamalarının yapıldığı blok *)<br />
&#8230;<br />
Const (* Sabit tanımları ve ilk değer atamaları *)<br />
&#8230;<br />
Var (* değişken tanımlamalarının yapıldığı blok *)<br />
&#8230;<br />
Procedure (* Procedure ve functionlar ana programdan önce yazılırlar. *)<br />
Function    (* Onların içinde de yerel değişken ve tip tanımalamaları için *)<br />
<br />
   Const     (* tıpkı ana programda olduğu gibi bloklar kullanılır.*)<br />
   &#8230;<br />
   Var<br />
   &#8230;<br />
   Type<br />
   &#8230;<br />
<br />
   begin<br />
   &#8230;<br />
   end; { procedure veya function}<br />
<br />
begin {ana program }<br />
komutlar;<br />
<br />
&#8230;<br />
<br />
end.  ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[If...Then...Else]]></title>
			<link>https://www.zohreanaforum.com/konu-if-then-else--8385.html</link>
			<pubDate>Fri, 05 Dec 2008 14:09:03 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-if-then-else--8385.html</guid>
			<description><![CDATA[Eğer&#8230;ise&#8230;değilse (If..then..else) Karar yapısı : Program yazarken en çok yapılan işlerin başında elinizdeki verilere bakarak bir karar vermek ve programın akışını bu karara göre yönlendirmek gelir. İyi programda gerekli yerlerde doğru ve etkili karar yapıları oluşturmak çok önemlidir. Çünkü bir programda en yavaş işleyen komutlardan birisi karşılaştırma komutlarıdır. Pascalda en çok kullanılan karşılaştırma ve kontrol komutu If..then..else dir.<br />
<br />
If deyiminden sonra yapılacak karşılaştırmanın sonucu doğru(True) ise then deyiminden sonraki blok işler. Eğer karşılaştırmanın sonucu yanlış(False) ise bu sefer de else deyiminden sonraki blok işler.Else deyimi seçimlik bir deyimdir. Yani isterseniz, ya da gerekmezse bu kısmı kullanmayabilirsiniz. Bu durumda eğer karşılaştırma sonucu yanlış ise program bir sonraki komutla akışına devam eder.<br />
<br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] Eğer else kullanacaksanız else den önceki satırda noktalı virgül kullanmamalısınız.    <br />
<br />
...<br />
If &lt;karşılaştırma&gt; then<br />
begin<br />
...<br />
komutlar<br />
...<br />
end;<br />
[ else<br />
begin<br />
...<br />
komutlar<br />
...<br />
end;]<br />
...   <br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] Karşılaştırma için kullanabileceğiniz operatörler için buraya tıklayın.    <br />
<br />
<span style="font-weight: bold;" class="mycode_b">ÖRNEK:   </span><br />
Girilen bir sayının pozitif veya negatif olduğunu söyleyen program.<br />
<br />
Var<br />
Sayi : integer;<br />
begin<br />
write(&#8216;Bir sayı girin : &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
readln(Sayi);<br />
if Sayi &lt; 0 then<br />
writeln(&#8216;Sayi negatiftir&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" /><br />
else<br />
writeln(&#8216;Sayi Poszitiftir&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
end.  <br />
<br />
Eğer isterseniz iç içe if kullanmaya devam edebilirsiniz. Bu oldukça karmaşık bir yapı oluşturabilir ancak bazı durumlarda böylesi uygulamalar zaruri olur.<br />
<br />
Örneğin, yazdığımız bir programda eğer girilmiş olan sayı 0&#8217;dan büyükse ve 128&#8217;den küçükse I değişkenine 1 eklesin, 128..256 arasında ise I&#8217;ya 10 eklesin, 256&#8217;dan büyükse I&#8217;ya 100 eklesin. Aynı zamanda eğer bu sayı 0&#8217;dan küçükse ve &#8211;127&#8217;den büyükse 1 eksiltsin, -127..-255 arasındaysa 10 eksiltsin ve &#8211;255&#8217;den de küçükse 100 I&#8217;dan 100 eksiltsin. Bir okuyuşta anlaması bile zor olan böyle bir işlem için karşılaştırma işlemlerini ayrı ayrı yapmak veya iç içe if kullanmak durumunda kalırız ve tabii sonuç genellikle yanlış çıkar. Fakat biraz dikkat ve biraz da pratik yapmakla bu işi halletmek mümkündür. Şimdi size 2 çalışır program örnegi vereceğim. İkisi de doğru çalışıyor fakat birisi daha profesyonelce hazırlanmış. Örnekleri incelerseniz karşılaştırma komutlarından ilki olan if..then..else deyimi ile hiçbir probleminiz kalmaz.<br />
<br />
Const<br />
   I : integer = 500;<br />
Var<br />
   Sayi : integer;<br />
Begin<br />
   Write('Bir sayı girin : ');<br />
   Readln(Sayi);<br />
  If (sayi &gt; 0) and (sayi &lt; 128) then<br />
     I := I+1;<br />
  If (sayi &gt;= 128) and (sayi &lt; 256) then<br />
     I := I+10;<br />
  If (sayi &gt;= 256) then<br />
     I := I+100;<br />
  If (sayi &lt; 0) and (sayi &gt; -127) then<br />
     I := I-1;<br />
  If (sayi &lt;= -127) and (sayi &gt; -255) then<br />
     I := I-10;<br />
  If (sayi =&lt; -255) then<br />
     I := I-100;<br />
  Writeln('İşlem sonucu I da kalan= ',I);<br />
End.  Const<br />
   I : integer = 500;<br />
Var<br />
   Sayi : integer;<br />
Begin<br />
   Write(&#8216;Bir sayı girin : &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
   Readln(Sayi);<br />
   If sayı &gt; 0 then<br />
       If sayı &gt; 128 then<br />
          If sayı &gt; 256 then<br />
              I := I + 100<br />
          Else<br />
              I := I +10<br />
      Else<br />
          I:= I+1<br />
    Else<br />
       If sayi &lt; -127 then<br />
           If sayi &lt; -256 then<br />
               I := I &#8211; 100<br />
           Else<br />
              I := I &#8211; 10<br />
       Else<br />
           I := I &#8211; 1;<br />
   Writeln(&#8216;İşlem sonucu I da kalan=&#8216; , I);<br />
End.  ]]></description>
			<content:encoded><![CDATA[Eğer&#8230;ise&#8230;değilse (If..then..else) Karar yapısı : Program yazarken en çok yapılan işlerin başında elinizdeki verilere bakarak bir karar vermek ve programın akışını bu karara göre yönlendirmek gelir. İyi programda gerekli yerlerde doğru ve etkili karar yapıları oluşturmak çok önemlidir. Çünkü bir programda en yavaş işleyen komutlardan birisi karşılaştırma komutlarıdır. Pascalda en çok kullanılan karşılaştırma ve kontrol komutu If..then..else dir.<br />
<br />
If deyiminden sonra yapılacak karşılaştırmanın sonucu doğru(True) ise then deyiminden sonraki blok işler. Eğer karşılaştırmanın sonucu yanlış(False) ise bu sefer de else deyiminden sonraki blok işler.Else deyimi seçimlik bir deyimdir. Yani isterseniz, ya da gerekmezse bu kısmı kullanmayabilirsiniz. Bu durumda eğer karşılaştırma sonucu yanlış ise program bir sonraki komutla akışına devam eder.<br />
<br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] Eğer else kullanacaksanız else den önceki satırda noktalı virgül kullanmamalısınız.    <br />
<br />
...<br />
If &lt;karşılaştırma&gt; then<br />
begin<br />
...<br />
komutlar<br />
...<br />
end;<br />
[ else<br />
begin<br />
...<br />
komutlar<br />
...<br />
end;]<br />
...   <br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] Karşılaştırma için kullanabileceğiniz operatörler için buraya tıklayın.    <br />
<br />
<span style="font-weight: bold;" class="mycode_b">ÖRNEK:   </span><br />
Girilen bir sayının pozitif veya negatif olduğunu söyleyen program.<br />
<br />
Var<br />
Sayi : integer;<br />
begin<br />
write(&#8216;Bir sayı girin : &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
readln(Sayi);<br />
if Sayi &lt; 0 then<br />
writeln(&#8216;Sayi negatiftir&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" /><br />
else<br />
writeln(&#8216;Sayi Poszitiftir&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
end.  <br />
<br />
Eğer isterseniz iç içe if kullanmaya devam edebilirsiniz. Bu oldukça karmaşık bir yapı oluşturabilir ancak bazı durumlarda böylesi uygulamalar zaruri olur.<br />
<br />
Örneğin, yazdığımız bir programda eğer girilmiş olan sayı 0&#8217;dan büyükse ve 128&#8217;den küçükse I değişkenine 1 eklesin, 128..256 arasında ise I&#8217;ya 10 eklesin, 256&#8217;dan büyükse I&#8217;ya 100 eklesin. Aynı zamanda eğer bu sayı 0&#8217;dan küçükse ve &#8211;127&#8217;den büyükse 1 eksiltsin, -127..-255 arasındaysa 10 eksiltsin ve &#8211;255&#8217;den de küçükse 100 I&#8217;dan 100 eksiltsin. Bir okuyuşta anlaması bile zor olan böyle bir işlem için karşılaştırma işlemlerini ayrı ayrı yapmak veya iç içe if kullanmak durumunda kalırız ve tabii sonuç genellikle yanlış çıkar. Fakat biraz dikkat ve biraz da pratik yapmakla bu işi halletmek mümkündür. Şimdi size 2 çalışır program örnegi vereceğim. İkisi de doğru çalışıyor fakat birisi daha profesyonelce hazırlanmış. Örnekleri incelerseniz karşılaştırma komutlarından ilki olan if..then..else deyimi ile hiçbir probleminiz kalmaz.<br />
<br />
Const<br />
   I : integer = 500;<br />
Var<br />
   Sayi : integer;<br />
Begin<br />
   Write('Bir sayı girin : ');<br />
   Readln(Sayi);<br />
  If (sayi &gt; 0) and (sayi &lt; 128) then<br />
     I := I+1;<br />
  If (sayi &gt;= 128) and (sayi &lt; 256) then<br />
     I := I+10;<br />
  If (sayi &gt;= 256) then<br />
     I := I+100;<br />
  If (sayi &lt; 0) and (sayi &gt; -127) then<br />
     I := I-1;<br />
  If (sayi &lt;= -127) and (sayi &gt; -255) then<br />
     I := I-10;<br />
  If (sayi =&lt; -255) then<br />
     I := I-100;<br />
  Writeln('İşlem sonucu I da kalan= ',I);<br />
End.  Const<br />
   I : integer = 500;<br />
Var<br />
   Sayi : integer;<br />
Begin<br />
   Write(&#8216;Bir sayı girin : &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
   Readln(Sayi);<br />
   If sayı &gt; 0 then<br />
       If sayı &gt; 128 then<br />
          If sayı &gt; 256 then<br />
              I := I + 100<br />
          Else<br />
              I := I +10<br />
      Else<br />
          I:= I+1<br />
    Else<br />
       If sayi &lt; -127 then<br />
           If sayi &lt; -256 then<br />
               I := I &#8211; 100<br />
           Else<br />
              I := I &#8211; 10<br />
       Else<br />
           I := I &#8211; 1;<br />
   Writeln(&#8216;İşlem sonucu I da kalan=&#8216; , I);<br />
End.  ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Case...Of]]></title>
			<link>https://www.zohreanaforum.com/konu-case-of.html</link>
			<pubDate>Fri, 05 Dec 2008 14:07:52 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-case-of.html</guid>
			<description><![CDATA[if..then..else genellikle az sayıda olan karşılaştırmalarda kullanılır. Ama eğer yapılan karşılaştırma çok karmaşıksa o zaman bu deyimi kullanmak oldukça zor olur ve çok fazla miktarda mantık hataları bulunur. Bunu engellemek için blok if deyimi diyebileceğimiz Case yapısını kullanırız.<br />
<br />
Case yapısında karşılaştırmanın yapılacağı değişkenin alabileceği değerler göre çeşitli işlemleri toplu olarak yapabiliriz. Bir önceki konuda gösterdiğimiz örneği ele alalım. Bir if deyimi için oldukça karmaşık olan bu örnekği bir de case ile çözelim. Tabii öncelikle Case&#8217;in genel yazılışını veriyoruz.<br />
<br />
case degişken of<br />
durum-1 : işlem(ler);<br />
...<br />
durum-n : işlem(ler);<br />
end;   <br />
<br />
Veya<br />
<br />
case değişken of<br />
durum-1 : işlem(ler);<br />
...<br />
durum-n : işlem(ler);<br />
else<br />
işlem(ler)<br />
end;   <br />
<br />
Durum dediğimiz yerlerde bir yada daha fazla, virgülle ayrılmış, sabitler veya aralıklar olabilir. Mesela :<br />
<br />
case Ch of<br />
'A'..'Z', 'a'..'z' : WriteLn('Harf');<br />
'0'..'9' : WriteLn('Rakam');<br />
'+', '-', '*', '/' : WriteLn('Operator');<br />
else<br />
WriteLn('Özel karakter');  <br />
<br />
Else kısmı ise tamamen seçimliktir. İstemezseniz kullanmayabilirsiniz. Şimdi gelelim örneğimize&#8230; Eğer daha bakmadıysanız önceki konuyu (if-then-else)okumanızı tavsiye ederim. Yine de soruyu tekrar soruyorum. Bu sorunun hiçbir amacı olmadığını sadece bir örnek olduğunu belirtmek isterim. Boşboşuna "Buna bu nedir?..Ne işe yarar?..Ben kimim?.. Niye burdayım?" gibi felsefi konulara girmeyin. Siz örneği anlayın yeter.<br />
<br />
Yazdığımız bir programda girilmiş olan sayı eğer 0&#8217;dan büyükse ve 128&#8217;den küçükse I değişkenine 1 eklesin, 128..256 arasında ise I&#8217;ya 10 eklesin, 256&#8217;dan büyükse I&#8217;ya 100 eklesin. Aynı zamanda eğer bu sayı 0&#8217;dan küçükse ve &#8211;127&#8217;den büyükse 1 eksiltsin, -127..-255 arasındaysa 10 eksiltsin ve &#8211;255&#8217;den de küçükse I&#8217;dan 100 eksiltsin.<br />
<br />
Const<br />
I : integer = 500;<br />
Var<br />
Sayi : integer;<br />
Begin<br />
Write(&#8216;Bir sayı girin : &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
Readln(Sayi);<br />
If (sayi &gt; 0) and (sayi &lt; 128) then<br />
I := I+1;<br />
If (sayi &gt;= 128) and (sayi &lt; 256) then<br />
I := I+10;<br />
If (sayi &gt;= 256) then<br />
I := I+100;<br />
If (sayi &lt; 0) and (sayi &gt; -127) then<br />
I := I-1;<br />
If (sayi &lt;= -127) and (sayi &gt; -255) then<br />
I := I-10;<br />
If (sayi =&lt; -255) then<br />
I := I-100;<br />
Writeln(&#8216;İşlem sonucu I da kalan=&#8216; , I);<br />
End.<br />
  Const<br />
I : integer = 500;<br />
Var<br />
Sayi : integer;<br />
Begin<br />
Write('Bir sayi girin : ');<br />
readln(Sayi);<br />
case Sayi of<br />
0..128: I:= I + 1;<br />
128..256: I := I + 10 ;<br />
256..32767 : I := I + 100;<br />
-127..0 : I := I - 1;<br />
-255..-128 : I := I - 10;<br />
-32768..-256 : I := I - 100;<br />
end;<br />
writeln('Islem sonunda I değeri =',I);<br />
end.<br />
  ]]></description>
			<content:encoded><![CDATA[if..then..else genellikle az sayıda olan karşılaştırmalarda kullanılır. Ama eğer yapılan karşılaştırma çok karmaşıksa o zaman bu deyimi kullanmak oldukça zor olur ve çok fazla miktarda mantık hataları bulunur. Bunu engellemek için blok if deyimi diyebileceğimiz Case yapısını kullanırız.<br />
<br />
Case yapısında karşılaştırmanın yapılacağı değişkenin alabileceği değerler göre çeşitli işlemleri toplu olarak yapabiliriz. Bir önceki konuda gösterdiğimiz örneği ele alalım. Bir if deyimi için oldukça karmaşık olan bu örnekği bir de case ile çözelim. Tabii öncelikle Case&#8217;in genel yazılışını veriyoruz.<br />
<br />
case degişken of<br />
durum-1 : işlem(ler);<br />
...<br />
durum-n : işlem(ler);<br />
end;   <br />
<br />
Veya<br />
<br />
case değişken of<br />
durum-1 : işlem(ler);<br />
...<br />
durum-n : işlem(ler);<br />
else<br />
işlem(ler)<br />
end;   <br />
<br />
Durum dediğimiz yerlerde bir yada daha fazla, virgülle ayrılmış, sabitler veya aralıklar olabilir. Mesela :<br />
<br />
case Ch of<br />
'A'..'Z', 'a'..'z' : WriteLn('Harf');<br />
'0'..'9' : WriteLn('Rakam');<br />
'+', '-', '*', '/' : WriteLn('Operator');<br />
else<br />
WriteLn('Özel karakter');  <br />
<br />
Else kısmı ise tamamen seçimliktir. İstemezseniz kullanmayabilirsiniz. Şimdi gelelim örneğimize&#8230; Eğer daha bakmadıysanız önceki konuyu (if-then-else)okumanızı tavsiye ederim. Yine de soruyu tekrar soruyorum. Bu sorunun hiçbir amacı olmadığını sadece bir örnek olduğunu belirtmek isterim. Boşboşuna "Buna bu nedir?..Ne işe yarar?..Ben kimim?.. Niye burdayım?" gibi felsefi konulara girmeyin. Siz örneği anlayın yeter.<br />
<br />
Yazdığımız bir programda girilmiş olan sayı eğer 0&#8217;dan büyükse ve 128&#8217;den küçükse I değişkenine 1 eklesin, 128..256 arasında ise I&#8217;ya 10 eklesin, 256&#8217;dan büyükse I&#8217;ya 100 eklesin. Aynı zamanda eğer bu sayı 0&#8217;dan küçükse ve &#8211;127&#8217;den büyükse 1 eksiltsin, -127..-255 arasındaysa 10 eksiltsin ve &#8211;255&#8217;den de küçükse I&#8217;dan 100 eksiltsin.<br />
<br />
Const<br />
I : integer = 500;<br />
Var<br />
Sayi : integer;<br />
Begin<br />
Write(&#8216;Bir sayı girin : &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
Readln(Sayi);<br />
If (sayi &gt; 0) and (sayi &lt; 128) then<br />
I := I+1;<br />
If (sayi &gt;= 128) and (sayi &lt; 256) then<br />
I := I+10;<br />
If (sayi &gt;= 256) then<br />
I := I+100;<br />
If (sayi &lt; 0) and (sayi &gt; -127) then<br />
I := I-1;<br />
If (sayi &lt;= -127) and (sayi &gt; -255) then<br />
I := I-10;<br />
If (sayi =&lt; -255) then<br />
I := I-100;<br />
Writeln(&#8216;İşlem sonucu I da kalan=&#8216; , I);<br />
End.<br />
  Const<br />
I : integer = 500;<br />
Var<br />
Sayi : integer;<br />
Begin<br />
Write('Bir sayi girin : ');<br />
readln(Sayi);<br />
case Sayi of<br />
0..128: I:= I + 1;<br />
128..256: I := I + 10 ;<br />
256..32767 : I := I + 100;<br />
-127..0 : I := I - 1;<br />
-255..-128 : I := I - 10;<br />
-32768..-256 : I := I - 100;<br />
end;<br />
writeln('Islem sonunda I değeri =',I);<br />
end.<br />
  ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[For...Do Dongusu]]></title>
			<link>https://www.zohreanaforum.com/konu-for-do-dongusu.html</link>
			<pubDate>Fri, 05 Dec 2008 14:06:23 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-for-do-dongusu.html</guid>
			<description><![CDATA[Bilgisayarların en güzel yanlarından birisi de hiç sıkılmadan, şikayet etmeden aynı şeyleri yapabilmeleridir. Böylesine tekrar tekrar çalışması gereken işlemleri, bir programlama dilinde ancak döngüler vasıtası ile sağlayabiliriz. Aşağıda bu döngülerin çeşitlerini ve Pascalda nasıl kullanıldıklarını görebilirsiniz.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">FOR...TO DÖNGÜSÜ  </span><br />
<br />
En basit döngü çeşididir. Kendisinden sonra gelen deyim veya deyimler gurubunu verilen sayı kadar çalıştırmaya yarar. Öncelikle yapısını görelim :<br />
for değişken := ilk_değer to son_değer do komut;   <br />
<br />
veya<br />
<br />
for değişken := ilk_değer to son_değer do<br />
begin<br />
    komut(lar)<br />
end;   <br />
<br />
<span style="font-weight: bold;" class="mycode_b">FOR..DOWNTO DÖNGÜSÜ  </span><br />
<br />
for değişken := ilk_değer downto son_değer do komut;<br />
   <br />
<br />
Veya<br />
<br />
for değişken := ilk_değer downto son_değer do<br />
begin<br />
   komut(lar)<br />
end;   <br />
<br />
Şimdi bu yapıya bakarak sizlere çalışma mantığını anlatmaya çalışalım. For deyiminden sonra sayaç olarak kullanılacak bir tamsayı değişken kullanılır. Döngü işlemi bu değişkenin ilk değerinden başlar ve son değere kadar 1&#8217;er 1&#8217;er artar (to) veya azalır(downto). Bazı başka dillerdekinin aksine ne artış miktarını ayarlayabilirsiniz ne de ondalıklı sayıları kullanabilirsiniz. Döngü kendisinden sonra gelen ilk deyimi veya begin..end bloğunu işletir. Döngü içinde iken döngü değişkenine müdahale etmek mümkün olmakla birlikte bunu yapmak sakıncalı olabilir. Bu yüzden döngü değişkenleri genellikle döngü içerisinde işleme tabi tutulmaz.<br />
<br />
Bu kadar teorik bilgiden sonra şimdi bir örnek ile konumuzu pekiştirelim.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Örnek:  </span><br />
<br />
var<br />
   i: integer;<br />
   ismin : string;<br />
begin<br />
   write('Ismini gir sahip :');<br />
   readln(ismin);<br />
   for i := 1 to 15 do<br />
   writeln('Merhaba ',ismin,' sahip');<br />
end.  ]]></description>
			<content:encoded><![CDATA[Bilgisayarların en güzel yanlarından birisi de hiç sıkılmadan, şikayet etmeden aynı şeyleri yapabilmeleridir. Böylesine tekrar tekrar çalışması gereken işlemleri, bir programlama dilinde ancak döngüler vasıtası ile sağlayabiliriz. Aşağıda bu döngülerin çeşitlerini ve Pascalda nasıl kullanıldıklarını görebilirsiniz.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">FOR...TO DÖNGÜSÜ  </span><br />
<br />
En basit döngü çeşididir. Kendisinden sonra gelen deyim veya deyimler gurubunu verilen sayı kadar çalıştırmaya yarar. Öncelikle yapısını görelim :<br />
for değişken := ilk_değer to son_değer do komut;   <br />
<br />
veya<br />
<br />
for değişken := ilk_değer to son_değer do<br />
begin<br />
    komut(lar)<br />
end;   <br />
<br />
<span style="font-weight: bold;" class="mycode_b">FOR..DOWNTO DÖNGÜSÜ  </span><br />
<br />
for değişken := ilk_değer downto son_değer do komut;<br />
   <br />
<br />
Veya<br />
<br />
for değişken := ilk_değer downto son_değer do<br />
begin<br />
   komut(lar)<br />
end;   <br />
<br />
Şimdi bu yapıya bakarak sizlere çalışma mantığını anlatmaya çalışalım. For deyiminden sonra sayaç olarak kullanılacak bir tamsayı değişken kullanılır. Döngü işlemi bu değişkenin ilk değerinden başlar ve son değere kadar 1&#8217;er 1&#8217;er artar (to) veya azalır(downto). Bazı başka dillerdekinin aksine ne artış miktarını ayarlayabilirsiniz ne de ondalıklı sayıları kullanabilirsiniz. Döngü kendisinden sonra gelen ilk deyimi veya begin..end bloğunu işletir. Döngü içinde iken döngü değişkenine müdahale etmek mümkün olmakla birlikte bunu yapmak sakıncalı olabilir. Bu yüzden döngü değişkenleri genellikle döngü içerisinde işleme tabi tutulmaz.<br />
<br />
Bu kadar teorik bilgiden sonra şimdi bir örnek ile konumuzu pekiştirelim.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Örnek:  </span><br />
<br />
var<br />
   i: integer;<br />
   ismin : string;<br />
begin<br />
   write('Ismini gir sahip :');<br />
   readln(ismin);<br />
   for i := 1 to 15 do<br />
   writeln('Merhaba ',ismin,' sahip');<br />
end.  ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Repeat..Until döngüsü]]></title>
			<link>https://www.zohreanaforum.com/konu-repeat-until-dongusu.html</link>
			<pubDate>Fri, 05 Dec 2008 14:05:44 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-repeat-until-dongusu.html</guid>
			<description><![CDATA[Repeat deyimi ile until deyimi arasında kalan işlemleri untildeki koşul yanlış olduğu sürece tekrarlar. Untildeki koşul(lar) doğru olduğu anda döngüden çıkar.<br />
 <br />
Repeat   <br />
...   <br />
işlemler;   <br />
...   <br />
Until koşul(lar);   <br />
 <br />
<span style="font-weight: bold;" class="mycode_b">Örnek :  </span><br />
 <br />
Var  <br />
I : Integer;  <br />
begin  <br />
repeat  <br />
Write('Bir sayı giriniz : ');  <br />
ReadLn(I);  <br />
until (I &gt;= 0) and (I &lt;= 9);  <br />
writeln(&#8216;Sayı 0..9 arasındadir.&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
End.  <br />
 <br />
 <br />
 <br />
 <br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003fNe olursa olsun şarta bakana kadar döngüyü bir kez çalıştırır.    <br />
 <br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] Until'de belirtilen şart doğru olduğu sürece çalışır.   ]]></description>
			<content:encoded><![CDATA[Repeat deyimi ile until deyimi arasında kalan işlemleri untildeki koşul yanlış olduğu sürece tekrarlar. Untildeki koşul(lar) doğru olduğu anda döngüden çıkar.<br />
 <br />
Repeat   <br />
...   <br />
işlemler;   <br />
...   <br />
Until koşul(lar);   <br />
 <br />
<span style="font-weight: bold;" class="mycode_b">Örnek :  </span><br />
 <br />
Var  <br />
I : Integer;  <br />
begin  <br />
repeat  <br />
Write('Bir sayı giriniz : ');  <br />
ReadLn(I);  <br />
until (I &gt;= 0) and (I &lt;= 9);  <br />
writeln(&#8216;Sayı 0..9 arasındadir.&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
End.  <br />
 <br />
 <br />
 <br />
 <br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003fNe olursa olsun şarta bakana kadar döngüyü bir kez çalıştırır.    <br />
 <br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] Until'de belirtilen şart doğru olduğu sürece çalışır.   ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[While-Do Döngüsü]]></title>
			<link>https://www.zohreanaforum.com/konu-while-do-dongusu.html</link>
			<pubDate>Fri, 05 Dec 2008 14:04:38 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-while-do-dongusu.html</guid>
			<description><![CDATA[Whiledan sonraki koşul doğru olduğu sürece işlem(ler) tekrarlanır. Whiledaki koşul(lar) doğru olduğu anda döngüden çıkar.<br />
<br />
While koşul(lar) do<br />
Begin<br />
...<br />
işlemler;<br />
...<br />
End;   <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Örnek :  </span><br />
<br />
Var<br />
   I : Integer;<br />
begin<br />
   I := 100;<br />
   while((I &gt;= 0) and (I &lt;= 9)) do<br />
   begin<br />
        Write('Bir sayı giriniz : ');<br />
        ReadLn(I);<br />
   end;<br />
   writeln(&#8216;Sayı 0..9 arasındadir.&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
End.  <br />
<br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]Repeat-Until Döngüsünden farklı olarak öncelikle koşual bakılır sonra döngü başlar.   <br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] 1-Döngüden çıkabilmek için mutlaka koşulun döngü içinde değişmesi gerektiğine dikkat edin.   <br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]2-Birden fazla koşul kullanacaksanız bu koşulların tümünü bir parantez içine alın.   ]]></description>
			<content:encoded><![CDATA[Whiledan sonraki koşul doğru olduğu sürece işlem(ler) tekrarlanır. Whiledaki koşul(lar) doğru olduğu anda döngüden çıkar.<br />
<br />
While koşul(lar) do<br />
Begin<br />
...<br />
işlemler;<br />
...<br />
End;   <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Örnek :  </span><br />
<br />
Var<br />
   I : Integer;<br />
begin<br />
   I := 100;<br />
   while((I &gt;= 0) and (I &lt;= 9)) do<br />
   begin<br />
        Write('Bir sayı giriniz : ');<br />
        ReadLn(I);<br />
   end;<br />
   writeln(&#8216;Sayı 0..9 arasındadir.&#8217<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;<br />
End.  <br />
<br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]Repeat-Until Döngüsünden farklı olarak öncelikle koşual bakılır sonra döngü başlar.   <br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f] 1-Döngüden çıkabilmek için mutlaka koşulun döngü içinde değişmesi gerektiğine dikkat edin.   <br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]2-Birden fazla koşul kullanacaksanız bu koşulların tümünü bir parantez içine alın.   ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Pascalda Type Bloğunun Kullanımı]]></title>
			<link>https://www.zohreanaforum.com/konu-pascalda-type-blogunun-kullanimi.html</link>
			<pubDate>Fri, 05 Dec 2008 14:04:03 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-pascalda-type-blogunun-kullanimi.html</guid>
			<description><![CDATA[Data tipleri programcının compiler&#8217;e datanın nasıl saklanacağını bildirmekte kullandıkları bir yoldur. Bir değişken tanımlandığı anda onun data tipinide mutlaka tanımlamak zorundasınızdır.<br />
<br />
Bazı data tipleri kullanılan dil tarafından standart olarak tanımlanmıştır zaten.Diğer tipleri<br />
ise kullanıcı kendisi tanımlayabilir.Pascal bu tip bir esnekliği ilk sağlayan dillerden birisidir.<br />
Kullanıcı tarafından tanımlanan tipler Pascalda TYPE bloğunda tanımlanır.<br />
<br />
<br />
Type<br />
  tip1 = tip_tanımı1; (* Her yeni tipe bir isim verilir ve önceden tanımlı tipler kullanılarak tanımlanır *)<br />
  tip2 = tip_tanımı2; (* İstediğimiz kadar tip tanımı yapabiliriz *)<br />
  tip3 = tip1; { Yeni tanımladığımız bir tipi başka bir tip tanımı için de kullanabiliriz. Tip tanımları bazen çok karmaşık olabilecekleri gibi bazen de çok basit olabilirler }<br />
  int = integer;<br />
  CharData = array['A'..'Z'] of Byte;<br />
<br />
Var<br />
  var1 : tip3   (* her yeni değişken için bir isim ve bir tip verilir. *)<br />
  var2, var3 : tip2    (* aynı tipte olan değişkenler bir defada tanımlanabilir *)<br />
  Sayı : int;<br />
  Char_dizi : CharData;<br />
  <br />
<br />
<br />
Type bloğunun en önemli kullanım yerleri ise record (kayıt) ve set (küme) tipi tanımlardır.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Record yapısı:  </span><br />
Record tipi dosyalama işlemlerinde kayıt desenini oluşturmakta kullanılır.Yani bir tek kayıt için,<br />
o kaydın hangi alanına hangi değişkenlerle erişilebileceğinin tanımlanmasında kullanılır.Örneğin<br />
öğrenci takibi programı yapılacaksa, bunun için aynı kayıtta hem adı, hem soyadı hem de öğrenci<br />
no&#8217;su tutulacak olsun.Bu kayıtları tek tek değişkenlere atayıp sonra dosyaya tek tek yazdırmak<br />
yerine, hepsini record yapısı içindeki değişkenlere atayıp bir defada dosyaya yazdırmak daha<br />
kolaydır.Buna benzer şekilde record yapısında tanımlı bir değişkenin içine dosyadan bir kayıt<br />
okuduğunuzda istediğiniz alanlara kolaylıkla erişirsiniz.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Örnek :   </span><br />
<br />
<br />
Type<br />
    Ogr_Kayit = record<br />
          No : integer;<br />
         Ad : String[30];<br />
         Soyad : String[30];<br />
    end;<br />
<br />
var<br />
   Ogrenci : Ogr_Kayit; { Ögrenci değişkeni içinde No, Ad ve Soyad alanları }<br />
    ...                               { bulunur. Bu alanlarla ilgili işlemler sadece öğrenci }<br />
    &#8230;                              { değişkeni kullanılarak yapılabilir. }  <br />
<br />
<br />
Record yapısında tanımlanmış bir değişkenin içindeki değişkenlere direkt olarak erişemezsiniz.<br />
Bu değişkenlere erişmek için Ogrenci.Ad, Ogrenci.No,&#8230;    formatını kullanmalısınız.<br />
<br />
Var_bloğunda_tanımlanan_değişken.alanın_adı<br />
   <br />
    <br />
    <br />
alıntıdır. <br />
   ]]></description>
			<content:encoded><![CDATA[Data tipleri programcının compiler&#8217;e datanın nasıl saklanacağını bildirmekte kullandıkları bir yoldur. Bir değişken tanımlandığı anda onun data tipinide mutlaka tanımlamak zorundasınızdır.<br />
<br />
Bazı data tipleri kullanılan dil tarafından standart olarak tanımlanmıştır zaten.Diğer tipleri<br />
ise kullanıcı kendisi tanımlayabilir.Pascal bu tip bir esnekliği ilk sağlayan dillerden birisidir.<br />
Kullanıcı tarafından tanımlanan tipler Pascalda TYPE bloğunda tanımlanır.<br />
<br />
<br />
Type<br />
  tip1 = tip_tanımı1; (* Her yeni tipe bir isim verilir ve önceden tanımlı tipler kullanılarak tanımlanır *)<br />
  tip2 = tip_tanımı2; (* İstediğimiz kadar tip tanımı yapabiliriz *)<br />
  tip3 = tip1; { Yeni tanımladığımız bir tipi başka bir tip tanımı için de kullanabiliriz. Tip tanımları bazen çok karmaşık olabilecekleri gibi bazen de çok basit olabilirler }<br />
  int = integer;<br />
  CharData = array['A'..'Z'] of Byte;<br />
<br />
Var<br />
  var1 : tip3   (* her yeni değişken için bir isim ve bir tip verilir. *)<br />
  var2, var3 : tip2    (* aynı tipte olan değişkenler bir defada tanımlanabilir *)<br />
  Sayı : int;<br />
  Char_dizi : CharData;<br />
  <br />
<br />
<br />
Type bloğunun en önemli kullanım yerleri ise record (kayıt) ve set (küme) tipi tanımlardır.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Record yapısı:  </span><br />
Record tipi dosyalama işlemlerinde kayıt desenini oluşturmakta kullanılır.Yani bir tek kayıt için,<br />
o kaydın hangi alanına hangi değişkenlerle erişilebileceğinin tanımlanmasında kullanılır.Örneğin<br />
öğrenci takibi programı yapılacaksa, bunun için aynı kayıtta hem adı, hem soyadı hem de öğrenci<br />
no&#8217;su tutulacak olsun.Bu kayıtları tek tek değişkenlere atayıp sonra dosyaya tek tek yazdırmak<br />
yerine, hepsini record yapısı içindeki değişkenlere atayıp bir defada dosyaya yazdırmak daha<br />
kolaydır.Buna benzer şekilde record yapısında tanımlı bir değişkenin içine dosyadan bir kayıt<br />
okuduğunuzda istediğiniz alanlara kolaylıkla erişirsiniz.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Örnek :   </span><br />
<br />
<br />
Type<br />
    Ogr_Kayit = record<br />
          No : integer;<br />
         Ad : String[30];<br />
         Soyad : String[30];<br />
    end;<br />
<br />
var<br />
   Ogrenci : Ogr_Kayit; { Ögrenci değişkeni içinde No, Ad ve Soyad alanları }<br />
    ...                               { bulunur. Bu alanlarla ilgili işlemler sadece öğrenci }<br />
    &#8230;                              { değişkeni kullanılarak yapılabilir. }  <br />
<br />
<br />
Record yapısında tanımlanmış bir değişkenin içindeki değişkenlere direkt olarak erişemezsiniz.<br />
Bu değişkenlere erişmek için Ogrenci.Ad, Ogrenci.No,&#8230;    formatını kullanmalısınız.<br />
<br />
Var_bloğunda_tanımlanan_değişken.alanın_adı<br />
   <br />
    <br />
    <br />
alıntıdır. <br />
   ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Pascalda Dizi Kullanımı]]></title>
			<link>https://www.zohreanaforum.com/konu-pascalda-dizi-kullanimi.html</link>
			<pubDate>Fri, 05 Dec 2008 14:02:50 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-pascalda-dizi-kullanimi.html</guid>
			<description><![CDATA[Hangi programlama dilini kullanıyor olursanız olun değişken tanımlamanın mantığı aynıdır. Saklanacak bilginin tipine göre bir tip seçilir buna bir isim verilir ve hafızada bu değişken için bellek ayrılır. Her değişken için durum aynıdır. Pascalda bu işlemi Var bloğunda yapıyoruz. Peki aynı özelliklere sahip birden fazla değişkene ihtiyaç duyarsak ne olacak. Mesela bir öğretmen düşünün. Değişik sayılarda öğrencisi olan sınıflara girsin ve bu öğrencilerin notlarını bilgisayarda tutmaya çalışsın. Eğer dizi değişkenleri kullanmayı bilmiyorsa en kalabalık sınıfındaki öğrenci sayısı kadar değişken tanımlayacak sonra da her öğrencinin notunu kendi değişkenine ayrı ayrı atamak zorunda kalacaktır. Oysa bunu halletmenin daha kolay bir yolu var. Dizileri kullanmak. Dizilerin en önemli özelliği aynı tipteki ve birbiri ile alakalı verileri toplu olarak tanımlamaya yaramasıdır. Bu durumda örneğimizdeki öğretmen en kalabalık sınıfındaki öğrenci sayısı kadar elemanı olan bir tek dizi değişkeni tanımlar ve bilgileri bir döngü içerisinde indis kullanarak dizinin uygun yerine yerleştirir. Bu iki durumu her zamanki gibi bir tablo içinde gösterelim.<br />
 <br />
 <br />
<span style="font-weight: bold;" class="mycode_b">Dizi kullanmayan öğretmen</span><br />
Var  <br />
OgrenciNotu1 := integer;  <br />
OgrenciNotu2 := integer;  <br />
OgrenciNotu3 := integer;  <br />
OgrenciNotu4 := integer;  <br />
...  <br />
...  <br />
OgrenciNotu30 := integer;  <br />
Begin  <br />
Write(&#8216;1.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
Readln(OgrenciNotu1);  <br />
Write(&#8216;2.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
Readln(OgrenciNotu2);  <br />
Write(&#8216;3.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
Readln(OgrenciNotu3);  <br />
...  <br />
...  <br />
write(&#8217;30.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
readln(OgrenciNotu30);  <br />
end.  <br />
<span style="font-weight: bold;" class="mycode_b">Dizi kullanan öğretmen</span><br />
Var  <br />
OgrenciNotu : array[1..30] of integer;  <br />
I : integer;  <br />
Begin  <br />
for I := 1 to 30 do  <br />
begin  <br />
write(I,'.Ogrencinin notu = ');  <br />
readln(OgrenciNotu[i]);  <br />
end;  <br />
End.  <br />
 <br />
Artık dizi kullanmanın avantajlarını biliyoruz. Bize aynı türden ve birbiri ile ilişkili bilgilere kolay erişmemizi sağlıyor. İsterseniz artık bir dizi tanımının nasıl yapıldığına bakabiliriz. Dizileri VAR bloğunda tanımlayabileceğimiz gibi, Type bloğunda da tanımlayabiliriz. Eğer TYPE bloğunu kullanırsak tanımlamış olduğumuz yeni tipi direkt değişken tipi olarak kullanabiliriz.,<br />
 <br />
 <br />
değişken_ismi : array [boyut_büyüklüğü] of dizi_tipi   <br />
 <br />
 <br />
Boyut büyüklüğü herhangi bir standart veri tipinde olabilir. Eğer çok boyutlu bir dizi ise bunlar birbirinden virgüllerle ayrılır. Dizi tipinde ise istediğimiz herhangi bir tipi kullanabilirz. Yani hem standart tipleri hem TYPE bloğunda tanımladığımız kendi tiplerimizi kullanabiliriz. Dizinin elemanlarına köşeli parantez içerisinde verilen indis numarası ile erişiriz. Eğer dizilerimiz çok boyutlu olacaksa<br />
 <br />
Örnek tanımlamalar :<br />
 <br />
Type  <br />
arr_type = array[1..25] of real;  <br />
Str20 = String[20];  <br />
 <br />
Var  <br />
IntList : array[1..100] of integer; {İnteger tipinde bir boyutlu dizi}  <br />
CharData : array['A'..'Z'] of Byte; {Char tipinde bir boyutlu dizi}  <br />
Matris : array[0..9, 0..9] of real; {real tipinde 2 boyutlu dizi}  <br />
MyStrArr : array[1..10] of Str20; {Yukarıda tanımladığım Str20 tipinde 10 elemanlı dizi}  <br />
KupData : array[1..20,1..20,1..20] of Word {Word tipinde 3 boyutlu dizi}  <br />
  <br />
  <br />
  <br />
alıntıdır ]]></description>
			<content:encoded><![CDATA[Hangi programlama dilini kullanıyor olursanız olun değişken tanımlamanın mantığı aynıdır. Saklanacak bilginin tipine göre bir tip seçilir buna bir isim verilir ve hafızada bu değişken için bellek ayrılır. Her değişken için durum aynıdır. Pascalda bu işlemi Var bloğunda yapıyoruz. Peki aynı özelliklere sahip birden fazla değişkene ihtiyaç duyarsak ne olacak. Mesela bir öğretmen düşünün. Değişik sayılarda öğrencisi olan sınıflara girsin ve bu öğrencilerin notlarını bilgisayarda tutmaya çalışsın. Eğer dizi değişkenleri kullanmayı bilmiyorsa en kalabalık sınıfındaki öğrenci sayısı kadar değişken tanımlayacak sonra da her öğrencinin notunu kendi değişkenine ayrı ayrı atamak zorunda kalacaktır. Oysa bunu halletmenin daha kolay bir yolu var. Dizileri kullanmak. Dizilerin en önemli özelliği aynı tipteki ve birbiri ile alakalı verileri toplu olarak tanımlamaya yaramasıdır. Bu durumda örneğimizdeki öğretmen en kalabalık sınıfındaki öğrenci sayısı kadar elemanı olan bir tek dizi değişkeni tanımlar ve bilgileri bir döngü içerisinde indis kullanarak dizinin uygun yerine yerleştirir. Bu iki durumu her zamanki gibi bir tablo içinde gösterelim.<br />
 <br />
 <br />
<span style="font-weight: bold;" class="mycode_b">Dizi kullanmayan öğretmen</span><br />
Var  <br />
OgrenciNotu1 := integer;  <br />
OgrenciNotu2 := integer;  <br />
OgrenciNotu3 := integer;  <br />
OgrenciNotu4 := integer;  <br />
...  <br />
...  <br />
OgrenciNotu30 := integer;  <br />
Begin  <br />
Write(&#8216;1.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
Readln(OgrenciNotu1);  <br />
Write(&#8216;2.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
Readln(OgrenciNotu2);  <br />
Write(&#8216;3.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
Readln(OgrenciNotu3);  <br />
...  <br />
...  <br />
write(&#8217;30.Ogrencinin notu = &#8216<img src="https://www.zohreanaforum.com/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />;  <br />
readln(OgrenciNotu30);  <br />
end.  <br />
<span style="font-weight: bold;" class="mycode_b">Dizi kullanan öğretmen</span><br />
Var  <br />
OgrenciNotu : array[1..30] of integer;  <br />
I : integer;  <br />
Begin  <br />
for I := 1 to 30 do  <br />
begin  <br />
write(I,'.Ogrencinin notu = ');  <br />
readln(OgrenciNotu[i]);  <br />
end;  <br />
End.  <br />
 <br />
Artık dizi kullanmanın avantajlarını biliyoruz. Bize aynı türden ve birbiri ile ilişkili bilgilere kolay erişmemizi sağlıyor. İsterseniz artık bir dizi tanımının nasıl yapıldığına bakabiliriz. Dizileri VAR bloğunda tanımlayabileceğimiz gibi, Type bloğunda da tanımlayabiliriz. Eğer TYPE bloğunu kullanırsak tanımlamış olduğumuz yeni tipi direkt değişken tipi olarak kullanabiliriz.,<br />
 <br />
 <br />
değişken_ismi : array [boyut_büyüklüğü] of dizi_tipi   <br />
 <br />
 <br />
Boyut büyüklüğü herhangi bir standart veri tipinde olabilir. Eğer çok boyutlu bir dizi ise bunlar birbirinden virgüllerle ayrılır. Dizi tipinde ise istediğimiz herhangi bir tipi kullanabilirz. Yani hem standart tipleri hem TYPE bloğunda tanımladığımız kendi tiplerimizi kullanabiliriz. Dizinin elemanlarına köşeli parantez içerisinde verilen indis numarası ile erişiriz. Eğer dizilerimiz çok boyutlu olacaksa<br />
 <br />
Örnek tanımlamalar :<br />
 <br />
Type  <br />
arr_type = array[1..25] of real;  <br />
Str20 = String[20];  <br />
 <br />
Var  <br />
IntList : array[1..100] of integer; {İnteger tipinde bir boyutlu dizi}  <br />
CharData : array['A'..'Z'] of Byte; {Char tipinde bir boyutlu dizi}  <br />
Matris : array[0..9, 0..9] of real; {real tipinde 2 boyutlu dizi}  <br />
MyStrArr : array[1..10] of Str20; {Yukarıda tanımladığım Str20 tipinde 10 elemanlı dizi}  <br />
KupData : array[1..20,1..20,1..20] of Word {Word tipinde 3 boyutlu dizi}  <br />
  <br />
  <br />
  <br />
alıntıdır ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[BMP Dosyalarının Pascal İle Gösterilmesi]]></title>
			<link>https://www.zohreanaforum.com/konu-bmp-dosyalarinin-pascal-ile-gosterilmesi.html</link>
			<pubDate>Fri, 05 Dec 2008 14:01:45 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-bmp-dosyalarinin-pascal-ile-gosterilmesi.html</guid>
			<description><![CDATA[Programınızda BMP dosya kullanmayı düşünüyorsanız çok faydalı bir döküman.  BMP dosyalarının, Pascal ile gösterilmesi dört kısımda yapılabilir :<br />
1. Dosyanın açılması ve başlığın okunması<br />
2. Renk tablosunun okunması ve Set edilmesi.<br />
3. Resim verilerinin okunup grafik ekrana yollanması.<br />
4. Dosyanın kapatılması.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Giriş:</span> Herhangi bir hata olduğunda hata kodunun saklanacağı değer BMPError olarak adlandırılmıştır. Hata mesaj numaraları isimlendirilirken ismin önüne "bm" eklenmiştir.<br />
<br />
Const {Hata mesaj numaraları}<br />
bmHataYok = 0;<br />
bmDosyaAcma = 1;<br />
bmDosyaOkuma = 2;<br />
bmDosyaOS2 = 3;<br />
bmLongGenislik = 4;<br />
bmLongYukseklik = 5;<br />
bm16Renk = 6;<br />
bmMilyonRenk = 7;<br />
bmCompressFile = 8;<br />
bmRenkPaleti = 9;<br />
bmGrafik = 10;<br />
bmDosyaSonu = 11;<br />
bmNotBMP = 12; <br />
<br />
Const {Hata mesajları}<br />
bmMesaj : Array[0..12] of String[60] =(<br />
  'bmp dosyası başarıyla okundu.',<br />
  'bmp dosyası yerinde yok...',<br />
  'bmp dosyası okunamıyor...',<br />
  'bmp dosyası OS2 formatında kaydedilmiş...',<br />
  'Resmin genişliği 1024"then büyük ',<br />
  'Resmin yüksekliği 768"then büyük ',<br />
  'bmp dosyası 16 renk renk kullanıyor...',<br />
  'bmp dosyası 256 renkten daha çok renk kullanıyor...',<br />
  'bmp dosyası sıkıştırılarak kaydedilmiş...',<br />
  'bmp dosyasından Renk Paleti okunamıyor...',<br />
  'Bgi256 çalışmıyor...',<br />
  'Dosya Sonu!',<br />
  'Dosya bmp dosya olarak kaydedilmemiş.'); <br />
<br />
Var<br />
BMPError : byte; {Hata kodu değişkeni}  <br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Dosyanın açılması ve başlığın okunması :</span><br />
<br />
BMP dosyadan farklı büyüklükteki bilgiler okunacağı için,  dosya tanımlaması olarak, tipi belirtilmemiş(file) dosya tanımlaması yapılması doğru olur. Ayrıca dosyayı açarken her okumada 1 byte okuyacak şekilde ayarlanması gerekmektedir.<br />
<br />
Var<br />
BMPDosya : File; {BMP dosya değişkeni} <br />
<br />
Assign(BMPDosya, DosyaIsmi); {Dosya tanımlaması}<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
Reset(BMPDosya, 1);{Dosyayı okuma modunda, her defasında 1 byte okuyacak şekilde aç }<br />
If ioResult &lt;&gt; 0 then {Hata varsa dosya yerinde yoktur.}<br />
begin<br />
BMPError := bmDosyaAcma;<br />
exit;<br />
end;<br />
{&#36;I+} {Giriş - Çıkış hata sinyalini aç}  <br />
<br />
Dosya açildiktan sonra BMP header bilgilerinin alinmasi gereklidir. Onun için Type bölümünde bir Header tanimlanir ve header degiskenine esitlenir. Header söyle olamalidir.<br />
<br />
Type  {BMP header yapısı}<br />
Theader = record<br />
  İz : array[1..2] of char; {BM}<br />
  FileSize : Longint; {Dosya uzunlığu}<br />
  Reserved : Longint; {0}<br />
  OfsetData : Longint; {Görüntü verisinin dosya içinden nereden başladığı}<br />
  InfoSize : Longint; {Başlığın bu kısımdan itibaren uzunluğu}{40 Windows bmp}<br />
  Width : Longint; {Görüntünün genişliği}<br />
  Height : Longint; {Görüntünün yüksekliği}<br />
  Planes : Word; {1 olmak zorunda}<br />
  NBits : word; {piksel başına bit sayısı}<br />
  CompType : longint; {sıkıştırma tipi}<br />
  CompSize : Longint; {Sıkıstırılmış görüntünün uzunluğu}<br />
  RowCoz : Longint; {Satır çözünürlüğü}<br />
  ColonCoz : Longint; {Sütün çözünürlüğü}<br />
  RenkCount : Longint; {kullanılan renk sayısı}<br />
  OnemliRenkCount : Longint; {Önemli renklerin sayısı}<br />
End; <br />
<br />
Var<br />
Header : Theader;  <br />
<br />
Daha sonra Header dosyadan okunur. Ve gerekli kontroller yapılır.<br />
<br />
Var<br />
Okunan : Word; {Dosyadan Okunan byte sayısı} <br />
<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
BlockRead(BMPDosya, Header, SizeOf(Header), Okunan); {Başlık kısmını oku}<br />
if (ioResult&lt;&gt;0) or (Okunan &lt; SizeOf(Header)) then<br />
begin<br />
BMPError := bmDosyaOkuma;<br />
exit;<br />
end;<br />
<br />
{&#36;I+} {Giriş - Çıkış hata sinyalini aç}<br />
if Header.iz &lt;&gt; 'BM' then {BMP mi?}<br />
begin<br />
BMPError := bmNotBMP;<br />
Exit;<br />
end;<br />
<br />
if Header.InfoSize &lt;&gt; 40 then {Windows_BMP mi?}<br />
begin<br />
BMPError := bmDosyaOS2;<br />
Exit;<br />
end; <br />
  <br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Renk tablosunun okunması ve Set edilmesi.</span><br />
<br />
Renk tablosunun okunması için önce dosyanın kullandığı renk sayısı bulunmalıdır. Bu bilgi başlık kısmındaki Nbits  değişkenine aktarılmaktadır.<br />
<br />
var<br />
ColorCount : word; {Kullanılan Renk sayısı} <br />
<br />
Case Header.nBits of<br />
4 : ColorCount := 16;<br />
8 : ColorCount := 256;<br />
end; <br />
  <br />
<br />
Dosyadaki renk paletinin yerleşimi farklı olduğu için iki farklı renk paleti hazırlanmalıdır. Bunlar VGA DAC için renk paleti ve BMP dosyasının renk paleti. VGA DAC için Renk paleti şöyle olmalıdır;<br />
<br />
Type<br />
TRgb = Record {Renk Tanımlaması}<br />
Red, Green, Blue : byte;<br />
end;<br />
TRgb256 = array[0..255] of TRgb; {256 renkli grafikler için Renk Paleti}<br />
  <br />
<br />
BMP dosyası için Renk paleti ise;<br />
<br />
Type {BMP dosyadaki renk sistemi yapısı}<br />
TrenkDizisi = Record {Renk Tanımlaması}<br />
Mavi, Yesil, Kirmizi : byte;<br />
Reserved : byte;<br />
end;<br />
TrenkPaleti = array[0..255] of TRenkDizisi; {256 renkli grafikler için Renk Paleti}<br />
<br />
var<br />
RenkPaleti : TRenkPaleti; <br />
  <br />
<br />
Daha sonra renk sayısına göre dosyadan renkler okunmalıdır.<br />
<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
BlockRead(BMPDosya, RenkPaleti, ColorCount * 4, Okunan); <br />
{&#36;I+} {Giriş - Çıkış hata sinyalini aç} <br />
  <br />
<br />
Okunan renk tablosunun VGA DAC' a aktarılması gerekmektedir. Aktarırken bazı dikkat edilmesi gereken hususlar vardır. Bunlar renklerin ters sırada olduğu dikkate alınıp doğru eşleme yapılması. Fazladan bir byte fazla kaydedilmiş olması ve DAC' a yazarken değerlerin dörde bölünerek yazılması.<br />
<br />
var<br />
Count : byte; {Sayaç}<br />
<br />
for count := 0 to ColorCount -1 do<br />
begin<br />
Rgb256[Count].Red := RenkPaleti[Count].Kirmizi shr 2;<br />
Rgb256[Count].Green := RenkPaleti[Count].Yesil shr 2;<br />
Rgb256[Count].Blue := RenkPaleti[Count].Mavi shr 2;<br />
end;<br />
  <br />
<br />
Elde edilen tabloyu DAC' a aktarmak için aşağıdaki procedure' ün kullanılması işlemlere hız kazandırır.<br />
<br />
<br />
procedure SetVGA256(var tp : TRgb256; segment, ofset, RC : word); assembler;<br />
asm mov ax, 1012h;<br />
mov bx, 0;<br />
mov cx, Rc;<br />
mov es, Segment;<br />
mov dx, Ofset;<br />
int 10h;<br />
end; <br />
  <br />
<br />
Verilecek olan komut ise;<br />
SetVga256(Rgb256, Seg(Rgb256), Ofs(Rgb256), ColorCount - 1);   <br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Resim verilerinin okunup grafik ekrana yollanması:</span><br />
Bmp dosyalarda her satır dördün katı olacak şekilde kaydedilmiştir. Fazlalık olan byte'lar  önemsizdir. Bundan dolayı dosyadan bir satır okurken başlık kısmında verilen Width {Görüntünün genişliği}    bilgisi kadar değil de Width     bilgisinden büyük dörde bölünebilen ilk sayı kadar okumak gereklidir. Ya da Width    kadar okuyup önemsiz byte'ları  atlamak gerekmektedir. Genişliği dörde tamamlayacak bir fonksiyon aşağıda verilmiştir.<br />
<br />
{Verilen sayıdan büyük 4'e bölünen sayıyı bulur}<br />
function DordeTamamla(a : word) : word;<br />
var<br />
b : byte;<br />
<br />
begin<br />
b := 4 - (a mod 4);<br />
if b &lt;&gt; 4 then DordeTamamla := a + b else DordeTamamla := a;<br />
end; <br />
  <br />
<br />
Geriye kalan ters sırada kaydedilmiş olan görüntü verilerini okuyup grafik ekrana yazılmasıdır. Bu basit mantıkla da yapılabilir ancak işlemlere biraz hız kazandırmak amacıyla dosyadan bir defada okuyabileceğimiz en çok veriyi hafızaya alıp bu hafızadan grafik ekrana yazılması daha doğru olacaktır. Aşağıdaki fonksiyon bunu gerçekleştirmek için hazırlanmıştır. Fonksiyonun görevi dosyadaki sonraki bir byte'lık veriyi bulmaktır. Ancak bu işlemi yaparken dosyadan maksimum bilgiyi bir tampona atıp, buradan veriyi vermektedir. Tampon boşalınca tekrar tamponu doldurmaktadır.<br />
<br />
const {Dosyadan Okunacak maxsimum byte sayısı}<br />
MaxCodes = 4095;<br />
<br />
Type {Resim datalarının saklanacağı değişken}<br />
TData = array[1..MaxCodes] of byte;<br />
<br />
Var<br />
Sonraki, ToplamData : Longint;<br />
Data : TData;<br />
<br />
function NextCode : byte; {sonraki datayı bulur}<br />
<br />
procedure BlokOku; {Dosyadan diziye veri okuma}<br />
begin<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
BlockRead(BMPDosya, Data, sizeof(Data), Okunan); {Blok genişliği}<br />
if (ioResult &lt;&gt; 0) or (Okunan = 0) then BMPError := bmDosyaSonu; {kadar oku}<br />
{&#36;I+}<br />
Sonraki := 1; {sonraki datayı hazırla}<br />
ToplamData := Okunan;<br />
end;<br />
<br />
begin<br />
if ToplamData &lt;= 0 then {toplam data sıfırsa dosyadan oku}<br />
begin<br />
  BlokOku; {Dosyadan diziye veri oku}<br />
  if BMPError = bmDosyaSonu then exit;<br />
end;<br />
<br />
NextCode := Data[Sonraki]; {Sonraki datayı bul}<br />
Dec(ToplamData);<br />
İnc(Sonraki);<br />
end; <br />
  <br />
<br />
Grafik ekranın açmak için Bgi256 kullanılabilir. Bunun için Bgi256.bgi dosyasının olması gerekmektedir.<br />
<br />
<br />
procedure Bgi256(Gm : integer);<br />
var<br />
GraphDriver, GraphMode, ErrorCode : integer;<br />
<br />
begin<br />
GraphDriver := InstallUserDriver('bgi256', nil);<br />
GraphMode := Gm;<br />
InitGraph(GraphDriver, GraphMode, ");<br />
ErrorCode := GraphResult;<br />
if ErrorCode &lt;&gt; grOk then<br />
begin<br />
  BMPError := bmGrafik;<br />
  Bgi := False;<br />
  Exit;<br />
  end<br />
else<br />
  Bgi := True;<br />
end; <br />
  <br />
<br />
16 ve 256 renkli dosyaları açmak aşağıdaki prosedürden yararlanılir.<br />
<br />
<br />
procedure ViewBMP(Xmin, Ymin : word);<br />
var<br />
MaxLine : Word;<br />
Reserved : byte;<br />
XCount : Word;<br />
Line : array[0..1023] of byte;<br />
Tmp : byte;<br />
<br />
Procedure LineView;<br />
var<br />
i : word;<br />
begin<br />
for i := 0 to Header.Width - 1 do Putpixel(Xmin + i , Ymin + MaxLine - 1, Line[i]); {Ekrana Çiz}<br />
Xcount := 0; {Satir Sayacı = 0}<br />
Dec(MaxLine); {Y'yi bir azalt}<br />
if MaxLine &lt; 0 then BMPError := bmDosyaSonu; {Y=0 ise çık}<br />
for i := 1 to Reserved do NextCode; {Boşa olan dataları atla}<br />
end; <br />
<br />
begin<br />
if BMPError &lt;&gt; bmHataYok then exit; {Hata varsa çık}<br />
Reserved := DordeTamamla(Header.Width) - Header.Width;<br />
MaxLine := Header.Height; {Görüntü yüksekliği}<br />
Seek(BMPDosya, Header.OfsetData); {Görüntünün başına gel}<br />
Xcount := 0; {Satir Sayacı = 0}<br />
ToplamData := -1; {NextCode'da Blok Okuması için}<br />
Repeat<br />
  Case ColorCount of<br />
   256 : begin<br />
    Line[XCount] := NextCode; {Datayı Satıra al}<br />
    inc(XCount); {Bir arttır}<br />
   end;<br />
   16 : begin<br />
    tmp := NextCode; {Datayı Satıra al}<br />
    Line[XCount] := tmp shr 4;<br />
    inc(XCount); {Bir arttır}<br />
    Line[XCount] := tmp and &#36;0F;<br />
    inc(XCount); {Bir arttır}<br />
   end;<br />
  end;<br />
  if XCount &gt;= Header.Width then LineView; {Satir sonu}<br />
   until BMPError = bmDosyaSonu; {Dosya sonuna gelince çık}<br />
    if BMPError = bmDosyaSonu then BMPError := bmHataYok; {Eğer dosya sonuysa normal}<br />
   end; <br />
  <br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Dosyanın kapatılması:</span><br />
<br />
<br />
if not ((BMPError = bmDosyaAcma) or (BMPError = bmDosyaOkuma)) then Close(BMPDosya); {Dosya Açılmışsa kapat}<br />
end.<br />
  <br />
<br />
 <br />
alıntıdır]]></description>
			<content:encoded><![CDATA[Programınızda BMP dosya kullanmayı düşünüyorsanız çok faydalı bir döküman.  BMP dosyalarının, Pascal ile gösterilmesi dört kısımda yapılabilir :<br />
1. Dosyanın açılması ve başlığın okunması<br />
2. Renk tablosunun okunması ve Set edilmesi.<br />
3. Resim verilerinin okunup grafik ekrana yollanması.<br />
4. Dosyanın kapatılması.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Giriş:</span> Herhangi bir hata olduğunda hata kodunun saklanacağı değer BMPError olarak adlandırılmıştır. Hata mesaj numaraları isimlendirilirken ismin önüne "bm" eklenmiştir.<br />
<br />
Const {Hata mesaj numaraları}<br />
bmHataYok = 0;<br />
bmDosyaAcma = 1;<br />
bmDosyaOkuma = 2;<br />
bmDosyaOS2 = 3;<br />
bmLongGenislik = 4;<br />
bmLongYukseklik = 5;<br />
bm16Renk = 6;<br />
bmMilyonRenk = 7;<br />
bmCompressFile = 8;<br />
bmRenkPaleti = 9;<br />
bmGrafik = 10;<br />
bmDosyaSonu = 11;<br />
bmNotBMP = 12; <br />
<br />
Const {Hata mesajları}<br />
bmMesaj : Array[0..12] of String[60] =(<br />
  'bmp dosyası başarıyla okundu.',<br />
  'bmp dosyası yerinde yok...',<br />
  'bmp dosyası okunamıyor...',<br />
  'bmp dosyası OS2 formatında kaydedilmiş...',<br />
  'Resmin genişliği 1024"then büyük ',<br />
  'Resmin yüksekliği 768"then büyük ',<br />
  'bmp dosyası 16 renk renk kullanıyor...',<br />
  'bmp dosyası 256 renkten daha çok renk kullanıyor...',<br />
  'bmp dosyası sıkıştırılarak kaydedilmiş...',<br />
  'bmp dosyasından Renk Paleti okunamıyor...',<br />
  'Bgi256 çalışmıyor...',<br />
  'Dosya Sonu!',<br />
  'Dosya bmp dosya olarak kaydedilmemiş.'); <br />
<br />
Var<br />
BMPError : byte; {Hata kodu değişkeni}  <br />
<br />
<span style="font-weight: bold;" class="mycode_b">1. Dosyanın açılması ve başlığın okunması :</span><br />
<br />
BMP dosyadan farklı büyüklükteki bilgiler okunacağı için,  dosya tanımlaması olarak, tipi belirtilmemiş(file) dosya tanımlaması yapılması doğru olur. Ayrıca dosyayı açarken her okumada 1 byte okuyacak şekilde ayarlanması gerekmektedir.<br />
<br />
Var<br />
BMPDosya : File; {BMP dosya değişkeni} <br />
<br />
Assign(BMPDosya, DosyaIsmi); {Dosya tanımlaması}<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
Reset(BMPDosya, 1);{Dosyayı okuma modunda, her defasında 1 byte okuyacak şekilde aç }<br />
If ioResult &lt;&gt; 0 then {Hata varsa dosya yerinde yoktur.}<br />
begin<br />
BMPError := bmDosyaAcma;<br />
exit;<br />
end;<br />
{&#36;I+} {Giriş - Çıkış hata sinyalini aç}  <br />
<br />
Dosya açildiktan sonra BMP header bilgilerinin alinmasi gereklidir. Onun için Type bölümünde bir Header tanimlanir ve header degiskenine esitlenir. Header söyle olamalidir.<br />
<br />
Type  {BMP header yapısı}<br />
Theader = record<br />
  İz : array[1..2] of char; {BM}<br />
  FileSize : Longint; {Dosya uzunlığu}<br />
  Reserved : Longint; {0}<br />
  OfsetData : Longint; {Görüntü verisinin dosya içinden nereden başladığı}<br />
  InfoSize : Longint; {Başlığın bu kısımdan itibaren uzunluğu}{40 Windows bmp}<br />
  Width : Longint; {Görüntünün genişliği}<br />
  Height : Longint; {Görüntünün yüksekliği}<br />
  Planes : Word; {1 olmak zorunda}<br />
  NBits : word; {piksel başına bit sayısı}<br />
  CompType : longint; {sıkıştırma tipi}<br />
  CompSize : Longint; {Sıkıstırılmış görüntünün uzunluğu}<br />
  RowCoz : Longint; {Satır çözünürlüğü}<br />
  ColonCoz : Longint; {Sütün çözünürlüğü}<br />
  RenkCount : Longint; {kullanılan renk sayısı}<br />
  OnemliRenkCount : Longint; {Önemli renklerin sayısı}<br />
End; <br />
<br />
Var<br />
Header : Theader;  <br />
<br />
Daha sonra Header dosyadan okunur. Ve gerekli kontroller yapılır.<br />
<br />
Var<br />
Okunan : Word; {Dosyadan Okunan byte sayısı} <br />
<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
BlockRead(BMPDosya, Header, SizeOf(Header), Okunan); {Başlık kısmını oku}<br />
if (ioResult&lt;&gt;0) or (Okunan &lt; SizeOf(Header)) then<br />
begin<br />
BMPError := bmDosyaOkuma;<br />
exit;<br />
end;<br />
<br />
{&#36;I+} {Giriş - Çıkış hata sinyalini aç}<br />
if Header.iz &lt;&gt; 'BM' then {BMP mi?}<br />
begin<br />
BMPError := bmNotBMP;<br />
Exit;<br />
end;<br />
<br />
if Header.InfoSize &lt;&gt; 40 then {Windows_BMP mi?}<br />
begin<br />
BMPError := bmDosyaOS2;<br />
Exit;<br />
end; <br />
  <br />
<br />
<span style="font-weight: bold;" class="mycode_b">2. Renk tablosunun okunması ve Set edilmesi.</span><br />
<br />
Renk tablosunun okunması için önce dosyanın kullandığı renk sayısı bulunmalıdır. Bu bilgi başlık kısmındaki Nbits  değişkenine aktarılmaktadır.<br />
<br />
var<br />
ColorCount : word; {Kullanılan Renk sayısı} <br />
<br />
Case Header.nBits of<br />
4 : ColorCount := 16;<br />
8 : ColorCount := 256;<br />
end; <br />
  <br />
<br />
Dosyadaki renk paletinin yerleşimi farklı olduğu için iki farklı renk paleti hazırlanmalıdır. Bunlar VGA DAC için renk paleti ve BMP dosyasının renk paleti. VGA DAC için Renk paleti şöyle olmalıdır;<br />
<br />
Type<br />
TRgb = Record {Renk Tanımlaması}<br />
Red, Green, Blue : byte;<br />
end;<br />
TRgb256 = array[0..255] of TRgb; {256 renkli grafikler için Renk Paleti}<br />
  <br />
<br />
BMP dosyası için Renk paleti ise;<br />
<br />
Type {BMP dosyadaki renk sistemi yapısı}<br />
TrenkDizisi = Record {Renk Tanımlaması}<br />
Mavi, Yesil, Kirmizi : byte;<br />
Reserved : byte;<br />
end;<br />
TrenkPaleti = array[0..255] of TRenkDizisi; {256 renkli grafikler için Renk Paleti}<br />
<br />
var<br />
RenkPaleti : TRenkPaleti; <br />
  <br />
<br />
Daha sonra renk sayısına göre dosyadan renkler okunmalıdır.<br />
<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
BlockRead(BMPDosya, RenkPaleti, ColorCount * 4, Okunan); <br />
{&#36;I+} {Giriş - Çıkış hata sinyalini aç} <br />
  <br />
<br />
Okunan renk tablosunun VGA DAC' a aktarılması gerekmektedir. Aktarırken bazı dikkat edilmesi gereken hususlar vardır. Bunlar renklerin ters sırada olduğu dikkate alınıp doğru eşleme yapılması. Fazladan bir byte fazla kaydedilmiş olması ve DAC' a yazarken değerlerin dörde bölünerek yazılması.<br />
<br />
var<br />
Count : byte; {Sayaç}<br />
<br />
for count := 0 to ColorCount -1 do<br />
begin<br />
Rgb256[Count].Red := RenkPaleti[Count].Kirmizi shr 2;<br />
Rgb256[Count].Green := RenkPaleti[Count].Yesil shr 2;<br />
Rgb256[Count].Blue := RenkPaleti[Count].Mavi shr 2;<br />
end;<br />
  <br />
<br />
Elde edilen tabloyu DAC' a aktarmak için aşağıdaki procedure' ün kullanılması işlemlere hız kazandırır.<br />
<br />
<br />
procedure SetVGA256(var tp : TRgb256; segment, ofset, RC : word); assembler;<br />
asm mov ax, 1012h;<br />
mov bx, 0;<br />
mov cx, Rc;<br />
mov es, Segment;<br />
mov dx, Ofset;<br />
int 10h;<br />
end; <br />
  <br />
<br />
Verilecek olan komut ise;<br />
SetVga256(Rgb256, Seg(Rgb256), Ofs(Rgb256), ColorCount - 1);   <br />
<br />
<span style="font-weight: bold;" class="mycode_b">3. Resim verilerinin okunup grafik ekrana yollanması:</span><br />
Bmp dosyalarda her satır dördün katı olacak şekilde kaydedilmiştir. Fazlalık olan byte'lar  önemsizdir. Bundan dolayı dosyadan bir satır okurken başlık kısmında verilen Width {Görüntünün genişliği}    bilgisi kadar değil de Width     bilgisinden büyük dörde bölünebilen ilk sayı kadar okumak gereklidir. Ya da Width    kadar okuyup önemsiz byte'ları  atlamak gerekmektedir. Genişliği dörde tamamlayacak bir fonksiyon aşağıda verilmiştir.<br />
<br />
{Verilen sayıdan büyük 4'e bölünen sayıyı bulur}<br />
function DordeTamamla(a : word) : word;<br />
var<br />
b : byte;<br />
<br />
begin<br />
b := 4 - (a mod 4);<br />
if b &lt;&gt; 4 then DordeTamamla := a + b else DordeTamamla := a;<br />
end; <br />
  <br />
<br />
Geriye kalan ters sırada kaydedilmiş olan görüntü verilerini okuyup grafik ekrana yazılmasıdır. Bu basit mantıkla da yapılabilir ancak işlemlere biraz hız kazandırmak amacıyla dosyadan bir defada okuyabileceğimiz en çok veriyi hafızaya alıp bu hafızadan grafik ekrana yazılması daha doğru olacaktır. Aşağıdaki fonksiyon bunu gerçekleştirmek için hazırlanmıştır. Fonksiyonun görevi dosyadaki sonraki bir byte'lık veriyi bulmaktır. Ancak bu işlemi yaparken dosyadan maksimum bilgiyi bir tampona atıp, buradan veriyi vermektedir. Tampon boşalınca tekrar tamponu doldurmaktadır.<br />
<br />
const {Dosyadan Okunacak maxsimum byte sayısı}<br />
MaxCodes = 4095;<br />
<br />
Type {Resim datalarının saklanacağı değişken}<br />
TData = array[1..MaxCodes] of byte;<br />
<br />
Var<br />
Sonraki, ToplamData : Longint;<br />
Data : TData;<br />
<br />
function NextCode : byte; {sonraki datayı bulur}<br />
<br />
procedure BlokOku; {Dosyadan diziye veri okuma}<br />
begin<br />
{&#36;I-} {Giriş - Çıkış hata sinyalini kapat}<br />
BlockRead(BMPDosya, Data, sizeof(Data), Okunan); {Blok genişliği}<br />
if (ioResult &lt;&gt; 0) or (Okunan = 0) then BMPError := bmDosyaSonu; {kadar oku}<br />
{&#36;I+}<br />
Sonraki := 1; {sonraki datayı hazırla}<br />
ToplamData := Okunan;<br />
end;<br />
<br />
begin<br />
if ToplamData &lt;= 0 then {toplam data sıfırsa dosyadan oku}<br />
begin<br />
  BlokOku; {Dosyadan diziye veri oku}<br />
  if BMPError = bmDosyaSonu then exit;<br />
end;<br />
<br />
NextCode := Data[Sonraki]; {Sonraki datayı bul}<br />
Dec(ToplamData);<br />
İnc(Sonraki);<br />
end; <br />
  <br />
<br />
Grafik ekranın açmak için Bgi256 kullanılabilir. Bunun için Bgi256.bgi dosyasının olması gerekmektedir.<br />
<br />
<br />
procedure Bgi256(Gm : integer);<br />
var<br />
GraphDriver, GraphMode, ErrorCode : integer;<br />
<br />
begin<br />
GraphDriver := InstallUserDriver('bgi256', nil);<br />
GraphMode := Gm;<br />
InitGraph(GraphDriver, GraphMode, ");<br />
ErrorCode := GraphResult;<br />
if ErrorCode &lt;&gt; grOk then<br />
begin<br />
  BMPError := bmGrafik;<br />
  Bgi := False;<br />
  Exit;<br />
  end<br />
else<br />
  Bgi := True;<br />
end; <br />
  <br />
<br />
16 ve 256 renkli dosyaları açmak aşağıdaki prosedürden yararlanılir.<br />
<br />
<br />
procedure ViewBMP(Xmin, Ymin : word);<br />
var<br />
MaxLine : Word;<br />
Reserved : byte;<br />
XCount : Word;<br />
Line : array[0..1023] of byte;<br />
Tmp : byte;<br />
<br />
Procedure LineView;<br />
var<br />
i : word;<br />
begin<br />
for i := 0 to Header.Width - 1 do Putpixel(Xmin + i , Ymin + MaxLine - 1, Line[i]); {Ekrana Çiz}<br />
Xcount := 0; {Satir Sayacı = 0}<br />
Dec(MaxLine); {Y'yi bir azalt}<br />
if MaxLine &lt; 0 then BMPError := bmDosyaSonu; {Y=0 ise çık}<br />
for i := 1 to Reserved do NextCode; {Boşa olan dataları atla}<br />
end; <br />
<br />
begin<br />
if BMPError &lt;&gt; bmHataYok then exit; {Hata varsa çık}<br />
Reserved := DordeTamamla(Header.Width) - Header.Width;<br />
MaxLine := Header.Height; {Görüntü yüksekliği}<br />
Seek(BMPDosya, Header.OfsetData); {Görüntünün başına gel}<br />
Xcount := 0; {Satir Sayacı = 0}<br />
ToplamData := -1; {NextCode'da Blok Okuması için}<br />
Repeat<br />
  Case ColorCount of<br />
   256 : begin<br />
    Line[XCount] := NextCode; {Datayı Satıra al}<br />
    inc(XCount); {Bir arttır}<br />
   end;<br />
   16 : begin<br />
    tmp := NextCode; {Datayı Satıra al}<br />
    Line[XCount] := tmp shr 4;<br />
    inc(XCount); {Bir arttır}<br />
    Line[XCount] := tmp and &#36;0F;<br />
    inc(XCount); {Bir arttır}<br />
   end;<br />
  end;<br />
  if XCount &gt;= Header.Width then LineView; {Satir sonu}<br />
   until BMPError = bmDosyaSonu; {Dosya sonuna gelince çık}<br />
    if BMPError = bmDosyaSonu then BMPError := bmHataYok; {Eğer dosya sonuysa normal}<br />
   end; <br />
  <br />
<br />
<span style="font-weight: bold;" class="mycode_b">4. Dosyanın kapatılması:</span><br />
<br />
<br />
if not ((BMPError = bmDosyaAcma) or (BMPError = bmDosyaOkuma)) then Close(BMPDosya); {Dosya Açılmışsa kapat}<br />
end.<br />
  <br />
<br />
 <br />
alıntıdır]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Pascal Derleyicileri]]></title>
			<link>https://www.zohreanaforum.com/konu-pascal-derleyicileri.html</link>
			<pubDate>Fri, 05 Dec 2008 14:00:10 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-pascal-derleyicileri.html</guid>
			<description><![CDATA[Günümüzde Pascal artık neredeyse sadece kendisine gönül vermiş ve kopamamış insanların sayesinde yaşıyor. Profesyonel programcılık alanında grafik arabirimler altında görsel araçlar kullanılmaya başlandığından beri ışığı iyice söndü.   <br />
Ben bilgisayarda kendimi üretken ve hakim hissetmeye Pascal (tabi ki Borland Pascal) ile başlayanlardanım. Borlan Pascal'ın Son üç sürümünü (5.0-7.0) kullandım. O zamanlar bir 16-bit DOS derleyicisi olarak başka bir derleyiciye ihtiyaç bırakmıyordu. Bilgilendikçe derleyicinin tüm olanaklarını kullanmaya başlıyorsunuz. Biraz da Delphi, C, C++ gibi geliştirme ortamlarını tanıdıktan sonra Â«ah keşke bu özellik benim derleyicimde veya Pascal'da da olsaydıÂ» diyorsunuz. Borland artık bir Pascal derleyicisi geliştirmeyecek. Bu yüzden eksik yönleri tamalayacak başka derleyiciler aramak gerekiyor. <br />
<br />
Eksikliği en çok hissedilenler <br />
* 32-bit hızlı, doğal kod <br />
* 32-bit 80386-387 dahili assembler <br />
* Aynı adda farklı parametreli procedure tanımlama (Overload) <br />
* Korumalı mod programlarında IDE içinden rahat hata ayıklama <br />
* Korumalı modda harici Dos Extender gerektirmeden çalışma (dahili extender) <br />
* ...Benimkiler bu kadar... Buradan itibaren sizin eksik bulduklarınız sıralanacak... <br />
<br />
Bazı ticari amaçlı firmalar ve amaçları esasen ticari olmayan grupların geliştirdikleri derleyiciler mevcut. Bu derleyicilerde BP uyumluluğu aranan başlıca özelliklerdendir. Bunlardan DOS ortamı için en bilinenleri <br />
* FPK Free Pascal <br />
* GNU Pascal <br />
* TMT Pascal <br />
<br />
TMT Pascal ve Free Pascal'ın bedava komut satırı derleyicilerini kullanarak yaptığım testte TMT'nin özellikle matematiksel işlemlerde hızlı kod ürettiğini gözledim. Adına zaman zaman rastlamama rağmen GNU Pascal hakkında pek fazla bilgim yok. <br />
<br />
 <span style="font-weight: bold;" class="mycode_b">Pascal Derleyicileri Listesi:</span>    <br />
<span style="font-weight: bold;" class="mycode_b">Borland/Turbo Pascal 7 (Ticari ürün)</span><a href="http://www.inprise.com/pascal/" target="_blank" rel="noopener" class="mycode_url">http://www.inprise.com/pascal/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS, and Windows 3.x <br />
Çok iyi bir IDE'ye, debugger'a, profiler'a sahip, bilinen en kaliteli Pascal geliştirme paketidir. Hakkında Internet'te dolu dolu iki ayrı bug listesi gördüm ama birçok kişi için karşılaşma olasılığı az olan buglardı. Zamanla yeni sürümleri çıkmadığı için ondaki eksiklikler alternatifleriyle kapatılmaya çalışılıyor. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Extended Pascal 32-bit for Win95/NT (Ticari ürün)</span><a href="http://www.prosperosoftware.com/e32iw.html" target="_blank" rel="noopener" class="mycode_url">http://www.prosperosoftware.com/e32iw.html</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS, and Windows. <br />
Ciddi profesyonel program geliştiricilerin ihtiyaçlarını karşılamak için hazırlanmış, ABD ve uluslarası standartları esas alan bir Pascal çeşididir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Free Pascal Compiler (FPC)</span><a href="http://www.brain.uni-freiburg.de/klaus/fpc/" target="_blank" rel="noopener" class="mycode_url">http://www.brain.uni-freiburg.de/klaus/fpc/ </a>  <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> DOS, Linux and OS/2. <br />
Orjinal kodu Pascal'da yazılmış ücretsiz ve oldukça iyi bir Pascal derleyicisidir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">GNU Pascal</span><a href="http://home.pages.de/GNU-Pascal" target="_blank" rel="noopener" class="mycode_url">http://home.pages.de/GNU-Pascal</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> DOS, Linux, OS/2 and 32-bit Windows. <br />
Kaynak koduyla birlikte verilen ücretsiz bir derleyicidir. DJGPP gerektirir ve IDE içeren sürümü de vardır. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Irie Pascal</span><a href="http://www.irietools.com/download.html" target="_blank" rel="noopener" class="mycode_url">http://www.irietools.com/download.html</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> Windows 95/NT, OS/2, MS-DOS and Linux. <br />
Irie Pascal, tam 32-bit Standard (ISO/IEC 7185) Pascal kodu işler, iki programdan oluşur: Irie Pascal Compiler ve Irie Virtual Machine Interpreter. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mystic Pascal</span><a href="http://members.tripod.com/programmerz2000/mystic.zip" target="_blank" rel="noopener" class="mycode_url">http://members.tripod.com/programmerz2000/mystic.zip</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS. <br />
Mystic Pascal shareware bir Pascal derleyicisidir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">P32</span><a href="http://surf.to/p32" target="_blank" rel="noopener" class="mycode_url">http://surf.to/p32</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> 32-bit DOS, Win32 Console, Win32 GUI. <br />
Vaadettiği 32-bit desteği, low level optimizasyonlar yapan derleyici, dahili assembler, IDE ve TP7 desteği ile dikkat çeken yeni bir derleyicidir. Henüz geliştirme aşamasındadır. (*Geliştirmeye katkıda bulunacak kimselere ihtiyaçları var.) <br />
<br />
<span style="font-weight: bold;" class="mycode_b">PasW32</span><a href="http://www.geocities.com/SiliconValley/Grid/8060/" target="_blank" rel="noopener" class="mycode_url">http://www.geocities.com/SiliconValley/Grid/8060/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> 32-bit DOS, Win32 Console, Win32 GUI. <br />
Delphi 2/3/4 için, Borland Pascal programlarını Delphi'de derlemeye yarayan BP uyumlu RTL. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">SpeedPascal</span><a href="http://www.ndrh.de/speed/" target="_blank" rel="noopener" class="mycode_url">http://www.ndrh.de/speed/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> OS/2. <br />
OS/2 ortamı için çok iyi bir Pascal derleyicisi programı. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">SURPAS</span><a href="http://www.fortunecity.com/marina/tranquil/142/Surpas.zip" target="_blank" rel="noopener" class="mycode_url">http://www.fortunecity.com/marina/tranqu...Surpas.zip</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS. <br />
Kaynak kodunu da içeren shareware bir Pascal derleyicisidir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Think Pascal</span><a href="http://www.benchin.com/%24index.wcgi/prod/1105428" target="_blank" rel="noopener" class="mycode_url">http://www.benchin.com/&#36;index.wcgi/prod/1105428</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> Macintosh. <br />
Macintosh için yazılmış kendi platformunda epey popüler olan bir geliştirme ortamıdır. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">TMT Pascal (Ticari ürün)</span><a href="http://www.tmt.com/" target="_blank" rel="noopener" class="mycode_url">http://www.tmt.com</a>    <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> DOS, Linux and OS/2. <br />
32-bit derleyiciye ve IDE'ye sahip ticari bir pascal geliştirme paketidir. Son sürümü yeni, küçük ve hızlı bir extender'a sahiptir, grafik konusundaki marifetleri arttırılmış. Özellikle grafik programlama (demolar gibi) konusunda iddialı bir üründür. Tüm VESA modlarını ve LFB'ı destekler. Ücretsiz olan Lite sürümünü sitesinden indirmek ve kullanmak serbesttir. Maalesef bu bedava sürüm IDE'den yoksundur ve derlenmiş dosya boyutu kısıtlaması vardır. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Virtual Pascal v2.0 (Ticari ürün)</span><a href="http://www.fprint.com/products/virtual_pascal/" target="_blank" rel="noopener" class="mycode_url">http://www.fprint.com/products/virtual_pascal/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> OS/2, Windows 95, NT and DOS. <br />
32-bit ticari bir Pascal derleyicisi. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Win-FPC (FPC gerektirir)</span><a href="http://www.brain.uni-freiburg.de/klaus/fpc/download.html" target="_blank" rel="noopener" class="mycode_url"> http://www.brain.uni-freiburg.de/klaus/fpc/download.html</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span>Win3.x/95/98, and OS/2 Warp 4. <br />
FPC ile Windows için program yazmaya yarayan bir IDE.  <br />
  <br />
<br />
<br />
alıntıdır]]></description>
			<content:encoded><![CDATA[Günümüzde Pascal artık neredeyse sadece kendisine gönül vermiş ve kopamamış insanların sayesinde yaşıyor. Profesyonel programcılık alanında grafik arabirimler altında görsel araçlar kullanılmaya başlandığından beri ışığı iyice söndü.   <br />
Ben bilgisayarda kendimi üretken ve hakim hissetmeye Pascal (tabi ki Borland Pascal) ile başlayanlardanım. Borlan Pascal'ın Son üç sürümünü (5.0-7.0) kullandım. O zamanlar bir 16-bit DOS derleyicisi olarak başka bir derleyiciye ihtiyaç bırakmıyordu. Bilgilendikçe derleyicinin tüm olanaklarını kullanmaya başlıyorsunuz. Biraz da Delphi, C, C++ gibi geliştirme ortamlarını tanıdıktan sonra Â«ah keşke bu özellik benim derleyicimde veya Pascal'da da olsaydıÂ» diyorsunuz. Borland artık bir Pascal derleyicisi geliştirmeyecek. Bu yüzden eksik yönleri tamalayacak başka derleyiciler aramak gerekiyor. <br />
<br />
Eksikliği en çok hissedilenler <br />
* 32-bit hızlı, doğal kod <br />
* 32-bit 80386-387 dahili assembler <br />
* Aynı adda farklı parametreli procedure tanımlama (Overload) <br />
* Korumalı mod programlarında IDE içinden rahat hata ayıklama <br />
* Korumalı modda harici Dos Extender gerektirmeden çalışma (dahili extender) <br />
* ...Benimkiler bu kadar... Buradan itibaren sizin eksik bulduklarınız sıralanacak... <br />
<br />
Bazı ticari amaçlı firmalar ve amaçları esasen ticari olmayan grupların geliştirdikleri derleyiciler mevcut. Bu derleyicilerde BP uyumluluğu aranan başlıca özelliklerdendir. Bunlardan DOS ortamı için en bilinenleri <br />
* FPK Free Pascal <br />
* GNU Pascal <br />
* TMT Pascal <br />
<br />
TMT Pascal ve Free Pascal'ın bedava komut satırı derleyicilerini kullanarak yaptığım testte TMT'nin özellikle matematiksel işlemlerde hızlı kod ürettiğini gözledim. Adına zaman zaman rastlamama rağmen GNU Pascal hakkında pek fazla bilgim yok. <br />
<br />
 <span style="font-weight: bold;" class="mycode_b">Pascal Derleyicileri Listesi:</span>    <br />
<span style="font-weight: bold;" class="mycode_b">Borland/Turbo Pascal 7 (Ticari ürün)</span><a href="http://www.inprise.com/pascal/" target="_blank" rel="noopener" class="mycode_url">http://www.inprise.com/pascal/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS, and Windows 3.x <br />
Çok iyi bir IDE'ye, debugger'a, profiler'a sahip, bilinen en kaliteli Pascal geliştirme paketidir. Hakkında Internet'te dolu dolu iki ayrı bug listesi gördüm ama birçok kişi için karşılaşma olasılığı az olan buglardı. Zamanla yeni sürümleri çıkmadığı için ondaki eksiklikler alternatifleriyle kapatılmaya çalışılıyor. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Extended Pascal 32-bit for Win95/NT (Ticari ürün)</span><a href="http://www.prosperosoftware.com/e32iw.html" target="_blank" rel="noopener" class="mycode_url">http://www.prosperosoftware.com/e32iw.html</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS, and Windows. <br />
Ciddi profesyonel program geliştiricilerin ihtiyaçlarını karşılamak için hazırlanmış, ABD ve uluslarası standartları esas alan bir Pascal çeşididir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Free Pascal Compiler (FPC)</span><a href="http://www.brain.uni-freiburg.de/klaus/fpc/" target="_blank" rel="noopener" class="mycode_url">http://www.brain.uni-freiburg.de/klaus/fpc/ </a>  <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> DOS, Linux and OS/2. <br />
Orjinal kodu Pascal'da yazılmış ücretsiz ve oldukça iyi bir Pascal derleyicisidir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">GNU Pascal</span><a href="http://home.pages.de/GNU-Pascal" target="_blank" rel="noopener" class="mycode_url">http://home.pages.de/GNU-Pascal</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> DOS, Linux, OS/2 and 32-bit Windows. <br />
Kaynak koduyla birlikte verilen ücretsiz bir derleyicidir. DJGPP gerektirir ve IDE içeren sürümü de vardır. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Irie Pascal</span><a href="http://www.irietools.com/download.html" target="_blank" rel="noopener" class="mycode_url">http://www.irietools.com/download.html</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> Windows 95/NT, OS/2, MS-DOS and Linux. <br />
Irie Pascal, tam 32-bit Standard (ISO/IEC 7185) Pascal kodu işler, iki programdan oluşur: Irie Pascal Compiler ve Irie Virtual Machine Interpreter. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mystic Pascal</span><a href="http://members.tripod.com/programmerz2000/mystic.zip" target="_blank" rel="noopener" class="mycode_url">http://members.tripod.com/programmerz2000/mystic.zip</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS. <br />
Mystic Pascal shareware bir Pascal derleyicisidir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">P32</span><a href="http://surf.to/p32" target="_blank" rel="noopener" class="mycode_url">http://surf.to/p32</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> 32-bit DOS, Win32 Console, Win32 GUI. <br />
Vaadettiği 32-bit desteği, low level optimizasyonlar yapan derleyici, dahili assembler, IDE ve TP7 desteği ile dikkat çeken yeni bir derleyicidir. Henüz geliştirme aşamasındadır. (*Geliştirmeye katkıda bulunacak kimselere ihtiyaçları var.) <br />
<br />
<span style="font-weight: bold;" class="mycode_b">PasW32</span><a href="http://www.geocities.com/SiliconValley/Grid/8060/" target="_blank" rel="noopener" class="mycode_url">http://www.geocities.com/SiliconValley/Grid/8060/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> 32-bit DOS, Win32 Console, Win32 GUI. <br />
Delphi 2/3/4 için, Borland Pascal programlarını Delphi'de derlemeye yarayan BP uyumlu RTL. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">SpeedPascal</span><a href="http://www.ndrh.de/speed/" target="_blank" rel="noopener" class="mycode_url">http://www.ndrh.de/speed/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> OS/2. <br />
OS/2 ortamı için çok iyi bir Pascal derleyicisi programı. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">SURPAS</span><a href="http://www.fortunecity.com/marina/tranquil/142/Surpas.zip" target="_blank" rel="noopener" class="mycode_url">http://www.fortunecity.com/marina/tranqu...Surpas.zip</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> MS-DOS. <br />
Kaynak kodunu da içeren shareware bir Pascal derleyicisidir. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Think Pascal</span><a href="http://www.benchin.com/%24index.wcgi/prod/1105428" target="_blank" rel="noopener" class="mycode_url">http://www.benchin.com/&#36;index.wcgi/prod/1105428</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> Macintosh. <br />
Macintosh için yazılmış kendi platformunda epey popüler olan bir geliştirme ortamıdır. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">TMT Pascal (Ticari ürün)</span><a href="http://www.tmt.com/" target="_blank" rel="noopener" class="mycode_url">http://www.tmt.com</a>    <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> DOS, Linux and OS/2. <br />
32-bit derleyiciye ve IDE'ye sahip ticari bir pascal geliştirme paketidir. Son sürümü yeni, küçük ve hızlı bir extender'a sahiptir, grafik konusundaki marifetleri arttırılmış. Özellikle grafik programlama (demolar gibi) konusunda iddialı bir üründür. Tüm VESA modlarını ve LFB'ı destekler. Ücretsiz olan Lite sürümünü sitesinden indirmek ve kullanmak serbesttir. Maalesef bu bedava sürüm IDE'den yoksundur ve derlenmiş dosya boyutu kısıtlaması vardır. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Virtual Pascal v2.0 (Ticari ürün)</span><a href="http://www.fprint.com/products/virtual_pascal/" target="_blank" rel="noopener" class="mycode_url">http://www.fprint.com/products/virtual_pascal/</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span> OS/2, Windows 95, NT and DOS. <br />
32-bit ticari bir Pascal derleyicisi. <br />
<br />
<span style="font-weight: bold;" class="mycode_b">Win-FPC (FPC gerektirir)</span><a href="http://www.brain.uni-freiburg.de/klaus/fpc/download.html" target="_blank" rel="noopener" class="mycode_url"> http://www.brain.uni-freiburg.de/klaus/fpc/download.html</a>   <br />
<span style="font-weight: bold;" class="mycode_b">Platform:</span>Win3.x/95/98, and OS/2 Warp 4. <br />
FPC ile Windows için program yazmaya yarayan bir IDE.  <br />
  <br />
<br />
<br />
alıntıdır]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Pascal İle Optimizasyon]]></title>
			<link>https://www.zohreanaforum.com/konu-pascal-ile-optimizasyon.html</link>
			<pubDate>Fri, 05 Dec 2008 13:59:22 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-pascal-ile-optimizasyon.html</guid>
			<description><![CDATA[Bu yazıda Pascal ile Intel'in x86 işlemcileri için klasik program geliştirme esas alınmış olsa da anlatılan prensipler farklı birçok geliştirme ortamı için de geçerlidir.<br />
  Giriş<br />
1- İŞLEMCIDEN BAĞIMSIZ OPTIMIZASYONLAR<br />
1.1- Hafıza aktarımlarını mümkün olduğunca büyük bloklar halinde yapmak doğru olur<br />
1.2- String işlemleri için standart prosedürlerin yerine daha hızlı alternatifler bulunabilir<br />
1.3- Genel değişkenler (global var.) ve işaretçi kullanımları (pointer) en aza indirilmelidir<br />
1.4- Giriş-çıkış ve grafik ile ilgili işlemlerde standart fonksiyonların kullanımı azaltılmalıdır<br />
1.5- Program doğru çalışıyorsa Â«Range CheckingÂ» kaldırılmalıdır<br />
1.6- Karşılaştırma ve koşullar en aza indirilmelidir<br />
1.7- Kullanılacak algoritmalar doğru seçilmelidir<br />
<br />
2- İŞLEMCIYE ÖZEL OPTIMIZASYONLAR<br />
2.1- 486 cephesinde durum<br />
2.2- Pentium ve Pentium MMX<br />
2.3- Pentium Pro ve Pentium II<br />
<br />
PASCAL'DA ASSEMBLY<br />
Inline direktifi<br />
Harici Prosedürler<br />
Assembler direktifi ve asm...end blokları<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Pascal ile Optimizasyon:</span><br />
<br />
Giriş: <br />
<br />
Pascal'da kaynak kodu optimizasyonu, günümüzdeki bilgisayarlarların hızlı olmasından ötürü Pascal ile program geliştiren kişilerin genelde gözönüne almadıkları ama programlarının yavaş bilgisayarlarda bile yeterli hızda çalışmasını isteyenlerin (oyun ve veritabanı programcıları vb.) yapmaları zorunlu olan birşeydir. <br />
Optimizasyon işlemi genellikle kaynak kodun okunurluğunu azaltan tekniklerle kod yazmayı, hatta assembly ile yazılmış harici nesnelerin (.obj dosyaları) programa dahil edilmelerini gerektirebilir. Bu bakımdan, programın geliştirme aşamasında hemen optimizasyon yapılması zordur. Turbo ProfilerÂ® gibi bir programla yavaşlamaya sebep olan bölümlerin belirlenip iyileştirilmesi, programın geliştirilmesinde modüler yapının iyi kurulması gerekir.  <br />
<br />
Optimizasyon temelde iki türlüdür:<br />
1- İşlemciden bağımsız optimizasyonlar <br />
2- İşlemciye özel optimizasyonlar <br />
<br />
1- İşlemciden bağımsız optimizasyonlar : <br />
Doğrudan Pascal kodu üzerinde yapılabilecek RAM hafıza disk erişimi ile ilgili okuma yazma işlemlerinin iyileştirilmesi, ayrıca, değişik çevre birimleriyle daha etkili iletişim yollarının bulunup uygulanmasıdır. <br />
<br />
Avantajları:<br />
? Programın okunurluğundan fazla taviz verilmeden iyileştirme yapılmış olur.<br />
? Programın değişik ortam ve işlemcilerde kullanılması mümkündür.<br />
<br />
Dezavantajları:<br />
? Çok yüksek hız artışları sağlanamayabilir.<br />
? Programın çalışma hızı kullanılan derleyiciye bağlıdır.<br />
<br />
Pascal kodunun iyileştirilmesinde bazen standart kütüphanenin (turbo.tpl) sunduklarını reddetmek ve özel kütüphaneler (üniteler) kullanmak gerekir. Bu kütüphanelerde interruptlar (kesmeler) kullanmak gerektiğinde mutlaka interruptlar hakkında yeterince bilgi edinmek veya kütüphaneyi güvenilir bir yerden almak iyi olur. Ayrıca, Pascal'da assembly kullanımı ile ilgili bölümü, hem işlemci ile ilgili, hem de işlemciden bağımsız optimizasyonlar için gerektiğinden okumakta fayda vardır.<br />
Bazı tavsiyeler:<br />
<br />
1.1- Hafıza aktarımlarını mümkün olduğunca büyük bloklar halinde yapmak doğru olur. <br />
<br />
Örnek: <br />
EGA/VGA renkli metin ekranı &#36;B800 segmentinde adreslenir. Bu segmentte her word ekrandaki bir karakterin kodunu ve niteliğini içerir. <br />
Aşağıda, bu adrese doğrudan veri yazarak ekranı o anda geçerli yazı niteliğindeki belli bir karakterle (Zkar parametresi) dolduran aynı işi yapan iki procedure vardır. İkinci procedure, veri atamalarını word paketleri halinde yaparak birinciye göre iki kat daha hızlı çalışan kod üretilmesini sağlar. <br />
<br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]Satir ve Sutun ekrandaki satır ve sütun sayılarını içeren global değişkenlerdir.   <br />
<br />
Bu örnekler test amaçlı olarak yazdığım bir örnek programdan alınmıştır.<br />
<br />
1. Procedure:<br />
<br />
Uses Crt;<br />
...<br />
Procedure Zemin(Zkar:Char);<br />
(* Atamalar 8 bit (byte) yapılıyor. <br />
    Program parçası anlaşılır şekilde yazılmış. <br />
   Optimizasyon yok. *)<br />
Var<br />
Q:Word;<br />
Begin<br />
For Q:=Satir*Sutun downto 0 do<br />
     begin<br />
     Mem[&#36;B800:Q*2  ]:=Byte(Zkar);<br />
     Mem[&#36;B800:Q*2+1]:=TextAttr;<br />
     end;<br />
end;<br />
...<br />
  <br />
<br />
2. Procedure:<br />
<br />
Uses Crt;<br />
...<br />
Procedure Zemin(Zkar:Char);<br />
(* Atamalar 16 bit (word) yapılıyor.<br />
   Program parçasının anlaşılırlığı azalmış. <br />
   Kaynak kodu optimizasyonu var. *)<br />
Var<br />
Q,Cift:Word;<br />
Begin<br />
Cift:=Byte(Zkar)+(TextAttr Shl 8);<br />
For Q:=Satir*Sutun downto 0 do<br />
     MemW[&#36;B800:Q Shl 1]:=Cift;<br />
end;<br />
  <br />
<br />
İkinci prosedürün kaynak kodu optimizasyonu için ardışık iki atama yerine her seferde bir atama yapılmış, sabit tamsayıyla çarpma işlemleri Â«shlÂ» operatörüyle gerçekleştirilmiştir. Bu prosedür, 32-bit yazmaçlar ve atamalar kullanılarak daha da iyileştirilebilir. <br />
Konuyla ilgili diğer önemli bir uyarı da Blockread ve Blockwrite ile ilgili. Bu prosedürler geniş arabellekle kullanılmalıdırlar. Arabellek boyutu 512 baytın katları olmalıdır. Örneğin 10.000 bayt arabellek yerine tam 10 kilobaytlık 10.240 bayt arabellek kullanılması performans açısından biraz daha iyidir. Ama en büyük performansı büyük arabellek verecektir.<br />
<br />
1.2- String işlemleri için standart prosedürlerin yerine daha hızlı alternatifler bulunabilir<br />
String tipi değişkenler, ilk Pascal derleyicilerinde karakter dizileri olarak tanımlanıyorlardı. Bir prosedürde parametre olarak kullanılmaları Â«stackÂ» bölümüne içerikleriyle kopyalanmalarına, dolayısıyla zaman ve yer kaybına yolaçıyordu. Bu sorun çok önceleri String tipi değişkenleri işaretçi (pointer) gibi kullanmakla halledildi. Derleyiciler artık parametre olan String değişkenlerin sadece adresini stack bölümüne atıyorlar, gerektiğinde bu adresten kullanıyorlar.<br />
Yine de String ile ilgili atama ve kopyalama işlemleri çok hızlı değildir. Programda String tipindeki değişkenlerin sıklıkla kullanıldıkları bölümler varsa (isim sıralama, kelime işlem vb.) bu bölümleri optimize etmek mümkündür. <br />
<br />
Örneğin, S ve D string, N bayt tipinde değişkenler olmak üzere, S'in ilk N karakterini D'ye aktarmak için<br />
D:=Copy(S,1,N);<br />
<br />
yazmak yerine<br />
<br />
Move(S[1],D[1],N);<br />
D[0]:=Chr(N);<br />
<br />
ikilisini yazmak çok daha iyi sonuç verir. <br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]Move komutu string tipi işlemlerde kullanmak için çok idealdir.   <br />
<br />
1.3- Genel değişkenler (global var.) ve işaretçi kullanımları (pointer) en aza indirilmelidir<br />
Yerel (local var.) değişkenlere erişim genel değişkenlere olduğundan daha hızlıdır. Sayaç vb. değişkenlerin genel değişken olarak tanımlanmaları şart değildir. Bunları prosedür ve fonksiyonlar içinde geçici yerel değişkenler olarak tanımlamak daha iyi sonuç verir.<br />
<br />
1.4- Giriş-çıkış ve grafik ile ilgili işlemlerde standart fonksiyonların kullanımı azaltılmalıdır<br />
Grafik kütüphanesi ve giriş-çıkış komutları, standartlara ve tüm kullanıcıların donanımına uyumlu olmaları amacı güdülerek yazıldıklarından oldukça yavaştırlar. <br />
Daha zahmetli de olsa, ilgili kesmelerden yararlanılarak grafik için Vesa uyumlu modlara erişerek bankları veya LFB'ı kullanacak şekilde programlamak, giriş-çıkış içinse ilgili portları ve işletim sisteminin olanaklarını kullanmak yerinde olur.<br />
<br />
1.5- Program doğru çalışıyorsa Â«Range CheckingÂ» kaldırılmalıdır<br />
Range Checking seçeneği, değişkenlere geçerli oldukları aralığın dışında bir değer atanıp atanmadığını kontrol eden kodları programa ekler. Bu kodlar karşılaştırma kodları oldukları için performansı olumsuz etkilerler. Programın hata ayıklama dönemi bitip doğru çalıştığından emin olununca seçenek devreden çıkarılmalıdır. <br />
<br />
Kaynak kodu optimizasyonunda bir diğer önemli konu derleyici için iyileştirmeye uygun kod yazmaktır. Yakın zamanda geliştirilen derleyicilerin çoğu optimizasyon yeteneklerine sahipler. <br />
<br />
Unutulmaması gereken diğer bir konu da yapılan optimizasyonu test etmektir. Performansa fazla katkı sağlamayan optimizasyon kodun okunurluğunu ve taşınırlığını boşuna azaltmış olur.<br />
<br />
1.6- Karşılaştırma ve koşullar en aza indirilmelidir<br />
Karşılaştırma komutları, geniş kapsamlı bir programda sıkça rastlanan komutlardır. Ama işlemci için bu tür komutlar, düz bir yoldaki yol ayrımlarıdır; işlemcinin hangi yola sapacağına karar vermesi yavaşlamaya sebep olacaktır.<br />
Günümüz işlemcilerinin karşılaştırma komutlarının sonucunu kestirmek ve böylece bu tür komutların hız kesmesini önlemek için kullandıkları dallanma tahmini yöntemleri, eğer yapılan tahmin yanlışsa boşa harcanan saat çevrimlerine yolaçar. Aşağıdaki iki yapı aynı işi yapmalarına karşın uygulamada, eğer mümkünse, ikincisi tercih edilmelidir. Birinci yapı bahsedilen mahsurlu duruma yolaçabilir.<br />
<br />
1. IF (Koşul) THEN A_iSLEMi <br />
     ELSE B_iSLEMi;<br />
<br />
2. B_iSLEMi;<br />
   IF (Koşul) THEN <br />
begin<br />
Geri_Al_B_iSLEMi;<br />
A_iSLEMi;<br />
end;<br />
<br />
1.7- Kullanılacak algoritmalar doğru seçilmelidir<br />
Bazı bilinen algoritmalarda aynı işi yapanlardan hangisinin daha hızlı çalıştığı malumdur. Örneğin Quicksort sıralama yöntemi, Bubble sort yönteminden çok daha hızlı çalışır. Programcı, kendi geliştirdiği algoritmanın daha etkin hale getirilmesinin mümkün olup olmadığını araştırmalı, mümkünse algoritmasını iyileştirmelidir.<br />
<br />
2- İşlemciye özel optimizasyonlar : <br />
İşlemcinin özelliklerinin ve varsa ilave komut setlerinin etkili bir şekilde kullanılmasıdır. Örnek olarak Pentium ve üstü işlemcilerin aynı anda iki bağımsız komutu işleme özelliğinin kullanılması için Â«pairingÂ» yapma veya bir çoklu ortam (multimedia) uygulamasında MMX&#8482; komut setininin avantajlarından faydalanmak verilebilir. <br />
<br />
Avantajları:<br />
? Mümkün olan en hızlı program kodu geliştirilebilir. <br />
? Yeni teknolojilerden yararlanılabilir.<br />
<br />
Dezavantajları:<br />
? Bu tür optimizasyonları her Pascal derleyicisi yapmadığı için assembly ile programa dahil etmek gerekecektir. <br />
? Fazladan çaba, zaman ve yeterli bilgi gerektirir. Programcı, işlemcinin özelliklerini ve çalışma prensiplerini bilmelidir.<br />
? Program, yapılan işlemciye özel optimizasyonlar yüzünden her işlemcide çalışmayabilir. Bu durumda çalışma kütüphanelerinin bazı bölümlerinin normal ve optimize olarak iki biçiminin bulundurulması ve gerekenin çalıştırılması zorunludur. Örneğin, MMX için optimizasyonlar yapılmışsa programı Pentium&#8482; ve Pentium Pro&#8482; 'da çalıştırmak için optimize edilmemiş normal kütüphaneye ihtiyaç duyulacaktır. Ayrıca Intel, AMD, Cyrix ve diğer üreticilerin işlemci tasarımları değişik olduğundan ötürü her işlemcide aynı oranda iyileştirme yapılamayabilir.<br />
<br />
Çoğunluğun kullandığı x86 temelli bilgisayarları gözönüne alacak olursak, tümü için geçerli bir optimizasyon tekniği yoktur. İşlemcilerin çalışma prensiplerine göre teknikler değişir. Ama bugünkü uygulamada, Pentium için optimize edilmiş bir program daha üst seviye işlemciler için de az veya çok optimize edilmiş sayılabilir.<br />
İşlemcilerin işleyişini gözönüne alarak programları optimize etmek oldukça zahmetli bir iştir. Esasen bu derleyici yazanların ve low-level programcıların işidir. Burada temel bazı işlemci işleyiş ve Pascal'da assembly kullanım bilgileri verilecektir.<br />
<br />
2.1- 486 cephesinde durum:<br />
Intel'in x86 komut setinde ilk köklü değişikliği yapıp 32-bit yazmaçlar (register) ve komutlar eklediği işlemcisi 80386'dan sonra piyasaya sürdüğü, uzun süre piyasada kalan ve çeşitli çekirdek (CPU) hızlarında birçok değişik modelleri (SX, DX, DX2, DLC vs.) çıkan, zamanının başarılı bir işlemcisidir. Çoğu durumda bir saat çevriminde bir komut işleyecek şekilde tasarlanmıştır. <br />
<br />
486 işlemciler 5 aşamada komut işlemektedirler. <br />
1- Prefech : Komutların işlemci iki 16 baytlık arabelleğinden birine alınır.<br />
2- Decode  : Komut yolundan gelen komutların çözümlemesi yapılır.<br />
3- Address Generation : Adres çözümlemesi yapılır.<br />
4- Execution : Komutun çalıştırılması bu aşamada olur.<br />
5- Writeback : Yazmaç içeriklerinin güncellendiği bölümdür.<br />
<br />
2.2- Pentium ve Pentium MMX:<br />
Pentium işlemciler, kendilerinden önceki nesillere göre komut işleme kapasitelerindeki büyük gelişme ile dikkat çektiler. Bu gelişme sayesinde birçok uygulamada aynı saat hızında Pentium işlemci 486 işlemciden en az iki kat daha hızlı komut işliyordu. Bu gelişmenin en önemli sebepleri:<br />
- Dallanma tahmini (Branch prediction) : Dallanma (jump) komutlarında işlemcinin birtakım tahminler yapmak yoluyla dallanmanın yolaçtığı gecikmeleri azaltmasıdır. <br />
- Çift pipeline : Komutların U ve V ile sembolize edilen iki pipeline (komut yolu) içinde eşzamanlı olarak işlenmesi sayesinde teorik olarak aynı anda iki komut işlenmesidir. Pratikte bunun gerçekleşebilmesi bazı şartların sağlanması gerekir.<br />
- Yeni kayan nokta işlem ünitesi : Pentium, gerçel sayı işlemlerinin hızını belirgin bir şekilde arttıran yeni matematik işlemci tasarımıyla kendi dönemindeki x86'ların önemli bir yavaşlığı telafi etti.<br />
<br />
Pentium MMX işlemci, klasik Pentium'a göre biraz daha iyi komut işler. Daha geniş L1 arabellek, daha iyi dallanma tahmini algoritması ve yeni komut seti eklentileri ona avantaj sağlar. <br />
<br />
Pentium için optimizasyonda Pascal kodu içinden yapılabilecek en önemli etki, inline veya asm bloklarını çift pipeline mimarisinin kurallarına uyarak optimize etmektir. İşlemciye aynı anda iki komut işletebilmenin yolu mümkün olduğunca uygun komut çiftleri oluşturmaktır. Pentium'un pipeline'ını oluşturan yollar U ve V yolları olarak adlandırılır. U yolu tüm komutları işleyebilirken V yolu bazı sıkça kullanılan basit yapılı komutları işleyebilir. Bu yolların etkin kullanımı, komutların uygun sırayla işlemciye ulaştırılmasıyla olur.<br />
<br />
Bazı eski karmaşık yapılı komutlar, komut çiftlemeyi mümkün kılacak şekilde eşder komutlara bölünebilirler. <br />
<br />
Örneğin,<br />
MOVZX EAX,BYTE PTR [...] =  XOR EAX,EAX + MOV AL,BYTE PTR [...] <br />
<br />
Temel kurallar şunlardır:<br />
<br />
1- Her iki komut basit yapıda olmalıdır. Komutları, Pentium'un işleyişi bakımından 4'e ayırmak mümkündür: <br />
UV (Hem U'da hem V'de çiftlenebilen), <br />
PU (U'da çiftlenebilen), <br />
PV (V'de çiftlenebilen, <br />
NP (çiftlenemeyen)<br />
<br />
UV : MOV, PUSH, POP yazmaç, LEA, NOP, INC, DEC, ADD, SUB, CMP, AND, OR, XOR, <br />
A.L.U. yazmaç,... , A.L.U. adres,yazmaç/değer, NOP, TEST(kısmen)<br />
PU : ADC, SBB, SHR, SAR, SHL, SAL yazmaç,değer , ROR, ROL, RCR, RCL yazmaç,1 <br />
PV : yakın CALL, JUMP, koşullu dallanma komutları.<br />
<br />
Bunların dışındaki komutlar U yolunda işlenir ve çiftlenemezler. <br />
<br />
2- İki komut arasında yazmaç bağlılığı bulunmamalıdır. Yani bir komut kendinden öncekinin sonucunu beklemek zorunda olmamalıdır.  Örnekler:<br />
<br />
MOV BX,CX ; ADD AX,BX ' ikinci komut birincide BX'in alacağı değere bağlı, çiftlenemez!<br />
MOV BX,CX ; MOV CX,AX ' ikinci komut birinciyi beklemeden işlenebilir.<br />
CMP AX,5  ; JA _etiket ' karşılaştırma ve dallanma komutları bu şekilde çiftlenebilir.<br />
<br />
3- Genellikle, önekli komutlar U'da işlenir ve çiftlenemezler. <br />
<br />
Pentium için optimize edilen programlar, işlemci çalışma prensiplerinden ötürü daha eski işlemcilerde normalden de yavaş çalışabilirler. Bunun sebebi, eski karmaşık yapılı komutların aynı anlama gelen komutlara ayrılmasıyla komut çiftleme imkânı oluşturmak, Pentium işlemcilerde hız kazandırırken eski tip işlemcilerde kaybettirebilir. Günümüzde pek önemi kalmayan bu durum bir uyarı niteliğindedir.<br />
<br />
2.3- Pentium Pro ve Pentium II :<br />
Mimarileri ve komut işleme teknikleri çok benzer olan olan bu iki işlemci, üç komutu aynı anda işleme yeteneğine sahiptir. Bunun dışında, gelişkin dallanma tahmini, yazmaç isimlerini otomatik değiştirme, sırasız komut işleme gibi çok etkili yöntemlerle çalışırlar. Pentium II, MMX desteği, 16-bit programları daha iyi işlemesi ve yeni veriyolu mimarisi ile Pentium Pro'dan ayrılır.<br />
Pentium Pro ve PII'nin komut yollarını D0, D1, D2 diye adlandırırsak, D0 Pentiumlardaki U'ya, diğerleri V'ye karşılık gelir. Komutların uygunlaştırılması üçlü halde yapılır. Bununla birlikte Pentium için optimize edilen program bu işlemcilerde de normalden hızlı çalışacaktır. <br />
<br />
Bu anlatılanların işlemci özelliklerinin bazı eksikleri ve belirtilmemiş istisnalar vardır. Genel durum, belirtildiği şekilde olup ayrıntılara girilmemiştir. <br />
<br />
Pascal'da Assembly:<br />
Derleyiciler herzaman en uygun kodu üretmezler, hatta birçoğu eski işlemcilerle olan uyumluluğu bozmamak için yeni işlemcilerde oldukça Â«müsrifÂ» davranan komutları üretebilirler. Ayrıca hafıza erişimi bolca olan ya da matematiksel işlem yapan kodların optimize edilmesi genellikle mümkündür. Derleyicinin yapamadığı yerde bunu programcı, kodunu assembly komutlarıyla destekleyerek yapar.<br />
Assembly komutları Pascal programlarına üç yoldan eklenebilir:<br />
1- Inline komutuyla doğrudan, derlenmiş byte kod olarak,<br />
2- Assembler'da Pascal modeliyle derlenmiş .obj dosyaları yoluyla,<br />
3- TP6'dan itibaren Assembler direktifi ile tüm prosedürde veya asm ... end bloğu arasında 16-bit 80286 komutları olarak.<br />
<br />
Inline direktifi:<br />
İşlemciye gönderilecek komutları hazır olarak programa katmak için kullanılır. Bir prosedür için uygun olan herhangi bir yerde yazılabilir. Kullanımı dikkat ve biraz bilgi ister. Normalde derleyicinin destekle-mediği komutları bu sayede programa eklemek mümkün olur. Bugünkü uygulamada bundan başka avantajı kalmamıştır. Bu direktif hakkında ayrıntılı bilgi bu yazıda verilmeyecektir.<br />
Assembly komutlarının karşılığı olan byte kodları Debug veya herhangi bir disassembler program yardımıyla elde ettikten sonra ardışık / ile ayrılmış baytlar şeklinde parantezin arasına yazmak gerekir.<br />
Inline(&#36;A1/&#36;FF/&#36;F0); veya aynı anlamda Inline(&#36;A1/&#36;F0FF); komutu MOV AX,&#36;FFF0 komutunun karşılığı olarak programa dahil edilebilir. Görüldüğü gibi, word değerlerin bayt halinde yazılması sırasında yüksek ve düşük baytların ters sırada yazılması gerekir.<br />
<br />
Harici Prosedürler:<br />
Pascal modeline göre derlenmiş assembly program parçaları .obj dosyaları halinde programa dahil edilebilir, programın içindeki veriyi kullanabilir. <br />
<br />
Assembler direktifi ve asm...end blokları:<br />
Kullanılan derleyiciye bağlı olarak kaynak kodu içinde assembly komutları ve prosedürleri kullanılabilir. Çok yaygın derleyicilerden Borland Pascal 6 ve 7'de 286/287 komutları, TMT Pascal'da 386/387 komutları desteklenmektedir. <br />
Genel kullanımı şu şekildedir:<br />
<br />
Procedure ProcName( {parametreler} );Assembler;<br />
asm<br />
... {Assembly komutları}<br />
end; {Prosedür sonu}<br />
<br />
Sözkonusu olan fonksiyonlar olduğunda da aynı yapı geçerlidir.<br />
Prosedür ve fonksiyonların değer parametreleriyle yazmaçlar arasındaki alışverişi parametreleri doğrudan boyutuna uygun yazmaca atanarak yapılabilir. Adres içeren parametrelerde ve fonksiyonlardan dönecek değerlerde dikkat edilecek noktalar vardır. <br />
<br />
Küçük bir hatırlatma: Prosedürlerin veya fonksiyonların parametreleri değer parametresi veya değişken parametresi olabilir. <br />
Procedure EkrandanSatirOku( X,Y,U : Byte; Var Str:String);<br />
Bu prosedürün görevi, metin ekranındaki X,Y koordinatından U uzunluğundaki bilgiyi okuyup Str string değişkenine aktarmak olsun. Buradaki X,Y ve U değer parametreleridir, değişmezler, Str ise değişken parametresidir, prosedür içinde değeri değişerek çıkabilir. <br />
<br />
Bu prosedür çağırılırken <br />
EkrandanSatirOku(4,5,N,S);<br />
şeklinde çağırılabilir,<br />
EkrandanSatirOku(4,5,N,'ABC');<br />
şeklinde çağırılamaz!<br />
Çünkü, değer parametrelerine değişken konabilir ama değişken parametrelerine (var ile tanımlı parametrelere) değer konamaz.<br />
Adres içeren parametreler, pointer, string, dizi (array) tipinde olan değer parametreleri ve tüm değişken parametreleridir. Bunların 4 baytlık (segment ve ofsetli) adresleri alınıp asm...end bloğunda işlenirler.<br />
Fonksiyonlarda ise, fonksiyonun geri dönecek değeri, tanımlanan tipine göre Byte, Shortint veya Char ise AL'de, Word veya Integer ise AX 'de, Longint veya Pointer ise AX<img src="https://www.zohreanaforum.com/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />X 'de saklanır.<br />
Ayrıca çok kullanılan bazı assembly komutlarını hatırlatmakta fayda var:<br />
<br />
( y:yazmaç, a:adres, d:değer, @<img src="https://www.zohreanaforum.com/images/smilies/confused.png" alt="Confused" title="Confused" class="smilie smilie_13" />ıçrama komutları için ofset )<br />
- MOV y/a, y/a/d<br />
- AND, OR, XOR y, y/a<br />
- NOT, NEG y/a<br />
- SHL, SHR, ROL, ROR y/a, y/d<br />
- LEA y, [y+d]<br />
- JMP @<br />
- JA, JZ, JE, JB, JNA, ... @<br />
- TEST, CMP y/a, y/a/d<br />
<br />
Yukarıdaki komutlarda Â«a, aÂ» kombinasyonu geçerli değildir. Ayrıca adres ve yazmaç kullanımı ile ilgili de kısıtlamalar vardır. Örneğin SHL DX,CL geçerli ama SHL DX,CX geçersizdir!<br />
<br />
Tüm bu bilgilerin ışığında, bir string değişkenin N. karakterinin Ascii kodunu veren bir fonksiyon yazılabilir:<br />
<br />
Function Ascii(Var S:String; N:Byte):Byte;Assembler;<br />
asm<br />
   LES DI, S[0] { 1: S'in başlangıç adresi ES<img src="https://www.zohreanaforum.com/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />I'a depolanır }<br />
   XOR BX,BX { 2: BX yazmacı sıfırlanır }<br />
   XOR AX,AX { 3: AX yazmacı sıfırlanır }<br />
   MOV BL, N { 4: Kaçıncı karakter hesaplanacağı BL'ye }<br />
   MOV AL,ES:[DI] { 5: S'in uzunluğunu içeren ilk bayt AL'ye aktarılır }<br />
   CMP AL,BL { 6: AL, BL ile karşılaştırılır }<br />
   JB @1 { 7: AL'de bulunan S'in uzunluğu N'den küçükse işlem yapılamaz}<br />
   MOV AL,ES:[DI+BX] { 8: N. karakter AL'ye aktarılır }<br />
   JMP @2 { 9: Fonksiyonun sonucu AL'de }<br />
@1:XOR AL,AL {10: İşlem mümkün değilse fonksiyondan sıfır değeri döner}<br />
@2: {11: Bitti!.. }<br />
end;<br />
<br />
Bu fonksiyon, esasen Ord(S[N]) ifadesiyle aynı görevi görmesine rağmen konuya iyi bir örnek oluşturduğu için yazılmıştır. S'in ES<img src="https://www.zohreanaforum.com/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />I'a aktarılan adresi, sıfırıncı baytını yani uzunluğunu içerir. Uzunluğu N'den küçükse, fonksiyonun istenen karakterin değerini vermesi mümkün değildir. Bu durumda AL değerinin sıfırlanarak fonksiyonun terkedildiği @1 etiketine dallanma yapılır ve fonksiyondan sıfır değeri döner. S'in uzunluğu N'den büyük veya eşitse işlem mümkündür, AL'ye N. karakterin aktarılması ile işlem tamamlanır. Bu da şöyle gerçekleşir: N'in değerinin 4. Satırdan beri BX'de olduğunu biliyoruz. S[0]'ın adresi ES:[DI] idi. Bu adresten BL yani şimdi BX kadar uzakta olan bayt, N. bayttır. Bu bayt AL'ye 8. Satırda aktarılır ve fonksiyon görevini yerine getirmiş olur.<br />
<br />
Sözün kısası...<br />
Optimizasyon konusu, donanımın yazılıma göre daha hızlı gelişim göstermesi yüzünden pek üzerinde durulmayan ama tecrübeli programcıların gözardı etmedikleri bir konudur. Aynı işi yapan iki rakip programdan daha hızlı olanının, daha düşük konfigürasyonda iyi çalışanın tercih edilmesi olasılığı yüksektir. Ayrıca disk gibi depolama birimlerinin hızı konusunda pek az gelişme oluyor. Dosya işlemlerinin optimizasyonu halen önem taşıyan bir konudur. <br />
Pascal&#8217;ı ve Intel işlemcilerini baz alarak yazılan bu yazıdaki bilgilerin daha kaliteli programların gelişmesine katkıda bulunmasını dilerim.<br />
<br />
alıntıdır]]></description>
			<content:encoded><![CDATA[Bu yazıda Pascal ile Intel'in x86 işlemcileri için klasik program geliştirme esas alınmış olsa da anlatılan prensipler farklı birçok geliştirme ortamı için de geçerlidir.<br />
  Giriş<br />
1- İŞLEMCIDEN BAĞIMSIZ OPTIMIZASYONLAR<br />
1.1- Hafıza aktarımlarını mümkün olduğunca büyük bloklar halinde yapmak doğru olur<br />
1.2- String işlemleri için standart prosedürlerin yerine daha hızlı alternatifler bulunabilir<br />
1.3- Genel değişkenler (global var.) ve işaretçi kullanımları (pointer) en aza indirilmelidir<br />
1.4- Giriş-çıkış ve grafik ile ilgili işlemlerde standart fonksiyonların kullanımı azaltılmalıdır<br />
1.5- Program doğru çalışıyorsa Â«Range CheckingÂ» kaldırılmalıdır<br />
1.6- Karşılaştırma ve koşullar en aza indirilmelidir<br />
1.7- Kullanılacak algoritmalar doğru seçilmelidir<br />
<br />
2- İŞLEMCIYE ÖZEL OPTIMIZASYONLAR<br />
2.1- 486 cephesinde durum<br />
2.2- Pentium ve Pentium MMX<br />
2.3- Pentium Pro ve Pentium II<br />
<br />
PASCAL'DA ASSEMBLY<br />
Inline direktifi<br />
Harici Prosedürler<br />
Assembler direktifi ve asm...end blokları<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Pascal ile Optimizasyon:</span><br />
<br />
Giriş: <br />
<br />
Pascal'da kaynak kodu optimizasyonu, günümüzdeki bilgisayarlarların hızlı olmasından ötürü Pascal ile program geliştiren kişilerin genelde gözönüne almadıkları ama programlarının yavaş bilgisayarlarda bile yeterli hızda çalışmasını isteyenlerin (oyun ve veritabanı programcıları vb.) yapmaları zorunlu olan birşeydir. <br />
Optimizasyon işlemi genellikle kaynak kodun okunurluğunu azaltan tekniklerle kod yazmayı, hatta assembly ile yazılmış harici nesnelerin (.obj dosyaları) programa dahil edilmelerini gerektirebilir. Bu bakımdan, programın geliştirme aşamasında hemen optimizasyon yapılması zordur. Turbo ProfilerÂ® gibi bir programla yavaşlamaya sebep olan bölümlerin belirlenip iyileştirilmesi, programın geliştirilmesinde modüler yapının iyi kurulması gerekir.  <br />
<br />
Optimizasyon temelde iki türlüdür:<br />
1- İşlemciden bağımsız optimizasyonlar <br />
2- İşlemciye özel optimizasyonlar <br />
<br />
1- İşlemciden bağımsız optimizasyonlar : <br />
Doğrudan Pascal kodu üzerinde yapılabilecek RAM hafıza disk erişimi ile ilgili okuma yazma işlemlerinin iyileştirilmesi, ayrıca, değişik çevre birimleriyle daha etkili iletişim yollarının bulunup uygulanmasıdır. <br />
<br />
Avantajları:<br />
? Programın okunurluğundan fazla taviz verilmeden iyileştirme yapılmış olur.<br />
? Programın değişik ortam ve işlemcilerde kullanılması mümkündür.<br />
<br />
Dezavantajları:<br />
? Çok yüksek hız artışları sağlanamayabilir.<br />
? Programın çalışma hızı kullanılan derleyiciye bağlıdır.<br />
<br />
Pascal kodunun iyileştirilmesinde bazen standart kütüphanenin (turbo.tpl) sunduklarını reddetmek ve özel kütüphaneler (üniteler) kullanmak gerekir. Bu kütüphanelerde interruptlar (kesmeler) kullanmak gerektiğinde mutlaka interruptlar hakkında yeterince bilgi edinmek veya kütüphaneyi güvenilir bir yerden almak iyi olur. Ayrıca, Pascal'da assembly kullanımı ile ilgili bölümü, hem işlemci ile ilgili, hem de işlemciden bağımsız optimizasyonlar için gerektiğinden okumakta fayda vardır.<br />
Bazı tavsiyeler:<br />
<br />
1.1- Hafıza aktarımlarını mümkün olduğunca büyük bloklar halinde yapmak doğru olur. <br />
<br />
Örnek: <br />
EGA/VGA renkli metin ekranı &#36;B800 segmentinde adreslenir. Bu segmentte her word ekrandaki bir karakterin kodunu ve niteliğini içerir. <br />
Aşağıda, bu adrese doğrudan veri yazarak ekranı o anda geçerli yazı niteliğindeki belli bir karakterle (Zkar parametresi) dolduran aynı işi yapan iki procedure vardır. İkinci procedure, veri atamalarını word paketleri halinde yaparak birinciye göre iki kat daha hızlı çalışan kod üretilmesini sağlar. <br />
<br />
<br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]Satir ve Sutun ekrandaki satır ve sütun sayılarını içeren global değişkenlerdir.   <br />
<br />
Bu örnekler test amaçlı olarak yazdığım bir örnek programdan alınmıştır.<br />
<br />
1. Procedure:<br />
<br />
Uses Crt;<br />
...<br />
Procedure Zemin(Zkar:Char);<br />
(* Atamalar 8 bit (byte) yapılıyor. <br />
    Program parçası anlaşılır şekilde yazılmış. <br />
   Optimizasyon yok. *)<br />
Var<br />
Q:Word;<br />
Begin<br />
For Q:=Satir*Sutun downto 0 do<br />
     begin<br />
     Mem[&#36;B800:Q*2  ]:=Byte(Zkar);<br />
     Mem[&#36;B800:Q*2+1]:=TextAttr;<br />
     end;<br />
end;<br />
...<br />
  <br />
<br />
2. Procedure:<br />
<br />
Uses Crt;<br />
...<br />
Procedure Zemin(Zkar:Char);<br />
(* Atamalar 16 bit (word) yapılıyor.<br />
   Program parçasının anlaşılırlığı azalmış. <br />
   Kaynak kodu optimizasyonu var. *)<br />
Var<br />
Q,Cift:Word;<br />
Begin<br />
Cift:=Byte(Zkar)+(TextAttr Shl 8);<br />
For Q:=Satir*Sutun downto 0 do<br />
     MemW[&#36;B800:Q Shl 1]:=Cift;<br />
end;<br />
  <br />
<br />
İkinci prosedürün kaynak kodu optimizasyonu için ardışık iki atama yerine her seferde bir atama yapılmış, sabit tamsayıyla çarpma işlemleri Â«shlÂ» operatörüyle gerçekleştirilmiştir. Bu prosedür, 32-bit yazmaçlar ve atamalar kullanılarak daha da iyileştirilebilir. <br />
Konuyla ilgili diğer önemli bir uyarı da Blockread ve Blockwrite ile ilgili. Bu prosedürler geniş arabellekle kullanılmalıdırlar. Arabellek boyutu 512 baytın katları olmalıdır. Örneğin 10.000 bayt arabellek yerine tam 10 kilobaytlık 10.240 bayt arabellek kullanılması performans açısından biraz daha iyidir. Ama en büyük performansı büyük arabellek verecektir.<br />
<br />
1.2- String işlemleri için standart prosedürlerin yerine daha hızlı alternatifler bulunabilir<br />
String tipi değişkenler, ilk Pascal derleyicilerinde karakter dizileri olarak tanımlanıyorlardı. Bir prosedürde parametre olarak kullanılmaları Â«stackÂ» bölümüne içerikleriyle kopyalanmalarına, dolayısıyla zaman ve yer kaybına yolaçıyordu. Bu sorun çok önceleri String tipi değişkenleri işaretçi (pointer) gibi kullanmakla halledildi. Derleyiciler artık parametre olan String değişkenlerin sadece adresini stack bölümüne atıyorlar, gerektiğinde bu adresten kullanıyorlar.<br />
Yine de String ile ilgili atama ve kopyalama işlemleri çok hızlı değildir. Programda String tipindeki değişkenlerin sıklıkla kullanıldıkları bölümler varsa (isim sıralama, kelime işlem vb.) bu bölümleri optimize etmek mümkündür. <br />
<br />
Örneğin, S ve D string, N bayt tipinde değişkenler olmak üzere, S'in ilk N karakterini D'ye aktarmak için<br />
D:=Copy(S,1,N);<br />
<br />
yazmak yerine<br />
<br />
Move(S[1],D[1],N);<br />
D[0]:=Chr(N);<br />
<br />
ikilisini yazmak çok daha iyi sonuç verir. <br />
<br />
<img src="http://www.zohreanaforum.com/" loading="lazy"  alt="[Resim: www.zohreanaforum.com]" class="mycode_img" />[COLOR=#c5003f]Move komutu string tipi işlemlerde kullanmak için çok idealdir.   <br />
<br />
1.3- Genel değişkenler (global var.) ve işaretçi kullanımları (pointer) en aza indirilmelidir<br />
Yerel (local var.) değişkenlere erişim genel değişkenlere olduğundan daha hızlıdır. Sayaç vb. değişkenlerin genel değişken olarak tanımlanmaları şart değildir. Bunları prosedür ve fonksiyonlar içinde geçici yerel değişkenler olarak tanımlamak daha iyi sonuç verir.<br />
<br />
1.4- Giriş-çıkış ve grafik ile ilgili işlemlerde standart fonksiyonların kullanımı azaltılmalıdır<br />
Grafik kütüphanesi ve giriş-çıkış komutları, standartlara ve tüm kullanıcıların donanımına uyumlu olmaları amacı güdülerek yazıldıklarından oldukça yavaştırlar. <br />
Daha zahmetli de olsa, ilgili kesmelerden yararlanılarak grafik için Vesa uyumlu modlara erişerek bankları veya LFB'ı kullanacak şekilde programlamak, giriş-çıkış içinse ilgili portları ve işletim sisteminin olanaklarını kullanmak yerinde olur.<br />
<br />
1.5- Program doğru çalışıyorsa Â«Range CheckingÂ» kaldırılmalıdır<br />
Range Checking seçeneği, değişkenlere geçerli oldukları aralığın dışında bir değer atanıp atanmadığını kontrol eden kodları programa ekler. Bu kodlar karşılaştırma kodları oldukları için performansı olumsuz etkilerler. Programın hata ayıklama dönemi bitip doğru çalıştığından emin olununca seçenek devreden çıkarılmalıdır. <br />
<br />
Kaynak kodu optimizasyonunda bir diğer önemli konu derleyici için iyileştirmeye uygun kod yazmaktır. Yakın zamanda geliştirilen derleyicilerin çoğu optimizasyon yeteneklerine sahipler. <br />
<br />
Unutulmaması gereken diğer bir konu da yapılan optimizasyonu test etmektir. Performansa fazla katkı sağlamayan optimizasyon kodun okunurluğunu ve taşınırlığını boşuna azaltmış olur.<br />
<br />
1.6- Karşılaştırma ve koşullar en aza indirilmelidir<br />
Karşılaştırma komutları, geniş kapsamlı bir programda sıkça rastlanan komutlardır. Ama işlemci için bu tür komutlar, düz bir yoldaki yol ayrımlarıdır; işlemcinin hangi yola sapacağına karar vermesi yavaşlamaya sebep olacaktır.<br />
Günümüz işlemcilerinin karşılaştırma komutlarının sonucunu kestirmek ve böylece bu tür komutların hız kesmesini önlemek için kullandıkları dallanma tahmini yöntemleri, eğer yapılan tahmin yanlışsa boşa harcanan saat çevrimlerine yolaçar. Aşağıdaki iki yapı aynı işi yapmalarına karşın uygulamada, eğer mümkünse, ikincisi tercih edilmelidir. Birinci yapı bahsedilen mahsurlu duruma yolaçabilir.<br />
<br />
1. IF (Koşul) THEN A_iSLEMi <br />
     ELSE B_iSLEMi;<br />
<br />
2. B_iSLEMi;<br />
   IF (Koşul) THEN <br />
begin<br />
Geri_Al_B_iSLEMi;<br />
A_iSLEMi;<br />
end;<br />
<br />
1.7- Kullanılacak algoritmalar doğru seçilmelidir<br />
Bazı bilinen algoritmalarda aynı işi yapanlardan hangisinin daha hızlı çalıştığı malumdur. Örneğin Quicksort sıralama yöntemi, Bubble sort yönteminden çok daha hızlı çalışır. Programcı, kendi geliştirdiği algoritmanın daha etkin hale getirilmesinin mümkün olup olmadığını araştırmalı, mümkünse algoritmasını iyileştirmelidir.<br />
<br />
2- İşlemciye özel optimizasyonlar : <br />
İşlemcinin özelliklerinin ve varsa ilave komut setlerinin etkili bir şekilde kullanılmasıdır. Örnek olarak Pentium ve üstü işlemcilerin aynı anda iki bağımsız komutu işleme özelliğinin kullanılması için Â«pairingÂ» yapma veya bir çoklu ortam (multimedia) uygulamasında MMX&#8482; komut setininin avantajlarından faydalanmak verilebilir. <br />
<br />
Avantajları:<br />
? Mümkün olan en hızlı program kodu geliştirilebilir. <br />
? Yeni teknolojilerden yararlanılabilir.<br />
<br />
Dezavantajları:<br />
? Bu tür optimizasyonları her Pascal derleyicisi yapmadığı için assembly ile programa dahil etmek gerekecektir. <br />
? Fazladan çaba, zaman ve yeterli bilgi gerektirir. Programcı, işlemcinin özelliklerini ve çalışma prensiplerini bilmelidir.<br />
? Program, yapılan işlemciye özel optimizasyonlar yüzünden her işlemcide çalışmayabilir. Bu durumda çalışma kütüphanelerinin bazı bölümlerinin normal ve optimize olarak iki biçiminin bulundurulması ve gerekenin çalıştırılması zorunludur. Örneğin, MMX için optimizasyonlar yapılmışsa programı Pentium&#8482; ve Pentium Pro&#8482; 'da çalıştırmak için optimize edilmemiş normal kütüphaneye ihtiyaç duyulacaktır. Ayrıca Intel, AMD, Cyrix ve diğer üreticilerin işlemci tasarımları değişik olduğundan ötürü her işlemcide aynı oranda iyileştirme yapılamayabilir.<br />
<br />
Çoğunluğun kullandığı x86 temelli bilgisayarları gözönüne alacak olursak, tümü için geçerli bir optimizasyon tekniği yoktur. İşlemcilerin çalışma prensiplerine göre teknikler değişir. Ama bugünkü uygulamada, Pentium için optimize edilmiş bir program daha üst seviye işlemciler için de az veya çok optimize edilmiş sayılabilir.<br />
İşlemcilerin işleyişini gözönüne alarak programları optimize etmek oldukça zahmetli bir iştir. Esasen bu derleyici yazanların ve low-level programcıların işidir. Burada temel bazı işlemci işleyiş ve Pascal'da assembly kullanım bilgileri verilecektir.<br />
<br />
2.1- 486 cephesinde durum:<br />
Intel'in x86 komut setinde ilk köklü değişikliği yapıp 32-bit yazmaçlar (register) ve komutlar eklediği işlemcisi 80386'dan sonra piyasaya sürdüğü, uzun süre piyasada kalan ve çeşitli çekirdek (CPU) hızlarında birçok değişik modelleri (SX, DX, DX2, DLC vs.) çıkan, zamanının başarılı bir işlemcisidir. Çoğu durumda bir saat çevriminde bir komut işleyecek şekilde tasarlanmıştır. <br />
<br />
486 işlemciler 5 aşamada komut işlemektedirler. <br />
1- Prefech : Komutların işlemci iki 16 baytlık arabelleğinden birine alınır.<br />
2- Decode  : Komut yolundan gelen komutların çözümlemesi yapılır.<br />
3- Address Generation : Adres çözümlemesi yapılır.<br />
4- Execution : Komutun çalıştırılması bu aşamada olur.<br />
5- Writeback : Yazmaç içeriklerinin güncellendiği bölümdür.<br />
<br />
2.2- Pentium ve Pentium MMX:<br />
Pentium işlemciler, kendilerinden önceki nesillere göre komut işleme kapasitelerindeki büyük gelişme ile dikkat çektiler. Bu gelişme sayesinde birçok uygulamada aynı saat hızında Pentium işlemci 486 işlemciden en az iki kat daha hızlı komut işliyordu. Bu gelişmenin en önemli sebepleri:<br />
- Dallanma tahmini (Branch prediction) : Dallanma (jump) komutlarında işlemcinin birtakım tahminler yapmak yoluyla dallanmanın yolaçtığı gecikmeleri azaltmasıdır. <br />
- Çift pipeline : Komutların U ve V ile sembolize edilen iki pipeline (komut yolu) içinde eşzamanlı olarak işlenmesi sayesinde teorik olarak aynı anda iki komut işlenmesidir. Pratikte bunun gerçekleşebilmesi bazı şartların sağlanması gerekir.<br />
- Yeni kayan nokta işlem ünitesi : Pentium, gerçel sayı işlemlerinin hızını belirgin bir şekilde arttıran yeni matematik işlemci tasarımıyla kendi dönemindeki x86'ların önemli bir yavaşlığı telafi etti.<br />
<br />
Pentium MMX işlemci, klasik Pentium'a göre biraz daha iyi komut işler. Daha geniş L1 arabellek, daha iyi dallanma tahmini algoritması ve yeni komut seti eklentileri ona avantaj sağlar. <br />
<br />
Pentium için optimizasyonda Pascal kodu içinden yapılabilecek en önemli etki, inline veya asm bloklarını çift pipeline mimarisinin kurallarına uyarak optimize etmektir. İşlemciye aynı anda iki komut işletebilmenin yolu mümkün olduğunca uygun komut çiftleri oluşturmaktır. Pentium'un pipeline'ını oluşturan yollar U ve V yolları olarak adlandırılır. U yolu tüm komutları işleyebilirken V yolu bazı sıkça kullanılan basit yapılı komutları işleyebilir. Bu yolların etkin kullanımı, komutların uygun sırayla işlemciye ulaştırılmasıyla olur.<br />
<br />
Bazı eski karmaşık yapılı komutlar, komut çiftlemeyi mümkün kılacak şekilde eşder komutlara bölünebilirler. <br />
<br />
Örneğin,<br />
MOVZX EAX,BYTE PTR [...] =  XOR EAX,EAX + MOV AL,BYTE PTR [...] <br />
<br />
Temel kurallar şunlardır:<br />
<br />
1- Her iki komut basit yapıda olmalıdır. Komutları, Pentium'un işleyişi bakımından 4'e ayırmak mümkündür: <br />
UV (Hem U'da hem V'de çiftlenebilen), <br />
PU (U'da çiftlenebilen), <br />
PV (V'de çiftlenebilen, <br />
NP (çiftlenemeyen)<br />
<br />
UV : MOV, PUSH, POP yazmaç, LEA, NOP, INC, DEC, ADD, SUB, CMP, AND, OR, XOR, <br />
A.L.U. yazmaç,... , A.L.U. adres,yazmaç/değer, NOP, TEST(kısmen)<br />
PU : ADC, SBB, SHR, SAR, SHL, SAL yazmaç,değer , ROR, ROL, RCR, RCL yazmaç,1 <br />
PV : yakın CALL, JUMP, koşullu dallanma komutları.<br />
<br />
Bunların dışındaki komutlar U yolunda işlenir ve çiftlenemezler. <br />
<br />
2- İki komut arasında yazmaç bağlılığı bulunmamalıdır. Yani bir komut kendinden öncekinin sonucunu beklemek zorunda olmamalıdır.  Örnekler:<br />
<br />
MOV BX,CX ; ADD AX,BX ' ikinci komut birincide BX'in alacağı değere bağlı, çiftlenemez!<br />
MOV BX,CX ; MOV CX,AX ' ikinci komut birinciyi beklemeden işlenebilir.<br />
CMP AX,5  ; JA _etiket ' karşılaştırma ve dallanma komutları bu şekilde çiftlenebilir.<br />
<br />
3- Genellikle, önekli komutlar U'da işlenir ve çiftlenemezler. <br />
<br />
Pentium için optimize edilen programlar, işlemci çalışma prensiplerinden ötürü daha eski işlemcilerde normalden de yavaş çalışabilirler. Bunun sebebi, eski karmaşık yapılı komutların aynı anlama gelen komutlara ayrılmasıyla komut çiftleme imkânı oluşturmak, Pentium işlemcilerde hız kazandırırken eski tip işlemcilerde kaybettirebilir. Günümüzde pek önemi kalmayan bu durum bir uyarı niteliğindedir.<br />
<br />
2.3- Pentium Pro ve Pentium II :<br />
Mimarileri ve komut işleme teknikleri çok benzer olan olan bu iki işlemci, üç komutu aynı anda işleme yeteneğine sahiptir. Bunun dışında, gelişkin dallanma tahmini, yazmaç isimlerini otomatik değiştirme, sırasız komut işleme gibi çok etkili yöntemlerle çalışırlar. Pentium II, MMX desteği, 16-bit programları daha iyi işlemesi ve yeni veriyolu mimarisi ile Pentium Pro'dan ayrılır.<br />
Pentium Pro ve PII'nin komut yollarını D0, D1, D2 diye adlandırırsak, D0 Pentiumlardaki U'ya, diğerleri V'ye karşılık gelir. Komutların uygunlaştırılması üçlü halde yapılır. Bununla birlikte Pentium için optimize edilen program bu işlemcilerde de normalden hızlı çalışacaktır. <br />
<br />
Bu anlatılanların işlemci özelliklerinin bazı eksikleri ve belirtilmemiş istisnalar vardır. Genel durum, belirtildiği şekilde olup ayrıntılara girilmemiştir. <br />
<br />
Pascal'da Assembly:<br />
Derleyiciler herzaman en uygun kodu üretmezler, hatta birçoğu eski işlemcilerle olan uyumluluğu bozmamak için yeni işlemcilerde oldukça Â«müsrifÂ» davranan komutları üretebilirler. Ayrıca hafıza erişimi bolca olan ya da matematiksel işlem yapan kodların optimize edilmesi genellikle mümkündür. Derleyicinin yapamadığı yerde bunu programcı, kodunu assembly komutlarıyla destekleyerek yapar.<br />
Assembly komutları Pascal programlarına üç yoldan eklenebilir:<br />
1- Inline komutuyla doğrudan, derlenmiş byte kod olarak,<br />
2- Assembler'da Pascal modeliyle derlenmiş .obj dosyaları yoluyla,<br />
3- TP6'dan itibaren Assembler direktifi ile tüm prosedürde veya asm ... end bloğu arasında 16-bit 80286 komutları olarak.<br />
<br />
Inline direktifi:<br />
İşlemciye gönderilecek komutları hazır olarak programa katmak için kullanılır. Bir prosedür için uygun olan herhangi bir yerde yazılabilir. Kullanımı dikkat ve biraz bilgi ister. Normalde derleyicinin destekle-mediği komutları bu sayede programa eklemek mümkün olur. Bugünkü uygulamada bundan başka avantajı kalmamıştır. Bu direktif hakkında ayrıntılı bilgi bu yazıda verilmeyecektir.<br />
Assembly komutlarının karşılığı olan byte kodları Debug veya herhangi bir disassembler program yardımıyla elde ettikten sonra ardışık / ile ayrılmış baytlar şeklinde parantezin arasına yazmak gerekir.<br />
Inline(&#36;A1/&#36;FF/&#36;F0); veya aynı anlamda Inline(&#36;A1/&#36;F0FF); komutu MOV AX,&#36;FFF0 komutunun karşılığı olarak programa dahil edilebilir. Görüldüğü gibi, word değerlerin bayt halinde yazılması sırasında yüksek ve düşük baytların ters sırada yazılması gerekir.<br />
<br />
Harici Prosedürler:<br />
Pascal modeline göre derlenmiş assembly program parçaları .obj dosyaları halinde programa dahil edilebilir, programın içindeki veriyi kullanabilir. <br />
<br />
Assembler direktifi ve asm...end blokları:<br />
Kullanılan derleyiciye bağlı olarak kaynak kodu içinde assembly komutları ve prosedürleri kullanılabilir. Çok yaygın derleyicilerden Borland Pascal 6 ve 7'de 286/287 komutları, TMT Pascal'da 386/387 komutları desteklenmektedir. <br />
Genel kullanımı şu şekildedir:<br />
<br />
Procedure ProcName( {parametreler} );Assembler;<br />
asm<br />
... {Assembly komutları}<br />
end; {Prosedür sonu}<br />
<br />
Sözkonusu olan fonksiyonlar olduğunda da aynı yapı geçerlidir.<br />
Prosedür ve fonksiyonların değer parametreleriyle yazmaçlar arasındaki alışverişi parametreleri doğrudan boyutuna uygun yazmaca atanarak yapılabilir. Adres içeren parametrelerde ve fonksiyonlardan dönecek değerlerde dikkat edilecek noktalar vardır. <br />
<br />
Küçük bir hatırlatma: Prosedürlerin veya fonksiyonların parametreleri değer parametresi veya değişken parametresi olabilir. <br />
Procedure EkrandanSatirOku( X,Y,U : Byte; Var Str:String);<br />
Bu prosedürün görevi, metin ekranındaki X,Y koordinatından U uzunluğundaki bilgiyi okuyup Str string değişkenine aktarmak olsun. Buradaki X,Y ve U değer parametreleridir, değişmezler, Str ise değişken parametresidir, prosedür içinde değeri değişerek çıkabilir. <br />
<br />
Bu prosedür çağırılırken <br />
EkrandanSatirOku(4,5,N,S);<br />
şeklinde çağırılabilir,<br />
EkrandanSatirOku(4,5,N,'ABC');<br />
şeklinde çağırılamaz!<br />
Çünkü, değer parametrelerine değişken konabilir ama değişken parametrelerine (var ile tanımlı parametrelere) değer konamaz.<br />
Adres içeren parametreler, pointer, string, dizi (array) tipinde olan değer parametreleri ve tüm değişken parametreleridir. Bunların 4 baytlık (segment ve ofsetli) adresleri alınıp asm...end bloğunda işlenirler.<br />
Fonksiyonlarda ise, fonksiyonun geri dönecek değeri, tanımlanan tipine göre Byte, Shortint veya Char ise AL'de, Word veya Integer ise AX 'de, Longint veya Pointer ise AX<img src="https://www.zohreanaforum.com/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />X 'de saklanır.<br />
Ayrıca çok kullanılan bazı assembly komutlarını hatırlatmakta fayda var:<br />
<br />
( y:yazmaç, a:adres, d:değer, @<img src="https://www.zohreanaforum.com/images/smilies/confused.png" alt="Confused" title="Confused" class="smilie smilie_13" />ıçrama komutları için ofset )<br />
- MOV y/a, y/a/d<br />
- AND, OR, XOR y, y/a<br />
- NOT, NEG y/a<br />
- SHL, SHR, ROL, ROR y/a, y/d<br />
- LEA y, [y+d]<br />
- JMP @<br />
- JA, JZ, JE, JB, JNA, ... @<br />
- TEST, CMP y/a, y/a/d<br />
<br />
Yukarıdaki komutlarda Â«a, aÂ» kombinasyonu geçerli değildir. Ayrıca adres ve yazmaç kullanımı ile ilgili de kısıtlamalar vardır. Örneğin SHL DX,CL geçerli ama SHL DX,CX geçersizdir!<br />
<br />
Tüm bu bilgilerin ışığında, bir string değişkenin N. karakterinin Ascii kodunu veren bir fonksiyon yazılabilir:<br />
<br />
Function Ascii(Var S:String; N:Byte):Byte;Assembler;<br />
asm<br />
   LES DI, S[0] { 1: S'in başlangıç adresi ES<img src="https://www.zohreanaforum.com/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />I'a depolanır }<br />
   XOR BX,BX { 2: BX yazmacı sıfırlanır }<br />
   XOR AX,AX { 3: AX yazmacı sıfırlanır }<br />
   MOV BL, N { 4: Kaçıncı karakter hesaplanacağı BL'ye }<br />
   MOV AL,ES:[DI] { 5: S'in uzunluğunu içeren ilk bayt AL'ye aktarılır }<br />
   CMP AL,BL { 6: AL, BL ile karşılaştırılır }<br />
   JB @1 { 7: AL'de bulunan S'in uzunluğu N'den küçükse işlem yapılamaz}<br />
   MOV AL,ES:[DI+BX] { 8: N. karakter AL'ye aktarılır }<br />
   JMP @2 { 9: Fonksiyonun sonucu AL'de }<br />
@1:XOR AL,AL {10: İşlem mümkün değilse fonksiyondan sıfır değeri döner}<br />
@2: {11: Bitti!.. }<br />
end;<br />
<br />
Bu fonksiyon, esasen Ord(S[N]) ifadesiyle aynı görevi görmesine rağmen konuya iyi bir örnek oluşturduğu için yazılmıştır. S'in ES<img src="https://www.zohreanaforum.com/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />I'a aktarılan adresi, sıfırıncı baytını yani uzunluğunu içerir. Uzunluğu N'den küçükse, fonksiyonun istenen karakterin değerini vermesi mümkün değildir. Bu durumda AL değerinin sıfırlanarak fonksiyonun terkedildiği @1 etiketine dallanma yapılır ve fonksiyondan sıfır değeri döner. S'in uzunluğu N'den büyük veya eşitse işlem mümkündür, AL'ye N. karakterin aktarılması ile işlem tamamlanır. Bu da şöyle gerçekleşir: N'in değerinin 4. Satırdan beri BX'de olduğunu biliyoruz. S[0]'ın adresi ES:[DI] idi. Bu adresten BL yani şimdi BX kadar uzakta olan bayt, N. bayttır. Bu bayt AL'ye 8. Satırda aktarılır ve fonksiyon görevini yerine getirmiş olur.<br />
<br />
Sözün kısası...<br />
Optimizasyon konusu, donanımın yazılıma göre daha hızlı gelişim göstermesi yüzünden pek üzerinde durulmayan ama tecrübeli programcıların gözardı etmedikleri bir konudur. Aynı işi yapan iki rakip programdan daha hızlı olanının, daha düşük konfigürasyonda iyi çalışanın tercih edilmesi olasılığı yüksektir. Ayrıca disk gibi depolama birimlerinin hızı konusunda pek az gelişme oluyor. Dosya işlemlerinin optimizasyonu halen önem taşıyan bir konudur. <br />
Pascal&#8217;ı ve Intel işlemcilerini baz alarak yazılan bu yazıdaki bilgilerin daha kaliteli programların gelişmesine katkıda bulunmasını dilerim.<br />
<br />
alıntıdır]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Matematiksel İşlem Programı]]></title>
			<link>https://www.zohreanaforum.com/konu-matematiksel-islem-programi.html</link>
			<pubDate>Thu, 04 Dec 2008 16:57:05 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-matematiksel-islem-programi.html</guid>
			<description><![CDATA[Menu secenekli güzel ve basit bir program  <br />
<br />
uses crt;<br />
label d;<br />
var<br />
a:byte;<br />
sec,devam:char;<br />
s1,s2:longint;<br />
sonuc:real;<br />
begin clrscr;<br />
d:<br />
for a:=5 to 75 do begin<br />
textcolor(3);gotoxy(a,5);write(#205);<br />
gotoxy(a,20);write(#205);<br />
gotoxy(a,7);write(#205);<br />
end;<br />
for a:=5 to 20 do begin<br />
gotoxy(5,a);write(#186);<br />
gotoxy(75,a);write(#186);<br />
gotoxy(5,5);write(#201);<br />
gotoxy(5,20);write(#200);<br />
gotoxy(75,5);write(#187);<br />
gotoxy(75,20);write(#188);<br />
end;<br />
for a:=10 to 30 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,18);write(#205);<br />
end;<br />
for a:=45 to 65 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,18);write(#205);<br />
end;<br />
for a:=10 to 18 do begin<br />
gotoxy(10,a);write(#186);<br />
gotoxy(30,a);write(#186);<br />
gotoxy(45,a);write(#186);<br />
gotoxy(65,a);write(#186);<br />
gotoxy(10,18);write(#200);<br />
gotoxy(10,10);write(#201);<br />
gotoxy(65,18);write(#188);<br />
gotoxy(65,10);write(#187);<br />
gotoxy(45,10);write(#201);<br />
gotoxy(45,18);write(#200);<br />
gotoxy(30,10);write(#187);<br />
gotoxy(30,18);write(#188);<br />
end;<br />
for a:=25 to 50 do begin<br />
gotoxy(a,24);write(#205);<br />
end;<br />
for a:=21 to 24 do begin<br />
gotoxy(25,a);write(#186);<br />
gotoxy(50,a);write(#186);<br />
gotoxy(25,20);write(#201);<br />
gotoxy(25,24);write(#200);<br />
gotoxy(50,24);write(#188);<br />
gotoxy(50,20);write(#187);<br />
end;<br />
textcolor(yellow);gotoxy(26,6);write('--------&gt; MENU &lt;---------');<br />
TEXTCOLOR(lightgreen);gotoxy(12,11);write('[a] TOPLAMA');<br />
gotoxy(12,13);write('[b] CIKARMA');<br />
GOTOXY(12,15);write('[c] CARPMA');<br />
GOTOXY(12,17);write('[d] BOLME');<br />
GOTOXY(47,11);Write('[e] KARE');<br />
GOTOXy(47,13);write('[f] FAKTORIYEL');<br />
GOtoxy(47,15);write('[g] KAREKOK');<br />
gotoxy(47,17);write('[h] DA&#732;RE ALAN ');<br />
GOTOXY(30,22);write('Seciminiz....:');<br />
SEC:=READKEY;<br />
case sec of<br />
'a': begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;TOPLAMA&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1+s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'b':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;CIKARMA&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1-s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'c':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;CARPMA&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1*s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'd':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;BOLME&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1/s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'e':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;KARE&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('Bir sayi girin...:');readln(s1);<br />
sonuc:=s1*s1;<br />
gotoxy(30,16);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'f':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;FAKTORIYEL&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('Bir sayi girin...:');readln(s1);sonuc:=1;<br />
for a:=1 to s1 do begin<br />
sonuc:=sonuc*a;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;end;<br />
'g':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;KAREKOK&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('Bir sayi girin...:');readln(s1);<br />
sonuc:=sqrt(s1);<br />
gotoxy(30,18);write('Sayinin karekoku...:',sonuc:3:2);<br />
end;<br />
'h':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('----&gt;&gt;&gt;&gt;DA&#732;REN&#732;N ALANI&lt;&lt;&lt;&lt;----');<br />
gotoxy(25,14);write('Dairenin yarÂcapini girin...:');readln(s1);<br />
sonuc:=s1*pi;<br />
gotoxy(30,18);write('Dairenin alanÂ...:',sonuc:3:2);<br />
end;<br />
end;<br />
tEXTCOLOR(RED);gotoxy(25,25);write(#205,'COPYRIGHT TO By ZIYANKAR',#205);<br />
gotoxy(20,21);write('DEvam etmek istiyormusunuz....[e/h]:');devam:=readkey;<br />
clrscr;<br />
if devam='e' then goto d<br />
else exit;<br />
readln;<br />
end.<br />
<br />
<br />
<br />
<br />
alıntıdır]]></description>
			<content:encoded><![CDATA[Menu secenekli güzel ve basit bir program  <br />
<br />
uses crt;<br />
label d;<br />
var<br />
a:byte;<br />
sec,devam:char;<br />
s1,s2:longint;<br />
sonuc:real;<br />
begin clrscr;<br />
d:<br />
for a:=5 to 75 do begin<br />
textcolor(3);gotoxy(a,5);write(#205);<br />
gotoxy(a,20);write(#205);<br />
gotoxy(a,7);write(#205);<br />
end;<br />
for a:=5 to 20 do begin<br />
gotoxy(5,a);write(#186);<br />
gotoxy(75,a);write(#186);<br />
gotoxy(5,5);write(#201);<br />
gotoxy(5,20);write(#200);<br />
gotoxy(75,5);write(#187);<br />
gotoxy(75,20);write(#188);<br />
end;<br />
for a:=10 to 30 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,18);write(#205);<br />
end;<br />
for a:=45 to 65 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,18);write(#205);<br />
end;<br />
for a:=10 to 18 do begin<br />
gotoxy(10,a);write(#186);<br />
gotoxy(30,a);write(#186);<br />
gotoxy(45,a);write(#186);<br />
gotoxy(65,a);write(#186);<br />
gotoxy(10,18);write(#200);<br />
gotoxy(10,10);write(#201);<br />
gotoxy(65,18);write(#188);<br />
gotoxy(65,10);write(#187);<br />
gotoxy(45,10);write(#201);<br />
gotoxy(45,18);write(#200);<br />
gotoxy(30,10);write(#187);<br />
gotoxy(30,18);write(#188);<br />
end;<br />
for a:=25 to 50 do begin<br />
gotoxy(a,24);write(#205);<br />
end;<br />
for a:=21 to 24 do begin<br />
gotoxy(25,a);write(#186);<br />
gotoxy(50,a);write(#186);<br />
gotoxy(25,20);write(#201);<br />
gotoxy(25,24);write(#200);<br />
gotoxy(50,24);write(#188);<br />
gotoxy(50,20);write(#187);<br />
end;<br />
textcolor(yellow);gotoxy(26,6);write('--------&gt; MENU &lt;---------');<br />
TEXTCOLOR(lightgreen);gotoxy(12,11);write('[a] TOPLAMA');<br />
gotoxy(12,13);write('[b] CIKARMA');<br />
GOTOXY(12,15);write('[c] CARPMA');<br />
GOTOXY(12,17);write('[d] BOLME');<br />
GOTOXY(47,11);Write('[e] KARE');<br />
GOTOXy(47,13);write('[f] FAKTORIYEL');<br />
GOtoxy(47,15);write('[g] KAREKOK');<br />
gotoxy(47,17);write('[h] DA&#732;RE ALAN ');<br />
GOTOXY(30,22);write('Seciminiz....:');<br />
SEC:=READKEY;<br />
case sec of<br />
'a': begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;TOPLAMA&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1+s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'b':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;CIKARMA&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1-s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'c':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;CARPMA&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1*s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'd':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;BOLME&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('1.sayi...:');readln(s1);<br />
gotoxy(30,16);write('2.sayi...:');readln(s2);<br />
sonuc:=s1/s2;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'e':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;KARE&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('Bir sayi girin...:');readln(s1);<br />
sonuc:=s1*s1;<br />
gotoxy(30,16);write('sonuc...:',sonuc:3:2);<br />
end;<br />
'f':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;FAKTORIYEL&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('Bir sayi girin...:');readln(s1);sonuc:=1;<br />
for a:=1 to s1 do begin<br />
sonuc:=sonuc*a;<br />
gotoxy(30,18);write('sonuc...:',sonuc:3:2);<br />
end;end;<br />
'g':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('------&gt;&gt;&gt;&gt;KAREKOK&lt;&lt;&lt;&lt;----------');<br />
gotoxy(30,14);write('Bir sayi girin...:');readln(s1);<br />
sonuc:=sqrt(s1);<br />
gotoxy(30,18);write('Sayinin karekoku...:',sonuc:3:2);<br />
end;<br />
'h':begin clrscr;<br />
for a:=20 to 60 do begin<br />
gotoxy(a,10);write(#205);<br />
gotoxy(a,20);write(#205);<br />
end;<br />
for a:=10 to 20 do begin<br />
gotoxy(20,a);write(#186);<br />
gotoxy(60,a);write(#186);<br />
gotoxy(20,10);write(#201);<br />
gotoxy(20,20);write(#200);<br />
gotoxy(60,10);write(#187);<br />
gotoxy(60,20);write(#188);<br />
end;<br />
textcolor(3);gotoxy(25,11);write('----&gt;&gt;&gt;&gt;DA&#732;REN&#732;N ALANI&lt;&lt;&lt;&lt;----');<br />
gotoxy(25,14);write('Dairenin yarÂcapini girin...:');readln(s1);<br />
sonuc:=s1*pi;<br />
gotoxy(30,18);write('Dairenin alanÂ...:',sonuc:3:2);<br />
end;<br />
end;<br />
tEXTCOLOR(RED);gotoxy(25,25);write(#205,'COPYRIGHT TO By ZIYANKAR',#205);<br />
gotoxy(20,21);write('DEvam etmek istiyormusunuz....[e/h]:');devam:=readkey;<br />
clrscr;<br />
if devam='e' then goto d<br />
else exit;<br />
readln;<br />
end.<br />
<br />
<br />
<br />
<br />
alıntıdır]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[sayıların ortalamasını alma]]></title>
			<link>https://www.zohreanaforum.com/konu-sayilarin-ortalamasini-alma.html</link>
			<pubDate>Thu, 04 Dec 2008 16:56:02 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-sayilarin-ortalamasini-alma.html</guid>
			<description><![CDATA[istediginiz sayıda girdiginiz sayıların ortalamasını almak için yazılmış bir program   var a,i:integer;<br />
    toplam,ortalama,b:real;<br />
begin<br />
write('kaç tane sayinin ortalamasini almak istiyorsunuz=');<br />
readln(a);<br />
toplam:=0;<br />
for i:=1 to a do<br />
begin<br />
write(i,'.sayiyi giriniz='); readln(b);<br />
toplam:=toplam+b;<br />
end;<br />
ortalama:=toplam/a;<br />
writeln(a,'tane sayinin ortalamasi=',ortalama:10:2);<br />
end.]]></description>
			<content:encoded><![CDATA[istediginiz sayıda girdiginiz sayıların ortalamasını almak için yazılmış bir program   var a,i:integer;<br />
    toplam,ortalama,b:real;<br />
begin<br />
write('kaç tane sayinin ortalamasini almak istiyorsunuz=');<br />
readln(a);<br />
toplam:=0;<br />
for i:=1 to a do<br />
begin<br />
write(i,'.sayiyi giriniz='); readln(b);<br />
toplam:=toplam+b;<br />
end;<br />
ortalama:=toplam/a;<br />
writeln(a,'tane sayinin ortalamasi=',ortalama:10:2);<br />
end.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Kayan Yazı]]></title>
			<link>https://www.zohreanaforum.com/konu-kayan-yazi.html</link>
			<pubDate>Thu, 04 Dec 2008 16:55:10 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-kayan-yazi.html</guid>
			<description><![CDATA[Klavyeden Girilin Bir kelimenin Ekreanın Ortasından Kayarak İnme...  uses Crt;<br />
var<br />
i,hiz,ses:integer;ad<img src="https://www.zohreanaforum.com/images/smilies/confused.png" alt="Confused" title="Confused" class="smilie smilie_13" />tring;<br />
begin clrscr;<br />
TEXTBACKGROUND(2);textcolor(15);<br />
gotoxy(1,1);write('KAYACAK OLAN YAZIYI GİRİNİZ...:');readln(ad);<br />
gotoxy(1,2);write('LÜTFEN GİRİS HIZINI GİRİNİZ...:');readln(hiz);<br />
gotoxy(1,3);write('LÜTFEN BELİRTİLENARALIKTA SES KODUNU GİRİNİZ...(1 ila 1000 arasi)...:');readln(ses);<br />
clrscr;<br />
gotoxy(1,1);writeln('PROGRAMDAN ÇIKMAK İÇİN LÜTFEN HERHANGİ BİR TUŞA BASINIZ VE YAZININ SAĞ TARAFA GEÇMESİNİ BEKLEYİNİZ....');<br />
repeat<br />
for i:=1 to 70 do begin<br />
textcolor(14);<br />
gotoxy(i+1,20);Write(ad);<br />
sound(ses);<br />
delay(hiz);<br />
textcolor(black);<br />
gotoxy(i+1,20);Write(ad);<br />
end;<br />
until keypressed;<br />
nosound;<br />
write('yusuf baydoğan tarafından hazırlanılmıştır. çalışmalarımzın devamı gelecektir');<br />
readln; end.<br />
<br />
<br />
[yazının rengi siyah değilse textcolor komutunun yanındaki sayıyı değiştiriniz ama unutmayın sadece 1-16 arasında sayı girilebilir başarılar]]]></description>
			<content:encoded><![CDATA[Klavyeden Girilin Bir kelimenin Ekreanın Ortasından Kayarak İnme...  uses Crt;<br />
var<br />
i,hiz,ses:integer;ad<img src="https://www.zohreanaforum.com/images/smilies/confused.png" alt="Confused" title="Confused" class="smilie smilie_13" />tring;<br />
begin clrscr;<br />
TEXTBACKGROUND(2);textcolor(15);<br />
gotoxy(1,1);write('KAYACAK OLAN YAZIYI GİRİNİZ...:');readln(ad);<br />
gotoxy(1,2);write('LÜTFEN GİRİS HIZINI GİRİNİZ...:');readln(hiz);<br />
gotoxy(1,3);write('LÜTFEN BELİRTİLENARALIKTA SES KODUNU GİRİNİZ...(1 ila 1000 arasi)...:');readln(ses);<br />
clrscr;<br />
gotoxy(1,1);writeln('PROGRAMDAN ÇIKMAK İÇİN LÜTFEN HERHANGİ BİR TUŞA BASINIZ VE YAZININ SAĞ TARAFA GEÇMESİNİ BEKLEYİNİZ....');<br />
repeat<br />
for i:=1 to 70 do begin<br />
textcolor(14);<br />
gotoxy(i+1,20);Write(ad);<br />
sound(ses);<br />
delay(hiz);<br />
textcolor(black);<br />
gotoxy(i+1,20);Write(ad);<br />
end;<br />
until keypressed;<br />
nosound;<br />
write('yusuf baydoğan tarafından hazırlanılmıştır. çalışmalarımzın devamı gelecektir');<br />
readln; end.<br />
<br />
<br />
[yazının rengi siyah değilse textcolor komutunun yanındaki sayıyı değiştiriniz ama unutmayın sadece 1-16 arasında sayı girilebilir başarılar]]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[copyy]]></title>
			<link>https://www.zohreanaforum.com/konu-copyy.html</link>
			<pubDate>Thu, 04 Dec 2008 16:54:35 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.zohreanaforum.com/member.php?action=profile&uid=268">PELİN</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.zohreanaforum.com/konu-copyy.html</guid>
			<description><![CDATA[metin dosyasının diğerine kopyalanması  program ornek;<br />
var<br />
d1,d2:TEXT;<br />
a:char;<br />
begin<br />
ASSIGN(d1,'c:\ornek.txt');<br />
ASSIGN(d2,'C:\odev.txt');<br />
Reset(d1);<br />
while not eof(d1) do<br />
begin<br />
read(d1,a)<br />
write(d2,a);<br />
end;<br />
close(d1);<br />
close(d2);<br />
end.]]></description>
			<content:encoded><![CDATA[metin dosyasının diğerine kopyalanması  program ornek;<br />
var<br />
d1,d2:TEXT;<br />
a:char;<br />
begin<br />
ASSIGN(d1,'c:\ornek.txt');<br />
ASSIGN(d2,'C:\odev.txt');<br />
Reset(d1);<br />
while not eof(d1) do<br />
begin<br />
read(d1,a)<br />
write(d2,a);<br />
end;<br />
close(d1);<br />
close(d2);<br />
end.]]></content:encoded>
		</item>
	</channel>
</rss>