Kod Dünyası

Algoritma etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Algoritma etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

23 Ocak 2015 Cuma

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

22 Ocak 2015 Perşembe

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.

20 Ocak 2015 Salı

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:  }

19 Ocak 2015 Pazartesi

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.0;t+=0.1){
14:     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

Ç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:
28:        for(i=0;i<5;i++)  fscanf(oku,"%f\n",&x[i]);
29:
30:        fscanf(oku,"%s",gecici);
31:
32:        for(i=0;i<5;i++)  fscanf(oku,"%f\n",&y[i]);
33:
34:      fclose(oku); /* verilerin bulundugu dosyayi kapat */
35:
36:      /* dizileri dosya2 ye yaz */
37: fprintf(yaz,"X\tY");
38: for(i=0;i<5;i++)
39:             fprintf(yaz,"%f\t%f",x[i],y[i]);
40:      fclose(yaz); /* verilerin yazildigi dosyayi kapat */
41:
42:        printf("%s --> %s dönüştürme işlemi gerçekleşti.",dosya1,dosya2);
43:
44: return 0;
45:}
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 <stdio.h>
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.

14 Ocak 2015 Çarşamba

Standard ANSI C dilinde 32 tane anahtar sözcük bulunmaktadır.(Derleyici yazan firmalar kendi yazdıkları
derleyiciler için ilave anahtar sözcükler tanımlayabilmektedir.)
auto break case char const continue default do double else enum extern float for goto  if
int long register return short signed sizeof static struct switch typedef union
unsigned void volatile while
Bazı programlama dillerinde anahtar sözcüklerin küçük ya da büyük harf olması fark etmemektedir. Ama
C’de bütün anahtar sözcükler küçük harf olarak tanımlanmıştır. C büyük harf küçük harf duyarlığı olan bir
dildir. (case sensitive) bir dildir. Ama diğer programlama dillerinin çoğunda büyük - küçük harf duyarlığı
yoktur. (case insensitive)
Örneğin, programcı olarak biz kullanacağımız bir değişkene “register” ismini vermeyiz. Çünkü bu bir anahtar
sözcüktür. (C dili tarafından rezerve edilmiştir) Ama buna karşın biz istediğimiz bir değişkene REGISTER,
Register,  RegisTER  vs. gibi isimler  verebiliriz,  çünkü  bunlar  artık  anahtar  sözcük sayılmazlar.  Anahtar
sözcük olan yalnızca tamamen küçük harf ile yazılan "register" dir.