31 Aralık 2013 Salı

C dili Değişkenler ve Sabitler - Ders2

Ders2: Değişkenler ve Sabitler

Değişkenler bellekte bilginin saklandığı gözlere verilen sembolik adlardır. Her değişkenin tuttuğu değerin nasıl bir veri olduğunu gösteren bir tipi vardır. C dilinde temelde birkaç tane değişken tipi vardır. Bunlar Tablo 2.1 te listelenmiştir.
Tablo 2.1 : Değişken tipleri ve bellekte kapladıkları alanlar
Değişken tipi Açıklama Bellekte işgal ettiği boyut (byte)
char tek bir karakter için 1
int tamsayı için 2 yada 4
float tek duyarlı gerçel sayı için (6 basamak hassasiyet) 2 yada 4
double çift duyarlı gerçel sayı için (12 basamak hassasiyet) 4 yada 8
Fakat bazı özel niteleyiciler vardır ki bunlar yukarıdaki temel tiplerin önüne gelerek onların türevlerini oluşturur. Bunlar short, long, unsigned dır. Bu niteleyiciler sayesinde değişkenin bellekte kaplayacağı alan isteğe göre değiştirilebilir. Kısa (short), uzun (long), ve normal (int) tamsayı arasında yalnızca uzunluk farkı vardır. Eğer normal tamsayı 16 bit (2 byte) ise uzun tamsayı 32 bit uzunluğundadır. Kısa tamsayı 16 biti geçmeyecek uzunluktadır. Değişken tiplerinin bellekte kapladığı alan sizeof operatörü ile öğrenilebilir. Program 2.1 bu amaçla yazılmıştır.
Program 2.1 : Değişken tipleri ve türevlerinin bellekte kapladıkları alanlar
1:  /* sizeof operatörünün kullanımı */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:    printf( "\nchar           : %d byte", sizeof( char ));
7:    printf( "\nint            : %d byte", sizeof( int ));
8:    printf( "\nshort          : %d byte", sizeof( short ));
9:    printf( "\nlong           : %d byte", sizeof( long ));
10:   printf( "\nunsigned char  : %d byte", sizeof( unsigned char ));
11:   printf( "\nunsigned int   : %d byte", sizeof( unsigned int ));
12:   printf( "\nunsigned short : %d byte", sizeof( unsigned short ));
13:   printf( "\nunsigned long  : %d byte", sizeof( unsigned long ));
14:   printf( "\nfloat          : %d byte", sizeof( float ));
15:   printf( "\ndouble         : %d byte", sizeof( double ));
16:   printf( "\nlong double    : %d byte", sizeof( long double ));
17:
18: return 0;
19: }

Değişkenler ve Sabitlerin Bildirimi
Değişkenler ve Sabitler programın başında bulunmalıdır. Bazı uygulamalarda değişkenin bir başlangıç değerinin olması istenir. Böyle durumlarda değişken bildirilirken başlangıç değeri verilebilir. Örneğin:
      char isim='X', z;
      int  sayi=0, n=10;
      float toplam=0.0, sonuc=22.14;   
Sabit bildirimi, başlangıç değeri verilen değişken bildirimi gibi yapılır. Ancak; veri tipinin önüne const anahtar sözcüğü koyulmalıdır. Örneğin:
      const float   PI = 3.142857;
      const double  NOT= 12345.8596235489;
      const int     EOF= -1;
      const char[] = "devam etmek için bir tuşa basın...";
gibi sabit bildirimleri geçerli olup bunların içerikleri program boyunca değiştirilemez. Yalnızca kullanılabilir. Genellikle, sabit olarak bildirilen değişken isimleri büyük harflerle, diğer değişken isimlerinin ise küçük harflerle yazılması(gösterilmesi) C programcıları tarafından geleneksel hale getirilmiştir.
Birçok C programında sabitler #define önişlemci komutu ile de tanımlandığını görebilirsiniz. Bu komutla sabit bildirimi, bir program parçasına ve makro fonksiyon tanımlaması yapılabilir. Bir program geliştirilirken simgesel sabitlerin kullanılması programın okunurluğunu arttır ve bazen gerekli de olabilir. Aşağıda verilen simgesel sabit bildirimleri geçerlidir. #define önişlemcisi ile makro fonksiyon tanımlama işlemi Fonksiyonlar bölümünde anlatılacaktır.
  #define MAX 100
  #define DATA 0x0378
  #define YARICAP 14.22
Değişken Bildirim Yerleri ve Türleri
Yerel(local) Bildirim
Yerel değişkenler kullanıldığı fonksiyon içerisinde bildirilir. Yalnızca bildirildiği fonksiyon içerisinde tanınır ve kullanılabilir.
    int topla(int a,int b)
    {
    /* yerel (local) değişken c nin bildirimi */
    int c;
    c = a + b;
    return c;
   }
Genel(general) Bildirim
Genel değişkenler bütün fonksiyonların dışında bildirilir. Bir değişken program boyunca sürekli olarak kullanılıyorsa genel olarak bildirilmelidir.
   #include <stdio.h>

   void karesi();

   /* 
   ** m ve n global tip değişkendir. 
   ** bu iki değişken tüm program boyunca kullanılmaktadır
   */
   int m,n;  

   main(){
     m=7;
     karesi();
     printf("%d nin karesi %d dir",m,n);
   }

  void karesi()
  {
    n = m*m;
  }
Tip Dönüşümleri
Bir formül içerisinde bir çok değişken veya sabit olabilir. Bu değişken ve sabitler birbirinden farklı tipte olursa, hesap sonucunun hangi tipte olacağı önemlidir. Bir bağıntıda ,çeriği dönüşüme uğrayan değişkenler eski içeriklerini korurlar. Dönüştürme işlemi için geçiçi bellek alanı kullanılır; dönüştürülen değer kullanıldıktan sonra o alan serbest bırakılır.
  
  char kr;
  int tam;
  long int ltam;
  unsigned int utam;
  short int stam;
  float f;
  double d;
bildirimlerine göre:
  bağıntı      sonuç tipi
  -------      ----------
  kr+5         int
  kr+5.0       double
  d+tam        double
  f+d-2        double
  utam-tam     unsigned
  ltam*tam     long
  tam/2        int
  tam/2.0      double
bir değişkenin sabit değerin veya bağıntının önüne tür (cast) yazılarak sonucun hangi tip çıkması istendiği söylenebilir. Genel yazım biçimi:
      (tür tipi)  bağıntı;
örneğin x int, a ve b float tipinde iki değişken olsun:
      int x=3;
      float a,b;
      ...
      a = x/2;
      b = (float) x/2;
işleminin sonucunda a değişkenine 1.0, b değişkenine 1.5 değeri aktarılır. yani x/2 ile x/2.0 aynı anlamda değildir.

30 Aralık 2013 Pazartesi

C Dili Başlık Dosyaları - Ders4


Ders4: Başlık Dosyaları

C dilinde bir program yazılırken, başlık dosyası (header file) olarak adlandırılan bir takım dosyalar #include önişlemcisi kullanılarak program içine koyulurlar. Çünkü kütüphanelerdeki birçok fonksiyon, başlık dosyaları içindeki bazı bildirimleri kullanırlar. Bu tür dosyaların uzantısı .h dir. Örneğin time.h gibi. ANSI C deki standart başlık dosyaları: assert.h locale.h stddef.h ctype.h math.h stdio.h errno.h setjmp.h stdlib.h float.h signal.h string.h limits.h stdarg.h time.h Bir çok C derleyicisinde yukarıdakilere ek olarak tanımlanmış başlık dosyaları da vardır. Bunlar derleyicinin yardım kısmından veya derleyicinin kullanım kılavuzundan öğrenilebilir. Örnek Başlık Dosyası Başlık dosyaları genellikle include dizininin içinde saklanır. Turbo C derleyicisine ait stdio.h başlık dosyasının içeriğini görmek için tıklayın. Başlık dosyaları kullanıcı tarafından da oluşturulabilir. Program 4.1 buna bir örnektir. Bu programda "benimki.h" başlık dosyası programın başına ilave edilmiştir. /* benimki.h */ int topla(int x,int y){ return (x+y); } float ort(int x,int y){ return (x+y)/2.0; } "benimk.h" başlık dosyası iki tane fonksiyon içermektedir. Fonksiyon kavramı daha sonra ayrıntılı olarak incelenecektir. Program 4.1 : Başlık dosyası örneği 1: #include 2: #include "benimki.h" 3: 4: main() 5: { 6: int x,y,toplam; 7: float ortalama; 8: x = 10; 9: y = 20; 10: toplam = topla(x,y); 11: ortalama = ort(x,y); 12: printf("%d ve %d nin toplamı %d, ortalaması %f dir\n",x,y,toplam,ortalama); 13: } Program 4.1 in çalışması için, benimki.h ve Program 4.1 aynı klasörün içinde olmalıdır. Aksi takdirde 2. satırdaki ifadede benimki.h dosyasının tam yolu yazılmalıdır.

28 Aralık 2013 Cumartesi

C Dili Operatörler - Ders3

Ders3: Operatörler

Operatörler, değişkenler veya sabitler üzerinde matematiksel ve karşılaştırma işlemlerini yapan simgelerdir.
Aritmetik Operatörler
Değişken veya sabitler üzerinde temel aritmetik işlemleri gerçekleyen operatörlerdir. Bunlar Tablo 3.1 de listelenmiştir.
Tablo 3.1 : Aritmetik Operatörler
Operator Açıklama Ornek Anlami
+ toplama x+y x ve y nin toplamı
- cikarma x-y x ve y nin farkı
* carpma x*y x ve y nin çarpımı
/ bolme x/y x ve y nin oranı
% artık bölme x%y x/y den kalan sayı
Atama Operatörleri
Bu operatörler bir değişkene , bir sabit eşitlemek için kullanılır.
Birleşik atama: bazı ifadelerde işlem operatörü ile atama operatörü birlikte kullanılarak, ifadeler daha kısa yazılabilir. Eğer ifade
          değişken = değişken [operatör] ifade;
