BASIC kullanıcılarını C'ye alıştırma turları

Başlatan bunalmis, 28 Ekim 2011, 18:48:32

z

Bu baslık, projelerini BASIC dilinde geliştirebilen fakat C bilmeyen arkadaşların kısa yoldan C ye geçiş yapmaları için açılmıştır.

Einstein_54'ün vereceği BASIC kodları C ye çevireceğiz ve bu esnada kendisiyle ikili tartışma ortamı oluşturacağız.

Bu nedenle konuyu bölecek diger mesajları silmeme anlayış göstermenizi rica ediyorum. (31 Ekimden itibariyle bu durumu kaldirdik)

C Programlama diliyle şamatalar  https://www.picproje.org/index.php/topic,35908.0.html başlığında konuları zaten hep birlikte tartışabileceğiz.

Eistain_54 şimdi Basic ile 1 den 100 e kadar sayıları toplayan örnek program yazacak.

2li tartışma yöntemi umduğum gibi olmazsa genele açık hale getiririz. (Amaç belli bir sırada dağılmadan konuları işlemek)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

    a var byte  'byte tipinde 8 bitlik değişken
 bastan:
     a=1          'a'nın ilk değeri
 basla:
        a=a+1         'a'yı bir arttır.degeri a'ya yükle
   if a=100 then    'a=100 ise
      goto bastan    'bastan etiketine git
   else         'değilse,yani 100 olmamışsa
     goto basla     'basla etiketine git
   endif             'else nin sonu
 end
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

muhittin_kaplan


z

#3
Pekala fakat 2 kisiyi asmayalim.

a var byte  'byte tipinde 8 bitlik değişken
bastan:
     a=1          'a'nın ilk değeri
basla:
        a=a+1         'a'yı bir arttır.degeri a'ya yükle
   if a=100 then    'a=100 ise
      goto bastan    'bastan etiketine git
   else         'değilse,yani 100 olmamışsa
     goto basla     'basla etiketine git
   endif             'else nin sonu
end

Asagidaki de programin herseyiyle ayni C de yazilmis sekli

void main()
{
char a;

bastan: a=1;
basla:
           a=a+1;
           if (a==100)
             {
                goto bastan;
             }
           else
            {
               goto basla;
            }
}

Verilen BASIC programa ne kadar cok benziyor.

Bu programla ilgili akliniza gelen hersey sorun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

#4
Tamam da neden char tipinde a? int olması gerekmezmi?

Sen programda ne yaptiysan ben de aynisini yaptim. Degiskeni sen byte tanimlayinca bende mecburen C deki karisligi olan char tanimladim. (Su anda ARM ile calisiyoruz diye dusunmeyin.)

char denince akla karakterler yani a...z A...Z 0...9 vs geliyor.

char degiskeni, C de hem bu tip veriler icin hemde 8 bit sayisal degerler icin kullaniriz.

karakter dedigimiz veriler aslinda ASCI sayisal degerlerdir. Mesela A karakteri aslinda 0x41 demektir.


Programi asagidaki gibi de yazabiliriz.

void main()
{
char a;

bastan: a=1;
basla:
           a=a+1;
           if (a==100) goto bastan;
           else goto basla;
}

eger toplami integer (32 bit)  tanimlamak istersek


void main()
{
int a;

bastan: a=1;
basla:
           a=a+1;
           if (a==100) goto bastan;
           else goto basla;
}

Bu arada istedigim programi değil bir baska programi yazmissin.

Ben 1 den 100'e kadar olan sayilarin toplamini bulan programi yazmani istemistim. (1 dahil 100 haric)

Tekrar yazmayi dene.
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

muhittin_kaplan

#5
evet neden Char

char denince akla karakterler yani a...z A...Z 0...9 vs geliyor.

char degiskeni, C de hem bu tip veriler icin hemde 8 bit sayisal degerler icin kullaniriz.

karakter dedigimiz veriler aslinda ASCI sayisal degerlerdir. Mesela A karakteri aslinda 0x41 demektir.


ayrıca 100 e kadar toplama yapan program. C de hata var mı ?

Dim A As byte
        Dim b As byte

        For A = 0 To 100
            b = b + A
        Next


int a,b;
      for (a=0;a<100;a++)
     {
        b=b+a
      }


B nin baslangic degerini sifirlamaliydin.




eistain_54

#6
Doğru ya. O halde veri tiplerini seçrken dikkatli olmalı... hocam bu konudan bahsedermisiniz biraz. yani ne tür veriler için ne tür değişkenler oluşturalım...

char a;  // 8 bitlik a degiskeni demek
short b; // 16 bitlik b degiskeni demek
int c;    //  32 bitlik c degiskeni demek
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

DumrulBey

#7
Bu çok güzel kollektif bir uygulama. Bülent hocamı tebrik ediyorum. Sizleri takip edeceğim...

Tesekkurler. Fakat mevcut bu baslik altinda sadece 3 kisi yazisacagiz. Cunku konu cok dagilir. Mesajlari silecegim.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

z

#8
void main()
{
char a;
short b;

        a=0;
        b=0;
AA:
        a=a+1;
        if (a & 0x04)
          {
              a=0;
              b++;
          }
        goto AA;
}

Bu program ne is yapar Programdaki AA etiketinin ustunden 10'uncu kez gecilinceye kadar A ve B sirayla hangi degerleri alirlar?

Atiyorum;

A=0 B=0
A=1 B=5
A=2 B=8

gibi ilk 10 degeri bulmanizi istiyorum.

Bu programi, C satirlarinin tamamen esdegeri olan Basic kodlarla BASIC de yazin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

#9
 ilk program için yanlış anlamışım inşallah bu kez yanlış anlamam
n var word
sonuc var word
sonuc1 var word
basla:
n=99
   sonuc1=n*(n+1)
   sonuc=sonuc1%2 ' Burada 3 kagit yapmissin fakat sonuc=sonuc1 / 2 olmasi gerekmezmi ( % bolme isareti mi demek? Sizin BASIC'i bilmiyorum cunku)
goto basla
end 
Alıntı yapılan: bunalmis - 28 Ekim 2011, 20:27:03
if (a & 0x04)
          {
              a=0;
              b++;
          }
benim anlamadığım bir nokta var. If şartının içeriği ne iş yapıyor ? Yani a ile 0x04 and işlemine tabi tutuluyo ya sonra ?

if komutuna ait parantezin icindeki islem yapilir bizdeki islem (a & 0x04).  Ardindan bu islemin sonuca bakilir. Eger a & 0x04'un sonucu sifirdan farkli ise karsilastirma dogru demektir. Eger sifir ise karsilastirma yanlis demektir.
0x04 hex sayisi 00000100 ikili sayisi demektir. O halde a degiskeninin sagdan 3. siradaki biti (0 nolu değil, 1 nolu değil 2 nolu olani) 1 olursa sonuc 0 dan farkli olur.

Bunun icin eger a 0x?4 yada 0x?C olursa 0x04 ile AND islemi sonucunda sonuc 0x04 olur.  (Burada ? yerine istedigin rakami koy)

C de if yapisi acisindan Bu cok onemli bir ornektir.

Bu aciklamadan sonra devamini sen getir ve basic programi yaz.

if (a & 0x04)  ile  if ((a & 0x04) !=0) ayni anlama gelir.
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

eistain_54

hocm gç yazıyorum ama çözebilmş değiilim henüz ...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

z

#11
void main()
{
char a;
short b;

        a=0;
        b=0;
AA:
        a=a+1;
        if (a & 0x04)
          {
              a=0;
              b++;
          }
        goto AA;
}

a var byte
b var word

        a=0
        b=0
AA:
        a=a+1
        if (a AND 4)<>0 then
              a=0
              b=b+a
        endif


        goto AA

Bu asamada takilman normal. Yukarida yazdigim Basic programa bak. Sonra konusalim.

Cok onemli uyari

Eger kullandiginiz BASIC de byte ve word isaretsiz sayi tanimlamaya yariyorsa verdigim C orneklerinde char ve short onune unsigned eki getirmelisiniz.

Yani asagidaki gibi

unsigned char a;
unsigned short b;

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

#12
İlk soru için o bölme işareti. Telefonda öyle gözüktü

ikinci için :
a var byte
b var word
a=0
b=0
main:
a=a+1
AA:
if (a and 4!=0) then
a=0
b=b+1
goto main
endif
goto main
end



ama ben nedense hala if içindeki şarta bi anlam veremedim?kusuruma bakmayın ne olur!kafamı bi türlü toparlayamıyorum...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

z

#13
O sarta anlam vermenız gerekmiyor. C de if komutunun bu özelliğini anlatabilmek için bu kafa karıştırıcı örneği verdim.
if (a & 0x04)
    {
        a=0;
        b++;
    }

if ((a & 0x04) !=0)
   {
       a=0;
       b++;
    }

Bunlar aynı anlama geliyor.

if komutunun bu kullanimini anlamadiysan kesinlikle ilerlemeyecegiz.

C programlama dili ile samatalarda tartismayi dene.  https://www.picproje.org/index.php/topic,35908.0.html
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

#14
şimdi çözdüm.

AA nın üstünden geçerken alınan değerler

1   a=0 b=0
2   a=1 b=0
3   a=2 b=0
4   a=3 b=0
5   a=0 b=1
6   a=1 b=1
7   a=2 b=1
8   a=3 b=1
9   a=0 b=2
10 a=1 b=2   

a var byte
b var word
a=0
b=0
AA:
a=a+1
if (a & 0x04 )!=0 then ' (Sizin BASIC de eşit değil != mı?)
a=0
b=b+1
endif
goto AA
end

sonun bitti inşallah yanlış yoktur :)

Evet olay bu

O zaman bir de şu soruya bak.

if ((a&2)||(a==8))
{
......
......
}

a nın hangi değerleri için parantez içindeki .... kodları çalıştırılır.

Bunu gerçekleyen 10 tane  a değeri verebilirmisin?
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!