Cprogramlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Cprogramlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
 Bu örnekte C programlama dilinde, kullanıcıdan alınan sayının tek sayımı yoksa çift sayı mı olduğunu bulan programı yazdık:




#include <stdio.h>

void tekcift(int x){
    if(x%2==0){
        printf("Cift");
    }
    else
        printf("Tek");
}

int main() {
    int sayi;
    printf("Sayi giriniz: ");
    scanf("%d",&sayi);

    tekcift(sayi);

    return 0;
}

---------

#include <stdio.h>

int main() {
    int sayi;
    printf("Sayi giriniz: ");
    scanf("%d",&sayi);

    if(sayi%2==0){
        printf("Cift");
    }
    else
        printf("Tek");
    return 0;
}

 
Bilgisayar içerisinde tüm veriler bitler ile temsil edilir. Her bit yalnızca 0 veya 1 değerini alabilir. Çoğu sistemde 8 bit bir baytı oluşturur. Byte, char tipi için standart depolama birimidir. Diğer veri tipleri daha çok sayıda baytlar içinde saklanır. Bit operatörleri operandlarının bitlerini yönetmek için kullanılır. Bit operatörleriyle genellikle işaretsiz tamsayılar (unsigned int) kullanılır. Bit işlemleri doğası gereği makine-bağımlı olduğundan dolayı bu programlar sizin sisteminizde doğru olarak çalışmayabilir.

Bit operatörleri şunlardır: AND(&), OR( | ), EXCLUSIVE OR(^), sola kaydırma(<<), sağa kaydırma(>>) ve tümleyen(~).

AND(&): İki operandın ikisinin de ilgili bitlerinde 1 varsa sonuçtaki bitler 1 yapılır.

OR( | ): İki operandın ilgili bitlerinden en az biri 1 ise sonuçtaki bitler 1 yapılır.

EXCLUSI ve OR (^): Operandların ilgili bitlerinden yalnızca biri 1 ise sonuçtaki bitler 1 yapılır.

Sola kaydırma (<<): İlk operandındaki bitleri ikinci operandında belirtilen sayı kadar sola kaydırır. Sağdan itibaren 0 ile doldurulur.

Sağa kaydırma(>>): İlk operandındaki bitleri ikinci operandında belirtilen sayı kadar sağa kaydırır. Soldan itibaren yapılacak doldurma işlemciye bağlıdır.

Tümleyen (~): Tüm sıfır bitleri 1, tüm 1 bitleri 0 yapar

İşaretsiz (unsigned) Tam Sayıyı Bit olarak Yazdırma

Bit operatörlerini kullanırken, değerleri ikilik sistemde yazdırmak bu operatörlerin etkilerini gösterebilmek için oldukça kullanışlıdır.

Aşağıdaki örnek, unsigned bir tam sayıyı her biri 8 bitten oluşan gruplarla ikilik gösterimde yazdırmaktadır.

#include <stdio.h>

void displayBits(unsigned int value);

int main(){
unsigned int x;
printf("%s","Enter a nonnegative int: ");
scanf("%u",&x);
displayBits(x);
}

void displayBits(unsigned int value){
unsigned int c; // sayıcı

//displayMask'ı tanımlama ve 31 biti solo kaydırma
unsigned int displayMask = 1 << 31;

printf("%10u = ",value);
for(c=1;c<=32;++c){
putchar(value & displayMask ? '1' : '0');
value <<=1; // 1 ile değeri sola kaydırma

if(c % 8 == 0) { // 8 bitten sonraki yerin çıkışı
putchar(' ');
}
}
putchar('\n');
}
Ekran Çıktısı:

Enter a nonnegative int:65000
      65000 = 00000000 00000000 11111101 11101000

displayBits fonksiyonu value ve displayMask değişkenlerini birleştirmek için bit AND operatörünü kullanır. Sıklıkla bit AND operatörü maske (belirli bitleri 1 değerine ayarlanmış bir tam sayı değeri) adı verilen bir operant kullanılır. Maskeler diğer bitleri seçerken bazı bitleri değer içinde saklamak için kullanılır. displayBits fonksiyonunda maske değişkeni displayMask şu değere atanmıştır;

1 << 31 (10000000 00000000 00000000 00000000)

Sola kaydırma operatörü, 1 değerini displayMask içindeki en düşük değerlikli (en sağdaki) bitten en yüksek değerlikli (en soldaki) bite doğru kaydırır ve sağdan itibaren bitleri o ile doldurur.
putchar(value & displayMask ? '1' : '0');