şeklinde ise, daha kısa bir biçimde
          değişken [operatör]= ifade;
olarak yazılabilir. Bunlar Tablo 3.2 te listelenmiştir.
Tablo 3.2 : Atama Operatörleri
Operator Açıklama Ornek Anlamı
= atama x=7; x=7;
+= ekleyerek atama x+=3; x=x+3;
-= eksilterek atama x-=5; x=x-5;
*= çarparak atama x*=4; x=x*4;
/= bölerek atama x/=2; x=x/2;
%= bölüp, kalanını atama x%=9; x=x%9;
++ bir arrtırma x++; veya ++x; x=x+1;
-- bir azaltma x--; veya --x; x=x-1;
Karşılaştırma Operatörleri ve Mantıksal Operatörler
Sayısal değerleri veya karakterleri karşılaştırmak için kullanılır. Bunlar Tablo 3.3 de listelenmiştir.
Tablo 3.3 : Karşılaştırma Operatörleri ve Mantıksal Operatörler
Operator Açıklama Ornek Anlamı
> büyüktür x>y x, y den büyük mü?
< küçüktür x<y x, y den küçük mü?
== eşittir x==y x, y ye eşit mi?
>= büyük-eşittir x>=y x, y den büyük yada eşit mi?
<= küçük-eşittir x<=y x, y den küçük yada eşit mi?
!= eşit değil x!=y x, y den farklı mı?
&& mantıksal VE x>2 && x<y x 2 den büyük VE y den küçük mü?
|| mantıksal VEYA x>2 || x<y x 2 den büyük VEYA y den küçük mü?
Bit Düzeyinde Işlem Yapan Operatörler
Sayısal veya karakter değişkenlerin üzerinde bit düzeyinde mantıksal işlem yapan operatörlerdir. Bunlar Tablo 3.4 te listelenmiştir.
Tablo 3.4 : Bit düzeyinde işlem yapan operatörler
Operator Açıklama Ornek Sonucu
& ve 10 & 25 (00001010 & 00011001) 8 (00001000)
| veya 10 | 25 (00001010 | 00011001) 27 (00011011)
^ özel veya 10 ^ 25 (00001010 ^ 00011001) 19 (00010011)
~ değil ~10 (00001010) 245 (11110101)
>> sağa kaydırma 12 >> 3 (00001100 >> 3) 1 (00000001)
<< sola kaydırma 12 << 3 (00001100 << 3) 96 (01100000)
Program 3.1 : Aritmetik ve atama operatörlerinin kullanımı
1:  /* Aritmetik ve atama operatörlerinin kullanımı */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:     int x, y;  /* yerel değikenlerin bildirimi */
7:
8:     x = 1;   /*  x in başlangıç değeri  */
9:     y = 3;   /*  y nin başlangıç değeri */
10:
11:    printf(" x = %d ve y = %d,\n olarak veriliyor.", x, y, z);
12:
13:    x = x + y;
14:    printf("x <- x + y  atamsının sonucunda x %d dir\n", x);
15:
16:    x = 1;  /* x e tekrar 1 değeri atanıyor */
17:    x += y;
18:    printf("x += y  atamasının sonucunda x %d dir\n", x);
19:
20: return 0;
21: }

27 Aralık 2013 Cuma

Stringler (Katarlar) - Ders11

Ders11: Stringler (Katarlar)

  Giriş
Katar bir char tipinde bildirilen karakter dizisidir. Stringler, içeriği harfler, rakamlar, veya bazı semboller olan text bilgilerini tutmak(saklamak) için kullanılır. C dilinde string bildirimi için bir tip deyimi yoktur. Bu yüzden, bir stringe bir dizi gözüyle bakılır. Genel olarak bir string'in bildirimi:
          char string_adı[eleman_sayısı];
şeklindedir. Örneğin 10 elemanlı bir isim bilgisi OgrenciAdi adlı bir string ile tutulmak istenirse:
          char OgrenciAdi[10];
şeklinde programın başında bildirilmelidir.
Stringlere Başlangıç Değeri Atama
Diğer dizi bildirimlerinde olduğu gibi, karakter dizilerine başlangıç değeri verilebilir. Örneğin aşağıda verilen iki bildirim aynı anlamdadır:
          char ktr[5]={'a','h','m','e','t','\0'};
          char ktr[5]="ahmet";
birinci satırdaki bildirimde '\0' (NULL) sembolü karakter dizisinin sonlandığını gösterir. Eğer bir karakter dizisinin kaç elemandan oluşacağı belirtilmezse, başlangıçta bildirilen karakter sayısı kaç tane ise dizinin eleman sayı o kadar olduğu varsayılır.
          char ktr[]="ahmet"; /* 5 elemanlı */
Stringler bazen bir pointer ile gösterilebilir.
          char *ktr="ahmet";
Her dört örnekteki ktr stringinin eleman sayısı 5 tir.
String Üzerinde İşlem Yapan Standart G/Ç Fonksiyonları
printf(); ve scanf();
Bu fonksiyonlar diğer tiplerde olduğu gibi formatlı okuma/yazma amaçlı kullanılır. String formatı %s dir. Aşağıda verilen programları iyice inceleyin. Bu öenekler basitten karmaşığa doğru sunulmuştur. Gerekli açıklamalar program üzerinde gösterilmiştir.
Program 11.1 : Bir stringin ekrana yazılması
1:  main()
2:  {
3:     char ktr[20]="Ahmet";
4:     printf("%s",ktr);
5:  }

Program 11.2 : iki stringin ekrana yazılması
1:  main(){
2:      char *ileti = "Selam dostum";
3:      char isim[] ={'A','l','i','\0'};
4:      printf("%s %s",ileti,isim);
5:  }

Program 11.3 : klavyeden okunan stringin ekrana yazılması
1:  main(){
2:      char ktr[20];
3:      printf("\nBir seyler yazin:");
4:      scanf("%s",ktr);    printf("%s yazdiniz.",ktr);
5:  }

Program 11.4 : Bir stringin formatlı yazılması
1:  main(){
2:       char ad[5]="ahmet";
3:       printf("%10s",ad);
4:  }

Program 11.5 : Bir stringin printf ile yazılması
1:  main(){
2:      char *isim = "ahmet";
3:      printf(isim);
4:  }

Program 11.6 : bir stringin içindeki m karakterinin sayısını öğrenme
1:  main(){
2:      char ktr[20];
3:      int i,sayac = 0;
4:      printf("\nBir seyler yazin :");
5:      scanf("%s",ktr);
6:      for(i=0;ktr[i];i++)
7:      if( ktr[i]=='m' ) sayac++;
8:      printf("yazilanlarin icinde %d tane m harfi var",sayac);
9:  }

puts(); ve gets();
Bu fonksiyonlar sadece stringler üzerinde işlem yapar. printf(); ve scanf(); fonksiyonları gibi klavyeden veri okuma/ekrana bilgi yazma amaçlı kullanılır.
Program 11.7 : puts ve gets fonksiyonları
1:  main(){
2:      char ktr[20];
3:      printf("\nBir seyler yazin: ");
4:      gets(ktr);    puts(ktr);
5:  }

Program 11.8 : bir siringin ilk karkareini yazdırma
1:  main(){
2:     char ad[10],soyad[20];
3:     printf("ADI    : ");
4:     gets(ad);
5:     printf("SOYADI : ");
6:     gets(soyad);
7:     printf("%c. %s",ad[0],soyad);
8:  }

Program 11.9 : puts,gets ve malloc fonksiyonları
1:  main(){
2:      char *ktr;
3:      ktr = (char *) malloc(20);
4:      printf("\nBir seyler yazin: ");
5:      gets(ktr);
6:      puts(ktr);
7:  }

Program 11.10 : bir stringin kaç karkaterden oluştuğunu hesaplar
1:  main(){
2:      char ktr[200];
3:      int  i;
4:       puts("Bir seyler yazin");
5:       gets(ktr);
6:       for(i=0;ktr[i];i++); /* kosul ktr[i]!='\0' anlamindadir*/    
7:       printf("yazilan %d harfdir",i);
8:  }

