Kitabın ortasından-1 (C ile rastgele konular)

Kitabın ortasından-1 (C ile rastgele konular)

Seriyi başlatıyorum. Konuyu uzatmadan, ufak tefek örneklerle anlatarak, c hakkında bazı bilgileri yazmak niyetindeyim. Örnekler konu babında birbiriyle alakası olmayabilir zaten bu yüzden, serinin adını “kitabın ortasında” koydum.

1-#define tanımlamanın ne işe yaradığını biliyorsunuz. Sadece #include kodlarının altına veya en tepeye yazmak zorundayız diye düşünüyorsanız yanılıyorsunuz. Ben öyle düşünüyordum ama bir deneyeyim dedim işe yaradı.

Örnek:

#include <stdio.h>
#include <stdlib.h> 
int main(void)
{
//not: define'ları her yere tanımlayabiliyoruz demekki...
    #define abc "abc"    
    puts(abc);    
    return 0;
}

2- sprint kullanımını şiddetle tavsiye ediyorum, bunu bilmediğim zamanlar; strcat, strcmp gibi fonksiyonlarla uzun yoldan aynı işleri yapıyordum. Konuyu anlamak için örneğe bakmanız yeterli:

#include <stdio.h>
#include <stdlib.h> 
int main(void)
{
//sprint örneği/////////////////////////////////
    char str [50]; //bu değişkenin boyutu  içine yazılacak verilerden büyük olmalıdır
    char ad []="Mustafa Gokhan";
    int yas=23;    
    //sprintf(str,"Merhaba %s%s%d",ad," bey yasiniz : ",yas); //ikinci parametreyede sabit yazı yazılabilir
    sprintf(str,"%s%s%s%d","Merhaba ",ad," bey yasiniz : ",yas);    
    puts(str);
    return 0;
}

3- C dilinde işlem önceliği çok basit ama bilinmesi gereken bir konudur. Ben her zaman parantez kullanırım, okunabilirliği artırsın diye ama başkalarının yazdığı yazılımları okurken bunları bilmemiz şart. Önce parantez içi, sonra çarpma ve bölme, en son olarakta toplama ve çıkartma işlemleri yapılabilir. Eğer aynı işlem önceliğine sahip iki işlem varsa ilk soldaki işlem yapılır sonra sağa geçilir.
Örnek:

printf("%d",96/6*8); // yani (96/6)*8=128 eder

4-Dev C++ IDE’si kötü bir ide değildir. Otomatik kod tamamlaması bile vardır. Bir kod yazarken ctrl+space yaparsanız(space, klavyedeki en uzun tuştur) yazabileceğiniz şeyleri listeler.

5-Pointerlarda işlem önceliği yine soldan sağa doğrudur.
Bir dizinin, i. elemanına erişmek için *(p+i) işlemi yapılması zorunludur. Yani

*p+i;   //p nin gösterdiği değere (dizinin ilk elemanına) i sayısını ekle 
*(p+i); //p nin gösterdiği adresten i blok ötedeki sayıyı hesapla anlamındadır.
//Çünkü, * operatörü + operatörüne göre işlem önceliğine sahiptir.

Örnekler:

#include <stdio.h>
#include <stdlib.h> 
int main(void)
{
    /////////////////////////////////////////////////
    unsigned char *Dest;
    Dest=(unsigned char *)malloc(15); //pointer'ımıza 15 byte'lık yer açıyoruz
    /* 
    //böyle olmaz
    *Dest = 'a';    
    *Dest++ = 'b';
    *Dest++ = 'c';

    //böyle de olmaz çünkü bu pointer bir dizinin adresini tutmuyor, 
    //yazdırırken diziyi değil direkt pointerin o anki adresini yazdırıyoruz çünkü.
    //aslında olmaz değil ama işe yaramaz anlamında...
    *(Dest++) = 'a';
    *(Dest++) = 'b';
    *(Dest++) = 'c';
    */
    /////////////////////////////////////////////////

    /////////////////////////////////////////////////
    *Dest = 'a'; 
    *(Dest+1) = 'b'; 
    *(Dest+2) = 'c'; 
    printf("%s",Dest); //sonuç: abc
    free(Dest);//Açtığımız 15 byte'lık alanı RAM'e geri iade ediyoruz.
    /////////////////////////////////////////////////

    /////////////////////////////////////////////////
    unsigned char deneme[10];
    unsigned char *dene;
    //
    dene=&deneme[0];
    *dene = 'a';
    dene++; *dene = 'b';
    dene++; *dene = 'c'; 

    printf("\n%s",deneme); //sonuç: abc
    /////////////////////////////////////////////////

    /////////////////////////////////////////////////
    dene=&deneme[0];
    *dene = 'd';
    *(dene+1) = 'e';
    *(dene+2) = 'f'; 
    printf("\n%s",deneme); //sonuç: abc
    /////////////////////////////////////////////////

    /////////////////////////////////////////////////
    dene=&deneme[0];
    *(dene++) = '1'; //    deneme[0]='1'; yap ve dene'yi 1 artır (kural gereği artırma işlemini değeri yazdıktan sonra yapıyor)
    *(dene++) = '2'; //    deneme[1]='2'; yap ve dene'yi 1 artır
    *dene = '3'; //    deneme[2]='3'; yap ama deneyi 1 artırma çünkü bu işlem son işlem
    printf("\n%s",deneme);
    /////////////////////////////////////////////////

    /////////////////////////////////////////////////
    dene=&deneme[0];
    *dene++ = '4'; //    deneme[0]='4'; yap ve dene'yi 1 artır (kural gereği artırma işlemini değeri yazdıktan sonra yapıyor)
    *dene++ = '5'; //    deneme[1]='5'; yap ve dene'yi 1 artır
    *dene = '6'; //    deneme[2]='6'; yap ama deneyi 1 artırma çünkü bu işlem son işlem(artırırsak birşey olur mu?, tabiki olmaz)
    printf("\n%s",deneme);
    /////////////////////////////////////////////////  
return 0;
}

6- (printf ile scanf) vs (puts ile gets)
Uzatmayı sevmem, örnekler:

#include <stdio.h>
#include <stdlib.h> 
int main(void)
{
    //not: Boşluk içeren bu tarz cümleler için puts(  ) ve gets(  ) fonksiyonları kullanılmaktadır.      gets(  ) atayacağı değerin ayrımını yapabilmek için '\n' aramaktadır.
    char cumle[40];
    printf( "Cümle giriniz> ");
    gets( cumle );
    printf( "Girdiğiniz cümle:\n" );
    puts( cumle ); // puts() fonksiyonu , printf() fonksiyonundan farklı olarak sonuna '\n' koyarak bir alt satıra geçer.

    //not normalde aşağıdaki scanfli kısmı üste, gets'li kısmı alta yazmıştım ancak program istediğim gibi çalışmadı, nedenini araştırmadım

    //not: scanf fonksiyonu boşluk gördüğü noktada, veriyi almayı keser    
    char isim[25], soyad[30];
    printf( "Ad ve soyad giriniz> ");
    scanf( "%s%s", isim, soyad ); //ad boşluk soyad şeklinde girildiği için boşluktan sonrasını ikinci değişkene yazar
    printf( "Sayın %s %s, hoş geldiniz!\n", isim, soyad );
    //////////////////////////////////////////////////
    return 0;
}

7- fprintf fonksiyonu ile txt dosya oluşturmak ve içini doldurmak için bir örnek yazalım.
Not: Aşağıdaki örnek alıntıdır kaynak: http://www.csharpnedir.com/articles/read/?id=517

#include <stdio.h>
 #include <stdlib.h>
 #define MONTH_NUMBER 12
char *ptr [] = {"Ocak","Subat","Mart","Nisan","Mayis","Haziran", "Temmuz","Agustos","Eylul","Ekim","Kasim","Aralik"};
int main(void)
 {
 FILE *fp;
 int i;
fp = fopen("aylar.txt","w");
 if (!fp) {
 printf("aylar.txt dosyasi olusturulamadi, program sonlandiriliyor...\n");
 exit(EXIT_FAILURE);
 }
for (i = 0; i < MONTH_NUMBER; ++i)
 fprintf(fp,"%2d. ay : %s\n",i+1,ptr[i]);
fclose(fp);
return 0;
 }

One thought on “Kitabın ortasından-1 (C ile rastgele konular)

  1. c18 dilinde sprint kullanırken dikkat edilmesi gereken birşey var. Sabit yazıları %s ile belirtseniz bile çalışmıyor. Sabit olan yazılarınızı ikinci parametrede tırnağın içine yazınız % ile başlayan ifadelerinizi sadece tanımlı değişkenler için kullanın. c18 de aşağıdaki şekilde olan komut derlenirken hata vermez ancak çalışmayacaktır:

    sprintf(str,"%s%s%s%d","Merhaba ",ad," bey yasiniz : ",yas);   
    

    Çalıştırabilmek için aşağıdaki gibi yazmalısınız

    sprintf(str,"Merhaba %s bey yasiniz : %d",ad,yas);
    

Bir Cevap Yazın