değişkenin en solundaki bit değerinin 0 ya da 1 olarak çıkarılmasına karar verir. value ve displayMask "&" kullanılarak birleştirilirse value değişkeninde en soldaki bit dışındaki bitler saklanır çünkü 0 ile biten bitler birbirine geçiş sağlar. Eğer en soldaki bit 1 ise value ve displayMask gerçek bir değer alır ve 1 ekrana yazılır aksi durumda 0 yazılır. Ardından value değişkeni bir sola kaydırılır value <<=1 ile. Atanmamış değişken value'da bu adımlar her bit için tekrarlanır .

Bitsel AND Operatörü (&)


Kullanılan iki operandın bitleri 1 ise, bitsel AND'in çıkışı 1'dir. Operandlardan herhangi biri 0 ise, bitsel AND'in çıkışı 0'dır.

12 ve 25 tamsayılarının bit düzeyinde AND işlemini inceleyelim:

12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bit Operation of 12 and 25
  00001100
& 00011001
  ________
  00001000  = 8 (In decimal)
Örnek:

#include <stdio.h>
int main() {
    int a = 12, b = 25;
    printf("Output = %d", a&b);
    return 0;
}

Çıktı:

Output = 8

Bitsel OR Operatörü (|)


Kullanılan operadlardan en az biri 1 ise, bitsel Or'ın çıkışı 1'dir.

12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bitwise OR Operation of 12 and 25
  00001100
| 00011001
  ________
  00011101  = 29 (In decimal)
Örnek:

#include <stdio.h>
int main() {
    int a = 12, b = 25;
    printf("Output = %d", a|b);
    return 0;
}


Çıktı:

Output = 29

Bitsel XOR (exclusive OR) Operatörü (^)


İki operandaki bitler zır ise, bitrsel XOR'un çıkışı 1 olur.

12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bitwise XOR Operation of 12 and 25
  00001100
^ 00011001
  ________
  00010101  = 21 (In decimal)
Örnek:

#include <stdio.h>
int main() {
    int a = 12, b = 25;
    printf("Output = %d", a^b);
    return 0;
}

Çıktı:

Output = 21


Shift Operatörleri


C'de iki tane shift operatörü vardır: Right shift ve left shift


Rigth Shift Operatörü(>>)


Sağa kaydırma operatörü, tüm bitleri belirli sayıda belirtilen bit kadar sağa kaydırır. 

212 = 11010100 (In binary)
212>>2 = 00110101 (In binary) [Right shift by two bits]
212>>7 = 00000001 (In binary)
212>>8 = 00000000 
212>>0 = 11010100 (No Shift)

Left Shift Opetatörü(<<)


Sola kaydırma operatörü, tüm bitleri belirli sayıda belirtilen bit kadar sola kaydırır. Sola kaydırma operatörü tarafından boşaltılan bit konumları 0 ile doldurulur.
212 = 11010100 (In binary)
212<<1 = 110101000 (In binary) [Left shift by one bit]
212<<0 = 11010100 (Shift by 0)
212<<4 = 110101000000 (In binary) =3392(In decimal)
Örnek

#include <stdio.h>
int main() {
    int num=212, i;
    for (i=0; i<=2; ++i) {
        printf("Right shift by %d: %d\n", i, num>>I);
    }
    printf("\n");

    for (i=0; i<=2; ++i) {
        printf("Left shift by %d: %d\n", i, num<<i);    
    }

    return 0;
}

Çıktı:



Right Shift by 0: 212
Right Shift by 1: 106
Right Shift by 2: 53

Left Shift by 0: 212
Left Shift by 1: 424
Left Shift by 2: 848




C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:


Kaynaklar:
https://www.bilgigunlugum.net/prog/cprog/2c_veri
https://www.programmingsimplified.com/c/source-code/c-program-convert-decimal-to-binary
https://www.programiz.com/c-programming/bitwise-operators
https://www.javatpoint.com/bitwise-operator-in-c
Deitel Deitel C/C++



 

Bu yazımızda, C programlamanın en önemli elemanlarında bir olan yapılar (struct) konusuna değineceğiz. 



Yapı (Struct) Nedir ?

Yapılar -bazen topluluklar diye anılır- tek bir isim altında onunla ilgili değişkenlerin olduğu koleksiyonlardır. Yapılar, sadece aynı veri türünde öğeleri içeren dizilerin aksine farklı veri türünde değişkenler içerebilir. Yapılar, diziler gibi belleğe sürekli biçimde yerleşen nesnelerdir. Dizilerde olduğu gibi başlangıç adresleri içerilerek fonksiyonlara kolaylıkla aktarılabilirler. 

Yapıların Bildirimi

Yapılar türetilmiş veri türleridir. Yapılar diğer türdeki nesneleri kullanarak inşa edilirler. Yapı bildiriminin genel biçimi:

struct [yapı_ismi] {
    <tür> <yapı_elemanı>;
    <tür> <yapı_elemanı>;
    <tür> <yapı_elemanı>;
    ...
};


Yukarıdaki genel biçimde:

struct :             Bildirim için gerekli anahtar sözcüktür.
yapı_ismi :      Yapıyı anlatan isimlendirme kurallarına uygun herhangi bir isim olabilir. / yapı                                         etiketidir.
yapı_elemanı : Yapıyı oluşturan değişken isimleridir; isimlendirme kurallarına uygun herhangi bir isim                           olabilir.

!! Bildirimin küme parantezinden sonra noktalı virgül ile sonlandırıldığına dikkat ediniz.!!

Örneğin, düzlemde bir nokta x ve y bileşenlerinden oluştuğuna göre, bu aynı elemanlar yerine bir yapı biçiminde de bildirebiliriz:

struct NOKTA {
    int x;
    int y;
};
...


Benzer biçimde, tarih bilgileri de hiçbiri int türünden üç ayrı değişken yerine, yapı kullanılarak mantıksal bir bütünlük içinde ifade edilebilir:

struct DATE {
    int day;
    int month;
    int year;
};

Yukarıdaki bildirimde DATE yapının ismi; day, month ve year ise int türünden yapı elemanlarıdır.

Yapı bildirimiyle derleyici yalnızca yapılar hakkında bilgi edinir; bellekte onlar için herhangi bir yer ayrılmaz. Yapı bildirimlerini bir çeşit şablon tanımlaması gibi düşünebilirsiniz. Tıpkı fonksiyon prototiplerinde olduğu gibi yapı bildirimleri de yalnızca derleyiciyi bilgilendirmek amacıyla kullanılmaktadır.

Yapı Değişkenlerinin Tanımlanması

Bellekte yer ayırma işlemi yapı değişkenlerinin tanımlanmasıyla oluşur. Yapı değişkenlerinin tanımlanması aşağıdaki iki biçimde yapılır:

struct <yapı_ismi> <yapı_değişkeninin_ismi>;

veya

struct [yapı_ismi] {
    ...
} [değişken_listesi];

Yağı değişkenlerinin yapı bildiriminde sonra tanımlanması zorunludur. 

Örneğin:

struct NOKTA {
    int x;
    int y;
};
...

struct NOKTA a;

veya

struct NOKTA {
    int x;
    int y;
}a;
...


benzer biçimde DATE yapısı türünden bir d değişkeni:

struct DATE {
    int day;
    int month;
    int year;
};
...
struct DATE d;

veya

struct DATE {
    int day;
    int month;
    int year;
}d;
...

Yapı Değişkenlerine İlk Değerin Verilmesi

Yapı değişkenlerine dizilerde olduğu gibi küme parantezleri içerisinde ilk değer verilir. 

Örneğin:

struct date {
    int day;
    int month;
    int year;
};
...
struct date d = {1,4,1995};


Derleyici ilk değerleri yapı elemanlarına sırasıyla yerleştirir. Yani yukarıdaki örnekte yapı elemanlarının alacağı değerler şöyledir:

d.day => 1
d.month => 4
d.year => 1995


Yapı Üyelerine Erişim

Yapı üyelerine erişmek için iki operatör kullanılır: Yapı üyesi operatörü (.) (aynı
zamanda nokta operatörü olarak da bilinir) ve yapı işaretçisi operatörü ( ->) (aynı zamanda ok
operatörü olarak da adlandırılır). Yapı üyesi operatörü yapının değişken ismiyle yapı üyesine erişir. 

Örneğin:

printf("%d",d.day);

Yapı işaretçisi operatörü -aralarında herhangi bir boşluk olmayan eksi (-) işareti ve büyüktür (>) işaretinden oluşan - yapıda bir işaretçi üzerinden bir yapı üyesine erişir.

struct data *x;
printf("%d", x-> year);

Örnek:

#include <stdio.h>

struct card {
char *face;
char *suit;
};

int main( )
{
struct card aCard;
struct card *cardPtr;

aCard.face = "Ace";
aCard.suit = "Spades";

cardPtr = &aCard;

printf( "%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face," of ", aCard.suit,
cardPtr->face," of ",cardPtr->suit,
(*cardPtr).face," of ",(*cardPtr).suit);
return 0;
}
Ekran Çıktısı:

Ace of Spades
Ace of Spades
Ace of Spades

İç İçe Yapılar

Bir yapının içende başka bir yapı nesnesi tanımlanabilir. İç içe yapıların tanımlanması C'de iki biçimde yapılmaktadır:

1) İçerideki yapının bildirimini daha yukarıda yaparak. Bu durumda derleyici doğal akış yönünde ilerlerken bildirilen yapıyı tanıyabilir.

struct date{
    int day, month, year;
};
...
struct person {
    char name[30];
    struct date bday;
};

2) İçerideli yapının dışındaki yapının içerisinde bildirilmesiyle. Bu durumda değişken tanımlanması da yapılmalıdır:

struct person {
    char name[30];
    struct date{
        int day, month, year;
    }bday;
};

Yapıların Fonksiyonlara Parametre Olarak Geçirilmesi

C'de parametrelerin kopyalanarak fonksiyonlara geçirildiğini hatırlayalım. Yapı değişkenleri de fonksiyonlara kopyalanarak parametre olarak geçirilebilirler. 

Örnek:

#include <stdio.h>

struct date{
int day,month,year;
};

void dispDate(struct date x){
printf("Year: %d\n",x.year);
printf("Month: %d\n",x.month);
printf("Dat: %d\n",x.day);
}

int main() {
// Write C code here
struct date n;

n.day = 4;
n.month = 5;
n.year = 1995;
dispDate(n);

}
Ekran Çıktısı:

Year: 1995
Month: 5
Dat: 4




C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:




Bu yazıda, C programlama dilinin en güçlü özelliklerinden biri olan göstericilere değineceğiz. Göstericiler, C'nin yönetilmesi en zor yeteneklerinden biridir. Göstericiler, programların referansa göre çağırma yapmasını ve bağlı listeler, sıralar, yığınlar ve ağaçlar gibi büyüyüp küçülebilen dinamik veri yapılarının oluşturulmasıyla, yönetilmesini sağlar. Bu yazıda, temel gösterici kavramlarına değineceğiz. Hadi başlayalım :)



Gösterici Değişkenlerini Bildirmek 

Göstericiler, adres bilgilerini saklamak ve adreslerle ilgili işlemler yapmak için kullanılan nesnelerdir. Normalde bir değişken doğrudan kesin bir değer içerir. Göstericiler ise kesin bir değer tutan değişkenlerin adresini içerir. Bu durumda, bir değişken ismi bir değeri doğrudan belirtirken, göstericiler değerleri dolaylı yoldan belirtir.

Gösterici bildirimlerinin genel biçimi şöyledir:

<tür> * <gösterici_ismi>;

<tür> göstericinin (içerisindeki adresin) türüdür. char, floan, int ... gibi herhangi bir türdür.
Burada * göstericiyi ya da adresi temsil etmektedir.

int *sayiciPtr, sayici;
Biçiminde bir bildirim, sayiciPtr değişkenini int * (bir tamsayıyı gösteren gösterici) tipinde bildirir. Bu bildirim "sayiciPtr bir int göstericisidir" ya da "sayiciPtr, tamsayı tipinde bir nesneyi gösterir" biçiminde okunur. Ayrıca, sayici değişkeni de bir tamsayı olarak bildirilmiştir. Bildirim içindeki * yalnızca sayiciPtr'ye uygulanır

Örnek gösterici bildirimleri:

float *f;
char *s;
int *dizi;
...

Gösterici Operatörleri

& ya da adres operatörü, operandının adresini döndüren bir tekli operatördür. Örneğin;

int y = 5;
int *yPtr;

bildirimlerini ele aldığımızda

yPtr = &y;

ifadesi, y değişkeninin adresini yPtr gösterici değişkenine atar. Buna, yPtr değişkeni y'yi göstermektedir denir.

Örnek:

#include <stdio.h> // Ekran girdi ve çıktılarını sağlamak için fonksiyon kütüphanemizi çağırıyoruz


    int main(){//ana fonksiyonumuzu başlatıyoruz.
        char degisken='a';
        char *gosterici=&degisken;

        printf("Ilk gosterici degeri : %X\n",gosterici);
        gosterici++;

        printf("Bir sonraki gosterici degeri : %X\n",gosterici);
        gosterici+=5;

        printf("Alti sonraki gosterici degeri : %X\n",gosterici);
        
        /*
        Ekran Çıktısı :
        Ilk gosterici degeri : 62FE17
        Bir sonraki gosterici degeri : 62FE18
        Alti sonraki gosterici degeri : 62FE1D
        */

        return 0; // programın sorusuz çalıştığını işletim sistemine bildiriyoruz.
    }

Fonksiyonları Referansa Göre Çağırmak

Bir fonksiyona argüman geçirmenin iki yolu vardır: değere göre ve referansa göre çağırma. Bir çok fonksiyon, çağırıcıdaki bir ya da birden çok değişkeni değiştirebilme yeteneğine veya değere göre çağırmanın yükünden (bu nesnenin bir kopyasının oluşturulmasını gerektirir) kurtulmak için büyük bir veri nesnesini gösteren göstericiyi geçirmeye ihtiyaç duyarlar. Bu amaçlar için C, referansa göre çağırma yeteneklerini sunar.

Örnek:

#include <stdio.h>
int degereGoreKup ( int ); /* prototip */

int main( ){

    int sayi = 5;

    printf( "Sayının esas değeri %d", sayi);
    sayi = degereGoreKup ( sayi );
    printf( "\nSayının yeni değeri %d\n", sayi);

    return 0;
}
int degereGoreKup( int n )
{
    return n * n * n; /* yerel değişken n’in küpünü al*/
}

Çıktı:

Sayının esas değeri 5
Sayının yeni değeri 125


Göstericilerin Artırılması ve Eksiltilmesi

Göstericiler *,/,%,... gibi aritmetik operatörlerle ve bit operatörleriyle kullanılmazlar. Fakat, bir gösterici tamsayılı artırılabilir ya da eksiltilebilir. Örneğin p bir gösterici olmak üzere aşağıdaki ifadelerin hepsi geçerlidir.

++p;
p = p - 2;
p += 4;
p -= 10;
--p;
...

Göstericiler yalnızca tamsayılı sabitleri ile değil tamsayı değişkenleriyle de artırılıp azaltılabilir.

char *p;
int a;
...
p = p + a;
p = p - 2;
p += a;
p = p + a + 10;

Göstericiler ve Diziler Arasındaki İlişki   

Diziler ve göstericiler, C‘de özel bir biçimde ilişkilidirler ve birbirleri yerine hemen hemen
her yerde kullanılabilirler. Bir dizi ismi, sabit bir gösterici olarak düşünülebilir. Göstericiler,
dizilerin belirteçlerle gösterimi de dahil olmak üzere her işlemde kullanılabilir.

b[5] tamsayı dizisinin ve bPtr tamsayı göstericisinin bildirildiğini varsayalım. Bir belirteç
kullanmayan dizi isminin, dizinin ilk elemanını gösteren bir gösterici olduğunu bildiğimize
göre, bPtr ‘yi b dizisinin ilk elemanına aşağıdaki ifade ile eşitleyebiliriz.

bPtr =b;

Bu ifade, dizinin ilk elemanının adresini aşağıdaki biçimde almakla eşdeğerdir.

bPtr = &b[0];

b[3] dizi elemanı, alternatif bir biçimde;

*(bPtr+3)

gösterici deyimi ile belirtilebilir.

Yukarıdaki deyimde 3, göstericinin offsetidir. Gösterici, dizinin başlangıç adresini
gösterirken, offset dizinin hangi elemanının kullanılacağını belirtir ve offset değeri dizi
belirteciyle eştir. Az önceki gösterime gösterici/offset gösterimi denir. Parantezler gereklidir
çünkü * operatörünün önceliği + operatörünün önceliğinden yüksektir. Parantezler olmadan
yukarıdaki ifade, *bPtr‘ye 3 eklerdi. (yani, bPtr‘nin dizinin başlangıcını gösterdiği
düşünülürse, b[0] 'a 3 eklenirdi.) Dizi elemanlarının, gösterici deyimleri ile belirtilebilmesi
gibi

&b[3]
adresi de

bPtr+3

biçimindeki gösterici deyimi ile belirtilebilir.
Dizinin kendisine de bir gösterici olarak davranılabilir ve göstericiği aritmetiğinde
kullanılabilir. Örneğin,

*(b+3)

deyimi de b[3] dizi elemanını belirtir. Genelde belirteç kullanan tüm dizi deyimleri, gösterici
ve offset ile yazılabilir. Bu durumda, gösterici/offset gösterimi, dizinin ismini gösterici olarak
kullanır. Az önceki ifadenin, dizinin ismini değiştirmediğine dikkat ediniz. b, hala dizinin ilk
elemanını göstermektedir.
Göstericiler de diziler gibi belirteçlerle kullanılabilir. Örneğin,

bPtr[1]

deyimi, b[1] dizi elemanını belirtir. Buna, gösterici/belirteç gösterimi denir.

Dizi isminin, her zaman dizinin başlangıcını gösteren sabit bir gösterici olduğunu hatırlayınız.
Bu sebepten,

b+=3

deyimi geçersizdir çünkü dizi isminin değerini, gösterici aritmetiği kullanarak değiştirmeye
çalışmaktadır.

Örnek:

#include <stdio.h>

int main( )
{
int b[ ] = { 10, 20, 30, 40 };
int *bPtr = b; /* bPtr b dizisini göstersin */
int i, offset;
printf( "b dizisi asağıdaki metodla yazılmıstır:\n"
"Dizi belirteçleri yöntemi\n" );
for ( i = 0; i < 4; i++ )
printf( "b[ %d ] = %d\n", i, b[ i ] );

printf( "\nGösterici/offset yöntemi,\n"
"gösterici dizinin ismidir\n" );

for ( offset = 0; offset < 4; offset++ )
printf( "*( b + %d ) = %d\n", offset, *( b + offset ) );

printf( "\nGösterici belirteç yöntemi\n" );

for ( i = 0; i < 4; i++ )
printf( " bPtr[ %d ] = %d\n", i, bPtr[ i ] );
printf( "\nGösterici/offset yöntemi\n" );

for ( offset = 0; offset < 4; offset++ )
printf( "*( bPtr + %d ) = %d\n", offset, *( bPtr + offset ) );
return 0;
}

Çıktı:

b dizisi aĢağıdaki metodla yazılmıĢtır:
Dizi belirteçleri yöntemi
b[0] = 10
b[1] = 20
b[2] = 30
b[3] = 40
Gösterici/offset yöntemi
gösterici dizinin ismidir
*(b + 0) = 10
*(b + 1) = 20
*(b + 2) = 30
*(b + 3) = 40
Gösterici belirteç yöntemi
bPtr[0] = 10
bPtr[0] = 20
bPtr[0] = 30
bPtr[0] = 40
Gösterici/offset yöntemi
*(bPtr + 0) = 10
*(bPtr + 1) = 20
*(bPtr + 1) = 30
*(bPtr + 1) = 40


C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar:
A'dan Z'ye C Kılavuzu 
Deitel C/C++

 Algoritma

Bir sorunu çözmek veya belirlenmiş bir amaca ulaşmak için tasarlanan yola, takip edilen işlem basamaklarına algoritma denir.

Algoritmalar açıkça belirtilmiş bir başlangıcı ve sonu olan işlemler kümesidir. Amaca ulaşmak için işlenecek çözüm yolları ve sıralamaları belirlenir ve algoritma bu sırayı  takip ederek en mantıklı çözüme ulaşır.

Yataktan kalkıp işe gitmek için genç bir idareci tarafından takip edilen "kalk ve ışılda algoritması"nı düşünün:


1)Yataktan kalk,
2)Pijamalarını çıkar,
3)Duş al,
4)Giyin,
5)Kahvaltı yap,
6)İşe git.

Bu akış, genç idareciyi kritik kararlar vermeye iyi bir şekilde hazırlar. Aynı adımları biraz farklı sırada yapıldığını düşünün:


1)Yataktan kalk,
2)Pijamalarını çıkart,
3)Giyin,
4)Duş al,
5)Kahvaltı yap,
6)İşe git.

Bu durumda, genç idarecimiz işe sırılsıklam gidecek. Bir bilgisayar programında ifadelerin hangi sırada yürütüleceğini belirlemeye program kontrolü denir.

Sözde Kod

Sözde kod algoritma geliştirmenize yardımcı olan yapay ve gayri resmi bir dildir. Günlük dile benzer; gerçek bir bilgisayar programlama dili olmamasına rağmen uygun ve kullanıcı dostudur. 

Bu kodları bilgisayarda çalıştıramayız. Aksine, bir programını C gibi bir bilgisayar programlama dilinde yazmaya teşebbüs etmeden önce sadece programı "planlama"nıza yardımcı olur. Yukarıda örnek olarak bahsettiğimiz "kalk ve ışılda algoritması" sözde koda örnek olarak verilebilir. 

Başka bir örnek daha vermek istersek:

1)Birinci sayıyı oku;
2)İkinci sayıyı oku;
3)Üçüncü sayıyı oku;
4)İlk iki sayıdan büyük olanı bul;
5)Büyük sayıyı sonuç isimli değişkene ata;
6)Eğer sonuç değişkeni üçüncü sayıdan büyük ise sonuç değerini yazdır;
7)Değilse
8)Üçüncü sayıyı yazdır;

if Seçim İfadesi

Seçim ifadeleri, alternatif eylemler arasında seçim yapmak için kullanılır. Örneğin, bir sınavdaki geçme notunun 60 olduğunu düşünün:

Eğer öğrencinin notu 60'tan büyükse veya 60' a eşit ise
    "Geçti" Yaz

sözde kod ifadesi "öğrencinin notunun 60'tan büyük veya eşit" koşulunun doğru olup olmadığını karşılaştırır. Koşul doğru ise "Geçti" yazılır ve sıradaki sözde kod ifadesi "icra edilir". Koşul yanlış ise, yazma işlemi göz ardı edilir ve sonraki sözde kod icra edilir.

Yukarıdaki if ifadesi sözde kodu C'de:

if ( not >= 60 )
printf ( "Geçtiniz\n" );

gibi yazılabilir.


if...else Seçim İfadesi

if seçim ifadesi, yalnızca koşul doğru olduğu zaman işaret edilen eylemi yapar; diğer türlü eylem atlanarak geçilir. if...else seçim ifadesi koşul doğru olduğu zaman ve yanlış olduğu zaman yapılacak farklı eylemleri belirlemenize izin verir. Örneğin,


Eğer öğrencinin notu 60'tan büyük veya eşit ise
    "Geçti" Yaz
Değilse
    "Kaldı" Yaz

sözde kod ifadesi, öğrencinin notu 60'tan büyük veya eşit ise "Geçti" veya öğrencinin notu 60'tan küçükse "Kaldı" yazar. İki durumda da, yazma işlemi olduktan sonra, sıradaki sözde kod "icra edilir." Değilse 'nin gövdesinde de boşluk bırakılmamıştır. 

Yukarıdaki if..else ifadesinin sözde kodu C'de:

if ( not >= 60 )
    printf ( "Geçti" );
else
    printf ( "Kaldı" );



Kümelenmiş if...else İfadeleri

if...else ifadeleri içinde if...else ifadeleri yerleştirerek çoklu durumlar için karşılaştırma yapar. Örneğin aşağıdaki sözde kod ifadesi, 90'dan büyük veya eşit olan sınav notları için A, 80'den büyük veya eşit ( fakat 90'dan küçük) notlar için B, 70'ten büyük veya eşit ( fakat 80'den küçük ) notlar için C, 60'tan büyük veya eşit (fakat 70'ten küçük )  notlar için D ve diğer tüm notlar için F yazılacaktır.


Eğer öğrencinin notu 90'dan büyük veya eşit ise
    "A" Yaz
Değilse
    Eğer öğrencinin notu 80'den büyük veya eşit ise
        "B" Yaz
    Değilse
        Eğer öğrencinin notu 70'den büyük veya eşit ise
            "C" Yaz
        Değilse
            Eğer öğrencinin notu 60'dan büyük veya eşit ise
                "D" Yaz
            Değilse
                "F" Yaz


Bu sözde kod C'de:


if ( not >= 90 ){
    printf("A\n");
    } // if sonu
else{
    if ( not >= 80 ){
        printf("B\n");
        } // if sonu
    else {
        if (not >= 70){
            printf ("C\n");
            } // if sonu
        else {
            if ( not >= 60 ){
                printf ( "D\n" );
                } // if sonu
            else {
                printf ("F\n" );
                } // else sonu
           } // else sonu
        } // else sonu
    } // else sonu        

         

gibi yazılabilir. not değişkeni 90'dan büyük veya eşitse, dört koşulda olacaktır, ancak sadece ilk karşılaşmadan sonra printf ifadesi yürütülecektir. Bu printf ifadesi yürütüldükten sonra, "en dış"taki if...else ifadesinin else kısmı atlanarak geçilir. 

Yukarıdaki if ifadesini;

if ( not >= 90 ) {
    printf("A\n"); 
    }
else if ( not >= 80 ){
    printf("B\n");
    }
else if (not >= 70){
    printf ("C\n");
    }
else if ( not >= 60 ){
    printf ( "D\n" );
    }
else{
    printf ("F\n" );
    }

şeklinde yazmayı tercih edebilirsiniz. 




while Tekrarlama İfadesi


Bir tekrarlama ifadesi, koşullar doğru olduğu sürece tekrar edilecek bir eylem belirtmemize izin verir.

Alışveriş listemde daha alınacak olduğu sürece
    Sonraki malzemeyi al ve listede üzerini çiz.

sözde kod ifadesi alışveriş boyunca meydana gelen tekrarı tanımlar. "Alışveriş listemde daha alınacak var" koşulu doğru veya yanlış olabilir. Doğru ise "Sonraki malzemeyi al ve listede üzerini çiz" eylemi gerçekleşir. Bu eylem, koşul doğru kaldığı sürece tekrarlı olarak gerçekleştirilir.  while  tekrarlama ifadesinin içerdiği ifade(ler) while 'ın gövdesini oluşturur.  

En sonunda , koşul yanlış olacaktır. Bu noktada, tekrarlama sonlanır ve tekrarlama yapısından sonraki ilk sözde kod yürütülür. 

C programlamada while döngüsünün syntax yapısı:

while(şart) {
   işlemler(s);
}


while ifadesine örnek olarak, 100'den büyük ve 3'ün kuvveti olan ilk sayıyı bulmak için tasarlanmış bir program parçası düşünün. sonuc tam sayı değişkeninin başlangıçta 3 olduğunu farz edin. Aşağıdaki while tekrarlama ifadesinin çalışması bittiği zaman sonuc istenen cevabı içerecektir.  


sonuc = 3;
while( sonuc <= 100 ) {
    sonuc = 3 * sonuc ;
    } // while sonu




Örnekler

1) Negatif bir sayıyı ekrana yazan program:


#include <stdio.h>
int main() {
    int sayi;

    printf("Sayi giriniz: ");
    scanf("%d", &sayi);

    if (sayi < 0) {
        printf("Girdigin sayi: %d.\n", sayi);
    }
}

Ekran çıktısı:


Sayi giriniz: -2
Girdigin sayi: -2.


2) Bir tam sayının tek mi çift mi olduğunu kontrol  eden program:


#include <stdio.h>
int main() {
    int sayi;
    printf("Bir tam sayi giriniz: ");
    scanf("%d", &sayi);

    if  (sayi%2 == 0) {
        printf("%d sayisi çift sayidir.",sayi);
    }
    else {
        printf("%d sayisi tek sayidir.",sayi);
    }

}


Ekran çıktısı:

Bir tam sayi giriniz: 7
7 sayisi tek sayidir.


3) Girilen iki tam sayı büyüklük olarak karşılaştıran program:


#include <stdio.h>
int main() {
    int sayi1, sayi2;
    printf("Iki tam sayi giriniz: ");
    scanf("%d %d", &sayi1, &sayi2);

    if(sayi1 ==sayi2) {
        printf("Sonuc: %d = %d",sayi1,sayi2);
    }

    else if (sayi1 > sayi2) {
        printf("Sonuc: %d > %d", sayi1,sayi2);
    }

    else {
        printf("Sonuc: %d < %d",sayi1, sayi2);
    }

}


Ekran çıktısı:

Iki sayi giriniz: 12
23
Sonuc: 12 < 23


4) 1'den 5'e kadar olan sayıları ekrana yazan program:


#include <stdio.h>
int main()
{
    int sayi = 1;
    
    while (sayi <= 5)
    {
        printf("%d\n", sai);
        ++i;
    }

}


Ekran çıktısı:

1
2
3
4
5


Kısa Yollar:

Aşağıdaki linkler ile C programlama ile ilgili olan diğer bölümlere ulaşabilirsiniz:



Kaynakça:

https://maker.robotistan.com/algoritma/

https://www.elektrikport.com/teknik-kutuphane/yalanci-kod-nedir/14925#ad-image-0

https://www.programiz.com/c-programming/c-if-else-statement

https://www.tutorialspoint.com/cprogramming/c_while_loop.htm

https://www.programiz.com/c-programming/c-do-while-loops

Deitel Deitel c ve c++