Bazı String Fonksiyonları
Bu fonksiyonlar standart C dilinde iki stringi karşılaştırmak, bir stringin içeriğini diğerine kopyalamak ve stringin uzunluğunu bulmak vb işlemler için tanımlı fonksiyonlardır. Bu ve benzeri fonksiyonlar kullanılırken string.h kütüphanesi programın başına ilave edilmelidir. Burada sadece bunlardan bir kaçı Tablo 11.1 de verilmiştir.
str, str1 ve str2 birer string ve kr bir karakter olmak üzere:
Tablo 11.1 : string.h kütüphanesine ait, bazı string fonksiyonları
strcmp( str1,str2 ); str1 ve str2 yi karşlaştırır
strcpy( str1,str2 ); str2 yi str1 e kopyalar
strcat( str1,str2 ); str2 yi str1 e ekler
strrev( str ); str yi ters çevirir
strlen( str ); str nin kaç karakterden oluştuğunu hesaplar
strchr( str,kr ); kr ile verilen karakterin str içindeki soldan itibaren yerini verir
Program 11.11 : İki stringin karşılaştırılması
1:  #include <string.h>
2:  main(){
3:     char ktr1[10],ktr2[10];
4:     int sonuc;
5:     printf("1. katar:");gets(ktr1);
6:     printf("2. katar:");gets(ktr2);
7:     sonuc = strcmp(ktr1,ktr2);
8:     if(sonuc>0)        puts("2. 1.den büyük");
9:     else if(sonuc<0 data-blogger-escaped-1.="" data-blogger-escaped-1.den="" data-blogger-escaped-10:="" data-blogger-escaped-11:="" data-blogger-escaped-e="" data-blogger-escaped-else="" data-blogger-escaped-it="" data-blogger-escaped-k="" data-blogger-escaped-puts="">

Program 11.12 : basit bir şifre programı
1:  #include <string.h>
2:  main(){
3:     char sifre[20];
4:     printf("SIFRE : ");
5:     scanf("%s",sifre);
6:    if( strcmp(sifre,"deneme")==0 )
7:        puts("sifre dogru girildi");
8:     else
9:        puts("sifre yanlis!");
10: }

Program 11.13 : Bir stringi diğerine kopyalama
1:  #include <string.h>
2:  main(){
2:     char *str1="ahmet", str2[10];
4:  /* once */
5:     puts(str2);
6:     strcpy(str2,str1);
7: /* sonra */
8:     puts(str2);
9: }

Program 11.14 : bir stringi diğerine ekleme
1:  #include <string.h>
2:  main(){
3:    char *a="ahmet            ";
4:    char *b="bingul";
5:    strcat(a,b);
6:    printf(a);
7:  }

Program 11.15 : strinin uzunluğunu hesaplar
1:  #include <string.h>
2:  main(){
3:     char ktr[100];
4:     puts("Birseyler yazin:");
5:     gets(ktr);
6:     printf("%s %d karakterden oluşmuştur.",ktr,strlen(ktr));
7:  }


26 Aralık 2013 Perşembe

Disk Dosyaları (Dosyalama) - Ders12

Ders12: Disk Dosyaları (Dosyalama)

Çoğu programda, bazı verilerin disk üzerinde saklanmasına gerek duyulur. C programlama dilinde, disk dosyasına erişme (okuma ve yazma için) iki farklı yöntemle yapılır. Bunlar üst düzey ve alt düzey olarak adlandırılır. Bunlardan üst düzey G/Ç yöntemi ANSI tarafından desteklenmektedir. Alt düzey G/Ç ANSI tarafından desteklenmemektedir. Bu yüzden, burada Üst düzey G/Ç konu edilecektir.
Dosya Açma ve Kapama
Bir dosyaya okuma/yazma yapmak için onun açılması gerekir. Bunun için fopen() fonksiyonu kullanılır. Açılan dosya fclose() ile tekrar kapatılmalıdır. Genel olarak:
          ...
          FILE *dosya;
          ...
          dosya = fopen(dosya_adı,mod);
          ...
          fclose(dosya);
          ...
mod ile açılacak olan dosyanın ne amaçla açılacağı belirlenir. Bunlar:
          r    (read only) yalnızca okuma için açar. 
          w    (write only) yalnızca yazma için açar.
          a    (append) ekleme yapmak için açar.
          r+   Okuma/yazma için açar.
          w+   Okuma/yazma için açar.
          a+   Okuma/yazma için açar.
deneme.txt adlı bir dosyanın, yazmak için açılıp açılmadığını test etmek için aşağıdaki kod kullanılır:
          #include <stdio.h>
          ...
          FILE *yaz; /* dosya işaretçisi */
          ...
          yaz = fopen("deneme.txt","w");

          if( yaz == NULL)
          {
                 puts("bu dosya acilmiyor...");
                 exit();
          }

          /* açılırsa! dosya işlemleri */
         ...
         fclose(yaz);
         ...
Dosya Fonksiyonları
  Fonksiyon     Görevi
  fopen()       Dosya oluşturur, açar
  fclose()      Dosyayı kapatır
  putc()        Dosyaya karakter yazar
  getc()        Dosyadan karakter okur
  feof()        Dosya sonuna gelindiğini sorgular
  fprintf()     Dosyaya formatlı veri yazar
  fscanf()      Dosyadan formatlı veri okur
  fputs()       Dosyaya katar yazar
  fgets()       Dosyadan katar okur
  fwrite()      Dosyaya dizi yazar
  fread()       Dosyadan dizi okur
Örnekler
Program 12.1 : Bu program klavyeden girilen iki tamsayı ve toplamını deneme.txt adlı bir dosyaya yazar.
1:/* dosya1.c */
2: #include <stdio.h>
3:
4: main()
5: {
6: FILE *yaz;
7: int x,y,z;
8:
9: yaz = fopen("deneme.txt","w");
10: if( yaz== NULL)
11: {
12:  puts("Dosya acilamiyor...\a\n");
13:  exit();
14: }
15:
16: printf("Toplanacak iki sayı girin : ");
17: scanf("%d %d",&x,&y);
18: z = x+y;
19:
20: fputs( "Bu dosya iki sayının toplamsını gösterir!\n",yaz );
21: fprintf(yaz,"%d + %d = %d",x,y,z);
22: fclose(yaz);
23:
24: puts("Bilgiler kaydedildi. Devam etmek için ENTER tuşuna basın.");
25: getchar();
26: }
Toplanacak iki sayı girin : 5 6
Bilgiler kaydedildi. Devam etmek için ENTER tuşuna basın.

+-----------------------------------------------
| Bu dosya iki sayının toplamsını gösterir!
| 5 + 6 = 11
|

Not: deneme.txt dosyası daha önce oluşturulmuşsa Program 12.1 önceki verileri silip yerine yeni verileri yazacaktır. Ekleme yapmak için fopen() fonksiyonunu 'a' modu ile kullanılmalıdır.

Bilgisayarın c:\deneme dizininde bulunan tipler.dat adlı bir dosyaya sahip olduğumuzu varsayalım, ve bu dosyanın içeriği aşağıdaki gibi olsun.
+-------------------------------
|Ahmet
|d
|1256
|65489878
|0.822
|
Buradaki veri tipleri sırasıyla katar, karakter, tamsayı, uzun tamsayı ve reel sayı şeklindedir. dosya2.c programı bu verilerin nasıl okunacağını göstermektedir.
Program 12.2 : Bu program bir dosyaya formatlı yazılmış olan verileri okur ve ekrana basar
1: /* dosya2.c */
2: #include <stdio.h>
3: main()
4: {
5: FILE  *oku;
6: char  ktr[10],kr;
7: int   tam;
8: long  uzun_tam;
9: float reel;
10:
11: if( (oku=fopen("c:\\deneme\\tipler.dat","r")==NULL ){
12:  puts("Dosya açılmadı !\n");
13:  exit();
14: }
15:
16: fscanf(oku,"%s\n%c\n%d\n%ld\n\%f",
17:     ktr,&kr,&tam,&uzun_tam,&reel);
18:  fclose(oku);
19:
20: puts("Dosyadan okunan veriler sırasıyla:");
21: printf(%s\n%c\n%d\n%ld\n\%f",ktr,kr,tam,uzun_tam,reel);
22: 
23: }
Dosyadan okunan veriler sırasıyla:
Ahmet
d
1256
65489878
0.822


Elimizde aşağıdaki gibi bir dosya olsun. Bu dosyadan istediğimiz bir öğrencinin numarasını girerek ona ait bilgilere ulaşılmak istensin. Program 12.3 basit bir veritabanı uygulamasıdır. Bu program öğrencilere ait bilgilerin bulunduğu bir dosyadan veri okur. 16. satırda Öğrencinin numarası istenir. Eğer böyle bir numara varsa öğrenciye ait bilgiler ekrana basılır. Aksi durumda "Kayıt bulunamadı" şelinde bir ileti ekrana basılır.
+------------------------------------------------
|NO     ADI     SOYADI  mt1     mt2     fin
|---    ------- ------  ---     ---     ---
|251 Ahmet   Bingul 100 100     100
|597    Meltem  Bingul  100 100     100
|569    Metin   Celen   54      65      89
|987    Teoman Burak   45      87      65
|
Program 12.3 : Basit bir veritabanı
1: /* dosya3.c */
2: #include <stdio.h>
3:
4: main()
5: {
6: FILE  *notlar;
7: int   i,numara,no,mt1,mt2,final;
8: char  gecici[10],ad[10],soyad[10];
9:
10: if( (notlar=fopen("notlar.js","r")==NULL ){
11:  puts("Dosya açılmadı !\n");
12:  exit(0);
13: }
14:
15: printf("Numara girin: ");
16: scanf("%d",&numara);
17:
18: for(i=0;i<12;i++)
18:  fscanf(notlar,"%s",gecici);
19: 
20: no = 0;
21:
22: while( !feof(notlar) )
23: {
24:  fscanf(notlar,"%d\t%s\t%s\%d\t%d\t%d\n",
25:         &no,ad,soyad,&mt1,&mt2,&final);
26:  if( no==numara ) break;
27: }
28: fclose(oku);
29: if( no ){
30:  puts("Öğrenci Bilgileri:");
31:  printf("Numarası : %d",no);
32:  printf("Adı      : %s",ad);
33:  printf("Soyadı   : %d",soyad);
34:  printf("1.Vize   : %d",mt1);
35:  printf("2.Vize   : %d",mt2);
36:   printf("2.Vize   : %d",mt3);
37: }
38: else
39:  puts("Kayıt bulunamadı");
40:
41: }/*main*/
Bazı uygulamalarda, daha önce bir şekilde hazırlanmış olan bir dosyanın içeriğini değiştirmek gerekebilir. Program 12.4 , eski.dat dosyasındaki verileri yeni.dat dosyasına aşağıdaki çevirir. Program kodları bir dosyadan diger bir dosyaya, bir verinin nasıl taşınacağına dair bir örnek teşkil eder.
    dosya 1                    dosya 2
 _______________           ________________
|X-degerleri    |         |                |
|1.0            |         |X      Y        |
|2.0            |         |1.0    0.0      |
|3.0            |         |2.0    2.5      |
|4.0            |         |3.0    4.9      |
|5.0            |  --->   |4.0    3.2      |
|Y-degerleri    |         |5.0    1.8      |
|0.0            |         |                |
|2.5            |         |                |
|4.9            |         |                |
|3.2            |         |                |
|1.8            |         |                |
|_______________|         |________________|
Program 12.4 : dosya1 in içindeki alt alta olarak yazılmış olan verileri, dosya2 ye şekildeki gibi yan yana yazar
1: /* dosya4.c */
2: #include <stdio.h>
3:
4: main()
5: {
6:       FILE  *oku,*yaz;
7:       float x[5],y[5];
8:       char  dosya1[12],dosya2[12],gecici[10];
9:       int   i;
10:
11:        printf("Verilerin okunacağı dosyanın adı");
12:        scanf("%s",dosya1);
13:        if( (oku==fopen(dosya1,"r"))==NULL ){
14:                printf("%s dosyası acilamiyor...",dosya1);
15:                exit();
16:        }
17:
18:        printf("Verilerin yazılacağı dosyanın adı");
19:        scanf("%s",dosya2);
20:        if( (yaz==fopen(dosya1,"w"))==NULL ){
21:  printf("%s dosyası acilamiyor...",dosya2);
22:  exit();
23:         }
24:
25:     /*dosya1 den verileri oku, bu verileri x[] ve y[] dizilerine sakla */
26:        fscanf(oku,"%s",gecici);  /* rakamlarin disindaki degerleri okumak icin */
27:
  for(i=0;i

25 Aralık 2013 Çarşamba

Enum, struct, union ve typedef Yapıları - Ders13

Ders13: enum, struct, union ve typedef Yapıları

C, kullanıcının kendi veri tipini tanımlamasına müsaade eder. Bu kısımda böyle veritiplerinin nasıl oluşturulacağı anlatılacaktır.
enum
Bu tip, değişkenin alabileceği değerlerin belli(sabit) olduğu durumlarda programı daha okunabilir hale getirmek için kullanılır. enum örnekleri Program 13.1 ve Program 13.2 de gösterilmiştir. Genel yazım biçimi:
          enum TipAdı{değer1,değer2,...,değerN}DeğişkenAdı;
TipAdı programcı tarafından verilen tip ismidir. DeğişkenAdı ise program içinde kullanılacak olan değişkenin adıdır. Eğer kullanılmazsa program içinde daha sonra enum ile birlikte kullanılır. Örneğin:
          enum bolumler{programcilik, donanim, muhasebe, motor};
tanımı ile derleyici programcilik için 0, donanim için 1, muhasebe için 2 ve motor için 3 değerini kabul ederek atamaları buna göre yapar. Değişken adı bildirilirse daha sonra enum kullanmaya gerek kalmaz.
          enum renkler{kirmizi,mavi,sari} renk;
          enum gunler{pazartesi,sali,carsamba,persembe,cuma,cumartesi,pazar};
Şimdi istenirse tanımlanan bu tipler program içinde kullanılabilir.
          enum bolumler bolum;
          enum gunler gun;

          bolum = muhasebe /* bolum = 2 anlaminda */
          gun   = cuma;    /* gun = 4 anlaminda   */
          renk  = kirmizi; /* renk = 0 anlaminda  */
Program 13.1 : 3 sabit renk için enum kullanımı
1:  /* enum1.c */
2:  enum renkler{kirmizi,sari,mavi};
3:
4:  main(){
5:       enum renkler renk;
6:       renk = sari;
7:       printf("\n%d",renk);
8:  }

Program 13.2 : 5 sabit bölüm için enum kullanımı
1:  /* enum2.c */
2:  enum bolumler{
3:    programcilik, donanim,   muhasebe, motor, buro
4:  }bolum;
5:
6:  main(){
7:     bolum = donanim;
8:     printf("\n%d",bolum);
9:     bolum +=2;  /* bolum=motor */
10:    printf("\n%d",bolum);
11: }

stuct
C dilinde standart tipler kullanılarak kendi tipinizi üretebilirsiniz. (struct örnekleri Program 13.3 , Program 13.4 ve Program 13.5 te gösterilmiştir). Bu yapının kullanımı:
          struct TipAdı{
       tip deg_ismi;
       tip deg_ismi;
       ...
          };
enum ile sabit bildirimi yapılırken struct ile değişken bildirimi yapılır. Bu yapının faydası, örneğin bir öğrenciye ait bilgileri bir çatı altında toplamak için:
          struct ogrenci{
       char  ad[10],soyad[20];
       long  no;
              short sinif;
          };
Bu tipte bir değişken tanımlama:
           struct ogrenci ogr1,ogr2;
şeklinde olmalıdır. ogr1 değişkeni ile tanımlanan 1. öğrencinin numarasına bir değer atama işlemi:
           ogr1.no = 2012597;
veya
           ogr1->no = 2012597;
şeklinde yapılır.
Program 13.3 : Bir öğrenciye ait bilgilerin tek bir çatı altında toplanması
1:  /* struct1.c */
2:  #include <stdio.h>
3:
4:  struct ogrenci{
5:      char ad[10],soyad[20];
6:      long no;
7:      int  sinif;
8:  }
9:
10: main(){
11:   struct ogrenci ogr;
12:   printf("Ogrenci nosu :");
13:   scanf("%ld",&ogr.no);
14:   if( ogr.no == 2248 )
15:   {
16:      ogr.no    = 2248;
17:      strcpy(ogr.ad,"Ahmet");
18:      strcpy(ogr.soyad,"Bingul");
19:      ogr.sinif = 1;
20:   }
21:   printf("\nNo    : %ld",ogr.no);
22:   printf("\nAdı   : %s ",ogr.ad);
23:   printf("\nSoyadı: %s ",ogr.soyad);
24:   printf("\nSınıfı: %d ",ogr.sinif);
25: }

Program 13.4 : Bir öğrenciye ait bilgilerin tek bir çatı altında toplanması
/* struct2.c */
#include <stdio.h>
struct ogrenci{
    char ad[10],soyad[20];
    long no;
    int  sinif;
}ogr;

main(){
   printf("Ogrenci nosu :");
   scanf("%ld",&ogr->no);
   if( ogr.no == 2248 )
   {
      ogr.no    = 2248;
      strcpy(ogr.ad,"Ahmet");
      strcpy(ogr.soyad,"Bingul");
      ogr.sinif = 1;
   }
   printf("\nNo    : %ld",ogr.no);
   printf("\nAdı   : %s ",ogr.ad);
   printf("\nSoyadı: %s ",ogr.soyad);
   printf("\nSınıfı: %d ",ogr.sinif);
}

Program 13.5 : bir topun x-y düzlemindeki zamana bağlı hareketi
1:  /* struct3.c */
2:  #include <stdio.h>
3:  #include <math.h>
4:
5:  struct koordinat{
6:    float x,y;
7:  }top;
8:
9:  main(){
10:   int i;
11:   float t;
12:
13:   for(t=0.0;t<10 data-blogger-escaped-.0="" data-blogger-escaped-14:="" data-blogger-escaped-t="" data-blogger-escaped-top-="">x = 10 - 9*cos(t);
15:     top->y = 5  + 2*sin(t);
16:     printf("%f\t%f",top->x,top->y);
17:   }
18:
19: }

tpyedef
struct ile oluşturulan yapıda typedef deyimi kullanılırsa, bu yapıdan değişken tanımlamak için tekrar struct deyiminin kullanılmasına gerek kalmaz.
         typedef struct kayit{
         char  ad[10],soyad[20];
         long  no;
         short sinif;
         }ogr1,ogr2;
bu kullanımın diğerlerinden farkı yoktur.
Bu deyimin başka kullanımı da vardır. C dilinde program kodları bu deyimle tamamen türkçeleştirilebilir. Örneğin:
          typedef int tamsayi;
şeklinde kullanılırsa programda daha sonra int tipinde bir değişken tanımlarken şu biçimde kullanılmasına izin verilir.
          tamsayi x,y; /* int x,y anlaminda */
union
Bir programda veya fonksiyonda değişkenlerin aynı bellek alanını paylaşması için ortaklık bildirimi union deyimi ile yapılır. Bu da belleğin daha verimli kullanılmasına imkan verir. Bu tipte bildirim yapılırken struct yerine union yazılır.
          union paylas{
                float f;
                int   i;
                char  kr;
          };
Dikkat: Yukarıdaki bildirim yapıldığında, bellekte bir yer ayrılmaz. Değişken bildirimi:
          union paylas bir,iki;
şeklinde yapılır. Üyelere erişmek aşağıdaki gibi olur:
          bir.kr= 'A';
          iki.f = 3.14;
          bir.i = 2000;
Program 13.6 : union x ve y nin aynı bellek alanını işgal ettiğinin kanıtı
1:  /* union1 */
2:  #include <stdio.h>
3:
4:  union paylas{
5:       int x;
6:       int y;
7:  }z;
8:
9:  main()
10: {
11:   int *X,*Y;
12:
13:    z.x = 10;
14:    X = &z.x;
15:    printf("\nTamsayı(x) : %d - bellek adresi %X",z.x,X);
16:
17:    z.y = 20;
18:    Y = &z.y;
20:    printf("\nTamsayı(y) : %d - bellek adresi %X",z.y,Y);
21: }
Tamsayı(x) : 10 - bellek adresi DF23
Tamsayı(y) : 20 - bellek adresi DF23

24 Aralık 2013 Salı

Grafik Kullanımı - Ders17

Ders17: Grafik Kullanımı


Bu kısımda sadece Turbo C derleyicisine ait basit grafik uygulamaları kısaca anlatılmıştır. Örneklerde verilen grafik fonksiyonları ANSI de bulunmamaktadır. Bu yüzden bir çok C derleyicisinde, kendi bünyesinde farklı grafik fonksiyonları oluşturulmuştur. Örneğin Linux ortamındaki grafik kullanmak için g2 kütüphanesi geliştirilmiştir.
Grafik Ekranına Geçiş
Grafik sistemine geçmek için, initgraph() fonksiyonunu kullanmak gerekir. Tüm çizimler sadece DOS ortamında çalışır. Grafik fonksiyonlarının kullanılması için graphics.h başlık dosyası programın başına ilave edilmelidir. Grafik işlemleri için temel işlemler:
          #include <graphics.h>
          ...
          int surucu=DETECT,grmod;        /* DETECT grafik surucusunu otomatik secer */
          initgraph(&surucu,&grmod,"");   /* grafik ekranını başlatır */ 
          ...
          closegraph();                   /* grafik ekranını kapatır */
şeklindedir.
Bazı Grafik Fonksiyonları
Bu bölümde Turbo C grafik fonksiyonlarının bazıları tanıtılmıştır. Bunların dışında biçok fonsiyon vardır. Bu fonksiyonlar derleyicinin başvuru kitabından öğrenilebilir.
renkler : 0-15 arasında (0-Siyah,15-mor) renk kodları ile (yada ingilizce isimleri örneğin YELLOW gibi) tanımlıdır.
moveto(x,y); Son noktayı (x,y) noktasına taşır
lineto(x,y); Son noktadan (x,y) noktasına düz bir çizgi çizer.
line(x1,y1,x2,y2); (x1,y1) noktasından (x2,y2) noktasına düz bir çizgi çizer.
circle(x,y,r); Merkezi (x,y) olmak üzere yarıçapı r olan bir çember çizer.
arc(x,y,baş_açı,bit_açı,r); Merkezi (x,y) noktasında ve yarıçapı r olan, baş_açı açısından dan başlayıp bit_açı açısına kadar bir yay çizer.
ellipse(x,y,baş_açı,bit_açı,xr,yr); Elipsin bir parçası olan yayı, merkezi (x,y) ve yarıçapları xr, yr olacak biçimde baş_açı açısındandan başlayarak bit_açı açısına kadar bir yay çizer.
putpixel(x,y,renk); (x,y) noktasına verilen renkte bir nokta çizer.
rectangle(sol,üst,sağ,alt); Sol üst köşesi (sol,üst) ve sağ alt köşesi (sağ,alt) koordinatlarında olacak şekilde bir dikdörtgen çizer.
bar(sol,üst,sağ,alt); İki boyutlu ve taralı bir bar çizer.
bar3d(sol,üst,sağ,alt,derinlik,şapka); Üç boyutlu ön yüzeyi taralı bar çizer. Şapka 0 ise barın üst kısmı çizilmez.
setcolor(renk); Çizilen olan şeklin rengini belirler
setbkcolor(renk); Arka alanın rengini belirler.
outtext(*yazılacak ifade); Yazılacak bir ifadenin grafik ekranında yazdırmak için kullanılır.
outtextxy(x,y,*yazılacak ifade); Grafik ekranında yazılacak bir ifadeyi (x,y) ile belirlenen noktadan başlayarak yazar.
settextstyle(font,yazı yönü,yazı boyutu); Ekranda yazılacak olan bir karakterin font'unu, yönünü ve boyutunu belirler. Yön:0 ise yatay, 1 ise dikey yazar.
cleardevice(); Ekranı temizler. DOS taki CLS komutu gibi.
closegraph(); Grafik ekranını kapatıp normal yazı ekranına döner. (DOS ekranı).

Örnekler
Burada Bir önceki kısımda verilen fonksiyonların, bir kaç uygulaması verilmiştir.
Program 17.1 : Grafik ekranında; bir çizgi, bir çember, bir yay, bir dikdörtgen ve bir elips çizer
1: /* grafik1.c
2:    Bu program, bir çizgi, bir çember, 
3:    bir yay, bir dikdörtgen ve bir elips çizer.
4: */
5: #include <stdio.h>
6: #include <grphics.h>
7:
8: main(){
9:      int sur=DETECT,gmode;
10:      initgraph(&sur,&gmode,"");
11:  
12:      line(12,12,298,198);
13:      circle(200,100,75)  
14:      arc(200,100,90,180,50);
15:      rectangle(10,10,300,200);
16:      ellipse(320,240,0,180,50,70);  
17:
18:      getchar();
19:      closegraph();
20: return 0;  
21: }


Program 17.2 : Ekranda yatay ve dikey iki yazı yazar ve farklı kalınlıkta iki çizgi çizer
1: /* grafik2.c 
2:    Bu program ekranda yatay ve dikey iki yazı yazar ve
3:    farklı kalınlıkta iki çizgi çizer.
4: */
5: #include <graphics.h>
6: main(){
7:       int sur=DETECT,grmode;
8:       initgraph(&sur,&grmde,"");
9:
10:      outtext("Merhaba C.");   
11:      outtextxy(30,40,"Bu yazi YATAY");
13:
14:      settextstyle(2,1,5);   
15:      outtextxy(50,60,"Bu yazi DIKEY");
16:
17:      setlinestyle(0,0,3);
18:      line(320,240,500,350);
19:
20:      setlinestyle(1,1,3);
21:      circle(320,240,100);
23: }


Program 17.3 : y=f(x) ile belirlenen bir fonksiyonu çizer
1:  /* grafik3.c
2:     Bu program, [-20,+20] aralığında sin(x) 
3:     fonksiyonunun grafiğini çizer. 22: satırdaki fonksiyonu
4:     değiştirerek, başka fonksiyonlar da çizilebilir.
5:  */
6:
7:  #include <graphics.h>
8:  #include <math.h>
9:
10:  main(){       
11:      int sur=DETECT,grmode;
12:       float x,y,X,Y,olcek;
13:       initgraph(&sur,&grmde,"");
14:
15:       putpixel(320,240,5);
16:       line(0,240,640,240);
17:       line(320,0,320,480);
18:
19:       olcek=40.0;                    /* Ölçek değiştirilerek zoom yapılabilir.  */
20:
21:       setcolor(YELLOW);              /* Fonksiyonun rengi sarı                  */
22:
23:       for(X=-20.0;X<=20;X+=0.01){    /* X değerleri [-20,20] aralığında         */
24:           Y=sin(X);                  /* sin(x) fonksiyonu                       */
25:           x=320+X*olcek;             /* Dönüşüm denklemleri                     */
26:           y=240-Y*olcek;            
27:           line(x,y,x,y);             /* Fonksiyon çiziliyor...                  */
28:        }
29:
30:    getchar();
31:    closegraph();
32:    return 0;
33:  }


<< 16 | İçindekiler | Port Denetimi >>


23 Aralık 2013 Pazartesi

Port Denetimi - Ders18

Ders18: Port Denetimi



Port Kavramı

Bu kısıma başlamadan önce port kavramları konusunda giriş seviyesinde bilgi sahibi olmak gerekir. Bunun için burayı tıklayın. Eğer port kavramı konusunda yeterli bilgiye sahip olduğunuzu düşünüyorsanız bu kısmı atlayabilirsiniz.
Portların Kontrolü

Geliştirilen bir program içerisinden donanımsal öğelere erişmek veya onları kullanmak için birçok yol vardır. En yalını, ki sistem mimarisi buna izin veriyorsa, bu gibi birimlere aynı bellek gözüne erişilmiyormuş gibi işaretçi değişkenler kullanılmıştır; ancak bu durum sistem mimarisinden dolayı her zaman mümkün olmayabilir. Bu durumda, ilgili birimlere erişmek için derleyicilerin sahip olduğu hazır kütüphane fonksiyonları kullanılır.
Port Giriş/Çıkış Fonksiyonları

Bir bilgisayarın portlarına erişmek için (outport(), intport() gibi) birçok fonksiyon vardır. Bunlar, sistemin sahip olduğu donanımsal öğelere port üzerinden erişilmesi imkanını sunar. Sistemin donanımsal öğelerine erişmek için derleyiciler birçok fonksiyona sahiptir; tüm listesi için kullanılan derleyicinin başvuru kitabına bakılmalıdır. Tablo 18.1 de, Turbo C derleyicisinde bululunan ve bu konu ile ilgili birkaç fonksiyon tanıtılmıştır (bunlar dışında birçok fonksiyon da vardır!).
Tablo 18.1 : Turbo C derleyicisine ait bazı port fonksiyonları
Port Fonksiyonu Açıklama
void outp(int port_adresi,int bayt_degeri); Porta bir baytlık veri yazar
void outport(int port_adresi,int deger); Porta bir kelime* yazar
void outportb(int port_adresi,unsigned char deger); Porta bir baytlık veri yazar
int inp(int port_adresi); Porttan bir baytlık veri okur
int inport(int port_adresi); Porttan bir kelime okur
char inportb(int port_adresi); Porttan bir baytlık veri okur
int peek(unsigned segment, unsigned offset); segment:offset ile belirlenen bellek alanındaki kelimeyi çağırır
char peekb(unsigned segment, unsigned offset); segment:offset ile belirlenen bellek alanından bir baytlık veriyi çağırır
void poke(unsigned segment, unsigned offset,int deger); segment:offset ile belirlenen bellek alanına bir tamsayı değeri yazar
void pokeb(unsigned segment,unsigned offset, char deger); segment:offset ile belirlenen bellek alanına bir baytlık veri yazar
(*) kelime(word) : Porta yazılacak veya porttan okunacak, bir tamsayının bellekte kaplayacağı alanı temsil eder. (Bu alan sizeof() operatörü ile öğrenilebilir)
Port foksiyonlarının kullanımı, örnek programlar üzerinde, bir sonraki bölümde incelenmiştir. Örnekler, programlaması kolay olduğu için, PC paralel portu üzerinde yoğunlaştırılmıştır. Programların çıktıları hemen ilgili progam kodunun altında verilmiştir.
Porta Veri Yazma ve Porttan Veri Okuma

Bir önceki bölümde verilen port fonksiyonları, bir PC nin bağlantı noktalarına erişmek veya bellek gözündeki port adreslerine erişmek için kullanılır. Aşağıda bu fonksiyonları daha iyi anlamak için 10 tane örnek program sunulmuştur. (Bütün programlar Turbo C derleyicisinde denemiştir. Eger bu derleyiciye sahip degilseniz, buradan inderbilirsiniz).
Not : Turbo C derleyicisinde port fonksiyonları kullanılırken dos.h başlık dosyası programın başına ilave edilmelidir.
Program 18.1 : outp fonksiyonunun kulanımı
1:  /* outp örneği */
2:  #include <stdio.h>
3:  #include <dos.h.h> /* port fonksiyonları için */
4:
5:  #define DATA  0x0378
6:
7:  int main(void)
8:  {
9:     int deger = 25;
10:
11:    outp(DATA,deger);
12:    printf("\n%X nolu adrese %d değeri yazıldı.",DATA,deger);
13:    return 0;
14: }
378 adresine 25 değeri yazıldı.

Program 18.1 de 5. satırda tanımlanan porta, 11.satırda 25 değeri yazılmaktadır. Bu değer PC paralel portunun DATA uçlarına yazılır. Bu sebeple 25 değeri binary olarak 8 e bölünür, yani 25 = 00011001 şekinde DATA portuna yazılır.
Porta yazılmak veya porttan okunmak istenen veriyi binay olarak görüntülemek mümkündür. PortPrg02 bu amaçla yazılımıştır. Bu işlemin gerçekleşmesi için Programa ayrıca CevFonks.c programı da ilave edilmelidir.
Program 18.2 : outportb fonksiyonun kullanımı
1:  #include <stdio.h>
2:  #include <dos.h>
3:  #include "CvrFonks.c"
4:
5:  #define DATA 0x0378
6:
7:  main()
8:  {
9:     int deger;
10:
11:    deger = 0x19; /* deger = 25 */
12:
13:     outportb(DATA,deger);
14:
15:     printf("\nDATA portuna gönderilen değer %Xh ",deger);
16:     cevir(deger);
17:
18:   return 0;
19: }
Porta gönderilen değer 19h 00011001

3. satıda CvrFonks.c programa eklenmiştir. 11. satırda tanımlanan değer, 5. satırdaki porta, 13. satırda elirtilen outportb fonksiyonu ile yazılmıştır. 16. satırdaki cevir fonksiyonu, porta yazılan değeri sadece 8 bite çevirir ve ekrana yazar. cevir fonksiyonu CevFonks.c fonksiyonunda daha önce tanımlanmıştır. outp ve outportb fonksiyonlarının kullanımının aynı olduğuna dikkat ediniz.
inp ve inportb fonksiyonları, PC bağlantı noktalarından bir baytlık veri okumak mümkündür. PortPrg03 bu fonksiyonlar ile nasıl veri okunacağına dair iyi bir fikir verir. Ayrıca bu iki fonksiyonun kullanımının aynı olduğuna dikkat ediniz.
Program 18.3 : inp ve inportb fonksiyonlarının kulanımı
1:  /* inp ve inportb fonksiyonlarıyla ile paralel porta atanan varsayılan değerleri öğrenme */
2:  #include <dos.h>
3:  #include <stdio.h>
4:
5:  #define DATA    0x0378
6:  #define STATUS  DATA+1
7:  #define CONTROL DATA+2
8:
9:  main()
10: {
11:    int  veri;
12:
13:    puts("Paralel porta atanan varsayılan değerler (Hex):");
14:
15:    veri = inp(DATA);
16:    printf( "Data portu    : %X\n",veri );
17:
18:    veri = inp(STATUS);
19:    printf( "Status portu  : %X\n",veri );
20:
21:    veri = inportb(CONTROL);
22:    printf( "Kontrol portu : %X\n",veri );
23:
24:    return 0;
25: }
Paralel porta atanan varsayılan değerler (Hex):
Data portu    : 4
Status portu  : 7F
Kontrol portu : CC

Port adresleri 5. 6. ve 7. satırlarda tanımlanmıştır. inp ve inportb foksiyonları ile okunanan değerle (sırasıyla DATA,STATUS ve CONTROL) veri değişkenine aktarılmış ve ekrana yazıldırılmıştır. Bu değerler porta hiç bir müdehale olmadan elde edilmiştir ve her bilgisayarda başka bir sonuç verebilir. Bu fonksiyonların tek parameteresi olduğuna dikkat ediniz.
Bir porta her hangi bir veri yazıldıktan sonra, bu veri o portun saklayıcısına (register) yazılır ve yeni bilgi yazılmadıkça orada veri kalır. PortPrg05 CONTROL portuna ouportb ile yazılan bir verinin inportb fonksiyonu ile okunması gösterilmiştir.
Program 18.4 : inportb ve outportb fonksiyonlarının kullanımı
1:  /* inportb ve outportb örneği */
2:  #include <stdio.h>
3:  #include <dos.h>
4:  #define PORT 0x037A  /* kontrol portu */
5:
6:  main()
7:  {
8:     int deger;
9:
10:    deger = inportb(PORT);  /* varsayılan deger */
11:    printf("\nPorta veri yazılmadan önceki değer : %X",deger);
12:
13:    deger = 0x0A;   /* deger = 10 */
14:    outportb(PORT,deger);
15:
16:    deger = inportb(PORT);
17:    printf("\nPorta veri yazdıktan sonraki değer : %X",deger);
18: }
Porta veri yazılmadan önceki değer : CC
Porta veri yazdıktan sonraki değer : CA

4. satırda belirtilen porta, A değeri 14. satırdaki outportb fonksiyonu ile yazılmıştır. Yazılan değer CONTROL portunun saklayıcısında saklanmaktadır. Daha sonra bu saklayıcıdan aynı veri 16. satırdaki inport fonksiyonu ile okunmaktadır. Program çıktısı incelendiğinde, portta varsayılan değerin CC, veri yazıldıktan sonraki değerin CA olduğu görülmektedir.
Not: CONTROL portunun ilk ilk dört bitine müdehale edilebilir. Yani birinci C değeri değiştirilemez.
Bazen paralel porttan istenen çıkış 8 bitten fazla olabilir. Bu durumda DATA portuna ek olarak CONTROL portunun kullanılması gerekir. DATA portunun 8 bitlik çıkışına, CONTROL portunun 4 bitlik çıkışları da ilave edilirse toplam 12 bitlik çıkış almak mümkün olur. PortPrg05 12 bitlik veri çıkışının nasıl yapılabilceğini göstermektedir. Kullanılan yöntem özetle şöyledir:
  • Veri 3 basamaklı Hex olarak ifade edilir. Çünkü 3 basamaklı Hex veri 12 bitlik binary veriye denktir.
    Örneğin A2F = 101000101111
  • Sağdan ilk 8 bit DATA portuna son 4 bit CONTROL portuna yazılır. Yani veri, veriC ve veriD olarak iki kısma bölünür.
    örneğin A2F = 1010 00101111
  • Soldan ilk 4 bit CONTROL portuna yazılması için, veri bitleri 8 basamak sağa kaydırılır.
    veriC = A2f >> 8 = 000000001010 = A
  • Daha sonra veri bitleri 4 sola ardından 4 sağa kaydırılır.
    A2F << 4 = 001011110000 = 2F0
    2F0 >> 4 = 000000101111 = 2F
    veriD = 2F
  • Böylece veri iki kısma ayrılmış olur.
Program 18.5 : PC Paralel portundan 12 bitlik veri çıkışı
1:  /*
2:     PC Paralel portundan 12 bitlik veri çıkışı:
3:     veri değişkeni bit düzeyinde işlem yapan operatörlerle
4:     iki kısma ayrılır.
5:          veri = veriC + veriD
6:  */
7:
8:  #include <stdio.h>
9:  #include <dos.h>
10:
11: #define DATA    0x0378
12: #define CONTROL DATA+2
13:
14: main()
15: {
16:
17:    int veri,veriC,veriD;
18:
19:    veri = 0xF48;  /* 3-dijit Hex sayı = 12 bit binary sayı */
20:
21:    veriC = veri >> 8; /* CONTROL portuna yazılack veri */
22:
23:    veri <<= 4;
24:    veri >>= 4;
25:
26:    veriD = veri;        /* DATA Portuna yazılacak veri */
27:
28:    outportb(DATA,veriD);
29:    outportb(CONTROL,veriC);
30:
31:    printf("\n12 bitlik veri              : %X%X",veriC,veriD);
32:    printf("\nCONTROL portuna yazılan veri: %X",veriC);
33:    printf("\nDATA    portuna vazılan veri: %X",veriD);
34:
35: return 0;
36: }
12 bitlik veri              : F48
CONTROL portuna yazılan veri: F
DATA    portuna vazılan veri: 48

19. satırdaki veri 21. satırdaki işlemle veriC değişkenine aktarılmıştır. 23. ve 24. satırdaki işlemlerle veri bitlerinden F değeri silinmiş olur. Elde eldilen yeni veri, 26. satırda veriD değişkenine aktarılmıştır. 28. ve 29. satıda veriC ve veriD değerleri sırasıyla CONTROL ve DATA portlarına yazılmıştır.
Paralel porttan belli bir formatla veri çıkış almak mümkündür. Örneğin format DATA uçlarına belli zaman aralıklarıyla sırasıyla 1 değeri göndemek olsun. Bu işlem bit düzeyinde işlem yapan operatörler ve ve basit bir döngü yardımıyla PortPrg06 programında incelenmiştir. Programda kullanılan delay fonksiyonu ile zaman aralıkları seçilmiştir. dos.h kütüphanesinde bulunan bu fonksiyon, kendisine parametre olarak gelen değeri mili saniye olarak kabul eder ve bekletir.
Program 18.6 : DATA-port uclarına sırasıyla 1 değerini gönderme
1:  /* DATA-port uclarına sırasıyla 1 değerini gönderir */
2:  #include <stdio.h>
3:  #include <dos.h>
4:
5:  #define DATA 0x0378
6:
7:  main()
8:  {
9:     int veri,sayac;
10:
11:    sayac = 0;  /* döngü sayacı */
12:    veri  = 1;
13:
14:    while( sayac<8 )
15:    {
16:        outportb(DATA,veri);  /* DATA portuna int veri yaz */
17:        printf("\nPorta yazılan veri : %d",veri);
18:
19:        veri <<= 1; /* veriyi binary olarak birer-birer sola kaydır */
20:
21:        delay(500); /* 500 ms bekle */
22:        sayac++;
23:    }
24: }
Porta yazılan veri : 1
Porta yazılan veri : 2
Porta yazılan veri : 4
Porta yazılan veri : 8
Porta yazılan veri : 16
Porta yazılan veri : 32
Porta yazılan veri : 64
Porta yazılan veri : 128

12. satırda veri değişkenine dögüye girmeden önce 1 (00000001) değeri atanmıştır. Dögü koşulu sınandıktan sonra 16. satırda veri DATA portuna yazılmıştır. 19. satırda verinin içeriği 1 bit sola kaydırılrak DATA portunun sadece bir sonraki ucuna 1 değeri gönderilmiştir. 21. satırda bu verinin DATA portunun saklayıcısında 500 ms saklanmış ve ardından bir sonraki çevrime girilmiştir. Bütün verilerin ekran çıktısı incelendiğinde 2 saysının kuvvetleri olduğu görülür.
Şimdiye kadar paralel portun taban adresini 378h olarak kabul edildi. Bu adres bazı makinalarda farklı olabilir. Fakat şu bir gerçektir ki taban adresleri PCde herzaman belli bir alanlarda(register) yazılıdır. Bu alanlar segment:offset olarak adlandırılan bölgede saklıdır. segment ve offset değerleri bir değişkeninin (veya bir çevre biriminin) bellekteki (genellikle RAM) adreslerini gösterir. Bu adresler dört çift heksadesimal değerden oluşur. Örneğin segment:offset => 23FB:0017 gibi. segment ve offset adres çiftinin belirli bir kombinasyonu ana bellekteki kesin adresleri belirler. Bu belirlemenin hesaplanışı şu şekildedir:
   segmet:offset => 2083:0100
segment adresinin sağına 0 rakamı ilave edilip offset adresi ile toplanır:
   20830h + 00100h = 20930h (= 133424 desimal olarak)
Çıkan netice ana belleğin 133424. adresini işaret eder. Segmet/Offset yapısı bilgisayarın giriş/çıkış bağlantı noktalarına atanan adresleri öğrenmek ve programlamak için de kullanılabilir. Örneğin paralel portun taban adresi 0000:0408 (yada 0040:0008) şeklinde belirlenen segment:offset adresi ile bellidir. PortPrg07 programında peek fonksiyonu ile paralel port adreslerinin nasıl öğrenileceği gösterilmiştir.
Program 18.7 : peek fonksiyonu ile paralel port adreslerinin öğrenilmesi
1:  /* peek fonksiyonu ile paralel port adreslerinin öğrenilmesi */
2:
3:  #include <dos.h>
4:  #include <stdio.h>
5:
6:  main()
7:  {
8:     unsigned int DATA,STATUS,CONTROL;
9:
10:    DATA    = peek(0x0000,0x0408); /* segmet:offset - 0000:0408 */
11:    STATUS  = DATA + 1;
12:    CONTROL = DATA + 2;
13:
14:    puts("Paralel Port Adresleri (Hex):");
15:
16:    printf("DATA    : %X\n",DATA);
17:    printf("STATUS  : %X\n",STATUS);
18:    printf("CONTROL : %X\n",CONTROL);
19:
20:    return 0;
21: }
Paralel Port Adresleri (Hex):
DATA    : 378
STATUS  : 379
CONTROL : 37A

10. satırdaki peek fonksiyonu ile 0000:0408 adres gözünden alınan değer DATA değişkenine aktarılmıştır. Bu değer 378h dir ve paralel portun taban adresini işaret eder. PortPrg07 ile elde edilen sonuç bir çok makine için geçerlidir. Fakat bazı makinelerde bu değer farklı olabilir. PortPrg08 daha genel amaçlı bir rogramdır ve bütün makinelerde kullanılabilir.
Program 18.8 : Genel amaçlı paralel port programı
1:  /* peek ile elde edilen değer ile porta ver yazma */
2:  #include <dos.h>
3:  #include <stdio.h>
4:  main()
5:  {
6:     unsigned int port;
7:
8:     port = peek(0x0040,0x0008);  /* 0x0000,0x0408 anlamında */
9:     outportb(port,22);
10:
11: }

8. satırdaki port değişkenine peek fonksiyonunun sonucu aktarılmıştır. 9. satırda port ile belirtilen porta (DATA portu) 22 değeri yazılmıştır.
Son olarak peek ve poke fonksiyonlarının kullanımı PortPrg09 ve PortPrg10 da birer örnekle gösterilmiştir. Bu örnekler klavyedeki Num Lock, Caps Lock ve Scroll Lock durumları için hazırlanmış iyi bir örnekdir.
Program 18.9 : Klavyedeki Num Lock, Caps Lock ve Scroll Lock durumlarını inceleme
1:  /* peek ile klavye kontrolü */
2:  #include <stdio.h>
3:  #include <dos.h>
4:
5:  int main(void)
6:  {
7:     int deger;
8:
9:     puts("Klavyedeki Num Lock, Caps Lock ve Scroll Lock durumları:");
10:    deger = peek(0x0040, 0x0017);
12:
13:    if (deger & 16)   puts("Scroll Lock açık");
14:    else              puts("Scroll Lock kapalı");
15:
16:    if (deger & 32)   puts("Num Lock açık");
17:    else              puts("Num Lock kapalı");
18:
19:    if (deger & 64)   puts("Caps Lock açık");
20:    else              puts("Caps Lock kapalı");
21:
22:    return 0;
23: }

Program 18.10 : Scroll Lock tusunu aktifleştirir
1:  #include <stdio.h>
2:  #include <dos.h>
3:
4:  int main(void)
5:  {
6:    printf("Scroll Lock tuşunun kapalı olduğundan emin olup ENTER tuşuna basın\n");
7:    getchar();
8:    poke(0x0000,0x0417,16);  /* scroll lock açılıyor... */
9:    printf("scroll lock şimdi açık\n");
10:   return 0;
11: }



EK: CvrFonks.c

/*
   Bu fonksiyon 10 tabanındaki bir sayıyı
   8 bit olarak 2 tabanına çevirir
*/

void cevir(int x)
{
    int i=0,Binary[8];
    /* x değeri alınıp 2 tabanına çevriliyor ...*/
    while( x>0 )
    {
       Binary[i++] = x%2;
       x /= 2;
    }
    /* x in binary değerleri ekrana yazdırılıyor...*/
    for(i=7;i>=0;i--)
    {
      if( Binary[i]>1 || Binary[i]<0 )
      Binary[i]=0;

      printf("%d",Binary[i]);
    }
}

22 Aralık 2013 Pazar

Ders19: İşletim Sistemi Yönetimi

Ders19: İşletim Sistemi Yönetimi


system() Fonksiyonu
Bu kısımda standart bir derleyicinde bulunan, stdlib.h kütüphanesindeki system() fonksiyonu anlatılacaktır. Bu fonksiyon kendisine parametre olarak gelen ifadeyi UNIX, Linux veya MS-DOS komut satırına yazar ve çalıştırır. system() fonksiyonu ile, bilgisayarın tüm dosya ve çevre birimleri, küçük program parçaları sayesinde kontrol edilebilir. Genel yazım biçimi:
      system("işletim_sistemi_komutu");
Örneğin,
Windows dizininde bulunan tüm dosyaları listelemek için
      system("dir c:\\windows");
Bu fonksiyon Linux İşletim sisteminde de kullanımı aynıdır. Örneğin /root/bingul/www dizinindeki dosya ve alt dizinleri listelemek için
      system("ls -asl /root/bingul/www");
Program 19.1 D: sürücüsünde bulunan tüm dosyaları gizli ve salt okunur hale getirmek için kullanılır. Son olarak derleyicinin EXE kodu üreteceğini unutmayın. Bu EXE kodu her bilgisayarda çalışır.
Program 19.1 : D: sürücüsünde bulunan bütün dosyaları gizli ve salt-okunur hale getirir
1:  /* D: sürücüsündeki bütün dosyaları gizli ve salt-okunur hale getirir */
2:  #include <stdlib.h>
3:  main()
4:  {
5:     system("attrib d:\\*.* +h+r");
6:  }

Program 19.2 proramında autoexec.bat dosyasına DOSKEYin nasıl yükleneceği gösterilmiştir. Bunun için >> yönlendirme operatörü kullanılmıştır. Bu operatör MSDOS işletim siteminde olduğu gibi Linux işletim sisteminde de kullanımı aynıdır.
Program 19.2 : Bilgisayar açılışında DOSKEY in yüklenmesi
1:  /* autoexec.bat dosyasına 'doskey /insert' yazar */
2:  #include <stdio.h>
3:  #include <stdlib.h>
4:
5:  main()
6:  {
7:     system("echo. >> c:\\autoexec.bat");
8:     system("echo doskey /insert >> c:\\autoexec.bat");
9:     printf("DOSKEY açılışa yüklendi...\n");
10: }
DOSKEY açılışa yüklendi...

main() Fonksiyonuna Paremetre Aktarımı
Fonksiyon inşasına dayanan bir C programında, ana programın kendisi, main(), de bir fonksiyondur. Ana programa parametre aktarımı, derlenmiş bir program komut satırından (işletim sistemi ortamından) ilk çalıştırılacağı zaman yapılır. Aktarılacak parametreler, programın adı yazılıp bir boşluk bırakıldıktan hemen sonra yazılır. Parametreler, komut satırından sayısal olarak girilse bile program içinde karakter topluluğu (string) olarak gelir. Bu durumda, string ifadeleri sayısal değerlere çeviren fonksiyonlar (atoi(), atol(), atof(),...) kullanılmalıdır. Genel kullanım biçimi:
          ...
          main(arguman_sayisi,arguman_vektoru)
          int  arguman_sayısı;
          char *arguman_vektoru[];
          {
             .
             .
             .
             if(arguman_sayisi < ...){
                printf("Eksik parametre !\n");
                exit(0);
             }
             if(arguman_sayisi > ...){
                 printf("Çok fazla parametre !\n");
                 exit(0);
             }
             .
             ... arguman_vectoru[0] ... /* 1. eleman program adı  */
             ... arguman_vectoru[1] ... /* 2. eleman 1. parametre */
             ... arguman_vectoru[2] ... /* 3. eleman 2. parametre */
             .
         }
Program 19.3 i dikkatle inceleyin.
Program 19.3 : komut satırından girilen iki sayının toplamını hesaplar
1:  #include <stdio.h>
2:  #include <stdlib.h>
3:
4:  main(int argsay, char *argvek[])
5:  {
6:     int toplam;
7:
8:     if(argsay < 3){
9:       printf("Eksik parametre !\n");
10:      exit(0);
11:    }
12:    if(arguman_sayisi > 3){
13:       printf("Çok fazla parametre !\n");
14:       exit(1);
15:    }
16:
17:    toplam = atoi(argvec[1])+atoi(argvec[2]);
18:    printf("Toplamları %d\n",toplam);
19:
20:  }

Program 19.3 in derlendikten sonra MS DOS ve Linux ortamında çalıştırılması şöyledir:
MS DOS                      | UNIX / Linux
----------------------------+-----------------------
c:\>topla 1 2               |$ topla 1 2
Toplamları 3                |Toplamları 3
                            |
C:\>topla 9 5 8             |$ topla 9 5 8
Çok fazla parametre !       |Çok fazla parametre !
                            |
C:\>topla 5                 |C:\>topla 5
Eksik parametre !           |Eksik parametre !
                            |
Komut satırında yazılan dosya adı dahil toplam parametre sayısı 3 tür. Bunlar:
argsay = 3

      1            2            3
    -----        -----        -----
             
    topla          58           34

      ^            ^            ^
      |            |            |
   argvek[0]    argvek[1]    argvek[2]
şeklindedir.
Aşağıda verilen iki program linux işletim sistemindeki cp ve wc komutlarının basit kaynak kodlarıdır:
  • cp komutunun kaynak kodları
  • wc komutunun kaynak kodları

21 Aralık 2013 Cumartesi

C Programlama Makroları - Ders20

C Makroları


Programın içinde sıkça yinelenmesi gerekebilecek küçük kod parçaları makrolar yardımıyla gerçeklenebilir.

Örnekte kare alma işlemini yapmak üzere bir makro yazılmıştır. Makrolar da değişmez tanımlarına benzer

şekilde #define sözcüğüyle yapılırlar. İşleyişleri de yine değişmez tanımlarına benzer şekilde olur, yani 
makronun adının geçtiği yere açılımı konur. Örnekteki

area = PI * sqr(radius);

komutu görülünce makro tanımında x yerine radius sözcüğü konarak kod

area = PI * ((radius) * (radius));

şekline getirilir (programcı kendisi bu şekilde yazmış gibi).

Bu işlem bir sözcük ya da sözcük grubunun yerine başka bir sözcük ya da sözcük grubunun yerleştirilmesi

şeklinde yürüdüğünden kullanımına dikkat etmek gerekir. Örnekteki makro

#define sqr(x) x * x

şeklinde tanımlansa ve programda

sqr(radius + 1)

şeklinde kullanılsaydı yerine geçecek (yanlış) kod şu şekilde olurdu:

radius + 1 * radius + 1

20 Aralık 2013 Cuma

C# - Multithreading

C# - Multithreading

thread is defined as the execution path of a program. Each thread defines a unique flow of control. If your application involves complicated and time consuming operations then it is often helpful to set different execution paths or threads, with each thread performing a particular job.
Threads are lightweight processes. One common example of use of thread is implementation of concurrent programming by modern operating systems. Use of threads saves wastage of CPU cycle and increase efficiency of an application.
So far we have written programs where a single thread runs as a single process which is the running instance of the application. However, this way the application can perform one job at a time. To make it execute more than one task at a time, it could be divided into smaller threads.

Thread Life Cycle

The life cycle of a thread starts when an object of the System.Threading.Thread class is created and ends when the thread is terminated or completes execution.
Following are the various states in the life cycle of a thread:
  • The Unstarted State: it is the situation when the instance of the thread is created but the Start method has not been called.
  • The Ready State: it is the situation when the thread is ready to run and waiting CPU cycle.
  • The Not Runnable State: a thread is not runnable, when:
    • Sleep method has been called
    • Wait method has been called
    • Blocked by I/O operations
  • The Dead State: it is the situation when the thread has completed execution or has been aborted.

The Main Thread

In C#, the System.Threading.Thread class is used for working with threads. It allows creating and accessing individual threads in a multithreaded application. The first thread to be executed in a process is called the main thread.
When a C# program starts execution, the main thread is automatically created. The threads created using the Thread class are called the child threads of the main thread. You can access a thread using the CurrentThread property of the Thread class.
The following program demonstrates main thread execution:
using System;
using System.Threading;

namespace MultithreadingApplication
{
    class MainThreadProgram
    {
        static void Main(string[] args)
        {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}
When the above code is compiled and executed, it produces the following result:
This is MainThread

Commonly Used Properties and Methods of the Thread Class

The following table shows some of the most commonly used properties of the Thread class:
PropertyDescription
CurrentContextGets the current context in which the thread is executing.
CurrentCultureGets or sets the culture for the current thread.
CurrentPrincipleGets or sets the thread's current principal (for role-based security).
CurrentThreadGets the currently running thread.
CurrentUICultureGets or sets the current culture used by the Resource Manager to look up culture-specific resources at run-time.
ExecutionContextGets an ExecutionContext object that contains information about the various contexts of the current thread.
IsAliveGets a value indicating the execution status of the current thread.
IsBackgroundGets or sets a value indicating whether or not a thread is a background thread.
IsThreadPoolThreadGets a value indicating whether or not a thread belongs to the managed thread pool.
ManagedThreadIdGets a unique identifier for the current managed thread.
NameGets or sets the name of the thread.
PriorityGets or sets a value indicating the scheduling priority of a thread.
ThreadStateGets a value containing the states of the current thread.
The following table shows some of the most commonly used methods of the Thread class:
S.NMethod Name & Description
1public void Abort()
Raises a ThreadAbortException in the thread on which it is invoked, to begin the process of terminating the thread. Calling this method usually terminates the thread.
2public static LocalDataStoreSlot AllocateDataSlot()
Allocates an unnamed data slot on all the threads. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead.
3public static LocalDataStoreSlot AllocateNamedDataSlot( string name) 
Allocates a named data slot on all threads. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead.
4public static void BeginCriticalRegion()
Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception might jeopardize other tasks in the application domain.
5public static void BeginThreadAffinity()
Notifies a host that managed code is about to execute instructions that depend on the identity of the current physical operating system thread.
6public static void EndCriticalRegion()
Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception are limited to the current task.
7public static void EndThreadAffinity()
Notifies a host that managed code has finished executing instructions that depend on the identity of the current physical operating system thread.
8public static void FreeNamedDataSlot(string name)
Eliminates the association between a name and a slot, for all threads in the process. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead.
9public static Object GetData( LocalDataStoreSlot slot ) 
Retrieves the value from the specified slot on the current thread, within the current thread's current domain. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead.
10public static AppDomain GetDomain()
Returns the current domain in which the current thread is running.
11public static AppDomain GetDomain()
Returns a unique application domain identifier
12public static LocalDataStoreSlot GetNamedDataSlot( string name ) 
Looks up a named data slot. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead.
13public void Interrupt()
Interrupts a thread that is in the WaitSleepJoin thread state.
14public void Join()
Blocks the calling thread until a thread terminates, while continuing to perform standard COM and SendMessage pumping. This method has different overloaded forms.
15public static void MemoryBarrier()
Synchronizes memory access as follows: The processor executing the current thread cannot reorder instructions in such a way that memory accesses prior to the call to MemoryBarrier execute after memory accesses that follow the call to MemoryBarrier.
16public static void ResetAbort()
Cancels an Abort requested for the current thread.
17public static void SetData( LocalDataStoreSlot slot, Object data ) 
Sets the data in the specified slot on the currently running thread, for that thread's current domain. For better performance, use fields marked with the ThreadStaticAttribute attribute instead.
18public void Start()
Starts a thread.
19public static void Sleep( int millisecondsTimeout ) 
Makes the thread pause for a period of time.
20public static void SpinWait( int iterations ) 
Causes a thread to wait the number of times defined by the iterations parameter
21public static byte VolatileRead( ref byte address )
public static double VolatileRead( ref double address )
public static int VolatileRead( ref int address )
public static Object VolatileRead( ref Object address ) 

Reads the value of a field. The value is the latest written by any processor in a computer, regardless of the number of processors or the state of processor cache. This method has different overloaded forms. Only some are given above.
22public static void VolatileWrite( ref byte address, byte value )
public static void VolatileWrite( ref double address, double value )
public static void VolatileWrite( ref int address, int value )
public static void VolatileWrite( ref Object address, Object value ) 

Writes a value to a field immediately, so that the value is visible to all processors in the computer. This method has different overloaded forms. Only some are given above.
23public static bool Yield()
Causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the thread to yield to.

Creating Threads

Threads are created by extending the Thread class. The extended Thread class then calls the Start()method to begin the child thread execution.
The following program demonstrates the concept:
using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}
When the above code is compiled and executed, it produces the following result:
In Main: Creating the Child thread
Child thread starts

Managing Threads

The Thread class provides various methods for managing threads.
The following example demonstrates the use of the sleep() method for making a thread pause for a specific period of time.
using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
            // the thread is paused for 5000 milliseconds
            int sleepfor = 5000; 
            Console.WriteLine("Child Thread Paused for {0} seconds", 
                              sleepfor / 1000);
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}
When the above code is compiled and executed, it produces the following result:
In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

Destroying Threads

The Abort() method is used for destroying threads.
The runtime aborts the thread by throwing a ThreadAbortException. This exception cannot be caught, the control is sent to the finally block, if any.
The following program illustrates this:
using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            try
            {

                Console.WriteLine("Child thread starts");
                // do some work, like counting to 10
                for (int counter = 0; counter <= 10; counter++)
                {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("Child Thread Completed");

            }
            catch (ThreadAbortException e)
            {
                Console.WriteLine("Thread Abort Exception");
            }
            finally
            {
                Console.WriteLine("Couldn't catch the Thread Exception");
            }

        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            //stop the main thread for some time
            Thread.Sleep(2000);
            //now abort the child
            Console.WriteLine("In Main: Aborting the Child thread");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}
When the above code is compiled and executed, it produces the following result:
In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception